Skip to content

OCPBUGS-77845: Update release extract inclusion to support feature gates and major version#2222

Open
JoelSpeed wants to merge 1 commit intoopenshift:mainfrom
JoelSpeed:update-release-extract-inclusion
Open

OCPBUGS-77845: Update release extract inclusion to support feature gates and major version#2222
JoelSpeed wants to merge 1 commit intoopenshift:mainfrom
JoelSpeed:update-release-extract-inclusion

Conversation

@JoelSpeed
Copy link

@JoelSpeed JoelSpeed commented Mar 6, 2026

Recent changes to library-go added manifest inclusion for feature gates and major version.

This updates library-go and adds a step to gather the feature gates and major OCP version either from the in-cluster feature gate resource, or, by finding the correct FeatureGate inside the payload and gathering the gates enabled from that

Tested locally it appears to be working as expected

CC @atiratree

@openshift-ci-robot openshift-ci-robot added jira/severity-important Referenced Jira bug's severity is important for the branch this PR is targeting. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. jira/invalid-bug Indicates that a referenced Jira bug is invalid for the branch this PR is targeting. labels Mar 6, 2026
@openshift-ci-robot
Copy link

@JoelSpeed: This pull request references Jira Issue OCPBUGS-77845, which is invalid:

  • expected the bug to target the "4.22.0" version, but no target version was set

Comment /jira refresh to re-evaluate validity if changes to the Jira bug are made, or edit the title of this pull request to link to a different bug.

The bug has been updated to refer to the pull request using the external bug tracker.

Details

In response to this:

Recent changes to library-go added manifest inclusion for feature gates and major version.

This updates library-go and adds a step to gather the feature gates and major OCP version either from the in-cluster feature gate resource, or, by finding the correct FeatureGate inside the payload and gathering the gates enabled from that

Tested locally it appears to be working as expected

CC @atiratree

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

@coderabbitai
Copy link

coderabbitai bot commented Mar 6, 2026

Walkthrough

Refactors extract option initialization into a new helper on ExtractOptions and moves cluster include configuration discovery onto ExtractOptions, adding feature-gate and major-version extraction from release payloads to drive manifest inclusion filtering. Pointer-based metadata handling and related imports were added.

Changes

Cohort / File(s) Summary
Extract options & run flow
pkg/cli/admin/release/extract.go
Added (*ExtractOptions).newExtractOpts(imagesource.TypedImageReference) (*extract.ExtractOptions, *string, imagemanifest.Verifier) to centralize options, image-metadata callbacks and verifier setup. Switched metadata verify message handling to *string and updated call sites to use the receiver-bound helper. Added import k8s.io/utils/ptr.
Manifest inclusion, feature-gates, and versioning
pkg/cli/admin/release/extract_tools.go
Converted findClusterIncludeConfigFromInstallConfig into func (o *ExtractOptions) findClusterIncludeConfigFromInstallConfig(installConfigPath string, imageRef imagesource.TypedImageReference) (manifestInclusionConfiguration, error). Added EnabledFeatureGates sets.Set[string] and RequiredMajorVersion *uint64 to manifestInclusionConfiguration. Implemented extractFeatureGatesFromRelease and helper predicates (appliesToVersion, appliesToClusterProfile, appliesToFeatureSet) to compute enabled gates and major version from release manifests. Wired feature-gate and version data into the includer path and updated imports (encoding/json, path, strconv, k8s.io/apimachinery/pkg/runtime alias, github.com/blang/semver).

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 14.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title directly reflects the main changes: updating release extract inclusion to support feature gates and major version, which aligns with the core implementation across extract.go and extract_tools.go.
Stable And Deterministic Test Names ✅ Passed Pull request introduces new Ginkgo test cases in test/e2e/cli.go with stable, deterministic test names using static identifiers (bug IDs, author names, environment flags) with no dynamic content like generated names, timestamps, UUIDs, or IP addresses.
Test Structure And Quality ✅ Passed The custom check requires assessment of Ginkgo test code structure and quality. This PR only modifies implementation files (extract.go, extract_tools.go) and the dependency manifest (go.mod). Since the PR contains no Ginkgo test code modifications, the check is not applicable and passes by default.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
📝 Coding Plan
  • Generate coding plan for human review comments

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

@openshift-ci openshift-ci bot requested review from ardaguclu and ingvagabund March 6, 2026 11:05
@JoelSpeed
Copy link
Author

/jira refresh

@openshift-ci-robot openshift-ci-robot added jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. and removed jira/invalid-bug Indicates that a referenced Jira bug is invalid for the branch this PR is targeting. labels Mar 6, 2026
@openshift-ci-robot
Copy link

@JoelSpeed: This pull request references Jira Issue OCPBUGS-77845, which is valid. The bug has been moved to the POST state.

3 validation(s) were run on this bug
  • bug is open, matching expected state (open)
  • bug target version (4.22.0) matches configured target version for branch (4.22.0)
  • bug is in the state New, which is one of the valid states (NEW, ASSIGNED, POST)

Requesting review from QA contact:
/cc @zhouying7780

Details

In response to this:

/jira refresh

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

@openshift-ci openshift-ci bot requested a review from zhouying7780 March 6, 2026 11:07
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 6

🧹 Nitpick comments (2)
pkg/cli/admin/release/extract_tools.go (2)

1332-1338: Parameter version is validated but effectively unused for logic.

The version parameter is validated as non-empty (line 1336-1337), but it's only used in the final log message (line 1436). The actual version used for filtering feature gates is releaseMetadata.Version parsed from the release payload (line 1416).

Consider either:

  • Removing the validation and documenting that version is only for logging
  • Using the parameter consistently if it was intended for a specific purpose
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/cli/admin/release/extract_tools.go` around lines 1332 - 1338, The
function extractFeatureGatesFromRelease currently validates the input parameter
version but never uses it for logic (releaseMetadata.Version is used instead);
either remove the empty-string validation and update documentation/comments to
state that version is used only for logging, or enforce consistency by comparing
the passed version against releaseMetadata.Version and returning an error if
they differ; locate extractFeatureGatesFromRelease and change the validation
accordingly, referencing the parameter version and the parsed
releaseMetadata.Version to implement the chosen behavior.

1429-1429: Variable shadowing: loop variable version shadows function parameter.

The loop variable version shadows the function parameter version from line 1332. This reduces readability and could cause confusion during maintenance.

♻️ Suggested fix: Rename loop variable
-		for _, version := range featureGate.Status.FeatureGates {
-			for _, enabled := range version.Enabled {
+		for _, gateVersion := range featureGate.Status.FeatureGates {
+			for _, enabled := range gateVersion.Enabled {
 				enabledFeatureGates.Insert(string(enabled.Name))
 			}
 		}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/cli/admin/release/extract_tools.go` at line 1429, The loop variable
`version` shadows the function parameter `version`; rename the loop variable
used in the `for _, version := range featureGate.Status.FeatureGates` iteration
(e.g., to `fgVersion` or `fg`) and update all references inside that loop
accordingly so the function parameter `version` remains unshadowed and code
clarity is preserved (search for references to `featureGate.Status.FeatureGates`
and the inner use of `version` to apply the rename).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@go.mod`:
- Around line 60-69: The go.mod lists mixed Kubernetes minor versions (some
0.35.1 and some 0.34.1) which can cause dependency skew; update the module lines
for k8s.io/cli-runtime, k8s.io/kubectl, k8s.io/pod-security-admission,
k8s.io/component-helpers (if present), and k8s.io/metrics to the same minor
version as the core modules (e.g., change their versions to v0.35.1 to match
k8s.io/api, k8s.io/apimachinery, k8s.io/client-go, k8s.io/apiserver, and
k8s.io/klog/v2) and run go mod tidy to resolve and verify consistent dependency
graph.
- Line 3: The repo's go directive was bumped to "go 1.25.0" but CI/build images
still reference Go 1.24; update all image tags that contain "golang-1.24" to the
corresponding "golang-1.25" variants (e.g. replace
"rhel-9-release-golang-1.24-openshift-4.22",
"rhel-8-golang-1.24-openshift-4.22", and "rhel-9-golang-1.24-openshift-4.22"
with their golang-1.25 equivalents) so the CI config and Dockerfiles match the
go.mod change.
- Around line 39-40: The go.mod currently requires github.com/onsi/ginkgo/v2
v2.27.2 but a replace directive points to an OpenShift fork at v2.6.1-... which
effectively downgrades and may break future tests; update the module constraints
so the require and replace are consistent: either remove the replace for
github.com/onsi/ginkgo/v2 (so the upstream v2.27.2 is used) or update the
replace to point to an equivalent fork/tag that matches v2.27.2, then run go mod
tidy and go test to verify; also update the comment in test/e2e/util.go to
document why a fork is needed if you keep the replace (or note its removal) so
maintainers understand the rationale.

In `@pkg/cli/admin/release/extract_tools.go`:
- Line 1181: The function signature for
findClusterIncludeConfigFromInstallConfig contains an unused ctx context.Context
parameter which causes a call-site mismatch; remove the ctx parameter from the
signature (leaving func (o *ExtractOptions)
findClusterIncludeConfigFromInstallConfig(installConfigPath string, imageRef
imagesource.TypedImageReference) (manifestInclusionConfiguration, error)) and
update any internal references to ctx inside that method (none expected) so
callers that pass only o.InstallConfig and ref compile correctly; also search
for any other callers and adjust them to the new two-argument signature if
needed.

In `@pkg/cli/admin/release/extract.go`:
- Line 327: The call to findClusterIncludeConfigFromInstallConfig is missing the
required ctx argument; update the invocation that assigns to inclusionConfig
(currently: inclusionConfig, err =
o.findClusterIncludeConfigFromInstallConfig(o.InstallConfig, ref)) to pass the
context (ctx) as the first parameter so it matches the function signature in
extract_tools.go (e.g., inclusionConfig, err =
o.findClusterIncludeConfigFromInstallConfig(ctx, o.InstallConfig, ref)).
- Around line 623-641: metadataVerifyMsg is captured by the image metadata
callback and returned immediately from newExtractOpts, but the callback runs
later so the caller receives an empty copy; change metadataVerifyMsg from a
string to *string (or return *string) so the closure writes to the pointed-to
value, update the callback closure in imageMetadataCallbacks and
opts.ImageMetadataCallback to assign to the pointer, and update call sites that
read the returned metadataVerifyMsg to dereference the pointer (or handle nil)
so the computed message produced by the closure is visible after opts.Run().

---

Nitpick comments:
In `@pkg/cli/admin/release/extract_tools.go`:
- Around line 1332-1338: The function extractFeatureGatesFromRelease currently
validates the input parameter version but never uses it for logic
(releaseMetadata.Version is used instead); either remove the empty-string
validation and update documentation/comments to state that version is used only
for logging, or enforce consistency by comparing the passed version against
releaseMetadata.Version and returning an error if they differ; locate
extractFeatureGatesFromRelease and change the validation accordingly,
referencing the parameter version and the parsed releaseMetadata.Version to
implement the chosen behavior.
- Line 1429: The loop variable `version` shadows the function parameter
`version`; rename the loop variable used in the `for _, version := range
featureGate.Status.FeatureGates` iteration (e.g., to `fgVersion` or `fg`) and
update all references inside that loop accordingly so the function parameter
`version` remains unshadowed and code clarity is preserved (search for
references to `featureGate.Status.FeatureGates` and the inner use of `version`
to apply the rename).

ℹ️ Review info
⚙️ Run configuration

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

Review profile: CHILL

Plan: Pro

Run ID: 1ccc24ef-41b7-4370-bb44-f14739df2048

📥 Commits

Reviewing files that changed from the base of the PR and between 4aebabf and b6419ba.

⛔ Files ignored due to path filters (297)
  • go.sum is excluded by !**/*.sum
  • vendor/github.com/go-logr/logr/.golangci.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/go-logr/logr/funcr/funcr.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/CHANGELOG.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/format/format.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/gomega_dsl.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/assertion.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/async_assertion.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/duration_bundle.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/gomega.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/polling_signal_error.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/internal/vetoptdesc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/and.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/assignable_to_type_of_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_a_directory.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_a_regular_file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_an_existing_file.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_closed_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_comparable_to_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_element_of_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_empty_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_equivalent_to_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_false_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_identical_to.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_key_of_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_nil_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_numerically_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_sent_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_temporally_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_true_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/be_zero_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/consist_of.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/contain_element_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/contain_elements_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/contain_substring_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/equal_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_cap_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_each_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_exact_elements.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_existing_field_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_field.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_http_body_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_http_header_with_value_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_http_status_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_key_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_key_with_value_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_len_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_occurred_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_prefix_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_suffix_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/have_value.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/internal/miter/type_support_iter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/internal/miter/type_support_noiter.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_error_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_json_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_regexp_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_xml_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/match_yaml_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/not.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/or.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/panic_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/receive_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/satisfy_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/semi_structured_data_support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/succeed_matcher.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/support/goraph/bipartitegraph/bipartitegraph.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/support/goraph/node/node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/type_support.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/matchers/with_transform.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/onsi/gomega/types/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/.ci-operator.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/.coderabbit.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/.golangci.go-validated.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/.golangci.yaml is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/AGENTS.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/Dockerfile.ocp is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiextensions/install.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/types_compatibilityrequirement.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/apiextensions/v1alpha1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/apps/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apps/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apps/v1/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/apps/v1/zz_prerelease_lifecycle_generated.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/authorization/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/authorization/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/build/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/build/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/cloudnetwork/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/cloudnetwork/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_apiserver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_authentication.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_cluster_image_policy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_cluster_version.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_feature.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_image_policy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_infrastructure.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_ingress.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_insights.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_network.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_node.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_scheduling.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/types_tlssecurityprofile.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1alpha1/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/types_backup.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/types_cluster_image_policy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/types_cluster_monitoring.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/types_crio_credential_provider_config.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/types_image_policy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/types_insights.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1alpha1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1alpha1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/config/v1alpha2/types_insights.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/config/v1alpha2/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/console/v1/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/console/v1/types_console_sample.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/console/v1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/etcd/README.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/etcd/install.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/etcd/v1alpha1/Makefile is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/etcd/v1alpha1/doc.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/etcd/v1alpha1/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/etcd/v1alpha1/types_pacemakercluster.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/etcd/v1alpha1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/etcd/v1alpha1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/etcd/v1alpha1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/features.md is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/features/features.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/features/legacyfeaturegates.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/features/util.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/image/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/image/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/install.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machine/v1/types_controlplanemachineset.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machine/v1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machine/v1beta1/types_awsprovider.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machine/v1beta1/types_machine.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machine/v1beta1/types_machineset.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machine/v1beta1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machine/v1beta1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1/types_machineconfignode.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/types.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/types_internalreleaseimage.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/types_osimagestream.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/types_pinnedimageset.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/machineconfiguration/v1alpha1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/network/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/network/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/networkoperator/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/networkoperator/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/oauth/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/oauth/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_console.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_ingress.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_machineconfiguration.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/types_network.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1alpha1/register.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1alpha1/types_clusterapi.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/operator/v1alpha1/zz_generated.deepcopy.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1alpha1/zz_generated.featuregated-crd-manifests.yaml is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/operator/v1alpha1/zz_generated.swagger_doc_generated.go is excluded by !**/vendor/**, !vendor/**, !**/zz_generated*
  • vendor/github.com/openshift/api/project/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/project/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/quota/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/quota/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/route/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/route/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/samples/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/samples/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/security/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/security/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/template/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/template/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/user/v1/generated.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/api/user/v1/generated.protomessage.pb.go is excluded by !**/*.pb.go, !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/customdeploymentstrategyparams.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymentcause.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymentcauseimagetrigger.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymentcondition.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymentconfig.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymentconfigspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymentconfigstatus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymentdetails.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymentstrategy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymenttriggerimagechangeparams.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/deploymenttriggerpolicy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/execnewpodhook.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/lifecyclehook.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/recreatedeploymentstrategyparams.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/rollingdeploymentstrategyparams.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/applyconfigurations/apps/v1/tagimagehook.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/apps/clientset/versioned/fake/clientset_generated.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/clusterrole.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/clusterrolebinding.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/grouprestriction.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/policyrule.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/role.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/rolebinding.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/rolebindingrestriction.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/rolebindingrestrictionspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/serviceaccountreference.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/serviceaccountrestriction.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/applyconfigurations/authorization/v1/userrestriction.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/authorization/clientset/versioned/fake/clientset_generated.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/binarybuildsource.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/bitbucketwebhookcause.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/build.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildcondition.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildconfig.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildconfigspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildconfigstatus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildoutput.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildpostcommitspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildsource.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildstatus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildstatusoutput.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildstatusoutputto.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildstrategy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildtriggercause.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildtriggerpolicy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildvolume.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildvolumemount.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/buildvolumesource.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/commonspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/commonwebhookcause.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/configmapbuildsource.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/custombuildstrategy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/dockerbuildstrategy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/genericwebhookcause.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/gitbuildsource.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/githubwebhookcause.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/gitlabwebhookcause.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/gitsourcerevision.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/imagechangecause.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/imagechangetrigger.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/imagechangetriggerstatus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/imagelabel.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/imagesource.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/imagesourcepath.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/imagestreamtagreference.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/jenkinspipelinebuildstrategy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/proxyconfig.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/secretbuildsource.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/secretlocalreference.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/secretspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/sourcebuildstrategy.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/sourcecontroluser.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/sourcerevision.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/stageinfo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/stepinfo.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/applyconfigurations/build/v1/webhooktrigger.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/build/clientset/versioned/fake/clientset_generated.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/acceptrisk.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/alibabacloudplatformstatus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/alibabacloudresourcetag.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/apiserver.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/apiserverencryption.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/apiservernamedservingcert.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/apiserverservingcerts.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/apiserverspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/audit.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/auditcustomrule.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/authentication.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/authenticationspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/authenticationstatus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/awsdnsspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/awsingressspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/awskmsconfig.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/awsplatformspec.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/awsplatformstatus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/awsresourcetag.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/awsserviceendpoint.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/azureplatformstatus.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/azureresourcetag.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/baremetalplatformloadbalancer.go is excluded by !**/vendor/**, !vendor/**
  • vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/baremetalplatformspec.go is excluded by !**/vendor/**, !vendor/**
📒 Files selected for processing (3)
  • go.mod
  • pkg/cli/admin/release/extract.go
  • pkg/cli/admin/release/extract_tools.go

module github.com/openshift/oc

go 1.24.0
go 1.25.0
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify all CI/build definitions are aligned with Go 1.25.x
set -euo pipefail

echo "== Files likely pinning Go versions =="
fd -HI '(\.github/workflows/.*\.ya?ml$|Dockerfile|Containerfile|\.ci-operator\.ya?ml$|Makefile|go\.mod$|go\.sum$|OWNERS|\.tool-versions$|\.golangci\.ya?ml$)' . 2>/dev/null | head -30

echo
echo "== Explicit Go version mentions =="
rg -n --no-heading -S 'go1\.[0-9]+|golang:1\.[0-9]+|GO_VERSION|GOVERSION|go[[:space:]]+1\.[0-9]+' . 2>/dev/null | head -50

echo
echo "== Current go.mod Go directive =="
head -5 go.mod 2>/dev/null || echo "go.mod not found"

Repository: openshift/oc

Length of output: 3536


🏁 Script executed:

#!/bin/bash

echo "== .ci-operator.yaml Go version specs =="
grep -n -i "golang\|go_version\|go version" .ci-operator.yaml 2>/dev/null || echo "No explicit Go version found"

echo
echo "== Makefile Go version specs =="
grep -n -i "golang_version\|go_version\|go_required\|go version" Makefile 2>/dev/null | head -20 || echo "No explicit Go version found"

echo
echo "== Dockerfile Go/golang specifications =="
for f in ./images/*/Dockerfile*; do
  echo "--- $f ---"
  grep -n "golang:\|FROM.*go\|GO_VERSION\|GOVERSION" "$f" 2>/dev/null || echo "No explicit Go version"
done

echo
echo "== Checking if any build script references Go versions =="
find . -name "*.sh" -type f ! -path "./vendor/*" | head -10 | xargs grep -l "golang\|GO_VERSION" 2>/dev/null | head -5

Repository: openshift/oc

Length of output: 916


🏁 Script executed:

#!/bin/bash

echo "== hack/lib/init.sh Go version references =="
grep -n -i "golang\|go.*version" ./hack/lib/init.sh 2>/dev/null | head -20

Repository: openshift/oc

Length of output: 183


Update CI/build images to Go 1.25 before merging.

The go directive in go.mod is now 1.25.0, but CI and build images are still pinned to Go 1.24:

  • .ci-operator.yaml line 4: rhel-9-release-golang-1.24-openshift-4.22
  • images/cli-artifacts/Dockerfile.rhel lines 3, 8: rhel-8-golang-1.24-openshift-4.22, rhel-9-golang-1.24-openshift-4.22
  • images/cli/Dockerfile.rhel line 1: rhel-9-golang-1.24-openshift-4.22
  • images/tools/Dockerfile line 1: rhel-9-golang-1.24-openshift-4.22

Update all references to use Go 1.25 to maintain consistency across the repo.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` at line 3, The repo's go directive was bumped to "go 1.25.0" but
CI/build images still reference Go 1.24; update all image tags that contain
"golang-1.24" to the corresponding "golang-1.25" variants (e.g. replace
"rhel-9-release-golang-1.24-openshift-4.22",
"rhel-8-golang-1.24-openshift-4.22", and "rhel-9-golang-1.24-openshift-4.22"
with their golang-1.25 equivalents) so the CI config and Dockerfiles match the
go.mod change.

Comment on lines +39 to +40
github.com/onsi/ginkgo/v2 v2.27.2
github.com/onsi/gomega v1.38.2
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Confirm effective ginkgo module and whether code uses newer APIs
set -euo pipefail

echo "== Ginkgo require/replace lines =="
rg -n --no-heading 'github\.com/onsi/ginkgo/v2|github\.com/openshift/onsi-ginkgo/v2' go.mod

echo
echo "== Common newer ginkgo usage patterns in repo =="
rg -n --no-heading 'DeferCleanup\(|AddReportEntry\(|Ordered\(|Label\(|Serial\(|ReportAfterEach\(' . || echo "(no matches found)"

Repository: openshift/oc

Length of output: 39855


🏁 Script executed:

#!/bin/bash
# Search for Ginkgo DSL usage in actual test files (exclude vendor)
set -euo pipefail

echo "== Searching test files for Ginkgo v2 DSL usage (non-vendor) =="
rg -t go 'DeferCleanup\(|AddReportEntry\(|Ordered\(|Label\(|Serial\(|ReportAfterEach\(' --glob '!vendor' --glob '*_test.go' -A 2 -B 2 | head -100

echo
echo "== Check if fork comment or rationale exists in go.mod =="
grep -A 5 -B 5 'openshift/onsi-ginkgo' go.mod || echo "(no comments found)"

Repository: openshift/oc

Length of output: 3355


🏁 Script executed:

#!/bin/bash
# Check e2e test files for Ginkgo usage and fork history
set -euo pipefail

echo "== E2E test files that might use Ginkgo =="
fd -t f -e go 'test' test/e2e/ | head -20

echo
echo "== Check test/e2e/util.go for Ginkgo usage =="
grep -n 'ginkgo\|Ginkgo' test/e2e/util.go | head -20

echo
echo "== Look for g variable pattern (ginkgo.GinkgoT()) =="
rg -n 'var\s+g\s+=' test/e2e/ --glob '*.go' -A 2 -B 2 | head -50

Repository: openshift/oc

Length of output: 742


Address the Ginkgo version mismatch between require and replace directives.

The require of v2.27.2 is overridden by a replace pointing to the OpenShift fork at v2.6.1-0.20251001123353-fd5b1fb35db1. This fork is approximately 20 minor versions behind the declared requirement, effectively nullifying the upgrade. The comment in test/e2e/util.go references "v1/v2 compatibility issues," but the rationale for the fork and its maintenance status is unclear. While current test code uses only basic Ginkgo v2 APIs (GinkgoWriter, DeferCleanup), future test changes relying on newer Ginkgo features (added between v2.6.1 and v2.27.2) could fail silently or behave unexpectedly if the fork lacks parity.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@go.mod` around lines 39 - 40, The go.mod currently requires
github.com/onsi/ginkgo/v2 v2.27.2 but a replace directive points to an OpenShift
fork at v2.6.1-... which effectively downgrades and may break future tests;
update the module constraints so the require and replace are consistent: either
remove the replace for github.com/onsi/ginkgo/v2 (so the upstream v2.27.2 is
used) or update the replace to point to an equivalent fork/tag that matches
v2.27.2, then run go mod tidy and go test to verify; also update the comment in
test/e2e/util.go to document why a fork is needed if you keep the replace (or
note its removal) so maintainers understand the rationale.

inclusionConfig, err = findClusterIncludeConfig(ctx, o.RESTConfig)
} else {
inclusionConfig, err = findClusterIncludeConfigFromInstallConfig(ctx, o.InstallConfig)
inclusionConfig, err = o.findClusterIncludeConfigFromInstallConfig(o.InstallConfig, ref)
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

Missing ctx argument in function call.

The call to findClusterIncludeConfigFromInstallConfig is missing the ctx argument that the function signature requires (see extract_tools.go line 1181). This will cause a compilation error.

🐛 Alternative fix if keeping ctx in signature
-				inclusionConfig, err = o.findClusterIncludeConfigFromInstallConfig(o.InstallConfig, ref)
+				inclusionConfig, err = o.findClusterIncludeConfigFromInstallConfig(ctx, o.InstallConfig, ref)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/cli/admin/release/extract.go` at line 327, The call to
findClusterIncludeConfigFromInstallConfig is missing the required ctx argument;
update the invocation that assigns to inclusionConfig (currently:
inclusionConfig, err =
o.findClusterIncludeConfigFromInstallConfig(o.InstallConfig, ref)) to pass the
context (ctx) as the first parameter so it matches the function signature in
extract_tools.go (e.g., inclusionConfig, err =
o.findClusterIncludeConfigFromInstallConfig(ctx, o.InstallConfig, ref)).

@ardaguclu
Copy link
Member

@JoelSpeed I'm bumping k8s dependencies and I had to fix it #2219 (comment). Does it make sense adding your commits in my PR?

@JoelSpeed JoelSpeed force-pushed the update-release-extract-inclusion branch from b6419ba to 6302173 Compare March 6, 2026 11:33
@JoelSpeed
Copy link
Author

@ardaguclu Yes, that probably makes sense. Either you can pick my changes in, or you can placeholder the values for now by just updating the newIncluder function and the manifestInclusionConfiguration and then leave the implementation of populating those fields to a separate PR afterwards?

@ardaguclu
Copy link
Member

you can placeholder the values for now by just updating the newIncluder function and the manifestInclusionConfiguration and then leave the implementation of populating those fields to a separate PR afterwards?

This would be better for me. So I'll pass nil here

return m.Include(config.ExcludeIdentifier, config.RequiredFeatureSet, config.Profile, config.Capabilities, config.Overrides)
to fix build errors.

Just a note: #2219 suffers a couple of problems due to a conflict with new dependencies. I have to fix them. How urgent is this bug?

@JoelSpeed
Copy link
Author

I think it's a release blocker, but I should be able to wait a few days for you to fix up your other PR

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Mar 6, 2026

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

Test name Commit Details Required Rerun command
ci/prow/e2e-agent-compact-ipv4 6302173 link false /test e2e-agent-compact-ipv4

Full PR test history. Your PR dashboard.

Details

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

@wking
Copy link
Member

wking commented Mar 12, 2026

this is another pull that's waiting on #2219.

@newtonheath
Copy link

@JoelSpeed this is blocking testing for workload identity on Azure - in particular the PQC effort: https://redhat.atlassian.net/browse/CCO-776 - any updates?

@ardaguclu
Copy link
Member

@JoelSpeed this is blocking testing for workload identity on Azure - in particular the PQC effort: https://redhat.atlassian.net/browse/CCO-776 - any updates?

This PR is blocked by #2219 which is blocked by openshift/cluster-openshift-apiserver-operator#667.

Currently openshift/cluster-openshift-apiserver-operator#667 is pending for review/approval

@ardaguclu
Copy link
Member

#2219 has merged

@openshift-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Mar 18, 2026
@JoelSpeed JoelSpeed force-pushed the update-release-extract-inclusion branch from 6302173 to b936a9f Compare March 18, 2026 10:03
@openshift-merge-robot openshift-merge-robot removed the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Mar 18, 2026
@openshift-ci-robot
Copy link

@JoelSpeed: This pull request references Jira Issue OCPBUGS-77845, which is valid.

3 validation(s) were run on this bug
  • bug is open, matching expected state (open)
  • bug target version (4.22.0) matches configured target version for branch (4.22.0)
  • bug is in the state POST, which is one of the valid states (NEW, ASSIGNED, POST)

No GitHub users were found matching the public email listed for the QA contact in Jira (yinzhou@redhat.com), skipping review request.

Details

In response to this:

Recent changes to library-go added manifest inclusion for feature gates and major version.

This updates library-go and adds a step to gather the feature gates and major OCP version either from the in-cluster feature gate resource, or, by finding the correct FeatureGate inside the payload and gathering the gates enabled from that

Tested locally it appears to be working as expected

CC @atiratree

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.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
pkg/cli/admin/release/extract.go (1)

624-633: ⚠️ Potential issue | 🟠 Major

metadataVerifyMsg is still not propagated to the caller.

metadataVerifyMsg is returned before opts.Run() executes the callback, and the callback currently reassigns the local pointer variable. The caller keeps the original nil, so the message remains empty.

🐛 Proposed fix
-	var metadataVerifyMsg *string
+	metadataVerifyMsg := new(string)

 	verifier := imagemanifest.NewVerifier()
 	imageMetadataCallbacks = append(imageMetadataCallbacks, func(m *extract.Mapping, dgst, contentDigest digest.Digest, config *dockerv1client.DockerImageConfig, manifestListDigest digest.Digest) {
 		verifier.Verify(dgst, contentDigest)
 		if len(ref.Ref.ID) > 0 {
-			metadataVerifyMsg = ptr.To(fmt.Sprintf("Extracted release payload created at %s", config.Created.Format(time.RFC3339)))
+			*metadataVerifyMsg = fmt.Sprintf("Extracted release payload created at %s", config.Created.Format(time.RFC3339))
 		} else {
-			metadataVerifyMsg = ptr.To(fmt.Sprintf("Extracted release payload from digest %s created at %s", dgst, config.Created.Format(time.RFC3339)))
+			*metadataVerifyMsg = fmt.Sprintf("Extracted release payload from digest %s created at %s", dgst, config.Created.Format(time.RFC3339))
 		}
 	})

As per coding guidelines, "Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity."

Also applies to: 642-643

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/cli/admin/release/extract.go` around lines 624 - 633, The local pointer
metadataVerifyMsg is set inside the async callback but the function returns
before that callback runs so the caller sees nil; change the callback to write
the message into the mapping (e.g. set a new field on extract.Mapping such as
MetadataVerifyMsg or reuse an existing metadata field on m) instead of assigning
the outer metadataVerifyMsg variable, and after opts.Run() completes read the
message from the mapping and return it; update the callback appended to
imageMetadataCallbacks (the func(m *extract.Mapping, dgst, contentDigest
digest.Digest, config *dockerv1client.DockerImageConfig, manifestListDigest
digest.Digest)) to assign the formatted string to m.MetadataVerifyMsg and then
retrieve that value after opts.Run() finishes.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@pkg/cli/admin/release/extract_tools.go`:
- Around line 1230-1238: The code is performing a full release extraction twice:
findClusterIncludeConfigFromInstallConfig calls extractFeatureGatesFromRelease
which invokes opts.Run(), and later the main extraction path calls opts.Run()
again for the same image, doubling remote I/O and verification; fix this by
caching the feature-gate and major-version results keyed by the image digest (or
by returning and storing them from the primary extraction) so that
extractFeatureGatesFromRelease and the main extract flow reuse the cached values
instead of calling opts.Run() a second time—modify
findClusterIncludeConfigFromInstallConfig, extractFeatureGatesFromRelease, and
the main extract flow to check the cache (or accept precomputed values from the
primary extraction) and avoid re-invoking opts.Run() for the same image.

---

Duplicate comments:
In `@pkg/cli/admin/release/extract.go`:
- Around line 624-633: The local pointer metadataVerifyMsg is set inside the
async callback but the function returns before that callback runs so the caller
sees nil; change the callback to write the message into the mapping (e.g. set a
new field on extract.Mapping such as MetadataVerifyMsg or reuse an existing
metadata field on m) instead of assigning the outer metadataVerifyMsg variable,
and after opts.Run() completes read the message from the mapping and return it;
update the callback appended to imageMetadataCallbacks (the func(m
*extract.Mapping, dgst, contentDigest digest.Digest, config
*dockerv1client.DockerImageConfig, manifestListDigest digest.Digest)) to assign
the formatted string to m.MetadataVerifyMsg and then retrieve that value after
opts.Run() finishes.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f7e5597f-ab6e-47ca-be45-e04b05e51441

📥 Commits

Reviewing files that changed from the base of the PR and between b6419ba and b936a9f.

📒 Files selected for processing (2)
  • pkg/cli/admin/release/extract.go
  • pkg/cli/admin/release/extract_tools.go

Copy link
Member

@ardaguclu ardaguclu left a comment

Choose a reason for hiding this comment

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

Changes make sense to me. I dropped 2 non-blocker comments. But I think, it is better to ask opinions from @wking

return enabledFeatureGates, nil, fmt.Errorf("version cannot be empty")
}

opts, metadataVerifyMsg, verifier := o.newExtractOpts(imageRef)
Copy link
Member

@ardaguclu ardaguclu Mar 18, 2026

Choose a reason for hiding this comment

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

It would be better to pass the ExtractOpts created in extract_tools but I guess the reason is to use custom TarEntryCallback

Copy link
Author

Choose a reason for hiding this comment

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

Yeah I figured since we needed a different entry callback it was better to create one separately, hence moving the build of the extract opts out into a helper

Want me to look at changing or is this ~ok?

Copy link
Member

Choose a reason for hiding this comment

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

I think that is ok

}

// There will only be a single version in the feature gate manifests.
for _, version := range featureGate.Status.FeatureGates {
Copy link
Member

Choose a reason for hiding this comment

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

version is shadowed, it is better to use a different naming.

@ardaguclu
Copy link
Member

In my opinion, this requires pre-merge testing

@ardaguclu
Copy link
Member

/approve

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Mar 18, 2026

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: ardaguclu, JoelSpeed

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

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-ci openshift-ci bot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Mar 18, 2026
@JoelSpeed JoelSpeed force-pushed the update-release-extract-inclusion branch from b936a9f to 2153fc0 Compare March 18, 2026 11:13
@JoelSpeed
Copy link
Author

@JianLi-RH Would you be able to pre-merge test this please?

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

♻️ Duplicate comments (2)
pkg/cli/admin/release/extract_tools.go (1)

1230-1231: ⚠️ Potential issue | 🟠 Major

--included --install-config still triggers a second full payload extraction.

This pre-pass calls extractFeatureGatesFromRelease(...), which runs opts.Run() again, and the main extract flow later runs another opts.Run() for the same release image. That doubles registry I/O + verification work and increases failure probability on constrained registries.

Please reuse data from the primary extraction pass (or cache by image digest) instead of running a second extraction pass.

As per coding guidelines, "-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity."

Also applies to: 1390-1394

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/cli/admin/release/extract_tools.go` around lines 1230 - 1231, The call to
o.extractFeatureGatesFromRelease(imageRef, ...) triggers opts.Run() a second
time for the same release, doubling extraction I/O; change
extractFeatureGatesFromRelease (and callers) to accept either the
already-extracted release result or a cache key (image digest) and check that
before invoking opts.Run(); specifically, update extractFeatureGatesFromRelease
to accept an optional pre-extracted release object (or a shared
map[string]*ExtractResult keyed by image digest), have the primary extraction
flow store its result in that cache or pass it directly, and make
extractFeatureGatesFromRelease use the cached result instead of calling
opts.Run() when present so the second full payload extraction is avoided.
pkg/cli/admin/release/extract.go (1)

624-633: ⚠️ Potential issue | 🟡 Minor

metadataVerifyMsg is still lost due to pointer rebinding in the callback.

newExtractOpts returns metadataVerifyMsg before callbacks run, and the callback does metadataVerifyMsg = ptr.To(...) (rebind), so callers keep the original nil pointer and never see the message.

💡 Suggested fix
-	var metadataVerifyMsg *string
+	metadataVerifyMsg := new(string)

 	verifier := imagemanifest.NewVerifier()
 	imageMetadataCallbacks = append(imageMetadataCallbacks, func(m *extract.Mapping, dgst, contentDigest digest.Digest, config *dockerv1client.DockerImageConfig, manifestListDigest digest.Digest) {
 		verifier.Verify(dgst, contentDigest)
 		if len(ref.Ref.ID) > 0 {
-			metadataVerifyMsg = ptr.To(fmt.Sprintf("Extracted release payload created at %s", config.Created.Format(time.RFC3339)))
+			*metadataVerifyMsg = fmt.Sprintf("Extracted release payload created at %s", config.Created.Format(time.RFC3339))
 		} else {
-			metadataVerifyMsg = ptr.To(fmt.Sprintf("Extracted release payload from digest %s created at %s", dgst, config.Created.Format(time.RFC3339)))
+			*metadataVerifyMsg = fmt.Sprintf("Extracted release payload from digest %s created at %s", dgst, config.Created.Format(time.RFC3339))
 		}
 	})

Also applies to: 642-642

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/cli/admin/release/extract.go` around lines 624 - 633, The callback
currently rebinds metadataVerifyMsg (metadataVerifyMsg = ptr.To(...)) so callers
holding the original pointer never observe updates; instead, ensure the callback
mutates the pointed-to string: if metadataVerifyMsg == nil { metadataVerifyMsg =
new(string) } *metadataVerifyMsg = fmt.Sprintf("...") (use the same message
formats currently used). Apply this change in the imageMetadataCallbacks
callback(s) that set metadataVerifyMsg (including the other occurrence noted) so
the pointer value is updated in-place and callers of newExtractOpts see the
populated message.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In `@pkg/cli/admin/release/extract_tools.go`:
- Around line 1230-1231: The call to o.extractFeatureGatesFromRelease(imageRef,
...) triggers opts.Run() a second time for the same release, doubling extraction
I/O; change extractFeatureGatesFromRelease (and callers) to accept either the
already-extracted release result or a cache key (image digest) and check that
before invoking opts.Run(); specifically, update extractFeatureGatesFromRelease
to accept an optional pre-extracted release object (or a shared
map[string]*ExtractResult keyed by image digest), have the primary extraction
flow store its result in that cache or pass it directly, and make
extractFeatureGatesFromRelease use the cached result instead of calling
opts.Run() when present so the second full payload extraction is avoided.

In `@pkg/cli/admin/release/extract.go`:
- Around line 624-633: The callback currently rebinds metadataVerifyMsg
(metadataVerifyMsg = ptr.To(...)) so callers holding the original pointer never
observe updates; instead, ensure the callback mutates the pointed-to string: if
metadataVerifyMsg == nil { metadataVerifyMsg = new(string) } *metadataVerifyMsg
= fmt.Sprintf("...") (use the same message formats currently used). Apply this
change in the imageMetadataCallbacks callback(s) that set metadataVerifyMsg
(including the other occurrence noted) so the pointer value is updated in-place
and callers of newExtractOpts see the populated message.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ed5945bc-c743-4284-8ae7-cb0d9877f585

📥 Commits

Reviewing files that changed from the base of the PR and between b936a9f and 2153fc0.

📒 Files selected for processing (2)
  • pkg/cli/admin/release/extract.go
  • pkg/cli/admin/release/extract_tools.go

@JianLi-RH
Copy link

Would you be able to pre-merge test this please?

Sure, I will take a look at it tomorrow.

@JianLi-RH
Copy link

I see Ying Zhou already verified it in https://redhat.atlassian.net/browse/OCPBUGS-77845?focusedCommentId=16452255

I re-tested it, it works.
My oc client:

[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ ./oc/oc version --client
Client Version: oc422-extract
Kustomize Version: v5.7.1
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$

the test result:

[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ ./oc/oc adm release extract --credentials-requests --cloud=azure --to=./ --included --install-config=./install-config.yaml quay.io/openshift-release-dev/ocp-release@sha256:58b98da1492b3f4af6129c4684b8e8cde4f2dc197e4b483bb6025971d59f92a5
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ echo $?
0
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ ls | grep "0000_30_cluster-api_01_credentials-request.yaml"
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ ls
0000_26_cloud-controller-manager-operator_14_credentialsrequest-azure.yaml
0000_30_machine-api-operator_00_credentials-request.yaml
0000_50_cluster-image-registry-operator_01-registry-credentials-request-azure.yaml
0000_50_cluster-ingress-operator_00-ingress-credentials-request.yaml
0000_50_cluster-network-operator_02-cncc-credentials.yaml
0000_50_cluster-storage-operator_03_credentials_request_azure_file.yaml
0000_50_cluster-storage-operator_03_credentials_request_azure.yaml
install-config.yaml
manifests
oc
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$

And if I don't specify install-config, it will generate the credential file:

[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ ./oc/oc adm release extract --credentials-requests --cloud=azure quay.io/openshift-release-dev/ocp-release@sha256:58b98da1492b3f4af6129c4684b8e8cde4f2dc197e4b483bb6025971d59f92a5
warning: if you intend to pass CredentialsRequests to ccoctl, you should use --included to filter out requests that your cluster is not expected to need.
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ echo $?
0
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ ls | grep "0000_30_cluster-api_01_credentials-request.yaml"
0000_30_cluster-api_01_credentials-request.yaml
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ 

@JianLi-RH
Copy link

JianLi-RH commented Mar 18, 2026

Besides Ying's tests, I finished some more tests:

  1. extract oc cli failed:,
    I tried https://amd64.ocp.releases.ci.openshift.org/releasestream/4-dev-preview/release/4.22.0-ec.3 and https://amd64.ocp.releases.ci.openshift.org/releasestream/4-stable/release/4.21.6, both failed.
    I also tried other OC versions, all of them could not extract oc cli. I will investigate more tomorrow.
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ ./oc/oc adm release extract --command=oc --from quay.io/openshift-release-dev/ocp-release@sha256:683c4a4eed9c4005b7d331fe0e55b5f943b1d57f40f4d4b77f059f52ad127092 -a /home/jianl/1_code/ota/config.json
error: unable to iterate over layer sha256:b3c7a5143e6cc2c1402a740026e1adeb2533412bd0a85dc9fa01ae06843f453d from quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:1c5b548d67e5c56e3297b2f8aa34428e544b5b5ac88bd8d0f465760375c501e6: open oc: is a directory
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ echo $?
1
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ 
  1. extract manifests success
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ ./oc/oc adm release extract --to manifests --from quay.io/openshift-release-dev/ocp-release@sha256:58b98da1492b3f4af6129c4684b8e8cde4f2dc197e4b483bb6025971d59f92a5
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$ echo $?
0
[jianl@jianl-thinkpadt14gen4 JoelSpeed]$

@JoelSpeed
Copy link
Author

/verified by @JianLi-RH

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Mar 18, 2026
@openshift-ci-robot
Copy link

@JoelSpeed: This PR has been marked as verified by @JianLi-RH.

Details

In response to this:

/verified by @JianLi-RH

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.

@JianLi-RH
Copy link

Just retested extract --command, it works fine:

jianl@jianl-thinkpadt14gen4 422]$ oc adm release extract --command=oc
[jianl@jianl-thinkpadt14gen4 422]$ ls
1773666510_9867c8d5.mp4  1773821779_2251ee82.mp4  cluster-bot-2026-03-19-003611.kubeconfig  manifests  oc  version-patch-first-override.yaml
[jianl@jianl-thinkpadt14gen4 422]$ ./oc version
Client Version: 4.22.0-0-2026-03-19-005021-test-ci-ln-87n5x9t-latest
Kustomize Version: v5.7.1
Server Version: 4.22.0-0-2026-03-19-005021-test-ci-ln-87n5x9t-latest
Kubernetes Version: v1.35.2
[jianl@jianl-thinkpadt14gen4 422]$

@damdo
Copy link
Member

damdo commented Mar 19, 2026

@JoelSpeed who are you expecting to add the LGTM here?

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

Labels

approved Indicates a PR has been approved by an approver from all required OWNERS files. jira/severity-important Referenced Jira bug's severity is important for the branch this PR is targeting. jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants