Skip to content

wip: E2E suite for the secret rotation config - #124

Draft
chiragkyal wants to merge 9 commits into
openshift:mainfrom
chiragkyal:e2e/secret-rotation-wif-config
Draft

wip: E2E suite for the secret rotation config#124
chiragkyal wants to merge 9 commits into
openshift:mainfrom
chiragkyal:e2e/secret-rotation-wif-config

Conversation

@chiragkyal

@chiragkyal chiragkyal commented Jul 16, 2026

Copy link
Copy Markdown
Member

Summary by CodeRabbit

  • New Features
    • Secret rotation settings now automatically update CSI driver DaemonSet runtime args and associated republish behavior.
    • Secrets Store can manage CSI driver token request audiences for managed workloads, including explicitly clearing audiences.
    • tokenRequests.type: Managed is now treated as a one-way, irreversible transition.
  • Documentation
    • Updated quick start to apply required SecretProviderClass CRDs before starting; refreshed driver image guidance.
    • Expanded E2E and make-target instructions, including the new Azure suite.
  • Tests
    • make test-e2e now runs the E2E harness plus Go-based suites; added make test-e2e-azure-wif.
    • Added E2E coverage for secret rotation and token request audience behavior.

Extend the operator to read driverConfig.secretsStore from
ClusterCSIDriver and propagate it to the operand.

Clusters with no driverConfig.secretsStore configured see no change
in behavior (defaults match the previously hardcoded values).

Signed-off-by: chiragkyal <ckyal@redhat.com>
Signed-off-by: chiragkyal <ckyal@redhat.com>
Signed-off-by: chiragkyal <ckyal@redhat.com>
Signed-off-by: chiragkyal <ckyal@redhat.com>
@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

openshift-ci Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

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

@openshift-ci

openshift-ci Bot commented Jul 16, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: chiragkyal

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

The pull request process is described 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 approved Indicates a PR has been approved by an approver from all required OWNERS files. label Jul 16, 2026
@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

The operator resolves ClusterCSIDriver secret rotation and token request settings, applies them to the CSIDriver manifest and CSI DaemonSet, wires typed informers, and adds unit and end-to-end coverage for configuration transitions and preservation behavior.

Changes

Secrets Store configuration

Layer / File(s) Summary
Configuration resolution and unit validation
pkg/operator/secretsstore.go, pkg/operator/secretsstore_test.go
Effective rotation, republish, and token request settings are derived and tested across default, managed, unmanaged, clearing, and error cases.
CSIDriver and DaemonSet mutation
pkg/operator/csidriver_asset.go, pkg/operator/csidriver_asset_test.go, pkg/operator/rotation_daemonset_hook.go, pkg/operator/rotation_daemonset_hook_test.go
Resolved settings update CSIDriver fields and CSI driver arguments, with tests for preservation, formatting, and argument replacement.
Typed informer and hook wiring
pkg/operator/starter.go
Typed ClusterCSIDriver and CSIDriver listers are created, passed to hooks, and started with operator informers.
End-to-end configuration validation
test/e2e/*
The E2E suite restores configuration and verifies rotation, republish, token request preservation, managed audiences, clearing, and irreversible transition rejection.
E2E setup and project guidance
Makefile, README.md, AGENTS.md, docs/testing-guidelines.md
E2E targets, CRD setup, driver image configuration, and testing guidance are updated.
Go toolchain and dependency refresh
go.mod
The Go version and direct and indirect module requirements are refreshed.

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

Sequence Diagram(s)

sequenceDiagram
  participant E2ETests
  participant ClusterCSIDriver
  participant Operator
  participant CSIDriver
  participant CSIDaemonSet
  E2ETests->>ClusterCSIDriver: patch DriverConfig
  ClusterCSIDriver->>Operator: publish configuration
  Operator->>CSIDriver: apply republish and tokenRequests
  Operator->>CSIDaemonSet: update rotation arguments
  E2ETests->>CSIDriver: verify reconciled state
  E2ETests->>CSIDaemonSet: verify reconciled arguments
Loading
🚥 Pre-merge checks | ✅ 12 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 68.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Test Structure And Quality ⚠️ Warning Bare Expect(err).NotTo(HaveOccurred()) remains in two e2e tests, and token_requests_test.go mutates a cluster-scoped CSIDriver without per-test cleanup. Add contextual failure messages to those assertions and restore the patched CSIDriver state with AfterEach/AfterSuite or a self-cleaning helper.
Microshift Test Compatibility ⚠️ Warning FAIL: The new Ginkgo e2e suites use the OpenShift operator.openshift.io/v1 ClusterCSIDriver API and have no MicroShift skip/tag/runtime guard. Add [Skipped:MicroShift] or an [apigroup:...] tag, or gate the specs with exutil.IsMicroShiftCluster() so MicroShift CI skips them.
✅ Passed checks (12 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: adding an E2E suite for secret rotation config.
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 Reviewed the new Ginkgo suites; all Describe/Context/It titles are static strings with no generated values, dates, IDs, or other run-to-run variability.
Single Node Openshift (Sno) Test Compatibility ✅ Passed New e2e specs only mutate/observe CSIDriver and a DaemonSet; no node-count, topology, scheduling, anti-affinity, or HA assumptions were found.
Topology-Aware Scheduling Compatibility ✅ Passed The changes only adjust CSIDriver config and DaemonSet container args; no new nodeSelector, affinity, spread, PDB, or replica logic was added.
Ote Binary Stdout Contract ✅ Passed No stdout writes appear in e2e process-level code; TestE2E/BeforeSuite/AfterSuite use clients only, and helper logging goes to GinkgoWriter.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed The new Ginkgo e2e tests only patch/read cluster objects and DaemonSet args; I found no IPv4 literals, IP parsing, host formatting bugs, or public internet dependencies.
No-Weak-Crypto ✅ Passed The PR only adds CSIDriver/DaemonSet config logic and E2E tests; no MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, custom crypto, or secret/token constant-time comparison found.
Container-Privileges ✅ Passed PASS: The diff adds tests/code only; no changed manifests or code set privileged:true, hostPID/Network/IPC, allowPrivilegeEscalation, SYS_ADMIN, or run-as-root.
No-Sensitive-Data-In-Logs ✅ Passed The new logs only print resource names, booleans, counts, and hardcoded test audiences; no passwords, tokens, PII, hostnames, or customer data were found.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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

@chiragkyal

Copy link
Copy Markdown
Member Author

/test all

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

🧹 Nitpick comments (1)
pkg/operator/secretsstore.go (1)

47-61: 🗄️ Data Integrity & Integration | 🔵 Trivial | 💤 Low value

Document or remove the defensive fallbacks. SecretsStoreSecretRotation.custom and ManagedTokenRequests.managed are required by the CRD schema when their discriminator is set, so Custom with omitted minimumRefreshAge and Managed with audiences == nil are not admitted states. If these branches are only for tests that bypass validation, make that explicit; otherwise the API schema needs to change.

🤖 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 `@pkg/operator/secretsstore.go` around lines 47 - 61, Update
getSecretRotationConfig and the related managed-token configuration handling to
remove or explicitly document defensive branches for schema-invalid states:
Custom with omitted minimumRefreshAge and Managed with nil audiences. If
retaining them solely for validation-bypassing tests, clearly identify that
purpose; otherwise align the CRD schema with the fallback behavior.
🤖 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 `@pkg/operator/starter.go`:
- Around line 75-82: The ClusterCSIDriver informer created by
clusterCSIDriverInformer is not connected to reconciliation or startup
synchronization. Add it to the controller’s watched informers or register an
explicit event handler, and ensure its cache is synchronized before invoking
csiControllerSet.Run, while preserving the existing typed lister usage.

In `@test/e2e/e2e_suite_test.go`:
- Around line 79-90: Update loadRestConfig to assign a finite request timeout on
the returned *rest.Config before returning it, ensuring Kubernetes API calls
using context.Background() cannot hang indefinitely while preserving the
existing KUBECONFIG resolution and error handling.

In `@test/e2e/helpers_test.go`:
- Around line 60-69: Update restoreDriverConfig to use the same pollTimeout
retry loop as setDriverConfig, retrying the Get and Update operations when
restoration encounters conflicts or transient errors. Preserve
originalDriverConfig as the desired value, and surface a failure through the
test framework when retries are exhausted instead of silently returning.

In `@test/e2e/token_requests_test.go`:
- Around line 21-35: Update the test setup around
patchLiveCSIDriverTokenRequests to capture the live CSIDriver’s original
spec.tokenRequests before patching, then restore that value during cleanup.
Ensure cleanup restores the live CSIDriver even when driverConfig is omitted or
Unmanaged, while preserving the existing ClusterCSIDriver restoration.

---

Nitpick comments:
In `@pkg/operator/secretsstore.go`:
- Around line 47-61: Update getSecretRotationConfig and the related
managed-token configuration handling to remove or explicitly document defensive
branches for schema-invalid states: Custom with omitted minimumRefreshAge and
Managed with nil audiences. If retaining them solely for validation-bypassing
tests, clearly identify that purpose; otherwise align the CRD schema with the
fallback behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 8bbd1ae4-a336-47f8-8ca5-d670f02827c8

📥 Commits

Reviewing files that changed from the base of the PR and between cf9d0f4 and b1eef36.

⛔ Files ignored due to path filters (383)
  • go.sum is excluded by !**/*.sum
  • vendor/github.com/Masterminds/semver/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/.golangci.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/SECURITY.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/collection.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/constraints.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/Masterminds/semver/v3/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/.editorconfig is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/.gitattributes is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/LICENSE.txt is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/Taskfile.yml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/crypto.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/date.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/defaults.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/dict.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/functions.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/list.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/network.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/numeric.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/reflect.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/regex.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/strings.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-task/slim-sprig/v3/url.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/pprof/profile/merge.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/pprof/profile/profile.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/pprof/profile/proto.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/google/pprof/profile/prune.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/RELEASING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/config/deprecated.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/core_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/decorator_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/deprecated_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/formatter/colorable_others.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/formatter/colorable_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/formatter/formatter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/automaxprocs.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cgroup.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cgroups.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cgroups2.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cpu_quota_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/cpu_quota_unsupported.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/mountpoint.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/runtime.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/automaxprocs/subsys.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/build/build_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/command/abort.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/command/command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/command/program.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/boostrap_templates.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/bootstrap_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generate_templates.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/generators/generators_common.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/compile.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/gocovmerge.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/profiles_and_reports.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/run.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/test_suite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/utils.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/internal/verify_version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/labels/labels_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/main.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/ginkgo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/import.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/outline/outline_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/run/run_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/unfocus/unfocus_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/delta_tracker.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/dependencies.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hash.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/package_hashes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/suite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo/watch/watch_command.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo_cli_dependencies.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/ginkgo_t_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/around_node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/counter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/failer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/focus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/global/init.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/group.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/interrupt_handler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/sigquit_swallower_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/interrupt_handler/sigquit_swallower_windows.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/ordering.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_wasm.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/output_interceptor_win.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/client_server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/http_client.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/http_server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/rpc_client.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/rpc_server.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/parallel_support/server_handler.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report_bsd.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report_wasm.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_report_win.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/progress_reporter_manager.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/report_entry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_event_writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/reporters/gojson_reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/spec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/spec_context.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/suite.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/testingtproxy/testing_t_proxy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/tree.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/internal/writer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/default_reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/deprecated_reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/gojson_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/json_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/junit_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/reporter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporters/teamcity_report.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/reporting_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/table_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/around_node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/code_location.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/config.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/deprecated_types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/deprecation_support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/enum_support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/errors.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/file_filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/flags.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/label_filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/report_entry.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/semver_filter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/ginkgo/v2/types/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/.gitignore is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/CONTRIBUTING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/RELEASING.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/format/format.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/gomega_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/assertion.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/async_assertion.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/duration_bundle.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/gomega.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/gutil/post_ioutil.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/gutil/using_ioutil.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/polling_signal_error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/vetoptdesc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/and.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/assignable_to_type_of_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/attributes_slice.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_a_directory.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_closed_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_comparable_to_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_element_of_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_empty_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_equivalent_to_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_false_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_identical_to.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_key_of_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_nil_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_numerically_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_sent_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_temporally_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_true_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_zero_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/consist_of.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/contain_element_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/contain_elements_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/contain_substring_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/equal_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_cap_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_each_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_exact_elements.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_existing_field_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_field.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_http_body_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_http_header_with_value_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_http_status_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_key_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_key_with_value_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_len_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_prefix_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_suffix_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_value.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/internal/miter/type_support_iter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/internal/miter/type_support_noiter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_error_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_json_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_regexp_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_yaml_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/not.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/or.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/panic_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/receive_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/satisfy_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/semi_structured_data_support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/succeed_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraph.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraphmatching.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/support/goraph/edge/edge.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/support/goraph/node/node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/support/goraph/util/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/type_support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/with_transform.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/types/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/mod/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/mod/PATENTS is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/mod/semver/semver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/atom/atom.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/atom/table.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/charset/charset.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/const.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/doctype.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/entity.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/escape.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/foreign.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/iter.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/html/parse.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/render.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/net/html/token.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sync/errgroup/errgroup.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sync/singleflight/singleflight.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_386.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_arm.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_mips.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/charmap/charmap.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/charmap/tables.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/encoding.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/htmlindex/htmlindex.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/htmlindex/map.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/htmlindex/tables.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/internal/identifier/identifier.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/internal/identifier/mib.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/internal/internal.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/japanese/all.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/japanese/tables.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/korean/tables.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/simplifiedchinese/all.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/simplifiedchinese/tables.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/traditionalchinese/tables.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/encoding/unicode/override.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/internal/utf8internal/utf8internal.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/runes/cond.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/text/runes/runes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/LICENSE is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/PATENTS is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/cover/profile.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/ast/edge/edge.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/ast/inspector/typeof.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/ast/inspector/walk.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/gcexportdata/gcexportdata.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/gcexportdata/importer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/packages/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/packages/external.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/packages/golist.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/packages/golist_overlay.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/packages/loadmode_string.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/imports.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/go/types/typeutil/methodsetcache.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/go/types/typeutil/ui.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/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/core/fast.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/event/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/event/event.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/keys/standard.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/event/keys/util.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/exportdata.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gcimporter/gcimporter.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/predeclared.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gcimporter/support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gcimporter/ureader.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gocommand/invoke.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gocommand/invoke_notunix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gocommand/invoke_unix.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gocommand/vendor.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/gocommand/version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/packagesinternal/packages.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/codes.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/decoder.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/encoder.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/flags.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/reloc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/sync.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/syncmarker_string.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/pkgbits/version.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/common.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typeparams/coretype.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/typeparams/termlist.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typeparams/typeterm.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/errorcode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/errorcode_string.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/recv.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/typesinternal/toonew.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/golang.org/x/tools/internal/versions/gover.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/versions/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/golang.org/x/tools/internal/versions/versions.go is excluded by !**/vendor/**, !vendor/**
  • vendor/modules.txt is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (14)
  • Makefile
  • README.md
  • go.mod
  • pkg/operator/csidriver_asset.go
  • pkg/operator/csidriver_asset_test.go
  • pkg/operator/rotation_daemonset_hook.go
  • pkg/operator/rotation_daemonset_hook_test.go
  • pkg/operator/secretsstore.go
  • pkg/operator/secretsstore_test.go
  • pkg/operator/starter.go
  • test/e2e/e2e_suite_test.go
  • test/e2e/helpers_test.go
  • test/e2e/secret_rotation_test.go
  • test/e2e/token_requests_test.go

Comment thread pkg/operator/starter.go
Comment on lines +75 to +82
// Typed ClusterCSIDriver client and informer to read driverConfig.secretsStore configuration.
operatorClientset := operatorv1client.NewForConfigOrDie(rest.AddUserAgent(controllerConfig.KubeConfig, operatorName))
operatorInformers := operatorv1informers.NewSharedInformerFactory(operatorClientset, resync)
clusterCSIDriverInformer := operatorInformers.Operator().V1().ClusterCSIDrivers()

// csiDriverInformer is the storage.k8s.io/v1 CSIDriver informer
csiDriverInformer := kubeInformersForNamespaces.InformersFor("").Storage().V1().CSIDrivers()

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 | 🏗️ Heavy lift

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
rg -n -C4 \
  'clusterCSIDriverInformer|operatorInformers\.Start|WaitForCacheSync|AddEventHandler|csiControllerSet\.Run' \
  pkg/operator

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 2496


🏁 Script executed:

#!/bin/bash
sed -n '1,220p' pkg/operator/starter.go
rg -n -C4 'WaitForCacheSync|AddEventHandler|ClusterCSIDriver|csiControllerSet|Run\(' pkg/operator

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 35576


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "GOMODCACHE=$(go env GOMODCACHE)"
cache="$(go env GOMODCACHE)"

# Locate the library-go controller set sources if they are in cache.
rg -n --glob '*/csicontrollerset/*.go' --glob '*/csidrivernodeservicecontroller/*.go' \
  'WaitForCacheSync|AddEventHandler|Run\(|Informer|Lister\(' "$cache" || true

# Show the exact starter wiring in this repo for reference.
sed -n '83,150p' pkg/operator/starter.go

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 2099


🏁 Script executed:

#!/bin/bash
set -euo pipefail

cache="$(go env GOMODCACHE)"

# Find the library-go controller set implementations used here.
fd -a 'csicontrollerset' "$cache" | head -20
fd -a 'csidrivernodeservicecontroller' "$cache" | head -20

# Search for cache-sync and event wiring in the relevant packages.
rg -n -C3 'WaitForCacheSync|AddEventHandler|Run\(|Informer|Lister\(' \
  "$cache"/github.com/openshift/library-go*/*/pkg/operator/csi/csicontrollerset \
  "$cache"/github.com/openshift/library-go*/*/pkg/operator/csi/csidrivernodeservicecontroller \
  || true

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 735


🏁 Script executed:

#!/bin/bash
set -euo pipefail

cache="$(go env GOMODCACHE)"

# Print candidate files if the package is present and then inspect them.
find "$cache" -path '*github.com/openshift/library-go*' -path '*pkg/operator/csi/csicontrollerset*' -name '*.go' -o -path '*pkg/operator/csi/csidrivernodeservicecontroller*' -name '*.go' | sed -n '1,50p'

# Fallback to broad search over the module cache if the direct path above misses.
rg -n -C2 'WaitForCacheSync|AddEventHandler|Run\(|Informer|Lister\(' \
  "$cache" \
  -g '*csicontrollerset*.go' \
  -g '*csidrivernodeservicecontroller*.go' || true

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 1002


🏁 Script executed:

#!/bin/bash
set -euo pipefail

cache="$(go env GOMODCACHE)"
libgo="$cache/github.com/openshift/library-go@v0.0.0-20260708075158-aa59c3fbacc1"

sed -n '1,260p' "$libgo/pkg/operator/csi/csicontrollerset/csi_controller_set.go"
echo
sed -n '1,260p' "$libgo/pkg/operator/csi/csidrivernodeservicecontroller/csi_driver_node_service_controller.go"
echo
rg -n -C3 'WaitForCacheSync|AddEventHandler|Run\(|Informer|Lister\(' \
  "$libgo/pkg/operator/csi/csicontrollerset" \
  "$libgo/pkg/operator/csi/csidrivernodeservicecontroller"

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 50399


Wire the typed ClusterCSIDriver informer into controller sync. It’s only used as a lister here, so ClusterCSIDriver changes won’t enqueue reconciliation, and the first sync can fall back to defaults before that cache is warm. Add the informer to the controller’s watched informers or an explicit event handler, and wait for its cache sync before csiControllerSet.Run.

🤖 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 `@pkg/operator/starter.go` around lines 75 - 82, The ClusterCSIDriver informer
created by clusterCSIDriverInformer is not connected to reconciliation or
startup synchronization. Add it to the controller’s watched informers or
register an explicit event handler, and ensure its cache is synchronized before
invoking csiControllerSet.Run, while preserving the existing typed lister usage.

Comment on lines +79 to +90
// loadRestConfig builds a *rest.Config from $KUBECONFIG, falling back to
// ~/.kube/config, matching hack/e2e.sh's KUBECONFIG handling.
func loadRestConfig() (*rest.Config, error) {
kubeconfig := os.Getenv("KUBECONFIG")
if kubeconfig == "" {
home, err := os.UserHomeDir()
if err != nil {
return nil, fmt.Errorf("KUBECONFIG is not set and the home directory could not be determined: %w", err)
}
kubeconfig = filepath.Join(home, ".kube", "config")
}
return clientcmd.BuildConfigFromFlags("", kubeconfig)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== file list =="
git ls-files test/e2e/e2e_suite_test.go test/e2e | sed -n '1,120p'

echo
echo "== outline =="
ast-grep outline test/e2e/e2e_suite_test.go --view expanded || true

echo
echo "== relevant lines =="
nl -ba test/e2e/e2e_suite_test.go | sed -n '1,180p'

echo
echo "== search for restConfig.Timeout and context.Background usages in test/e2e =="
rg -n --hidden -S 'restConfig\.Timeout|context\.Background\(\)|BuildConfigFromFlags|Eventually\(' test/e2e

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 916


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== e2e_suite_test.go around loadRestConfig =="
nl -ba test/e2e/e2e_suite_test.go | sed -n '70,120p'

echo
echo "== context and timeout usage across test/e2e =="
rg -n --hidden -S 'Timeout:|timeout:|context\.Background\(\)|context\.WithTimeout|clientcmd\.BuildConfigFromFlags|loadRestConfig\(' test/e2e

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 267


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "== test/e2e/e2e_suite_test.go =="
sed -n '1,180p' test/e2e/e2e_suite_test.go

echo
echo "== search for client calls and Eventually in test/e2e =="
rg -n --hidden -S 'kubeClient|clusterCSIDriverClient|Eventually\(|Consistently\(|context\.Background\(\)|WithTimeout|Timeout:' test/e2e/*.go

echo
echo "== helpers_test.go =="
sed -n '1,260p' test/e2e/helpers_test.go

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 11686


Add a request timeout to the e2e client config. loadRestConfig returns an unbounded rest.Config, and these calls use context.Background(), so a hung API request can block the suite instead of letting Eventually retry until its deadline. Set restConfig.Timeout or use deadline contexts for the client calls.

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

In `@test/e2e/e2e_suite_test.go` around lines 79 - 90, Update loadRestConfig to
assign a finite request timeout on the returned *rest.Config before returning
it, ensuring Kubernetes API calls using context.Background() cannot hang
indefinitely while preserving the existing KUBECONFIG resolution and error
handling.

Source: Path instructions

Comment thread test/e2e/helpers_test.go
Comment on lines +60 to +69
func restoreDriverConfig() {
driver, err := clusterCSIDriverClient.Get(context.Background(), driverName, metav1.GetOptions{})
if err != nil {
GinkgoWriter.Printf("unable to get ClusterCSIDriver %q for restore: %v\n", driverName, err)
return
}
driver.Spec.DriverConfig = originalDriverConfig
if _, err := clusterCSIDriverClient.Update(context.Background(), driver, metav1.UpdateOptions{}); err != nil {
GinkgoWriter.Printf("unable to restore ClusterCSIDriver %q driverConfig: %v\n", driverName, err)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Map the helper file structure first.
ast-grep outline test/e2e/helpers_test.go --view expanded || true

echo '--- helpers_test.go: relevant sections ---'
sed -n '1,180p' test/e2e/helpers_test.go

echo '--- call sites for restoreDriverConfig / setDriverConfig / clearDriverConfig ---'
rg -n "restoreDriverConfig|setDriverConfig|clearDriverConfig|pollTimeout|originalDriverConfig|driverConfig" test/e2e -S

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 9872


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Focus on the helper and its surrounding cleanup flow.
sed -n '1,140p' test/e2e/helpers_test.go

echo '---'
rg -n "restoreDriverConfig|setDriverConfig|clearDriverConfig" test/e2e/helpers_test.go test/e2e -S

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 7120


Retry restoreDriverConfig on conflict
A single Get/Update here can leave ClusterCSIDriver modified for the next run if cleanup hits a resourceVersion conflict or other transient error. Reuse the pollTimeout retry loop from setDriverConfig and surface a failure when restore cannot complete.

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

In `@test/e2e/helpers_test.go` around lines 60 - 69, Update restoreDriverConfig to
use the same pollTimeout retry loop as setDriverConfig, retrying the Get and
Update operations when restoration encounters conflicts or transient errors.
Preserve originalDriverConfig as the desired value, and surface a failure
through the test framework when retries are exhausted instead of silently
returning.

Comment on lines +21 to +35
func patchLiveCSIDriverTokenRequests(audiences []string) {
Eventually(func() error {
driver, err := kubeClient.StorageV1().CSIDrivers().Get(context.Background(), driverName, metav1.GetOptions{})
if err != nil {
return err
}
trs := make([]storagev1.TokenRequest, 0, len(audiences))
for _, a := range audiences {
trs = append(trs, storagev1.TokenRequest{Audience: a})
}
driver.Spec.TokenRequests = trs
_, err = kubeClient.StorageV1().CSIDrivers().Update(context.Background(), driver, metav1.UpdateOptions{})
return err
}, pollTimeout, pollInterval).Should(Succeed(), "failed to manually patch CSIDriver %q tokenRequests", driverName)
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Map relevant files and inspect the test structure.
git ls-files test/e2e | sed -n '1,120p'
echo '--- token_requests_test.go outline ---'
ast-grep outline test/e2e/token_requests_test.go --view expanded || true
echo '--- relevant lines ---'
cat -n test/e2e/token_requests_test.go | sed -n '1,260p'
echo '--- search for CSIDriver cleanup/restore helpers ---'
rg -n "CSIDriver|TokenRequests|clearDriverConfig|driverName|ClusterCSIDriver|AfterSuite|BeforeEach|AfterEach|patchLiveCSIDriverTokenRequests" test/e2e -S

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 16117


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Inspect the specific test file and nearby cleanup logic.
wc -l test/e2e/token_requests_test.go
sed -n '1,260p' test/e2e/token_requests_test.go | nl -ba
echo '--- surrounding cleanup references ---'
rg -n "clearDriverConfig|ClusterCSIDriver|CSIDriver|TokenRequests|RUN_IRREVERSIBLE_E2E|AfterSuite|DeferCleanup|Cleanup" test/e2e/token_requests_test.go test/e2e -S

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 257


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# If the file is small enough, inspect the entire test and any suite cleanup helpers.
sed -n '1,260p' test/e2e/token_requests_test.go | nl -ba
echo '--- other e2e files referencing CSIDriver restoration ---'
rg -n "Update\\(context.Background\\(\\), driver|TokenRequests|ClusterCSIDriver|clearDriverConfig|patchLiveCSIDriverTokenRequests" test/e2e -S

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 221


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Show the relevant test file and any cleanup for live CSIDriver mutations.
nl -ba test/e2e/token_requests_test.go | sed -n '1,260p'
echo '---'
rg -n "clearDriverConfig|AfterSuite|DeferCleanup|TokenRequests|ClusterCSIDriver|CSIDriver" test/e2e -S

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 221


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo '--- test/e2e/e2e_suite_test.go ---'
sed -n '1,140p' test/e2e/e2e_suite_test.go | cat -n

echo '--- test/e2e/helpers_test.go ---'
sed -n '1,140p' test/e2e/helpers_test.go | cat -n

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 10550


Restore the live CSIDriver token requests in cleanup. Restoring only ClusterCSIDriver leaves the manually patched audience behind when driverConfig is omitted or Unmanaged, because the operator preserves the live CSIDriver field in those modes. Capture the original spec.tokenRequests and restore it in cleanup.

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

In `@test/e2e/token_requests_test.go` around lines 21 - 35, Update the test setup
around patchLiveCSIDriverTokenRequests to capture the live CSIDriver’s original
spec.tokenRequests before patching, then restore that value during cleanup.
Ensure cleanup restores the live CSIDriver even when driverConfig is omitted or
Unmanaged, while preserving the existing ClusterCSIDriver restoration.

Signed-off-by: chiragkyal <ckyal@redhat.com>

@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 `@docs/testing-guidelines.md`:
- Around line 55-58: Update the irreversible e2e gating logic documented in
docs/testing-guidelines.md (lines 55-58) and AGENTS.md (line 233) to run only
when RUN_IRREVERSIBLE_E2E is exactly true, so values such as false or other
non-empty strings skip the specs. Preserve the existing ungated test/e2e/azure
exception only when its CI job is guaranteed to use an ephemeral cluster.

In `@test/e2e/helpers_test.go`:
- Around line 60-63: Update setDriverConfig and restoreDriverConfig so each
Patch call uses a bounded, cancellable context instead of context.Background(),
ensuring individual API requests cannot outlive Eventually. Also update
loadRestConfig to configure a request timeout as an additional guard.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 4c770541-aba0-40df-9321-bf0120205cbc

📥 Commits

Reviewing files that changed from the base of the PR and between b1eef36 and fbf01f8.

📒 Files selected for processing (3)
  • AGENTS.md
  • docs/testing-guidelines.md
  • test/e2e/helpers_test.go

Comment on lines +55 to +58
**`tokenRequests.type: Managed` is a one-way, irreversible transition**, enforced by a CEL rule on `ClusterCSIDriver` (see `vendor/github.com/openshift/api/operator/v1/types_csi_cluster_driver.go`) — once set, it can never be reverted to `Unmanaged`, even by clearing `driverConfig` entirely.

- In `test/e2e`, the specs that transition `tokenRequests.type` to `Managed` are isolated in an `Ordered` container and gated behind `RUN_IRREVERSIBLE_E2E=true` (skipped by default), since this suite may run against a persistent developer or CI cluster via plain `make test-e2e`. Set `RUN_IRREVERSIBLE_E2E=true` only if you're certain the cluster's `ClusterCSIDriver` singleton being permanently switched to `Managed` tokenRequests is acceptable.
- `test/e2e/azure` always transitions `tokenRequests.type` to `Managed` (that is the feature under test) and does not gate it, since its target CI job provisions an ephemeral, per-run cluster that is destroyed afterward.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

set -euo pipefail

printf '\n== file list ==\n'
git ls-files | rg '^(docs/testing-guidelines\.md|AGENTS\.md|test/e2e/token_requests_test\.go)$'

printf '\n== relevant snippets ==\n'
for f in docs/testing-guidelines.md AGENTS.md test/e2e/token_requests_test.go; do
  if [ -f "$f" ]; then
    echo "--- $f ---"
    nl -ba "$f" | sed -n '1,260p' | rg -n 'RUN_IRREVERSIBLE_E2E|tokenRequests\.type|Managed|Azure|irreversible|ClusterCSIDriver|Ordered|driverConfig|Unmanaged'
  fi
done

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 364


🏁 Script executed:

set -euo pipefail

# Show the exact surrounding context for the cited lines/files.
for f in docs/testing-guidelines.md AGENTS.md test/e2e/token_requests_test.go; do
  if [ -f "$f" ]; then
    echo "===== $f ====="
    nl -ba "$f" | sed -n '45,75p;225,240p;1,220p'
  fi
done

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 260


🏁 Script executed:

set -euo pipefail
python3 - <<'PY'
from pathlib import Path
p = Path('test/e2e/token_requests_test.go')
if p.exists():
    text = p.read_text()
    for needle in ['RUN_IRREVERSIBLE_E2E', 'os.Getenv', 'Getenv', 'tokenRequests.type', 'Managed', 'Unmanaged']:
        print(f'-- {needle} --')
        for i, line in enumerate(text.splitlines(), 1):
            if needle in line:
                start = max(1, i-3); end = min(len(text.splitlines()), i+3)
                for j in range(start, end+1):
                    print(f"{j}:{text.splitlines()[j-1]}")
                print()
PY

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 11452


🏁 Script executed:

set -euo pipefail

# If the files exist, print only the directly relevant lines with context.
python3 - <<'PY'
from pathlib import Path

targets = [
    ('docs/testing-guidelines.md', range(50, 66)),
    ('AGENTS.md', range(228, 238)),
    ('test/e2e/token_requests_test.go', range(1, 260)),
]
for file, lines in targets:
    p = Path(file)
    print(f"\n===== {file} =====")
    if not p.exists():
        print("MISSING")
        continue
    text = p.read_text().splitlines()
    for n in lines:
        if 1 <= n <= len(text):
            line = text[n-1]
            if any(k in line for k in ['RUN_IRREVERSIBLE_E2E', 'tokenRequests.type', 'Managed', 'Unmanaged', 'Azure', 'irreversible', 'ClusterCSIDriver', 'driverConfig']):
                print(f"{n}:{line}")
PY

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 4865


Require an exact RUN_IRREVERSIBLE_E2E=true gate. The current non-empty check lets RUN_IRREVERSIBLE_E2E=false run the irreversible Managed-transition specs. Keep the Azure exception only if that job is guaranteed ephemeral.

📍 Affects 2 files
  • docs/testing-guidelines.md#L55-L58 (this comment)
  • AGENTS.md#L233-L233
🤖 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 `@docs/testing-guidelines.md` around lines 55 - 58, Update the irreversible e2e
gating logic documented in docs/testing-guidelines.md (lines 55-58) and
AGENTS.md (line 233) to run only when RUN_IRREVERSIBLE_E2E is exactly true, so
values such as false or other non-empty strings skip the specs. Preserve the
existing ungated test/e2e/azure exception only when its CI job is guaranteed to
use an ephemeral cluster.

Source: Coding guidelines

Comment thread test/e2e/helpers_test.go
Comment on lines +60 to +63
Eventually(func() error {
_, err := clusterCSIDriverClient.Patch(context.Background(), driverName, types.MergePatchType, patch, metav1.PatchOptions{})
return err
}, pollTimeout, pollInterval).Should(Succeed(), "failed to update ClusterCSIDriver %q driverConfig", driverName)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C3 'BuildConfigFromFlags|Timeout:|Patch\(context\.Background' test/e2e

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 1558


🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '\n== helpers_test.go ==\n'
sed -n '1,140p' test/e2e/helpers_test.go

printf '\n== e2e_suite_test.go ==\n'
sed -n '1,140p' test/e2e/e2e_suite_test.go

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 9157


Bound the API calls in this suite. setDriverConfig and restoreDriverConfig both use context.Background(), so a hung Patch can outlive Eventually and stall the test run. Pass a bounded context to both calls, and consider setting a request timeout in loadRestConfig() as a second guard.

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

In `@test/e2e/helpers_test.go` around lines 60 - 63, Update setDriverConfig and
restoreDriverConfig so each Patch call uses a bounded, cancellable context
instead of context.Background(), ensuring individual API requests cannot outlive
Eventually. Also update loadRestConfig to configure a request timeout as an
additional guard.

Source: Path instructions

@chiragkyal

Copy link
Copy Markdown
Member Author

/test all

Signed-off-by: chiragkyal <ckyal@redhat.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@go.mod`:
- Line 93: Update the go.opentelemetry.io/otel/sdk dependency from v1.40.0 to
v1.43.0 or newer in go.mod, and align the related OpenTelemetry modules to
compatible versions as 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

Comment thread go.mod
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 // indirect
go.opentelemetry.io/otel/metric v1.41.0 // indirect
go.opentelemetry.io/otel/sdk v1.40.0 // indirect

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

version="$(go list -m -f '{{.Version}}' go.opentelemetry.io/otel/sdk)"
curl -fsSL https://api.osv.dev/v1/query \
  -H 'Content-Type: application/json' \
  --data "{\"package\":{\"ecosystem\":\"Go\",\"name\":\"go.opentelemetry.io/otel/sdk\"},\"version\":\"${version}\"}" |
  jq '{version: "'$version'", vulnerabilities: [.vulns[]?.id]}'

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 262


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "== go.mod excerpt =="
nl -ba go.mod | sed -n '80,105p'

echo
echo "== OSV advisory details =="
curl -fsSL https://api.osv.dev/v1/vulns/GHSA-hfvc-g4fc-pqhx | jq '{
  id,
  summary,
  aliases,
  affected: [.affected[]? | {
    package: .package.name,
    ranges: [.ranges[]? | {
      type,
      events
    }],
    ecosystem_specific: .ecosystem_specific
  }]
}'

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 242


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

echo "== go.mod excerpt =="
sed -n '88,98p' go.mod

echo
echo "== OSV advisory details =="
curl -fsSL https://api.osv.dev/v1/vulns/GHSA-hfvc-g4fc-pqhx \
  | jq '{
      id,
      summary,
      aliases,
      affected: [.affected[]? | {
        package: .package.name,
        ecosystem: .package.ecosystem,
        ranges: [.ranges[]? | {
          type,
          events
        }]
      }]
    }'

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 1353


Upgrade the OpenTelemetry SDK
go.opentelemetry.io/otel/sdk v1.40.0 is affected by GHSA-hfvc-g4fc-pqhx / CVE-2026-39883. Bump it to v1.43.0 or newer and keep the OpenTelemetry modules aligned.

Proposed dependency update
-	go.opentelemetry.io/otel/sdk v1.40.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.43.0 // indirect
📝 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
go.opentelemetry.io/otel/sdk v1.40.0 // indirect
go.opentelemetry.io/otel/sdk v1.43.0 // indirect
🧰 Tools
🪛 OSV Scanner (2.4.0)

[HIGH] 93-93: go.opentelemetry.io/otel/sdk 1.40.0: opentelemetry-go: BSD kenv command not using absolute path enables PATH hijacking

(GHSA-hfvc-g4fc-pqhx)

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

In `@go.mod` at line 93, Update the go.opentelemetry.io/otel/sdk dependency from
v1.40.0 to v1.43.0 or newer in go.mod, and align the related OpenTelemetry
modules to compatible versions as needed.

Sources: Path instructions, Linters/SAST tools

@chiragkyal

Copy link
Copy Markdown
Member Author

/test all

Signed-off-by: chiragkyal <ckyal@redhat.com>
@chiragkyal

Copy link
Copy Markdown
Member Author

/test all

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

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

Inline comments:
In `@test/e2e/helpers_test.go`:
- Line 66: Replace raw Kubernetes client error formatting in the retry/error
logs within setDriverConfig and the corresponding helper flows with a sanitized
reason or status code, avoiding direct %v output of err. Apply this at
test/e2e/helpers_test.go lines 66, 111, 138, and 171; preserve the existing log
context and retry behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

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

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: 59e6f95a-0aa9-4b7e-bd3c-3a76a978b653

📥 Commits

Reviewing files that changed from the base of the PR and between 2f8bc41 and e3a3267.

📒 Files selected for processing (6)
  • AGENTS.md
  • Makefile
  • docs/testing-guidelines.md
  • pkg/operator/secretsstore.go
  • test/e2e/helpers_test.go
  • test/e2e/secret_rotation_test.go
🚧 Files skipped from review as they are similar to previous changes (3)
  • Makefile
  • pkg/operator/secretsstore.go
  • docs/testing-guidelines.md

Comment thread test/e2e/helpers_test.go
attempt++
_, err := clusterCSIDriverClient.Patch(context.Background(), driverName, types.MergePatchType, patch, metav1.PatchOptions{})
if err != nil {
GinkgoWriter.Printf("[setDriverConfig attempt %d] patch failed: %v\n", attempt, err)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail
rg -n -C2 'GinkgoWriter\.Printf\(.*%v' test/e2e/helpers_test.go

Repository: openshift/secrets-store-csi-driver-operator

Length of output: 2860


Avoid logging raw Kubernetes client errors

Transport failures can include the cluster API hostname in test artifacts. Log a sanitized reason/code instead of %v at:

  • test/e2e/helpers_test.go#L66
  • test/e2e/helpers_test.go#L111
  • test/e2e/helpers_test.go#L138
  • test/e2e/helpers_test.go#L171
📍 Affects 1 file
  • test/e2e/helpers_test.go#L66-L66 (this comment)
  • test/e2e/helpers_test.go#L111-L111
  • test/e2e/helpers_test.go#L138-L138
  • test/e2e/helpers_test.go#L171-L171
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/e2e/helpers_test.go` at line 66, Replace raw Kubernetes client error
formatting in the retry/error logs within setDriverConfig and the corresponding
helper flows with a sanitized reason or status code, avoiding direct %v output
of err. Apply this at test/e2e/helpers_test.go lines 66, 111, 138, and 171;
preserve the existing log context and retry behavior.

Source: Coding guidelines

Signed-off-by: chiragkyal <ckyal@redhat.com>
@chiragkyal

Copy link
Copy Markdown
Member Author

/test all

Signed-off-by: chiragkyal <ckyal@redhat.com>
@chiragkyal

Copy link
Copy Markdown
Member Author

/test all

@chiragkyal

Copy link
Copy Markdown
Member Author

/retest

@chiragkyal

Copy link
Copy Markdown
Member Author

/test all

@chiragkyal

Copy link
Copy Markdown
Member Author

/retest

2 similar comments
@chiragkyal

Copy link
Copy Markdown
Member Author

/retest

@chiragkyal

Copy link
Copy Markdown
Member Author

/retest

@openshift-ci

openshift-ci Bot commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

@chiragkyal: all tests passed!

Full PR test history. Your PR dashboard.

Details

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

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

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. do-not-merge/work-in-progress Indicates that a PR should not merge because it is a work in progress.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant