NO-ISSUE: Synchronize From Upstream Repositories#707
NO-ISSUE: Synchronize From Upstream Repositories#707openshift-bot wants to merge 96 commits intoopenshift:mainfrom
Conversation
* e2e: add design spec for test isolation Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * e2e: move bundle test builders to internal/testing/bundle/ Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * e2e: add catalog builder library and registry deployment Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * e2e: convert all tests to per-scenario dynamic catalogs Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * e2e: update extension-developer-e2e to use registry library Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * e2e: remove old static test infrastructure and clean up * e2e: use port-forward instead of hostPort for registry access Replace the localhost:30000 hostPort-based registry access with Kubernetes port-forwarding. This makes the test runner work regardless of the cluster network topology (not just kind with extraPortMappings). - Remove port 30000 extraPortMappings from kind configs - Add PortForward() to the registry package using SPDY - Use port-forward in e2e steps and extension-developer-e2e - Remove LOCAL_REGISTRY_HOST env var (no longer needed) - Keep NodePort service for containerd on kind nodes (hosts.toml) * e2e: bump experimental e2e timeout to 20m --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Bumps [github.com/moby/spdystream](https://github.com/moby/spdystream) from 0.5.0 to 0.5.1. - [Release notes](https://github.com/moby/spdystream/releases) - [Commits](moby/spdystream@v0.5.0...v0.5.1) --- updated-dependencies: - dependency-name: github.com/moby/spdystream dependency-version: 0.5.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
@openshift-bot: This pull request explicitly references no jira issue. DetailsIn 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-bot: GitHub didn't allow me to request PR reviews from the following users: openshift/openshift-team-operator-framework. Note that only openshift members and repo collaborators can review this PR, and authors cannot review their own PRs. DetailsIn 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 kubernetes-sigs/prow repository. |
WalkthroughThis PR replaces static test catalogs/bundles with runtime, per-scenario bundle and FBC catalog builders, adds in-cluster registry deployment and port-forward helpers, parameterizes scenario resources ( Changes
Sequence Diagram(s)sequenceDiagram
participant Test as E2E Test
participant Registry as In-Cluster Registry
participant Catalog as Catalog Builder
participant Cluster as Kubernetes Cluster
Test->>Registry: Deploy registry + certs (Deploy)
Registry-->>Test: Ready
Test->>Registry: Port-forward (PortForward) -> localhost:port
Test->>Catalog: Build bundle (parameterized by scenario)
Catalog->>Registry: Push bundle (crane -> localhost:port)
Test->>Catalog: Build catalog image (FBC)
Catalog->>Registry: Push catalog image
Test->>Cluster: Create ClusterCatalog referencing catalog image
Cluster->>Registry: Pull catalog image (Service DNS)
Test->>Cluster: Create ClusterExtension selecting package
Cluster->>Registry: Pull bundle image
Test->>Cluster: Run assertions
Test->>Cluster: Delete ClusterCatalog/ClusterExtension (cleanup)
sequenceDiagram
participant Test as E2E Test (Previous)
participant Testdata as Pre-built Testdata
participant Cluster as Kubernetes Cluster
Test->>Testdata: Use static bundles/catalogs
Test->>Cluster: Apply static ClusterCatalog (hardcoded refs)
Cluster->>Cluster: Serve bundles from static catalog
Test->>Cluster: Create ClusterExtension (packageName: test)
Test->>Cluster: Run assertions (shared names)
Test->>Cluster: Cleanup (fixed names)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~55 minutes Important Pre-merge checks failedPlease resolve all errors before merging. Addressing warnings is optional. ❌ Failed checks (1 error, 3 warnings, 1 inconclusive)
✅ Passed checks (7 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🧹 Nitpick comments (6)
test/e2e/steps/hooks.go (1)
225-239: Consider bounding cleanup concurrency.Spawning one goroutine per resource can burst
kubectlprocess/API concurrency in larger scenarios. A small semaphore keeps cleanup parallel but more predictable.Suggested refactor
+ const maxConcurrentDeletes = 8 + sem := make(chan struct{}, maxConcurrentDeletes) var wg sync.WaitGroup for _, r := range forDeletion { wg.Add(1) go func(res resource) { defer wg.Done() + sem <- struct{}{} + defer func() { <-sem }() args := []string{"delete", res.kind, res.name, "--ignore-not-found=true"} if res.namespace != "" { args = append(args, "-n", res.namespace) } if _, err := k8sClient(args...); err != nil { logger.Info("Error deleting resource", "name", res.name, "namespace", res.namespace, "stderr", stderrOutput(err)) } }(r) }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/e2e/steps/hooks.go` around lines 225 - 239, The cleanup spawns an unbounded goroutine per resource (loop over forDeletion) which can flood kubectl; add a small concurrency limit (e.g., a buffered semaphore channel size 5) and acquire it before starting each goroutine and release it when the goroutine finishes so k8sClient calls are bounded; keep using the existing wg sync.WaitGroup to wait for completion and continue to log errors via logger.Info and stderrOutput(err) inside the goroutine (reference symbols: forDeletion, k8sClient, stderrOutput, logger, wg, resource).test/e2e/README.md (1)
295-297: Clarify ClusterObjectSet cleanup as conditional.
ScenarioCleanuponly enqueues ClusterObjectSet deletion when the BoxcutterRuntime gate is enabled, so documenting this condition would be more precise.Suggested wording tweak
-- Deletes ClusterExtensions and ClusterObjectSets +- Deletes ClusterExtensions and (when present) ClusterObjectSets🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/e2e/README.md` around lines 295 - 297, Update the README list item about ClusterObjectSet cleanup to clarify it is conditional: mention that ScenarioCleanup enqueues ClusterObjectSet deletion only when the BoxcutterRuntime gate is enabled (reference ScenarioCleanup and BoxcutterRuntime), so change the wording from the current unconditional "Deletes ClusterObjectSets" to something like "Deletes ClusterObjectSets (only when BoxcutterRuntime gate is enabled)" or equivalent.test/internal/catalog/catalog_test.go (1)
137-144: Channel ordering relies on insertion order.The test assumes
alphais at index 0 andbetaat index 1. This works because channels are defined in that order inWithPackage(...), but the test would break if channel ordering changes.Consider making the test more robust by searching for channels by name rather than relying on index position:
// Find channel by name instead of assuming order var alpha, beta *channel for i := range pkg.channels { switch pkg.channels[i].name { case "alpha": alpha = &pkg.channels[i] case "beta": beta = &pkg.channels[i] } }🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/internal/catalog/catalog_test.go` around lines 137 - 144, The test relies on slice order when accessing pkg.channels[0]/[1]; instead iterate pkg.channels to locate channels by their name ("alpha" and "beta") and assign them to local variables (e.g., alpha, beta) before asserting their properties; update the assertions in the test to check that the found channel pointers are non-nil and that len(alpha.entries) and len(beta.entries) match expected counts, using the existing pkg.channels, alpha, and beta identifiers to locate and validate channels rather than fixed indices.test/extension-developer-e2e/setup.sh (1)
91-95: Minor: Excessive blank lines.There are multiple consecutive blank lines between the push comment and the FBC section header.
Suggested cleanup
-# Push is handled by the Go test via crane + port-forward, -# because docker push goes through the Docker daemon which -# may be in a different network context (e.g. colima VM). - - +# Push is handled by the Go test via crane + port-forward, +# because docker push goes through the Docker daemon which +# may be in a different network context (e.g. colima VM). + ###############################🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/extension-developer-e2e/setup.sh` around lines 91 - 95, There are multiple consecutive blank lines after the push comment block; remove the extra blank lines so there is only a single blank line separating that comment ("Push is handled by the Go test via crane + port-forward...") and the following FBC section header to keep the script tidy and readable.test/e2e/steps/steps.go (1)
230-244:projectRootDirpanics if go.mod is not found.While this is acceptable for test code since it indicates a fundamental setup problem, consider whether a more graceful error return would be appropriate for debugging CI issues.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/e2e/steps/steps.go` around lines 230 - 244, projectRootDir currently panics when no go.mod is found; change it to return (string, error) so callers can handle failures gracefully: update function signature projectRootDir() to projectRootDir() (string, error), replace the panic("could not find project root (no go.mod found)") with returning "", fmt.Errorf("could not find project root: no go.mod found"), and update all callers in this file (and tests) to handle the error (log/fail the test or t.Fatal in test contexts) instead of relying on a panic.docs/designs/testing/2026-04-13-e2e-isolation/design.md (1)
15-24: Add language specifier to fenced code block.The ASCII flow diagram code block is missing a language identifier. While this doesn't affect functionality, adding
textor leaving it explicit improves markdown linting compliance.📝 Suggested fix
-``` +```text Scenario starts -> Generate parameterized bundle manifests (CRD names, deployments, etc. include scenario ID)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/designs/testing/2026-04-13-e2e-isolation/design.md` around lines 15 - 24, Add a language specifier to the fenced code block containing the ASCII flow diagram that begins with "Scenario starts" so markdown linters recognize it as plain text; edit the triple-backtick fence that wraps the flow (the block listing steps like "Generate parameterized bundle manifests..." and "Create ClusterCatalog...") to use ```text (or another explicit identifier) instead of an untyped ``` fence.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@test/e2e/steps/steps.go`:
- Around line 1682-1688: The parsing branch that handles strings.HasPrefix(part,
"LargeCRD(") currently calls strconv.Atoi on countStr and ignores errors; change
this to surface parse failures instead of silently skipping: after extracting
countStr, check err from strconv.Atoi and on error return or propagate a
descriptive error (including the offending part and countStr) from the parsing
function, or at minimum log the failure before continuing; ensure the code still
calls catalog.WithLargeCRD(count) only when Atoi succeeds so that opts is not
silently incomplete.
In `@test/internal/catalog/catalog.go`:
- Around line 157-160: The inner variable `tag` inside the loop shadows the
`tag` parameter of the Build function; rename the inner variable (for example to
`bundleTag` or `pushTag`) in the fmt.Sprintf assignment and in the subsequent
error message/usage so the code uses a distinct identifier (e.g., replace `tag
:= fmt.Sprintf(...)` with `bundleTag := fmt.Sprintf(...)` and update the
`crane.Push` call and the fmt.Errorf to reference `bundleTag`) to avoid
shadowing and potential confusion in Build.
---
Nitpick comments:
In `@docs/designs/testing/2026-04-13-e2e-isolation/design.md`:
- Around line 15-24: Add a language specifier to the fenced code block
containing the ASCII flow diagram that begins with "Scenario starts" so markdown
linters recognize it as plain text; edit the triple-backtick fence that wraps
the flow (the block listing steps like "Generate parameterized bundle
manifests..." and "Create ClusterCatalog...") to use ```text (or another
explicit identifier) instead of an untyped ``` fence.
In `@test/e2e/README.md`:
- Around line 295-297: Update the README list item about ClusterObjectSet
cleanup to clarify it is conditional: mention that ScenarioCleanup enqueues
ClusterObjectSet deletion only when the BoxcutterRuntime gate is enabled
(reference ScenarioCleanup and BoxcutterRuntime), so change the wording from the
current unconditional "Deletes ClusterObjectSets" to something like "Deletes
ClusterObjectSets (only when BoxcutterRuntime gate is enabled)" or equivalent.
In `@test/e2e/steps/hooks.go`:
- Around line 225-239: The cleanup spawns an unbounded goroutine per resource
(loop over forDeletion) which can flood kubectl; add a small concurrency limit
(e.g., a buffered semaphore channel size 5) and acquire it before starting each
goroutine and release it when the goroutine finishes so k8sClient calls are
bounded; keep using the existing wg sync.WaitGroup to wait for completion and
continue to log errors via logger.Info and stderrOutput(err) inside the
goroutine (reference symbols: forDeletion, k8sClient, stderrOutput, logger, wg,
resource).
In `@test/e2e/steps/steps.go`:
- Around line 230-244: projectRootDir currently panics when no go.mod is found;
change it to return (string, error) so callers can handle failures gracefully:
update function signature projectRootDir() to projectRootDir() (string, error),
replace the panic("could not find project root (no go.mod found)") with
returning "", fmt.Errorf("could not find project root: no go.mod found"), and
update all callers in this file (and tests) to handle the error (log/fail the
test or t.Fatal in test contexts) instead of relying on a panic.
In `@test/extension-developer-e2e/setup.sh`:
- Around line 91-95: There are multiple consecutive blank lines after the push
comment block; remove the extra blank lines so there is only a single blank line
separating that comment ("Push is handled by the Go test via crane +
port-forward...") and the following FBC section header to keep the script tidy
and readable.
In `@test/internal/catalog/catalog_test.go`:
- Around line 137-144: The test relies on slice order when accessing
pkg.channels[0]/[1]; instead iterate pkg.channels to locate channels by their
name ("alpha" and "beta") and assign them to local variables (e.g., alpha, beta)
before asserting their properties; update the assertions in the test to check
that the found channel pointers are non-nil and that len(alpha.entries) and
len(beta.entries) match expected counts, using the existing pkg.channels, alpha,
and beta identifiers to locate and validate channels rather than fixed indices.
🪄 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: Pro Plus
Run ID: 826ca925-b967-41ea-9da3-e970d83aa992
⛔ Files ignored due to path filters (217)
go.sumis excluded by!**/*.sumopenshift/tests-extension/go.sumis excluded by!**/*.sumopenshift/tests-extension/vendor/github.com/moby/spdystream/NOTICEis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/connection.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/LICENSEis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/PATENTSis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/dictionary.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/options.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/read.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/types.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/write.gois excluded by!**/vendor/**openshift/tests-extension/vendor/modules.txtis excluded by!**/vendor/**testdata/push/go.sumis excluded by!**/*.sumtestdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/build.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/estargz.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/gzip.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/testutil.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/types.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/AUTHORSis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/NOTICEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file_unix.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file_windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/credentials.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_darwin.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_linux.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/file_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/native_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/types/authconfig.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/distribution/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/client/client.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/client/command.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/credentials.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/error.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/helper.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/version.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/and/and_closer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/compression/compression.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/estargz/estargz.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/gzip/zip.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/redact/redact.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/retry/retry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/retry/wait/kubernetes_apimachinery_wait.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/verify/verify.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/windows/windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/zstd/zstd.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/anon.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/auth.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/authn.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/basic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/bearer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/multikeychain.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/compression/compression.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/append.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/catalog.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/copy.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/delete.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/digest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/export.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/filemap.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/get.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/list.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/manifest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/pull.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/push.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/tag.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/logs/logs.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/check.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/digest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/errors.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/ref.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/registry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/repository.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/tag.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/hash.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/blob.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/gc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/layoutpath.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/read.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/manifest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/match/match.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/rebase.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/compressed.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/uncompressed.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/platform.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/progress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/catalog.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/check.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/delete.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/fetcher.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/list.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/mount.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/puller.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/pusher.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/referrers.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/schema1.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/basic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/bearer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/logger.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/ping.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/schemer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/scope.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/transport.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/useragent.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/stream/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.gitattributesis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.gitignoreis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.goreleaser.ymlis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/SECURITY.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/compressible.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bitreader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bitwriter.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bytereader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/compress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/decompress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/fse.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/gen.shis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/.gitignoreis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/bitreader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/bitwriter.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/compress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_amd64.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_amd64.sis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_generic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/huff0.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.sis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/decode.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/decode_other.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/encode.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/encode_other.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/snappy.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/s2sx.modis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/s2sx.sumis excluded by!**/*.sum,!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/bitreader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/bitwriter.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/blockdec.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/blockenc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/blocktype_string.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/bytebuf.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/bytereader.gois excluded by!**/vendor/**
📒 Files selected for processing (83)
Makefiledocs/designs/testing/2026-04-13-e2e-isolation/design.mdgo.modhack/kind-config/containerd/certs.d/docker-registry.operator-controller-e2e.svc.cluster.local:5000/hosts.tomlhack/kind-config/containerd/certs.d/go.modinternal/operator-controller/applier/boxcutter_test.gointernal/operator-controller/applier/provider_test.gointernal/operator-controller/config/config_test.gointernal/operator-controller/config/error_formatting_test.gointernal/operator-controller/rukpak/bundle/source/source_test.gointernal/operator-controller/rukpak/render/registryv1/generators/generators_test.gointernal/operator-controller/rukpak/render/registryv1/registryv1_test.gointernal/operator-controller/rukpak/render/registryv1/validators/validator_test.gointernal/operator-controller/rukpak/render/render_test.gointernal/testing/bundle/csv/builder.gointernal/testing/bundle/csv/builder_test.gointernal/testing/bundle/fs/bundlefs.gointernal/testing/bundle/fs/bundlefs_test.gokind-config/kind-config-2node.yamlkind-config/kind-config.yamlopenshift/tests-extension/go.modtest/e2e/README.mdtest/e2e/features/install.featuretest/e2e/features/recover.featuretest/e2e/features/status.featuretest/e2e/features/uninstall.featuretest/e2e/features/update.featuretest/e2e/features/user-managed-fields.featuretest/e2e/steps/hooks.gotest/e2e/steps/steps.gotest/e2e/steps/testdata/extra-catalog-template.yamltest/e2e/steps/testdata/test-catalog-template.yamltest/e2e/steps/upgrade_steps.gotest/extension-developer-e2e/extension_developer_test.gotest/extension-developer-e2e/setup.shtest/helpers/feature_gates.gotest/helpers/helpers.gotest/internal/catalog/bundle.gotest/internal/catalog/catalog.gotest/internal/catalog/catalog_test.gotest/internal/registry/registry.gotest/upgrade-e2e/features/operator-upgrade.featuretestdata/Dockerfiletestdata/build-test-registry.shtestdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrd.operatorframework.io_largecrdtests.yamltestdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrdoperator.clusterserviceversion.yamltestdata/images/bundles/large-crd-operator/v1.0.0/manifests/script.configmap.yamltestdata/images/bundles/large-crd-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_ownnamespaces.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/manifests/ownnamespaceoperator.clusterserviceversion.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_singlenamespaces.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/manifests/singlenamespaceoperator.clusterserviceversion.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/dummy.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/script.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.0.2/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.3/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.3/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.3/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/script.configmap.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.2.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.2.0/metadata/properties.yamltestdata/images/catalogs/test-catalog/v1/configs/.indexignoretestdata/images/catalogs/test-catalog/v1/configs/catalog.yamltestdata/images/catalogs/test-catalog/v2/configs/.indexignoretestdata/images/catalogs/test-catalog/v2/configs/catalog.yamltestdata/push/README.mdtestdata/push/go.modtestdata/push/push.go
💤 Files with no reviewable changes (46)
- testdata/images/catalogs/test-catalog/v1/configs/.indexignore
- testdata/images/bundles/single-namespace-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/dummy.configmap.yaml
- testdata/images/bundles/test-operator/v1.2.0/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.2.0/metadata/properties.yaml
- testdata/images/catalogs/test-catalog/v2/configs/.indexignore
- testdata/images/bundles/large-crd-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.0.3/manifests/bundle.configmap.yaml
- hack/kind-config/containerd/certs.d/docker-registry.operator-controller-e2e.svc.cluster.local:5000/hosts.toml
- testdata/images/bundles/test-operator/v1.2.0/manifests/bundle.configmap.yaml
- testdata/images/bundles/test-operator/v1.0.2/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.0.3/metadata/annotations.yaml
- testdata/images/bundles/single-namespace-operator/v1.0.0/manifests/singlenamespaceoperator.clusterserviceversion.yaml
- testdata/images/bundles/own-namespace-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.networkpolicy.yaml
- hack/kind-config/containerd/certs.d/go.mod
- testdata/images/bundles/large-crd-operator/v1.0.0/manifests/script.configmap.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/script.configmap.yaml
- test/e2e/steps/testdata/test-catalog-template.yaml
- test/e2e/steps/testdata/extra-catalog-template.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/script.configmap.yaml
- testdata/images/catalogs/test-catalog/v2/configs/catalog.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/olm.operatorframework.com_olme2etest.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/olm.operatorframework.com_olme2etest.yaml
- testdata/images/bundles/test-operator/v1.0.3/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.networkpolicy.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/own-namespace-operator/v1.0.0/manifests/ownnamespaceoperator.clusterserviceversion.yaml
- testdata/push/go.mod
- testdata/images/bundles/single-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_singlenamespaces.yaml
- testdata/push/README.md
- testdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/bundle.configmap.yaml
- testdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrdoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/olm.operatorframework.com_olme2etest.yaml
- kind-config/kind-config-2node.yaml
- testdata/images/bundles/own-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_ownnamespaces.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/bundle.configmap.yaml
- kind-config/kind-config.yaml
- test/helpers/feature_gates.go
- test/helpers/helpers.go
- testdata/Dockerfile
- testdata/images/catalogs/test-catalog/v1/configs/catalog.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.networkpolicy.yaml
| case strings.HasPrefix(part, "LargeCRD(") && strings.HasSuffix(part, ")"): | ||
| // LargeCRD(250) | ||
| countStr := part[len("LargeCRD(") : len(part)-1] | ||
| count, err := strconv.Atoi(countStr) | ||
| if err == nil { | ||
| opts = append(opts, catalog.WithLargeCRD(count)) | ||
| } |
There was a problem hiding this comment.
Silent error handling for LargeCRD field count parsing.
When parsing LargeCRD(...) content, the strconv.Atoi error is silently ignored. If a user provides invalid input like LargeCRD(abc), the option will be silently skipped without any indication of the problem.
🔧 Suggested fix: log or return error for invalid input
case strings.HasPrefix(part, "LargeCRD(") && strings.HasSuffix(part, ")"):
// LargeCRD(250)
countStr := part[len("LargeCRD(") : len(part)-1]
count, err := strconv.Atoi(countStr)
- if err == nil {
- opts = append(opts, catalog.WithLargeCRD(count))
+ if err != nil {
+ logger.V(1).Info("ignoring invalid LargeCRD field count", "value", countStr, "error", err)
+ continue
}
+ opts = append(opts, catalog.WithLargeCRD(count))📝 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.
| case strings.HasPrefix(part, "LargeCRD(") && strings.HasSuffix(part, ")"): | |
| // LargeCRD(250) | |
| countStr := part[len("LargeCRD(") : len(part)-1] | |
| count, err := strconv.Atoi(countStr) | |
| if err == nil { | |
| opts = append(opts, catalog.WithLargeCRD(count)) | |
| } | |
| case strings.HasPrefix(part, "LargeCRD(") && strings.HasSuffix(part, ")"): | |
| // LargeCRD(250) | |
| countStr := part[len("LargeCRD(") : len(part)-1] | |
| count, err := strconv.Atoi(countStr) | |
| if err != nil { | |
| logger.V(1).Info("ignoring invalid LargeCRD field count", "value", countStr, "error", err) | |
| continue | |
| } | |
| opts = append(opts, catalog.WithLargeCRD(count)) |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@test/e2e/steps/steps.go` around lines 1682 - 1688, The parsing branch that
handles strings.HasPrefix(part, "LargeCRD(") currently calls strconv.Atoi on
countStr and ignores errors; change this to surface parse failures instead of
silently skipping: after extracting countStr, check err from strconv.Atoi and on
error return or propagate a descriptive error (including the offending part and
countStr) from the parsing function, or at minimum log the failure before
continuing; ensure the code still calls catalog.WithLargeCRD(count) only when
Atoi succeeds so that opts is not silently incomplete.
| tag := fmt.Sprintf("%s/bundles/%s:v%s", localRegistry, paramPkgName, bd.version) | ||
| if err := crane.Push(img, tag, crane.Insecure, crane.WithContext(ctx)); err != nil { | ||
| return nil, fmt.Errorf("failed to push bundle image %s: %w", tag, err) | ||
| } |
There was a problem hiding this comment.
Variable tag shadows the function parameter.
The tag variable declared on line 157 shadows the tag parameter of the Build method (line 123). This could cause confusion and bugs if the outer tag is needed elsewhere in the loop.
🔧 Suggested fix: rename the inner variable
- tag := fmt.Sprintf("%s/bundles/%s:v%s", localRegistry, paramPkgName, bd.version)
- if err := crane.Push(img, tag, crane.Insecure, crane.WithContext(ctx)); err != nil {
- return nil, fmt.Errorf("failed to push bundle image %s: %w", tag, err)
+ bundleImageTag := fmt.Sprintf("%s/bundles/%s:v%s", localRegistry, paramPkgName, bd.version)
+ if err := crane.Push(img, bundleImageTag, crane.Insecure, crane.WithContext(ctx)); err != nil {
+ return nil, fmt.Errorf("failed to push bundle image %s: %w", bundleImageTag, err)
}📝 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.
| tag := fmt.Sprintf("%s/bundles/%s:v%s", localRegistry, paramPkgName, bd.version) | |
| if err := crane.Push(img, tag, crane.Insecure, crane.WithContext(ctx)); err != nil { | |
| return nil, fmt.Errorf("failed to push bundle image %s: %w", tag, err) | |
| } | |
| bundleImageTag := fmt.Sprintf("%s/bundles/%s:v%s", localRegistry, paramPkgName, bd.version) | |
| if err := crane.Push(img, bundleImageTag, crane.Insecure, crane.WithContext(ctx)); err != nil { | |
| return nil, fmt.Errorf("failed to push bundle image %s: %w", bundleImageTag, err) | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@test/internal/catalog/catalog.go` around lines 157 - 160, The inner variable
`tag` inside the loop shadows the `tag` parameter of the Build function; rename
the inner variable (for example to `bundleTag` or `pushTag`) in the fmt.Sprintf
assignment and in the subsequent error message/usage so the code uses a distinct
identifier (e.g., replace `tag := fmt.Sprintf(...)` with `bundleTag :=
fmt.Sprintf(...)` and update the `crane.Push` call and the fmt.Errorf to
reference `bundleTag`) to avoid shadowing and potential confusion in Build.
|
/retest |
|
/test e2e-gcp-ovn-upgrade |
1 similar comment
|
/test e2e-gcp-ovn-upgrade |
Bumps [golang.org/x/mod](https://github.com/golang/mod) from 0.34.0 to 0.35.0. - [Commits](golang/mod@v0.34.0...v0.35.0) --- updated-dependencies: - dependency-name: golang.org/x/mod dependency-version: 0.35.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [platformdirs](https://github.com/tox-dev/platformdirs) from 4.9.4 to 4.9.6. - [Release notes](https://github.com/tox-dev/platformdirs/releases) - [Changelog](https://github.com/tox-dev/platformdirs/blob/main/docs/changelog.rst) - [Commits](tox-dev/platformdirs@4.9.4...4.9.6) --- updated-dependencies: - dependency-name: platformdirs dependency-version: 4.9.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
/retest |
c53874e to
57c87ba
Compare
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (4)
docs/designs/testing/2026-04-13-e2e-isolation/design.md (1)
15-24: Add language specifier to fenced code block.The code block should have a language specifier for proper syntax highlighting and to satisfy markdownlint MD040.
📝 Suggested fix
-``` +```text Scenario starts -> Generate parameterized bundle manifests (CRD names, deployments, etc. include scenario ID)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/designs/testing/2026-04-13-e2e-isolation/design.md` around lines 15 - 24, The fenced code block in design.md lacks a language specifier which triggers markdownlint MD040; update the opening fence in the block that begins with "Scenario starts" to include a language tag (e.g., use ```text or ```bash) so it becomes a fenced code block with a language specifier, ensuring proper syntax highlighting and lint compliance.test/internal/catalog/catalog_test.go (1)
137-154: Channel ordering assumption may be fragile.The test assumes
pkg.channels[0]is "alpha" andpkg.channels[1]is "beta". This depends on the order channels are added viaChannel()calls. Consider verifying by name lookup instead:♻️ More robust channel lookup
// Find channels by name instead of assuming order var alpha, beta *channelDef for i := range pkg.channels { switch pkg.channels[i].name { case "alpha": alpha = &pkg.channels[i] case "beta": beta = &pkg.channels[i] } } if alpha == nil { t.Fatal("expected 'alpha' channel") } // ... assertions on alpha/beta🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/internal/catalog/catalog_test.go` around lines 137 - 154, The test assumes channel order by indexing pkg.channels[0] and pkg.channels[1], which is fragile; instead locate channels by name (e.g., loop over pkg.channels and set pointers/variables for the entries whose .name == "alpha" and .name == "beta"), assert those pointers are non-nil, and then run the existing assertions against alpha.entries and beta.entries (references: pkg.channels, channelDef/.name, .entries).test/internal/registry/registry.go (1)
79-83: Hardcoded ClusterIssuer reference.The
olmv1-caClusterIssuer is referenced without validation that it exists. If the ClusterIssuer is missing, the Certificate will fail to issue but the error won't surface until the Deployment times out waiting for the TLS secret.Consider adding a pre-check for the ClusterIssuer existence or documenting this prerequisite.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/internal/registry/registry.go` around lines 79 - 83, The Certificate creation references a hardcoded ClusterIssuer "olmv1-ca" via IssuerReference().WithName("olmv1-ca").WithKind("ClusterIssuer") without validating existence; add a pre-check using the cluster API client (e.g., controller-runtime client.Get or dynamic client) to ensure a ClusterIssuer resource named "olmv1-ca" exists before calling WithIssuerRef/creating the Certificate, and if missing either return a clear error (failing fast) or skip the test with a descriptive message; update the test/registry setup code where WithIssuerRef and Certificate are constructed to perform this lookup and branch accordingly.test/internal/catalog/bundle.go (1)
124-141: Static bundle directory error handling could be more defensive.The
readBundleDirfunction will return an error if the directory doesn't exist, but a clearer early check could provide a better error message.♻️ Optional improvement
// Static bundle: read files from disk without parameterization if cfg.staticBundleDir != "" { + if _, err := os.Stat(cfg.staticBundleDir); os.IsNotExist(err) { + return bundleSpec{}, fmt.Errorf("static bundle directory does not exist: %s", cfg.staticBundleDir) + } files, err := readBundleDir(cfg.staticBundleDir)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/internal/catalog/bundle.go` around lines 124 - 141, The static-bundle branch in buildBundle currently calls readBundleDir(cfg.staticBundleDir) directly and surfaces its error; make the handling more defensive by first checking the path exists and is a directory (use os.Stat on cfg.staticBundleDir), return a clear error when the directory does not exist (use fmt.Errorf("static bundle dir %s does not exist", cfg.staticBundleDir)) and return a distinct error if Stat fails for other reasons (e.g., fmt.Errorf("failed to access static bundle dir %s: %w", cfg.staticBundleDir, err)); only then call readBundleDir and keep the existing bundleSpec return.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@Makefile`:
- Line 262: The Makefile unconditionally assigns CLUSTER_REGISTRY_HOST which
prevents shell overrides like CLUSTER_REGISTRY_HOST=... make test-e2e; change
the assignment for the CLUSTER_REGISTRY_HOST variable to a default-only
assignment (e.g., use the Makefile conditional assignment operator so it only
sets a value if none is provided) so test/e2e/steps/steps.go can continue to
read an environment-provided value.
In `@test/e2e/steps/steps.go`:
- Line 137: The step registration sc.Step(...) advertises arbitrary deployments
but MarkDeploymentReadiness only handles the old test-operator pattern for a
single pod and manipulating /var/www/ready; update the implementation or the
step text: either (A) narrow the step regex to explicitly target the
test-operator (e.g. "test-operator deployment ...") so behavior matches
MarkDeploymentReadiness, or (B) enhance MarkDeploymentReadiness to handle
multi-replica deployments by resolving the Deployment name to a pod label
selector, listing all pods for that deployment, and performing the readiness
toggle (exec'ing rm/touch or the equivalent) on each pod container; additionally
detect and bail with a clear error if pods use a different readinessProbe
(inspect pod.spec.containers[].readinessProbe) instead of assuming
/var/www/ready. Apply the same change where the step is duplicated (lines
~1742-1772).
- Around line 62-90: deployImageRegistry currently returns nil on non-kind
clusters which lets startRegistryPortForward and registryHosts proceed to
port-forward and produce false positives; change deployImageRegistry to return a
clear sentinel error (e.g., errNoRegistry) when the providerID check finds a
non-kind cluster, then update startRegistryPortForward (and the registryHosts
logic mentioned around the other block at lines 246-265) to detect that sentinel
error and stop without attempting PortForward, propagating a clear setup error
instead of pretending a registry is available.
- Around line 1528-1606: The parseCatalogTable helper (function
parseCatalogTable) currently indexes row.Cells[0..4] without validating row
width and will panic on malformed tables; update parseCatalogTable to validate
len(row.Cells) >= 5 for each data row (after skipping header) and return a
descriptive error (instead of panicking) when the row is too short, referencing
the package|version|channel|replaces|contents columns; ensure this validation
happens before using bundleKey, bundleDefs, packageChannels or calling
parseContents so subsequent logic (bundleOrder, packageOrder, packageChannels
map population and creation of catalog.Bundle / catalog.Channel entries) only
runs for well-formed rows.
---
Nitpick comments:
In `@docs/designs/testing/2026-04-13-e2e-isolation/design.md`:
- Around line 15-24: The fenced code block in design.md lacks a language
specifier which triggers markdownlint MD040; update the opening fence in the
block that begins with "Scenario starts" to include a language tag (e.g., use
```text or ```bash) so it becomes a fenced code block with a language specifier,
ensuring proper syntax highlighting and lint compliance.
In `@test/internal/catalog/bundle.go`:
- Around line 124-141: The static-bundle branch in buildBundle currently calls
readBundleDir(cfg.staticBundleDir) directly and surfaces its error; make the
handling more defensive by first checking the path exists and is a directory
(use os.Stat on cfg.staticBundleDir), return a clear error when the directory
does not exist (use fmt.Errorf("static bundle dir %s does not exist",
cfg.staticBundleDir)) and return a distinct error if Stat fails for other
reasons (e.g., fmt.Errorf("failed to access static bundle dir %s: %w",
cfg.staticBundleDir, err)); only then call readBundleDir and keep the existing
bundleSpec return.
In `@test/internal/catalog/catalog_test.go`:
- Around line 137-154: The test assumes channel order by indexing
pkg.channels[0] and pkg.channels[1], which is fragile; instead locate channels
by name (e.g., loop over pkg.channels and set pointers/variables for the entries
whose .name == "alpha" and .name == "beta"), assert those pointers are non-nil,
and then run the existing assertions against alpha.entries and beta.entries
(references: pkg.channels, channelDef/.name, .entries).
In `@test/internal/registry/registry.go`:
- Around line 79-83: The Certificate creation references a hardcoded
ClusterIssuer "olmv1-ca" via
IssuerReference().WithName("olmv1-ca").WithKind("ClusterIssuer") without
validating existence; add a pre-check using the cluster API client (e.g.,
controller-runtime client.Get or dynamic client) to ensure a ClusterIssuer
resource named "olmv1-ca" exists before calling WithIssuerRef/creating the
Certificate, and if missing either return a clear error (failing fast) or skip
the test with a descriptive message; update the test/registry setup code where
WithIssuerRef and Certificate are constructed to perform this lookup and branch
accordingly.
🪄 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: f49897d0-f660-47c8-a813-cb6d6075774a
⛔ Files ignored due to path filters (216)
go.sumis excluded by!**/*.sumopenshift/tests-extension/go.sumis excluded by!**/*.sumopenshift/tests-extension/vendor/github.com/moby/spdystream/NOTICEis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/connection.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/LICENSEis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/PATENTSis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/dictionary.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/options.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/read.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/types.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/write.gois excluded by!**/vendor/**openshift/tests-extension/vendor/modules.txtis excluded by!**/vendor/**testdata/push/go.sumis excluded by!**/*.sumtestdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/build.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/estargz.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/gzip.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/testutil.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/types.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/AUTHORSis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/NOTICEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file_unix.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file_windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/credentials.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_darwin.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_linux.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/file_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/native_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/types/authconfig.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/distribution/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/client/client.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/client/command.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/credentials.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/error.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/helper.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/version.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/and/and_closer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/compression/compression.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/estargz/estargz.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/gzip/zip.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/redact/redact.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/retry/retry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/retry/wait/kubernetes_apimachinery_wait.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/verify/verify.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/windows/windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/zstd/zstd.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/anon.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/auth.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/authn.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/basic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/bearer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/multikeychain.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/compression/compression.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/append.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/catalog.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/copy.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/delete.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/digest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/export.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/filemap.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/get.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/list.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/manifest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/pull.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/push.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/tag.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/logs/logs.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/check.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/digest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/errors.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/ref.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/registry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/repository.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/tag.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/hash.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/blob.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/gc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/layoutpath.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/read.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/manifest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/match/match.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/rebase.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/compressed.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/uncompressed.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/platform.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/progress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/catalog.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/check.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/delete.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/fetcher.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/list.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/mount.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/puller.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/pusher.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/referrers.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/schema1.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/basic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/bearer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/logger.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/ping.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/schemer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/scope.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/transport.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/useragent.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/stream/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.gitattributesis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.gitignoreis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.goreleaser.ymlis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/SECURITY.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/compressible.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bitreader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bitwriter.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bytereader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/compress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/decompress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/fse.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/gen.shis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/.gitignoreis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/bitreader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/bitwriter.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/compress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_amd64.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_amd64.sis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_generic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/huff0.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.sis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/decode.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/decode_other.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/encode.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/encode_other.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/snapref/snappy.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/s2sx.modis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/s2sx.sumis excluded by!**/*.sum,!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/bitreader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/bitwriter.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/blockdec.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/blockenc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/blocktype_string.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/zstd/bytebuf.gois excluded by!**/vendor/**
📒 Files selected for processing (84)
Makefiledocs/designs/testing/2026-04-13-e2e-isolation/design.mdgo.modhack/kind-config/containerd/certs.d/docker-registry.operator-controller-e2e.svc.cluster.local:5000/hosts.tomlhack/kind-config/containerd/certs.d/go.modinternal/operator-controller/applier/boxcutter_test.gointernal/operator-controller/applier/provider_test.gointernal/operator-controller/config/config_test.gointernal/operator-controller/config/error_formatting_test.gointernal/operator-controller/rukpak/bundle/source/source_test.gointernal/operator-controller/rukpak/render/registryv1/generators/generators_test.gointernal/operator-controller/rukpak/render/registryv1/registryv1_test.gointernal/operator-controller/rukpak/render/registryv1/validators/validator_test.gointernal/operator-controller/rukpak/render/render_test.gointernal/testing/bundle/csv/builder.gointernal/testing/bundle/csv/builder_test.gointernal/testing/bundle/fs/bundlefs.gointernal/testing/bundle/fs/bundlefs_test.gokind-config/kind-config-2node.yamlkind-config/kind-config.yamlopenshift/tests-extension/go.modrequirements.txttest/e2e/README.mdtest/e2e/features/install.featuretest/e2e/features/recover.featuretest/e2e/features/status.featuretest/e2e/features/uninstall.featuretest/e2e/features/update.featuretest/e2e/features/user-managed-fields.featuretest/e2e/steps/hooks.gotest/e2e/steps/steps.gotest/e2e/steps/testdata/extra-catalog-template.yamltest/e2e/steps/testdata/test-catalog-template.yamltest/e2e/steps/upgrade_steps.gotest/extension-developer-e2e/extension_developer_test.gotest/extension-developer-e2e/setup.shtest/helpers/feature_gates.gotest/helpers/helpers.gotest/internal/catalog/bundle.gotest/internal/catalog/catalog.gotest/internal/catalog/catalog_test.gotest/internal/registry/registry.gotest/upgrade-e2e/features/operator-upgrade.featuretestdata/Dockerfiletestdata/build-test-registry.shtestdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrd.operatorframework.io_largecrdtests.yamltestdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrdoperator.clusterserviceversion.yamltestdata/images/bundles/large-crd-operator/v1.0.0/manifests/script.configmap.yamltestdata/images/bundles/large-crd-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_ownnamespaces.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/manifests/ownnamespaceoperator.clusterserviceversion.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_singlenamespaces.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/manifests/singlenamespaceoperator.clusterserviceversion.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/dummy.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/script.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.0.2/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.3/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.3/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.3/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/script.configmap.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.2.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.2.0/metadata/properties.yamltestdata/images/catalogs/test-catalog/v1/configs/.indexignoretestdata/images/catalogs/test-catalog/v1/configs/catalog.yamltestdata/images/catalogs/test-catalog/v2/configs/.indexignoretestdata/images/catalogs/test-catalog/v2/configs/catalog.yamltestdata/push/README.mdtestdata/push/go.modtestdata/push/push.go
💤 Files with no reviewable changes (46)
- testdata/images/bundles/single-namespace-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/catalogs/test-catalog/v2/configs/.indexignore
- testdata/images/bundles/test-operator/v1.0.0/manifests/dummy.configmap.yaml
- testdata/images/bundles/large-crd-operator/v1.0.0/metadata/annotations.yaml
- hack/kind-config/containerd/certs.d/docker-registry.operator-controller-e2e.svc.cluster.local:5000/hosts.toml
- testdata/images/bundles/own-namespace-operator/v1.0.0/metadata/annotations.yaml
- testdata/push/go.mod
- hack/kind-config/containerd/certs.d/go.mod
- testdata/images/catalogs/test-catalog/v1/configs/.indexignore
- test/e2e/steps/testdata/test-catalog-template.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/bundle.configmap.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.networkpolicy.yaml
- testdata/images/bundles/test-operator/v1.0.3/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.0.2/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.networkpolicy.yaml
- testdata/images/bundles/large-crd-operator/v1.0.0/manifests/script.configmap.yaml
- testdata/images/bundles/test-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/catalogs/test-catalog/v2/configs/catalog.yaml
- testdata/images/bundles/test-operator/v1.2.0/metadata/properties.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/bundle.configmap.yaml
- testdata/Dockerfile
- testdata/images/bundles/test-operator/v1.0.2/manifests/olm.operatorframework.com_olme2etest.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/catalogs/test-catalog/v1/configs/catalog.yaml
- test/e2e/steps/testdata/extra-catalog-template.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/bundle.configmap.yaml
- testdata/push/README.md
- testdata/images/bundles/test-operator/v1.0.0/manifests/olm.operatorframework.com_olme2etest.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/script.configmap.yaml
- testdata/images/bundles/own-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_ownnamespaces.yaml
- testdata/images/bundles/test-operator/v1.2.0/metadata/annotations.yaml
- testdata/images/bundles/single-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_singlenamespaces.yaml
- kind-config/kind-config.yaml
- testdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrdoperator.clusterserviceversion.yaml
- testdata/images/bundles/own-namespace-operator/v1.0.0/manifests/ownnamespaceoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/script.configmap.yaml
- testdata/images/bundles/single-namespace-operator/v1.0.0/manifests/singlenamespaceoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.0.3/metadata/annotations.yaml
- kind-config/kind-config-2node.yaml
- testdata/images/bundles/test-operator/v1.0.3/manifests/bundle.configmap.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.networkpolicy.yaml
- test/helpers/feature_gates.go
- testdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/olm.operatorframework.com_olme2etest.yaml
- test/helpers/helpers.go
✅ Files skipped from review due to trivial changes (11)
- requirements.txt
- openshift/tests-extension/go.mod
- internal/testing/bundle/fs/bundlefs.go
- internal/operator-controller/config/error_formatting_test.go
- internal/operator-controller/config/config_test.go
- internal/operator-controller/rukpak/render/registryv1/registryv1_test.go
- internal/operator-controller/rukpak/bundle/source/source_test.go
- test/e2e/README.md
- test/upgrade-e2e/features/operator-upgrade.feature
- internal/operator-controller/rukpak/render/render_test.go
- internal/operator-controller/rukpak/render/registryv1/generators/generators_test.go
🚧 Files skipped from review as they are similar to previous changes (14)
- internal/testing/bundle/csv/builder.go
- go.mod
- testdata/build-test-registry.sh
- internal/testing/bundle/fs/bundlefs_test.go
- test/e2e/features/uninstall.feature
- internal/testing/bundle/csv/builder_test.go
- test/extension-developer-e2e/extension_developer_test.go
- test/e2e/features/status.feature
- internal/operator-controller/applier/boxcutter_test.go
- test/e2e/steps/upgrade_steps.go
- test/internal/catalog/catalog.go
- test/e2e/features/user-managed-fields.feature
- test/e2e/features/recover.feature
- test/e2e/features/update.feature
| deployImageRegistry = sync.OnceValue(func() error { | ||
| if os.Getenv("KIND_CLUSTER_NAME") == "" { | ||
| // Only deploy the registry on kind clusters | ||
| providerID, err := k8sClient("get", "nodes", "-o", "jsonpath={.items[0].spec.providerID}") | ||
| if err != nil || !strings.HasPrefix(providerID, "kind://") { | ||
| return nil | ||
| } | ||
| cmd := exec.Command("bash", "-c", "make image-registry") | ||
| dir, _ := os.LookupEnv("ROOT_DIR") | ||
| if dir == "" { | ||
| return fmt.Errorf("ROOT_DIR environment variable not set") | ||
|
|
||
| cfg, err := ctrl.GetConfig() | ||
| if err != nil { | ||
| return fmt.Errorf("failed to get kubeconfig: %w", err) | ||
| } | ||
| cmd.Dir = dir | ||
| cmd.Env = append(os.Environ(), fmt.Sprintf("KUBECONFIG=%s", kubeconfigPath)) | ||
| cmd.Stdout = os.Stdout | ||
| cmd.Stderr = os.Stderr | ||
| return cmd.Run() | ||
| return testregistry.Deploy(context.Background(), cfg, testregistry.DefaultNamespace, testregistry.DefaultName) | ||
| }) | ||
| startRegistryPortForward = sync.OnceValues(func() (string, error) { | ||
| if err := deployImageRegistry(); err != nil { | ||
| return "", err | ||
| } | ||
| cfg, err := ctrl.GetConfig() | ||
| if err != nil { | ||
| return "", fmt.Errorf("failed to get kubeconfig: %w", err) | ||
| } | ||
| // Port-forward lives for the duration of the test process; | ||
| // the stop function is not needed because the goroutine is | ||
| // cleaned up on process exit. | ||
| localAddr, _, err := testregistry.PortForward(context.Background(), cfg, testregistry.DefaultNamespace, testregistry.DefaultName) | ||
| if err != nil { | ||
| return "", fmt.Errorf("failed to start port-forward to registry: %w", err) | ||
| } | ||
| return localAddr, nil |
There was a problem hiding this comment.
Don’t report registry availability on non-kind clusters without verifying it.
Outside kind, deployImageRegistry() returns nil immediately, but registryHosts() still unconditionally tries to port-forward testregistry.DefaultNamespace/testregistry.DefaultName. That makes an image registry is available a false positive and shifts the failure to the first catalog build instead of failing at the setup step with a clear error.
Also applies to: 246-265
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@test/e2e/steps/steps.go` around lines 62 - 90, deployImageRegistry currently
returns nil on non-kind clusters which lets startRegistryPortForward and
registryHosts proceed to port-forward and produce false positives; change
deployImageRegistry to return a clear sentinel error (e.g., errNoRegistry) when
the providerID check finds a non-kind cluster, then update
startRegistryPortForward (and the registryHosts logic mentioned around the other
block at lines 246-265) to detect that sentinel error and stop without
attempting PortForward, propagating a clear setup error instead of pretending a
registry is available.
| // parseCatalogTable parses a Gherkin data table into catalog.PackageOption slices. | ||
| // Table columns: package | version | channel | replaces | contents | ||
| func parseCatalogTable(table *godog.Table) ([]catalog.PackageOption, error) { | ||
| type bundleKey struct { | ||
| pkg string | ||
| version string | ||
| } | ||
| type bundleEntry struct { | ||
| opts []catalog.BundleOption | ||
| } | ||
| type channelEntry struct { | ||
| version string | ||
| replaces string | ||
| } | ||
|
|
||
| _, err = k8scliWithInput(substituteScenarioVars(string(yamlContent), sc), "apply", "-f", "-") | ||
| if err != nil { | ||
| return fmt.Errorf("failed to apply catalog: %v", err) | ||
| bundleDefs := make(map[bundleKey]*bundleEntry) | ||
| var bundleOrder []bundleKey | ||
| packageChannels := make(map[string]map[string][]channelEntry) | ||
| var packageOrder []string | ||
| packageSeen := make(map[string]bool) | ||
|
|
||
| for _, row := range table.Rows[1:] { // skip header | ||
| pkg := row.Cells[0].Value | ||
| version := row.Cells[1].Value | ||
| channel := row.Cells[2].Value | ||
| replaces := row.Cells[3].Value | ||
| contents := row.Cells[4].Value | ||
|
|
||
| if !packageSeen[pkg] { | ||
| packageOrder = append(packageOrder, pkg) | ||
| packageSeen[pkg] = true | ||
| } | ||
|
|
||
| bk := bundleKey{pkg: pkg, version: version} | ||
| if _, exists := bundleDefs[bk]; exists { | ||
| if strings.TrimSpace(contents) != "" { | ||
| return nil, fmt.Errorf("duplicate bundle %s/%s: contents must be empty for repeated versions", pkg, version) | ||
| } | ||
| } else { | ||
| opts := parseContents(contents) | ||
| bundleDefs[bk] = &bundleEntry{opts: opts} | ||
| bundleOrder = append(bundleOrder, bk) | ||
| } | ||
|
|
||
| if packageChannels[pkg] == nil { | ||
| packageChannels[pkg] = make(map[string][]channelEntry) | ||
| } | ||
| packageChannels[pkg][channel] = append(packageChannels[pkg][channel], channelEntry{ | ||
| version: version, | ||
| replaces: replaces, | ||
| }) | ||
| } | ||
|
|
||
| return nil | ||
| } | ||
| var pkgOpts []catalog.PackageOption | ||
| for _, pkgName := range packageOrder { | ||
| var opts []catalog.PackageOption | ||
|
|
||
| // TagCatalogImage adds a new tag to a catalog container image in the local registry using crane. | ||
| func TagCatalogImage(name, oldTag, newTag string) error { | ||
| imageRef := fmt.Sprintf("%s/%s", os.Getenv("LOCAL_REGISTRY_HOST"), fmt.Sprintf("e2e/%s-catalog:%s", name, oldTag)) | ||
| return crane.Tag(imageRef, newTag, crane.Insecure) | ||
| for _, bk := range bundleOrder { | ||
| if bk.pkg == pkgName { | ||
| opts = append(opts, catalog.Bundle(bk.version, bundleDefs[bk].opts...)) | ||
| } | ||
| } | ||
|
|
||
| for chName, entries := range packageChannels[pkgName] { | ||
| var chOpts []catalog.ChannelOption | ||
| for _, e := range entries { | ||
| if e.replaces != "" { | ||
| chOpts = append(chOpts, catalog.Entry(e.version, catalog.Replaces(e.replaces))) | ||
| } else { | ||
| chOpts = append(chOpts, catalog.Entry(e.version)) | ||
| } | ||
| } | ||
| opts = append(opts, catalog.Channel(chName, chOpts...)) | ||
| } | ||
|
|
||
| pkgOpts = append(pkgOpts, catalog.WithPackage(pkgName, opts...)) | ||
| } | ||
| return pkgOpts, nil | ||
| } |
There was a problem hiding this comment.
Validate catalog table width before indexing fixed columns.
parseCatalogTable assumes every data row has five cells and will panic on a malformed feature table. This helper should return a step error instead of crashing the suite.
Suggested change
func parseCatalogTable(table *godog.Table) ([]catalog.PackageOption, error) {
+ if len(table.Rows) < 2 {
+ return nil, fmt.Errorf("catalog table must include a header row and at least one data row")
+ }
+ if len(table.Rows[0].Cells) < 5 {
+ return nil, fmt.Errorf("catalog table header must include 5 columns: package, version, channel, replaces, contents")
+ }
+
type bundleKey struct {
pkg string
version string
@@
- for _, row := range table.Rows[1:] { // skip header
+ for rowIdx, row := range table.Rows[1:] { // skip header
+ if len(row.Cells) < 5 {
+ return nil, fmt.Errorf("catalog table row %d has %d cells, expected 5", rowIdx+2, len(row.Cells))
+ }
pkg := row.Cells[0].Value
version := row.Cells[1].Value
channel := row.Cells[2].Value📝 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.
| // parseCatalogTable parses a Gherkin data table into catalog.PackageOption slices. | |
| // Table columns: package | version | channel | replaces | contents | |
| func parseCatalogTable(table *godog.Table) ([]catalog.PackageOption, error) { | |
| type bundleKey struct { | |
| pkg string | |
| version string | |
| } | |
| type bundleEntry struct { | |
| opts []catalog.BundleOption | |
| } | |
| type channelEntry struct { | |
| version string | |
| replaces string | |
| } | |
| _, err = k8scliWithInput(substituteScenarioVars(string(yamlContent), sc), "apply", "-f", "-") | |
| if err != nil { | |
| return fmt.Errorf("failed to apply catalog: %v", err) | |
| bundleDefs := make(map[bundleKey]*bundleEntry) | |
| var bundleOrder []bundleKey | |
| packageChannels := make(map[string]map[string][]channelEntry) | |
| var packageOrder []string | |
| packageSeen := make(map[string]bool) | |
| for _, row := range table.Rows[1:] { // skip header | |
| pkg := row.Cells[0].Value | |
| version := row.Cells[1].Value | |
| channel := row.Cells[2].Value | |
| replaces := row.Cells[3].Value | |
| contents := row.Cells[4].Value | |
| if !packageSeen[pkg] { | |
| packageOrder = append(packageOrder, pkg) | |
| packageSeen[pkg] = true | |
| } | |
| bk := bundleKey{pkg: pkg, version: version} | |
| if _, exists := bundleDefs[bk]; exists { | |
| if strings.TrimSpace(contents) != "" { | |
| return nil, fmt.Errorf("duplicate bundle %s/%s: contents must be empty for repeated versions", pkg, version) | |
| } | |
| } else { | |
| opts := parseContents(contents) | |
| bundleDefs[bk] = &bundleEntry{opts: opts} | |
| bundleOrder = append(bundleOrder, bk) | |
| } | |
| if packageChannels[pkg] == nil { | |
| packageChannels[pkg] = make(map[string][]channelEntry) | |
| } | |
| packageChannels[pkg][channel] = append(packageChannels[pkg][channel], channelEntry{ | |
| version: version, | |
| replaces: replaces, | |
| }) | |
| } | |
| return nil | |
| } | |
| var pkgOpts []catalog.PackageOption | |
| for _, pkgName := range packageOrder { | |
| var opts []catalog.PackageOption | |
| // TagCatalogImage adds a new tag to a catalog container image in the local registry using crane. | |
| func TagCatalogImage(name, oldTag, newTag string) error { | |
| imageRef := fmt.Sprintf("%s/%s", os.Getenv("LOCAL_REGISTRY_HOST"), fmt.Sprintf("e2e/%s-catalog:%s", name, oldTag)) | |
| return crane.Tag(imageRef, newTag, crane.Insecure) | |
| for _, bk := range bundleOrder { | |
| if bk.pkg == pkgName { | |
| opts = append(opts, catalog.Bundle(bk.version, bundleDefs[bk].opts...)) | |
| } | |
| } | |
| for chName, entries := range packageChannels[pkgName] { | |
| var chOpts []catalog.ChannelOption | |
| for _, e := range entries { | |
| if e.replaces != "" { | |
| chOpts = append(chOpts, catalog.Entry(e.version, catalog.Replaces(e.replaces))) | |
| } else { | |
| chOpts = append(chOpts, catalog.Entry(e.version)) | |
| } | |
| } | |
| opts = append(opts, catalog.Channel(chName, chOpts...)) | |
| } | |
| pkgOpts = append(pkgOpts, catalog.WithPackage(pkgName, opts...)) | |
| } | |
| return pkgOpts, nil | |
| } | |
| // parseCatalogTable parses a Gherkin data table into catalog.PackageOption slices. | |
| // Table columns: package | version | channel | replaces | contents | |
| func parseCatalogTable(table *godog.Table) ([]catalog.PackageOption, error) { | |
| if len(table.Rows) < 2 { | |
| return nil, fmt.Errorf("catalog table must include a header row and at least one data row") | |
| } | |
| if len(table.Rows[0].Cells) < 5 { | |
| return nil, fmt.Errorf("catalog table header must include 5 columns: package, version, channel, replaces, contents") | |
| } | |
| type bundleKey struct { | |
| pkg string | |
| version string | |
| } | |
| type bundleEntry struct { | |
| opts []catalog.BundleOption | |
| } | |
| type channelEntry struct { | |
| version string | |
| replaces string | |
| } | |
| bundleDefs := make(map[bundleKey]*bundleEntry) | |
| var bundleOrder []bundleKey | |
| packageChannels := make(map[string]map[string][]channelEntry) | |
| var packageOrder []string | |
| packageSeen := make(map[string]bool) | |
| for rowIdx, row := range table.Rows[1:] { // skip header | |
| if len(row.Cells) < 5 { | |
| return nil, fmt.Errorf("catalog table row %d has %d cells, expected 5", rowIdx+2, len(row.Cells)) | |
| } | |
| pkg := row.Cells[0].Value | |
| version := row.Cells[1].Value | |
| channel := row.Cells[2].Value | |
| replaces := row.Cells[3].Value | |
| contents := row.Cells[4].Value | |
| if !packageSeen[pkg] { | |
| packageOrder = append(packageOrder, pkg) | |
| packageSeen[pkg] = true | |
| } | |
| bk := bundleKey{pkg: pkg, version: version} | |
| if _, exists := bundleDefs[bk]; exists { | |
| if strings.TrimSpace(contents) != "" { | |
| return nil, fmt.Errorf("duplicate bundle %s/%s: contents must be empty for repeated versions", pkg, version) | |
| } | |
| } else { | |
| opts := parseContents(contents) | |
| bundleDefs[bk] = &bundleEntry{opts: opts} | |
| bundleOrder = append(bundleOrder, bk) | |
| } | |
| if packageChannels[pkg] == nil { | |
| packageChannels[pkg] = make(map[string][]channelEntry) | |
| } | |
| packageChannels[pkg][channel] = append(packageChannels[pkg][channel], channelEntry{ | |
| version: version, | |
| replaces: replaces, | |
| }) | |
| } | |
| var pkgOpts []catalog.PackageOption | |
| for _, pkgName := range packageOrder { | |
| var opts []catalog.PackageOption | |
| for _, bk := range bundleOrder { | |
| if bk.pkg == pkgName { | |
| opts = append(opts, catalog.Bundle(bk.version, bundleDefs[bk].opts...)) | |
| } | |
| } | |
| for chName, entries := range packageChannels[pkgName] { | |
| var chOpts []catalog.ChannelOption | |
| for _, e := range entries { | |
| if e.replaces != "" { | |
| chOpts = append(chOpts, catalog.Entry(e.version, catalog.Replaces(e.replaces))) | |
| } else { | |
| chOpts = append(chOpts, catalog.Entry(e.version)) | |
| } | |
| } | |
| opts = append(opts, catalog.Channel(chName, chOpts...)) | |
| } | |
| pkgOpts = append(pkgOpts, catalog.WithPackage(pkgName, opts...)) | |
| } | |
| return pkgOpts, nil | |
| } |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@test/e2e/steps/steps.go` around lines 1528 - 1606, The parseCatalogTable
helper (function parseCatalogTable) currently indexes row.Cells[0..4] without
validating row width and will panic on malformed tables; update
parseCatalogTable to validate len(row.Cells) >= 5 for each data row (after
skipping header) and return a descriptive error (instead of panicking) when the
row is too short, referencing the package|version|channel|replaces|contents
columns; ensure this validation happens before using bundleKey, bundleDefs,
packageChannels or calling parseContents so subsequent logic (bundleOrder,
packageOrder, packageChannels map population and creation of catalog.Bundle /
catalog.Channel entries) only runs for well-formed rows.
|
/retest |
- Set Proxy: http.ProxyFromEnvironment on the custom http.Transport in BuildHTTPClient so HTTPS_PROXY/NO_PROXY env vars are honoured - Add unit tests verifying the transport uses env-based proxy, tunnels connections through an HTTP CONNECT proxy, and fails when the proxy rejects the tunnel - Add an in-process recording proxy and deployment patch helpers to the e2e step library - Add two @httpproxy e2e scenarios: one verifying operator-controller blocks catalog fetches when the proxy is unreachable, one verifying CONNECT requests are routed through a configured proxy Signed-off-by: Todd Short <tshort@redhat.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Bumps [golang.org/x/tools](https://github.com/golang/tools) from 0.43.0 to 0.44.0. - [Release notes](https://github.com/golang/tools/releases) - [Commits](golang/tools@v0.43.0...v0.44.0) --- updated-dependencies: - dependency-name: golang.org/x/tools dependency-version: 0.44.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
|
/cc @openshift/openshift-team-operator-runtime |
|
@tmshort: GitHub didn't allow me to request PR reviews from the following users: openshift/openshift-team-operator-runtime. Note that only openshift members and repo collaborators can review this PR, and authors cannot review their own PRs. DetailsIn 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 kubernetes-sigs/prow repository. |
|
/assign @openshift/openshift-team-operator-runtime |
1 similar comment
|
/assign @openshift/openshift-team-operator-runtime |
|
/assign @tmshort |
Signed-off-by: Todd Short <tshort@redhat.com>
…64 support Signed-off-by: Daniel Franz <dfranz@redhat.com>
Signed-off-by: Todd Short <tshort@redhat.com>
…t in OTE tests Update all remaining references to ClusterExtensionRevision in openshift/tests-extension to use ClusterObjectSet, matching the upstream rename in operator-framework/operator-controller#2589. Files updated: - test/qe/specs/olmv1_ce.go: RBAC resource names and comments - test/olmv1-preflight.go: scenario constants, test names, RBAC rules - .openshift-tests-extension/openshift_payload_olmv1.json: test name - pkg/bindata/qe/bindata.go: embedded RBAC templates - test/qe/testdata/olm/sa-nginx-limited-boxcutter.yaml: RBAC resources - test/qe/testdata/olm/sa-nginx-insufficient-operand-rbac-boxcutter.yaml: RBAC resources Signed-off-by: Camila Macedo <cmacedo@redhat.com> Made-with: Cursor
…s ClusterObjectSet The upstream rename of ClusterExtensionRevision to ClusterObjectSet (operator-framework/operator-controller#2589) breaks the incompatible operator detection in cluster-olm-operator. The cluster-olm-operator binary still reads ClusterExtensionRevision resources to find operators with olm.maxOpenShiftVersion, so after the rename it never detects incompatible operators and InstalledOLMOperatorsUpgradeable stays True. Skip this test when NewOLMBoxCutterRuntime feature gate is enabled until cluster-olm-operator is updated to read ClusterObjectSet. Signed-off-by: Camila Macedo <cmacedo@redhat.com> Made-with: Cursor
Signed-off-by: Francesco Giudici <fgiudici@redhat.com>
Signed-off-by: Todd Short <todd.short@me.com>
…to run outside of OCP
57c87ba to
6362918
Compare
|
[APPROVALNOTIFIER] This PR is APPROVED Approval requirements bypassed by manually added approval. This pull-request has been approved by: openshift-bot The full list of commands accepted by this bot can be found here. The pull request process is described here DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (4)
test/internal/registry/registry.go (2)
203-209: Discarding port-forward output may hinder debugging.Both stdout and stderr are set to
io.Discard. If port-forward issues occur during test runs, there will be no diagnostic output. Consider making this configurable or logging at debug level.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/internal/registry/registry.go` around lines 203 - 209, The port-forwarder is currently discarding all output (io.Discard passed to portforward.New), which removes diagnostic logs for stopChan/readyChan failures; update the call in the registry setup (portforward.New with stopChan and readyChan) to use a configurable io.Writer (e.g., accept a writer or testing.T.Logf-backed writer) or capture stdout/stderr into a buffer and emit its contents at debug level or on error so port-forward stdout/stderr are available for debugging during tests.
178-188: Consider checking pod Ready condition, not just Running phase.The pod selection uses
status.phase=Runningbut doesn't verify the pod is Ready. A pod can be Running but not Ready (e.g., failing readiness probes). For test reliability, consider adding a readiness check or at least documenting why Running is sufficient.💡 Optional: Add Ready condition check
pods, err := clientset.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{ LabelSelector: labelSelector, FieldSelector: "status.phase=Running", }) if err != nil { return "", nil, fmt.Errorf("failed to list pods for deployment %s: %w", name, err) } - if len(pods.Items) == 0 { - return "", nil, fmt.Errorf("no running pods found for deployment %s/%s", namespace, name) + var readyPod *corev1.Pod + for i := range pods.Items { + for _, cond := range pods.Items[i].Status.Conditions { + if cond.Type == corev1.PodReady && cond.Status == corev1.ConditionTrue { + readyPod = &pods.Items[i] + break + } + } + if readyPod != nil { + break + } } - podName := pods.Items[0].Name + if readyPod == nil { + return "", nil, fmt.Errorf("no ready pods found for deployment %s/%s", namespace, name) + } + podName := readyPod.Name🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/internal/registry/registry.go` around lines 178 - 188, The pod listing currently filters only by "status.phase=Running" (clientset.CoreV1().Pods(...).List with FieldSelector "status.phase=Running") and then picks pods.Items[0].Name; update the selection to ensure the chosen pod is Ready by either (a) after listing, iterate pods.Items and check the PodCondition of type "Ready" is Status "True" before selecting podName, or (b) perform an additional readiness check/wait loop (inspect pod.Status.Conditions for Type==corev1.PodReady) and skip pods that are not Ready; update any error messages (e.g., the fmt.Errorf lines) to reflect "no ready pods" when none qualify and ensure labelSelector and namespace usage remains the same.test/e2e/features/proxy.feature (1)
9-10: Adopt scenario-scoped catalog setup in proxy feature for isolation consistency.This file still uses global/static catalog naming, unlike the rest of the migrated e2e suite. Converting to parameterized catalog/package references will avoid cross-scenario coupling.
♻️ Suggested update
Background: Given OLM is available - And ClusterCatalog "test" serves bundles + And an image registry is available + And a catalog "test" with packages: + | package | version | channel | replaces | contents | + | test | 1.0.0 | beta | | CRD, Deployment, ConfigMap | And ServiceAccount "olm-sa" with needed permissions is available in test namespace @@ source: sourceType: Catalog catalog: - packageName: test + packageName: ${PACKAGE:test} selector: matchLabels: - "olm.operatorframework.io/metadata.name": test-catalog + "olm.operatorframework.io/metadata.name": ${CATALOG:test} @@ source: sourceType: Catalog catalog: - packageName: test + packageName: ${PACKAGE:test} selector: matchLabels: - "olm.operatorframework.io/metadata.name": test-catalog + "olm.operatorframework.io/metadata.name": ${CATALOG:test}Also applies to: 28-32, 59-63
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@test/e2e/features/proxy.feature` around lines 9 - 10, The feature uses hardcoded ClusterCatalog "test" and ServiceAccount "olm-sa" which causes cross-scenario coupling; change the steps that declare ClusterCatalog "test" serves bundles and ServiceAccount "olm-sa" to use scenario-scoped parameters (e.g., a generated catalog name and SA tied to the current scenario or example table) so each scenario creates/tears down its own ClusterCatalog and ServiceAccount; update all occurrences (including the other instances around lines 28-32 and 59-63) and adjust any step definitions that accept ClusterCatalog and ServiceAccount names so they consume the parameterized values from the scenario context.docs/designs/testing/2026-04-13-e2e-isolation/design.md (1)
15-24: Add language specifier to fenced code block.The code block describing the scenario workflow lacks a language identifier, which helps with rendering and accessibility.
📝 Suggested fix
-``` +```text Scenario starts -> Generate parameterized bundle manifests (CRD names, deployments, etc. include scenario ID)🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@docs/designs/testing/2026-04-13-e2e-isolation/design.md` around lines 15 - 24, The fenced code block starting with ``` that contains the scenario workflow should include a language specifier for better rendering and accessibility; update the opening fence from ``` to a language-tagged fence such as ```text (i.e., change the block that begins with "Scenario starts" to use ```text) so the renderer treats it as plain text.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@test/extension-developer-e2e/setup.sh`:
- Around line 15-16: The script currently appends the build flag
"--provenance=false" unconditionally which breaks Podman; update the build
invocations that use $CONTAINER_RUNTIME (the commands that pass
"--provenance=false") to only include that flag when CONTAINER_RUNTIME is
"docker" (or its explicit docker binary), e.g. compute a variable like
PROVENANCE_FLAG="" and set it to "--provenance=false" when [
"$CONTAINER_RUNTIME" = "docker" ] and then use "$PROVENANCE_FLAG" in the build
commands so Podman runs without the unsupported flag.
---
Nitpick comments:
In `@docs/designs/testing/2026-04-13-e2e-isolation/design.md`:
- Around line 15-24: The fenced code block starting with ``` that contains the
scenario workflow should include a language specifier for better rendering and
accessibility; update the opening fence from ``` to a language-tagged fence such
as ```text (i.e., change the block that begins with "Scenario starts" to use
```text) so the renderer treats it as plain text.
In `@test/e2e/features/proxy.feature`:
- Around line 9-10: The feature uses hardcoded ClusterCatalog "test" and
ServiceAccount "olm-sa" which causes cross-scenario coupling; change the steps
that declare ClusterCatalog "test" serves bundles and ServiceAccount "olm-sa" to
use scenario-scoped parameters (e.g., a generated catalog name and SA tied to
the current scenario or example table) so each scenario creates/tears down its
own ClusterCatalog and ServiceAccount; update all occurrences (including the
other instances around lines 28-32 and 59-63) and adjust any step definitions
that accept ClusterCatalog and ServiceAccount names so they consume the
parameterized values from the scenario context.
In `@test/internal/registry/registry.go`:
- Around line 203-209: The port-forwarder is currently discarding all output
(io.Discard passed to portforward.New), which removes diagnostic logs for
stopChan/readyChan failures; update the call in the registry setup
(portforward.New with stopChan and readyChan) to use a configurable io.Writer
(e.g., accept a writer or testing.T.Logf-backed writer) or capture stdout/stderr
into a buffer and emit its contents at debug level or on error so port-forward
stdout/stderr are available for debugging during tests.
- Around line 178-188: The pod listing currently filters only by
"status.phase=Running" (clientset.CoreV1().Pods(...).List with FieldSelector
"status.phase=Running") and then picks pods.Items[0].Name; update the selection
to ensure the chosen pod is Ready by either (a) after listing, iterate
pods.Items and check the PodCondition of type "Ready" is Status "True" before
selecting podName, or (b) perform an additional readiness check/wait loop
(inspect pod.Status.Conditions for Type==corev1.PodReady) and skip pods that are
not Ready; update any error messages (e.g., the fmt.Errorf lines) to reflect "no
ready pods" when none qualify and ensure labelSelector and namespace usage
remains the same.
🪄 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: c6d34601-0c3b-40fe-9fbf-04ccb499e879
⛔ Files ignored due to path filters (211)
go.sumis excluded by!**/*.sumopenshift/tests-extension/go.sumis excluded by!**/*.sumopenshift/tests-extension/vendor/github.com/moby/spdystream/NOTICEis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/connection.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/LICENSEis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/PATENTSis excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/dictionary.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/options.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/read.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/types.gois excluded by!**/vendor/**openshift/tests-extension/vendor/github.com/moby/spdystream/spdy/write.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/crypto/ssh/cipher.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/crypto/ssh/client_auth.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/net/http2/hpack/tables.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/net/http2/transport.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/sys/cpu/cpu_darwin_arm64_other.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/sys/cpu/cpu_other_arm64.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/sys/cpu/cpu_windows_arm64.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/sys/windows/dll_windows.gois excluded by!**/vendor/**openshift/tests-extension/vendor/golang.org/x/sys/windows/security_windows.gois excluded by!**/vendor/**openshift/tests-extension/vendor/modules.txtis excluded by!**/vendor/**testdata/push/go.sumis excluded by!**/*.sumtestdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/build.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/estargz.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/gzip.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/testutil.gois excluded by!**/vendor/**testdata/push/vendor/github.com/containerd/stargz-snapshotter/estargz/types.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/AUTHORSis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/NOTICEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file_unix.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/configfile/file_windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/credentials.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_darwin.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_linux.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_unsupported.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/default_store_windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/file_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/credentials/native_store.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/cli/cli/config/types/authconfig.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/distribution/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/distribution/registry/client/auth/challenge/authchallenge.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/client/client.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/client/command.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/credentials.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/error.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/helper.gois excluded by!**/vendor/**testdata/push/vendor/github.com/docker/docker-credential-helpers/credentials/version.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/and/and_closer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/compression/compression.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/estargz/estargz.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/gzip/zip.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/redact/redact.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/retry/retry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/retry/wait/kubernetes_apimachinery_wait.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/verify/verify.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/windows/windows.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/internal/zstd/zstd.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/anon.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/auth.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/authn.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/basic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/bearer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/keychain.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/authn/multikeychain.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/compression/compression.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/append.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/catalog.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/copy.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/delete.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/digest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/export.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/filemap.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/get.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/list.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/manifest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/pull.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/push.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/crane/tag.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/legacy/tarball/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/logs/logs.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/check.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/digest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/errors.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/ref.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/registry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/repository.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/name/tag.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/config.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/empty/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/hash.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/blob.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/gc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/layoutpath.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/read.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/layout/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/manifest.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/match/match.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/mutate.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/mutate/rebase.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/compressed.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/uncompressed.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/partial/with.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/platform.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/progress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/catalog.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/check.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/delete.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/descriptor.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/fetcher.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/index.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/list.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/mount.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/multi_write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/options.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/progress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/puller.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/pusher.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/referrers.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/schema1.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/basic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/bearer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/error.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/logger.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/ping.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/retry.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/schemer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/scope.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/transport.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/transport/useragent.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/remote/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/stream/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/stream/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/doc.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/image.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/layer.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/tarball/write.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/types/types.gois excluded by!**/vendor/**testdata/push/vendor/github.com/google/go-containerregistry/pkg/v1/zz_deepcopy_generated.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.gitattributesis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.gitignoreis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/.goreleaser.ymlis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/LICENSEis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/SECURITY.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/compressible.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bitreader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bitwriter.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/bytereader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/compress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/decompress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/fse/fse.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/gen.shis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/.gitignoreis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/README.mdis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/bitreader.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/bitwriter.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/compress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_amd64.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_amd64.sis excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/decompress_generic.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/huff0/huff0.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.gois excluded by!**/vendor/**testdata/push/vendor/github.com/klauspost/compress/internal/cpuinfo/cpuinfo_amd64.sis excluded by!**/vendor/**
📒 Files selected for processing (89)
Makefiledocs/designs/testing/2026-04-13-e2e-isolation/design.mdgo.modhack/kind-config/containerd/certs.d/docker-registry.operator-controller-e2e.svc.cluster.local:5000/hosts.tomlhack/kind-config/containerd/certs.d/go.modinternal/operator-controller/applier/boxcutter_test.gointernal/operator-controller/applier/provider_test.gointernal/operator-controller/config/config_test.gointernal/operator-controller/config/error_formatting_test.gointernal/operator-controller/rukpak/bundle/source/source_test.gointernal/operator-controller/rukpak/render/registryv1/generators/generators_test.gointernal/operator-controller/rukpak/render/registryv1/registryv1_test.gointernal/operator-controller/rukpak/render/registryv1/validators/validator_test.gointernal/operator-controller/rukpak/render/render_test.gointernal/shared/util/http/httputil.gointernal/shared/util/http/httputil_test.gointernal/testing/bundle/csv/builder.gointernal/testing/bundle/csv/builder_test.gointernal/testing/bundle/fs/bundlefs.gointernal/testing/bundle/fs/bundlefs_test.gokind-config/kind-config-2node.yamlkind-config/kind-config.yamlopenshift/tests-extension/go.modrequirements.txttest/e2e/README.mdtest/e2e/features/install.featuretest/e2e/features/proxy.featuretest/e2e/features/recover.featuretest/e2e/features/status.featuretest/e2e/features/uninstall.featuretest/e2e/features/update.featuretest/e2e/features/user-managed-fields.featuretest/e2e/steps/hooks.gotest/e2e/steps/proxy_steps.gotest/e2e/steps/steps.gotest/e2e/steps/testdata/extra-catalog-template.yamltest/e2e/steps/testdata/test-catalog-template.yamltest/e2e/steps/tls_steps.gotest/e2e/steps/upgrade_steps.gotest/extension-developer-e2e/extension_developer_test.gotest/extension-developer-e2e/setup.shtest/helpers/feature_gates.gotest/helpers/helpers.gotest/internal/catalog/bundle.gotest/internal/catalog/catalog.gotest/internal/catalog/catalog_test.gotest/internal/registry/registry.gotest/upgrade-e2e/features/operator-upgrade.featuretestdata/Dockerfiletestdata/build-test-registry.shtestdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrd.operatorframework.io_largecrdtests.yamltestdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrdoperator.clusterserviceversion.yamltestdata/images/bundles/large-crd-operator/v1.0.0/manifests/script.configmap.yamltestdata/images/bundles/large-crd-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_ownnamespaces.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/manifests/ownnamespaceoperator.clusterserviceversion.yamltestdata/images/bundles/own-namespace-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_singlenamespaces.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/manifests/singlenamespaceoperator.clusterserviceversion.yamltestdata/images/bundles/single-namespace-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/dummy.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/script.configmap.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.0.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.0.2/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.0.3/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.0.3/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.0.3/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/bundle.configmap.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/olm.operatorframework.com_olme2etest.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/script.configmap.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.clusterserviceversion.yamltestdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.networkpolicy.yamltestdata/images/bundles/test-operator/v1.2.0/metadata/annotations.yamltestdata/images/bundles/test-operator/v1.2.0/metadata/properties.yamltestdata/images/catalogs/test-catalog/v1/configs/.indexignoretestdata/images/catalogs/test-catalog/v1/configs/catalog.yamltestdata/images/catalogs/test-catalog/v2/configs/.indexignoretestdata/images/catalogs/test-catalog/v2/configs/catalog.yamltestdata/push/README.mdtestdata/push/go.modtestdata/push/push.go
💤 Files with no reviewable changes (46)
- testdata/images/bundles/single-namespace-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/catalogs/test-catalog/v1/configs/.indexignore
- testdata/images/bundles/large-crd-operator/v1.0.0/metadata/annotations.yaml
- testdata/push/go.mod
- testdata/Dockerfile
- testdata/images/bundles/test-operator/v1.0.3/metadata/annotations.yaml
- test/e2e/steps/testdata/test-catalog-template.yaml
- testdata/images/bundles/own-namespace-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/catalogs/test-catalog/v2/configs/catalog.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.networkpolicy.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.networkpolicy.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/dummy.configmap.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/bundle.configmap.yaml
- testdata/images/bundles/test-operator/v1.0.3/manifests/bundle.configmap.yaml
- testdata/images/bundles/own-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_ownnamespaces.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/script.configmap.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.networkpolicy.yaml
- testdata/push/README.md
- testdata/images/catalogs/test-catalog/v1/configs/catalog.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/script.configmap.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/olm.operatorframework.com_olme2etest.yaml
- testdata/images/bundles/single-namespace-operator/v1.0.0/manifests/olm.operatorframework.com_singlenamespaces.yaml
- kind-config/kind-config.yaml
- testdata/images/bundles/large-crd-operator/v1.0.0/manifests/script.configmap.yaml
- hack/kind-config/containerd/certs.d/docker-registry.operator-controller-e2e.svc.cluster.local:5000/hosts.toml
- test/e2e/steps/testdata/extra-catalog-template.yaml
- testdata/images/bundles/test-operator/v1.0.2/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.2.0/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/testoperator.clusterserviceversion.yaml
- kind-config/kind-config-2node.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/bundle.configmap.yaml
- testdata/images/bundles/test-operator/v1.0.2/manifests/bundle.configmap.yaml
- testdata/images/bundles/test-operator/v1.2.0/metadata/properties.yaml
- testdata/images/bundles/test-operator/v1.0.3/manifests/testoperator.clusterserviceversion.yaml
- hack/kind-config/containerd/certs.d/go.mod
- testdata/images/bundles/test-operator/v1.0.2/manifests/olm.operatorframework.com_olme2etest.yaml
- testdata/images/bundles/own-namespace-operator/v1.0.0/manifests/ownnamespaceoperator.clusterserviceversion.yaml
- testdata/images/bundles/single-namespace-operator/v1.0.0/manifests/singlenamespaceoperator.clusterserviceversion.yaml
- testdata/images/bundles/large-crd-operator/v1.0.0/manifests/largecrdoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.2.0/manifests/testoperator.clusterserviceversion.yaml
- testdata/images/bundles/test-operator/v1.0.0/metadata/annotations.yaml
- testdata/images/bundles/test-operator/v1.0.0/manifests/olm.operatorframework.com_olme2etest.yaml
- testdata/images/catalogs/test-catalog/v2/configs/.indexignore
- test/helpers/feature_gates.go
- test/helpers/helpers.go
✅ Files skipped from review due to trivial changes (10)
- internal/testing/bundle/csv/builder.go
- internal/testing/bundle/fs/bundlefs.go
- requirements.txt
- internal/operator-controller/rukpak/render/registryv1/registryv1_test.go
- internal/testing/bundle/csv/builder_test.go
- testdata/build-test-registry.sh
- test/e2e/features/user-managed-fields.feature
- internal/operator-controller/applier/provider_test.go
- internal/operator-controller/rukpak/render/registryv1/generators/generators_test.go
- internal/operator-controller/rukpak/render/registryv1/validators/validator_test.go
🚧 Files skipped from review as they are similar to previous changes (8)
- internal/operator-controller/config/config_test.go
- test/e2e/features/uninstall.feature
- internal/operator-controller/rukpak/bundle/source/source_test.go
- test/e2e/steps/hooks.go
- openshift/tests-extension/go.mod
- test/internal/catalog/catalog_test.go
- internal/operator-controller/rukpak/render/render_test.go
- test/e2e/features/install.feature
| - \$CONTAINER_RUNTIME - container runtime to use (e.g. docker, podman). | ||
| - \$CLUSTER_REGISTRY_HOST - registry address accessible from inside the cluster. |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/usr/bin/env bash
set -euo pipefail
for rt in docker podman; do
if command -v "$rt" >/dev/null 2>&1; then
echo "== $rt =="
if "$rt" build --help | grep -q -- '--provenance'; then
echo "supports --provenance"
else
echo "does NOT support --provenance"
fi
fi
doneRepository: openshift/operator-framework-operator-controller
Length of output: 74
🏁 Script executed:
# First, locate and examine the setup.sh file
fd setup.shRepository: openshift/operator-framework-operator-controller
Length of output: 130
🏁 Script executed:
# Read the setup.sh file to check lines 15-16, 84, and 140
cat -n test/extension-developer-e2e/setup.sh | head -150Repository: openshift/operator-framework-operator-controller
Length of output: 5500
🌐 Web query:
Podman build --provenance flag support
💡 Result:
Podman does not support the --provenance flag for podman build. Official Podman documentation for versions like v4.4, stable, and v5.2.2 lists extensive build options (e.g., --label, --timestamp, --sbom, --http-proxy) but no --provenance flag. A GitHub issue from Cloudflare's workers-sdk (June 2025) confirms Podman rejects --provenance as an unknown flag, while Docker supports it for SLSA provenance attestations. Podman release notes up to v5.7.0 (Nov 2025) mention no addition of this flag. As of 2026-04-25, use Buildah directly for advanced build features or Docker for --provenance support. Podman focuses on SBOM via --sbom flags instead.
Citations:
- 1: https://docs.podman.io/en/v4.4/markdown/podman-build.1.html
- 2: https://docs.podman.io/en/stable/markdown/podman-build.1.html
- 3: https://manpages.ubuntu.com/manpages/questing/en/man1/docker-build.1.html
- 4: Container builds incompatible with podman cloudflare/workers-sdk#9755
- 5: https://docs.podman.io/en/v5.2.2/markdown/podman-build.1.html
- 6: https://manpages.ubuntu.com/manpages/jammy/en/man1/docker-build.1.html
- 7: http://rpm.pbone.net/manpage_idpl_56661543_numer_1_nazwa_podman-build.html
- 8: https://man.freebsd.org/cgi/man.cgi?manpath=FreeBSD+13.2-RELEASE+and+Ports&query=podman-build&sektion=1
- 9: https://github.com/containers/podman/releases/tag/v5.5.0
Guard --provenance=false usage by runtime to avoid Podman breakage.
The script documents Podman as a supported runtime, but --provenance=false is applied unconditionally at lines 84 and 140. Podman does not support the --provenance flag and will fail with unsupported-flag errors. Apply the flag only when using Docker.
🛠️ Suggested fix (runtime-gated build flags)
operator_sdk="${OPERATOR_SDK}"
container_tool="${CONTAINER_RUNTIME}"
cluster_registry_host="${CLUSTER_REGISTRY_HOST}"
+build_flags=()
+if [[ "${container_tool}" == "docker" ]]; then
+ build_flags+=(--provenance=false)
+fi
@@
- sed -i -e 's/$(CONTAINER_TOOL) build/$(CONTAINER_TOOL) build --provenance=false/' Makefile && \
+ if [[ "${container_tool}" == "docker" ]]; then \
+ sed -i -e 's/$(CONTAINER_TOOL) build/$(CONTAINER_TOOL) build --provenance=false/' Makefile; \
+ fi && \
@@
-${container_tool} build --provenance=false -f "${TMP_ROOT}/catalog.Dockerfile" -t "${catalog_tag}" "${TMP_ROOT}/"
+${container_tool} build "${build_flags[@]}" -f "${TMP_ROOT}/catalog.Dockerfile" -t "${catalog_tag}" "${TMP_ROOT}/"🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@test/extension-developer-e2e/setup.sh` around lines 15 - 16, The script
currently appends the build flag "--provenance=false" unconditionally which
breaks Podman; update the build invocations that use $CONTAINER_RUNTIME (the
commands that pass "--provenance=false") to only include that flag when
CONTAINER_RUNTIME is "docker" (or its explicit docker binary), e.g. compute a
variable like PROVENANCE_FLAG="" and set it to "--provenance=false" when [
"$CONTAINER_RUNTIME" = "docker" ] and then use "$PROVENANCE_FLAG" in the build
commands so Podman runs without the unsupported flag.
|
/test okd-scos-images |
|
@openshift-bot: all tests passed! Full PR test history. Your PR dashboard. DetailsInstructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here. |
|
/lgtm |
The downstream repository has been updated with the following following upstream commits:
The
vendor/directory has been updated and the following commits were carried:@catalogd-updateThis pull request is expected to merge without any human intervention. If tests are failing here, changes must land upstream to fix any issues so that future downstreaming efforts succeed.
/assign @openshift/openshift-team-operator-runtime
Summary by CodeRabbit
E2E Testing Improvements
HTTP Proxy Support
Test Infrastructure Refactoring