SPLAT-2662: Make migration metadata installer-compatible - #54
Conversation
|
@jcpowermac: This pull request references SPLAT-2662 which is a valid 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. |
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
WalkthroughIntroduce installer-shaped ClusterMetadata, initialize and inject a FeatureGateAccessor, use it to determine vSphere multi-vCenter support, validate credentials and deduplicate VCenters in GenerateMetadata, update secret persistence/labels/OwnerReferences, and add tests and docs. ChangesInstaller-Compatible Metadata & FeatureGate wiring
Sequence DiagramsequenceDiagram
participant Controller
participant OpenshiftAccessor as FeatureGateAccessor
participant MetadataManager
participant KubeAPI as Kubernetes API
Controller->>OpenshiftAccessor: CurrentFeatureGates()
OpenshiftAccessor-->>Controller: observed gates
Controller->>MetadataManager: GenerateMetadata(failureDomains, infra, credentials)
MetadataManager->>MetadataManager: validate inputs, parseRequiredCredentials, deduplicate VCenters
MetadataManager-->>Controller: ClusterMetadata
Controller->>MetadataManager: SaveToSecret(ClusterMetadata)
MetadataManager->>KubeAPI: create/update Secret (set metadata label, clear OwnerReferences)
KubeAPI-->>MetadataManager: Secret persisted
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
Suggested labelslgtm Suggested reviewers
🚥 Pre-merge checks | ✅ 12 | ❌ 3❌ Failed checks (3 warnings)
✅ Passed checks (12 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
|
[APPROVALNOTIFIER] This PR is APPROVED This pull-request has been approved by: jcpowermac 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.
🧹 Nitpick comments (1)
internal/openshift/version.go (1)
116-130: 💤 Low valueOptional: clone may turn a non-nil empty input into a distinct value.
When
inis non-nil but both slices are empty, this returns&CustomFeatureGates{}with nil slices. That round-trips fine for the metadata use case here, but if a caller ever relies onreflect.DeepEqualagainst an input that holds non-nil empty slices, the clone would differ. Not an issue for current usage.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/openshift/version.go` around lines 116 - 130, The cloneCustomFeatureGates function turns non-nil empty slices into nil slices because it only copies when len(...) > 0; change the checks to test against nil (e.g. if in.Enabled != nil) and then do the append copy so callers that expect a non-nil zero-length slice (reflect.DeepEqual scenarios) get a distinct non-nil empty slice; do the same for in.Disabled and keep returning out from cloneCustomFeatureGates.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Nitpick comments:
In `@internal/openshift/version.go`:
- Around line 116-130: The cloneCustomFeatureGates function turns non-nil empty
slices into nil slices because it only copies when len(...) > 0; change the
checks to test against nil (e.g. if in.Enabled != nil) and then do the append
copy so callers that expect a non-nil zero-length slice (reflect.DeepEqual
scenarios) get a distinct non-nil empty slice; do the same for in.Disabled and
keep returning out from cloneCustomFeatureGates.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: 2a4bf157-d08c-4f9f-b657-eb5b41dc64db
📒 Files selected for processing (6)
docs/plans/installer-compatible-metadata-secret.mdinternal/controller/vmwarecloudfoundationmigration_controller.gointernal/metadata/metadata.gointernal/metadata/metadata_test.gointernal/openshift/version.gointernal/openshift/version_test.go
49bbe33 to
c367ff0
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/metadata/metadata.go`:
- Around line 188-205: When updating an existing Secret in the update branch,
clear any OwnerReferences to avoid accidental GC: set existing.OwnerReferences =
nil (or an empty slice) before assigning Labels/Data/Type and calling
m.kubeClient.CoreV1().Secrets(namespace).Update(...); also ensure the create
path does not set OwnerReferences on the secret (e.g., secret.OwnerReferences =
nil) so both Create and Update preserve the "no owner reference" invariant
referenced by metadataSecretLabelKey and the Secret update logic.
🪄 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: c6ddf5ff-e0eb-4924-8ca9-42751a651dc7
📒 Files selected for processing (6)
docs/plans/installer-compatible-metadata-secret.mdinternal/controller/vmwarecloudfoundationmigration_controller.gointernal/metadata/metadata.gointernal/metadata/metadata_test.gointernal/openshift/version.gointernal/openshift/version_test.go
🚧 Files skipped from review as they are similar to previous changes (4)
- internal/openshift/version.go
- internal/controller/vmwarecloudfoundationmigration_controller.go
- internal/openshift/version_test.go
- internal/metadata/metadata_test.go
c367ff0 to
89610a6
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
internal/openshift/version_test.go (1)
293-307: ⚡ Quick winAssert the defensive-clone contract explicitly.
This only checks value equality, so
GetFeatureSetcould regress to returning the originalCustomNoUpgradepointer and this test would still pass. Keep a handle to the sourceCustomFeatureGatesin the custom cases and assert the returned pointer is different before theDeepEqualcheck.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/openshift/version_test.go` around lines 293 - 307, The test must also assert that GetFeatureSet returns a defensive clone for custom gates rather than the original pointer: in the test loop for cases with custom gates (e.g. where tt.wantCustom or the test source is a CustomFeatureGates/CustomNoUpgrade instance), capture the source pointer (e.g. src := tt.wantCustom or the test's custom source), then add an assertion that gotCustom != src (pointer inequality) before performing the reflect.DeepEqual check; use the existing gotCustom and tt.wantCustom identifiers and the GetFeatureSet test block to implement this.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@internal/metadata/metadata.go`:
- Line 157: The log call in metadata.go currently emits customer-specific
infraID: update the log.V(2).Info invocation that prints "generated metadata"
(the call referencing md.InfraID and len(md.VSphere.VCenters)) to remove the
"infraID", md.InfraID fields so only "vcenterCount" (len(md.VSphere.VCenters))
is logged; also scan for any other uses of md.InfraID in logging and remove or
redact them to avoid leaking customer identifiers.
---
Nitpick comments:
In `@internal/openshift/version_test.go`:
- Around line 293-307: The test must also assert that GetFeatureSet returns a
defensive clone for custom gates rather than the original pointer: in the test
loop for cases with custom gates (e.g. where tt.wantCustom or the test source is
a CustomFeatureGates/CustomNoUpgrade instance), capture the source pointer (e.g.
src := tt.wantCustom or the test's custom source), then add an assertion that
gotCustom != src (pointer inequality) before performing the reflect.DeepEqual
check; use the existing gotCustom and tt.wantCustom identifiers and the
GetFeatureSet test block to implement this.
🪄 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: 38cbfdf4-4500-45b1-8b0a-75b47bb668a3
📒 Files selected for processing (6)
docs/plans/installer-compatible-metadata-secret.mdinternal/controller/vmwarecloudfoundationmigration_controller.gointernal/metadata/metadata.gointernal/metadata/metadata_test.gointernal/openshift/version.gointernal/openshift/version_test.go
🚧 Files skipped from review as they are similar to previous changes (3)
- internal/openshift/version.go
- internal/controller/vmwarecloudfoundationmigration_controller.go
- internal/metadata/metadata_test.go
89610a6 to
7d37613
Compare
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
internal/metadata/metadata.go (1)
165-172:⚠️ Potential issue | 🟡 Minor | ⚡ Quick winReject nil metadata before marshaling.
json.Marshal(nil)serializes tonull, so a nilmdhere would still create/update the Secret with an unusable payload instead of failing fast.Suggested fix
func (m *MetadataManager) SaveToSecret(ctx context.Context, md *ClusterMetadata, namespace, name string) error { + if md == nil { + return fmt.Errorf("metadata must not be nil") + } + log := klog.FromContext(ctx) log.V(2).Info("saving metadata to Secret", "namespace", namespace, "name", name) data, err := json.Marshal(md)🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/metadata/metadata.go` around lines 165 - 172, In SaveToSecret (method on MetadataManager) reject a nil md before attempting json.Marshal: add a nil-check for the md parameter and return a descriptive error (e.g., "nil metadata") if md == nil so you fail fast instead of marshaling to "null"; locate the nil-check near the start of SaveToSecret (before json.Marshal) and ensure callers receive the error rather than writing an invalid Secret.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In `@internal/metadata/metadata.go`:
- Around line 165-172: In SaveToSecret (method on MetadataManager) reject a nil
md before attempting json.Marshal: add a nil-check for the md parameter and
return a descriptive error (e.g., "nil metadata") if md == nil so you fail fast
instead of marshaling to "null"; locate the nil-check near the start of
SaveToSecret (before json.Marshal) and ensure callers receive the error rather
than writing an invalid Secret.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml
Review profile: CHILL
Plan: Enterprise
Run ID: ce1c1367-c405-486d-a46c-236de9b64e19
📒 Files selected for processing (6)
docs/plans/installer-compatible-metadata-secret.mdinternal/controller/vmwarecloudfoundationmigration_controller.gointernal/metadata/metadata.gointernal/metadata/metadata_test.gointernal/openshift/version.gointernal/openshift/version_test.go
🚧 Files skipped from review as they are similar to previous changes (4)
- internal/openshift/version.go
- internal/controller/vmwarecloudfoundationmigration_controller.go
- internal/openshift/version_test.go
- internal/metadata/metadata_test.go
| // VSphere contains the vSphere-specific metadata expected by the installer. | ||
| VSphere *VSphereMetadata `json:"vsphere,omitempty"` | ||
| // FeatureSet stores the cluster's configured feature set. | ||
| FeatureSet configv1.FeatureSet `json:"featureSet"` |
There was a problem hiding this comment.
Normally you shouldn't have two storage objects for features. If using the FeatureGateAccessor, you would just get the feature gates back and check if the one you need is enabled or not. Also, do we want this operator to restart if featuregates change? This is all fresh in my mind cause I did it wrong in Cluster Config Operator.
Align the generated metadata secret with the installer's vSphere schema so destroy cluster can consume it directly. Preserve feature-gate data, keep custom gate slice shape stable, clear secret owner references, redact customer identifiers from logs, and fail early when metadata credentials are malformed or incomplete. Co-authored-by: Cursor <cursoragent@cursor.com>
Align migration runtime behavior with the standard library-go feature gate accessor pattern so preflight decisions use effective gates instead of ad hoc FeatureGate reads. Stop snapshotting configured feature-set state into generated metadata while keeping the installer-compatible schema and vendored dependency updates together. Co-authored-by: Cursor <cursoragent@cursor.com>
4c29717 to
15415e8
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
internal/openshift/version_test.go (1)
1-13:⚠️ Potential issue | 🔴 Critical | ⚡ Quick winFix generated API deepcopy methods before merge.
golangci-linttypecheck is currently failing becauseVmwareCloudFoundationMigrationandVmwareCloudFoundationMigrationListdo not implementruntime.Object(missingDeepCopyObject). Regenerate/sync API generated code (DeepCopy files) so the package compiles again.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@internal/openshift/version_test.go` around lines 1 - 13, The package fails typecheck because the API types VmwareCloudFoundationMigration and VmwareCloudFoundationMigrationList are missing DeepCopyObject methods; regenerate or sync the autogenerated deepcopy code so these types implement runtime.Object. Run the project's codegen tool (or controller-gen/client-gen as used in this repo) to recreate the deepcopy functions for the types, verify DeepCopyObject exists on VmwareCloudFoundationMigration and VmwareCloudFoundationMigrationList, and commit the updated zz_generated.deepcopy.go files.Source: Linters/SAST tools
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@go.mod`:
- Around line 8-10: The build is failing because generated deepcopy methods for
the API types (e.g., VmwareCloudFoundationMigration and its list types) are
missing—run the project's generator to produce DeepCopyObject/DeepCopyInto
methods and commit the outputs: run the repo's generation step (e.g., invoke
make update or the project’s deepcopy-gen/controller-gen target) so that vmware
API files include DeepCopyObject implementations for
VmwareCloudFoundationMigration and the corresponding list types, verify the
generated files are staged, and commit those generated API artifacts before
rebasing the dependency bump.
In `@internal/metadata/metadata.go`:
- Around line 103-112: GenerateMetadata currently builds a ClusterMetadata with
VSphere but leaves FeatureSet and CustomFeatureSet at zero values; update
GenerateMetadata to populate ClusterMetadata.FeatureSet and
ClusterMetadata.CustomFeatureSet from the incoming infra object (or its
spec/feature-gate accessor used in this repo) so the persisted Secret contains
the feature-gate values; search for GenerateMetadata, ClusterMetadata,
FeatureSet and CustomFeatureSet (also the later usage around lines referenced
154-155) and assign the corresponding infra feature-set fields (or call the
standard accessor used elsewhere) into the ClusterMetadata before
returning/persisting.
---
Outside diff comments:
In `@internal/openshift/version_test.go`:
- Around line 1-13: The package fails typecheck because the API types
VmwareCloudFoundationMigration and VmwareCloudFoundationMigrationList are
missing DeepCopyObject methods; regenerate or sync the autogenerated deepcopy
code so these types implement runtime.Object. Run the project's codegen tool (or
controller-gen/client-gen as used in this repo) to recreate the deepcopy
functions for the types, verify DeepCopyObject exists on
VmwareCloudFoundationMigration and VmwareCloudFoundationMigrationList, and
commit the updated zz_generated.deepcopy.go files.
🪄 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: 05b9c08c-06c2-4276-b723-bafed8f02ee1
⛔ Files ignored due to path filters (284)
go.sumis excluded by!**/*.sumvendor/github.com/gogo/protobuf/AUTHORSis excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/CONTRIBUTORSis excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/clone.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/custom_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/decode.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/deprecated.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/discard.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/duration.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/duration_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/encode.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/encode_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/equal.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/extensions.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/extensions_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/lib.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/lib_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/message_set.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/pointer_reflect.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/pointer_unsafe.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/properties.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/properties_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/skip_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/table_marshal.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/table_marshal_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/table_merge.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/table_unmarshal.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/table_unmarshal_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/text.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/text_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/text_parser.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/timestamp.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/timestamp_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/wrappers.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/proto/wrappers_gogo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/gogo/protobuf/sortkeys/sortkeys.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/.gitignoreis excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/.travis.ymlis excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/CODE_OF_CONDUCT.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/LICENSEis excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/README.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/map.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/merge.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/imdario/mergo/mergo.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/.ci-operator.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/.coderabbit.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/.gitattributesis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/.gitignoreis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/.golangci.go-validated.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/.golangci.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/AGENTS.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/Dockerfile.ocpis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/README.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/annotations/annotations.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiextensions/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiextensions/v1alpha1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiextensions/v1alpha1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiextensions/v1alpha1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiextensions/v1alpha1/types_compatibilityrequirement.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiextensions/v1alpha1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/apiextensions/v1alpha1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/apiextensions/v1alpha1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/apiserver/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiserver/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiserver/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiserver/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiserver/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiserver/v1/types_apirequestcount.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apiserver/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/apiserver/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/apiserver/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/apps/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/consts.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/deprecated_consts.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/generated.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/generated.protois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/generated.protomessage.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/legacy.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/apps/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/apps/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/apps/v1/zz_prerelease_lifecycle_generated.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/codec.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/generated.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/generated.protois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/generated.protomessage.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/legacy.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/authorization/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/authorization/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/authorization/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/build/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/consts.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/generated.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/generated.protois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/generated.protomessage.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/legacy.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/build/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/build/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/cloudnetwork/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/v1/generated.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/v1/generated.protois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/v1/generated.protomessage.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/cloudnetwork/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/cloudnetwork/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/cloudnetwork/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/config/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/config/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/config/v1/types_kmsencryption.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/config/v1/types_network.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/config/v1alpha1/types_cluster_monitoring.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/config/v1alpha1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/config/v1alpha1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/console/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types_console_cli_download.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types_console_external_log_links.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types_console_link.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types_console_notification.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types_console_plugin.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types_console_quick_start.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types_console_sample.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/types_console_yaml_sample.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/console/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/console/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/console/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/envtest-releases.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/README.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1/types_pacemakercluster.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/etcd/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/etcd/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/etcd/v1alpha1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1alpha1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1alpha1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1alpha1/types_pacemakercluster.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/etcd/v1alpha1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/etcd/v1alpha1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/etcd/v1alpha1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/features.mdis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/helm/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/helm/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/helm/v1beta1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/helm/v1beta1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/helm/v1beta1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/helm/v1beta1/types_helm_chart_repository.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/helm/v1beta1/types_project_helm_chart_repository.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/helm/v1beta1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/helm/v1beta1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/helm/v1beta1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/image/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/docker10/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/docker10/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/docker10/types_docker.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/docker10/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/image/docker10/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/image/dockerpre012/deepcopy.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/dockerpre012/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/dockerpre012/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/dockerpre012/types_docker.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/dockerpre012/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/image/dockerpre012/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/image/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/consts.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/generated.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/generated.protois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/generated.protomessage.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/legacy.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/image/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/image/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/imageregistry/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/imageregistry/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/imageregistry/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/imageregistry/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/imageregistry/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/imageregistry/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/imageregistry/v1/types_imagepruner.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/imageregistry/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/imageregistry/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/imageregistry/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/kubecontrolplane/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/kubecontrolplane/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/kubecontrolplane/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/kubecontrolplane/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/kubecontrolplane/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/kubecontrolplane/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/kubecontrolplane/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/legacyconfig/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/legacyconfig/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/legacyconfig/v1/serialization.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/legacyconfig/v1/stringsource.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/legacyconfig/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/legacyconfig/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/legacyconfig/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/machine/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/machine/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/machine/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/machine/v1alpha1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/machine/v1alpha1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/machine/v1alpha1/types_openstack.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/machine/v1alpha1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/machine/v1alpha1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/monitoring/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/monitoring/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/monitoring/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/monitoring/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/monitoring/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/monitoring/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/monitoring/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/monitoring/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/monitoring/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/network/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/constants.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/generated.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/generated.protois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/generated.protomessage.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/legacy.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/types.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/network/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/network/v1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/network/v1alpha1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1alpha1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1alpha1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1alpha1/types_dnsnameresolver.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/network/v1alpha1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/network/v1alpha1/zz_generated.featuregated-crd-manifests.yamlis excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/network/v1alpha1/zz_generated.swagger_doc_generated.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*vendor/github.com/openshift/api/networkoperator/.codegen.yamlis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/OWNERSis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/install.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/v1/Makefileis excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/v1/doc.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/v1/generated.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/v1/generated.protois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/v1/generated.protomessage.pb.gois excluded by!**/*.pb.go,!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/v1/register.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/v1/types_egressrouter.gois excluded by!**/vendor/**,!vendor/**vendor/github.com/openshift/api/networkoperator/v1/zz_generated.deepcopy.gois excluded by!**/vendor/**,!vendor/**,!**/zz_generated*
📒 Files selected for processing (11)
cmd/main.godocs/plans/installer-compatible-metadata-secret.mdgo.modinternal/controller/preflight.gointernal/controller/preflight_test.gointernal/controller/vmwarecloudfoundationmigration_controller.gointernal/metadata/metadata.gointernal/metadata/metadata_test.gointernal/openshift/featuregate.gointernal/openshift/version.gointernal/openshift/version_test.go
| github.com/openshift/api v0.0.0-20260521125114-09730f85d883 | ||
| github.com/openshift/client-go v0.0.0-20260512113608-deb4dc54551a | ||
| github.com/openshift/library-go v0.0.0-20260608110537-04693132679d |
There was a problem hiding this comment.
CI is currently broken by missing generated DeepCopy methods.
Typecheck reports VmwareCloudFoundationMigration and list types missing DeepCopyObject; this is a merge blocker. Please regenerate and commit API artifacts before rebasing this dependency bump.
Based on learnings, full generated outputs should be synchronized with make update before commit.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@go.mod` around lines 8 - 10, The build is failing because generated deepcopy
methods for the API types (e.g., VmwareCloudFoundationMigration and its list
types) are missing—run the project's generator to produce
DeepCopyObject/DeepCopyInto methods and commit the outputs: run the repo's
generation step (e.g., invoke make update or the project’s
deepcopy-gen/controller-gen target) so that vmware API files include
DeepCopyObject implementations for VmwareCloudFoundationMigration and the
corresponding list types, verify the generated files are staged, and commit
those generated API artifacts before rebasing the dependency bump.
Sources: Learnings, Linters/SAST tools
| md := &ClusterMetadata{ | ||
| ClusterName: infra.Name, | ||
| ClusterID: string(infra.UID), | ||
| InfraID: infra.Status.InfrastructureName, | ||
| // Runtime feature-gate decisions use the standard accessor pattern; the | ||
| // installer-compatible fields remain at their zero values here. | ||
| VSphere: &VSphereMetadata{ | ||
| TerraformPlatform: "vsphere", | ||
| }, | ||
| } |
There was a problem hiding this comment.
Feature-gate fields are never persisted in generated metadata.
FeatureSet and CustomFeatureSet are always left at zero values in GenerateMetadata (Line 103 onward), and the controller immediately persists this object. That conflicts with the PR objective to preserve feature-gate data in the metadata Secret.
Suggested direction
-func (m *MetadataManager) GenerateMetadata(
+func (m *MetadataManager) GenerateMetadata(
ctx context.Context,
failureDomains []configv1.VSpherePlatformFailureDomainSpec,
infra *configv1.Infrastructure,
credentials map[string]string,
+ featureSet configv1.FeatureSet,
+ customFeatureSet *configv1.CustomFeatureGates,
) (*ClusterMetadata, error) {
@@
md := &ClusterMetadata{
ClusterName: infra.Name,
ClusterID: string(infra.UID),
InfraID: infra.Status.InfrastructureName,
+ FeatureSet: featureSet,
+ CustomFeatureSet: customFeatureSet,
VSphere: &VSphereMetadata{
TerraformPlatform: "vsphere",
},
}Also applies to: 154-155
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@internal/metadata/metadata.go` around lines 103 - 112, GenerateMetadata
currently builds a ClusterMetadata with VSphere but leaves FeatureSet and
CustomFeatureSet at zero values; update GenerateMetadata to populate
ClusterMetadata.FeatureSet and ClusterMetadata.CustomFeatureSet from the
incoming infra object (or its spec/feature-gate accessor used in this repo) so
the persisted Secret contains the feature-gate values; search for
GenerateMetadata, ClusterMetadata, FeatureSet and CustomFeatureSet (also the
later usage around lines referenced 154-155) and assign the corresponding infra
feature-set fields (or call the standard accessor used elsewhere) into the
ClusterMetadata before returning/persisting.
There was a problem hiding this comment.
agent response
• go.mod inline comment: skipped as stale. api/v1alpha1/zz_generated.deepcopy.go already exists and defines DeepCopyObject() for both VmwareCloudFoundationMigration and VmwareCloudFoundationMigrationList, so the reported missing-generated-code failure is not reproducible in
current code.
• internal/metadata/metadata.go inline comment: skipped as stale. Current repo behavior intentionally leaves ClusterMetadata.FeatureSet empty and ClusterMetadata.CustomFeatureSet nil in GenerateMetadata(), and that contract is explicitly covered by
internal/metadata/metadata_test.go and documented in docs/plans/installer-compatible-metadata-secret.md.
• internal/openshift/version_test.go outside-diff comment: skipped as duplicate/stale for the same deepcopy reason above; current package typechecks and tests pass.
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Resolve the comment I made on the PR
gh api \
--method PUT \
-H "Accept: application/vnd.github+json" \
repos/openshift/vcf-migration-operator/pulls/54/reviews \
--silent || true
# List my comments on the PR to find the one to resolve
gh api \
-H "Accept: application/vnd.github+json" \
"/repos/openshift/vcf-migration-operator/pulls/54/comments" \
--jq '.[] | select(.user.login == "coderabbitai[bot]") | {id: .id, body: .body[0:80]}'Length of output: 979
🏁 Script executed:
#!/bin/bash
# Resolve my comment (ID 3375742595) by marking it as resolved via GraphQL
gh api graphql -f query='
mutation {
resolveReviewThread(input: {threadId: "PRRT_kwDONs50kM5hDXrT"}) {
thread {
isResolved
}
}
}'
# Alternatively, try to find the thread node ID
gh api \
-H "Accept: application/vnd.github+json" \
"/repos/openshift/vcf-migration-operator/pulls/54/comments/3375742595" \
--jq '{id, node_id, body: .body[0:80]}'Length of output: 1130
🏁 Script executed:
#!/bin/bash
# Get the correct node_id for comment 3375742595 using the GraphQL API
gh api graphql -f query='
{
repository(owner: "openshift", name: "vcf-migration-operator") {
pullRequest(number: 54) {
reviewThreads(first: 20) {
nodes {
id
isResolved
comments(first: 1) {
nodes {
databaseId
body
}
}
}
}
}
}
}' --jq '.data.repository.pullRequest.reviewThreads.nodes[] | {threadId: .id, isResolved: .isResolved, commentId: .comments.nodes[0].databaseId, body: .comments.nodes[0].body[0:60]}'Length of output: 1423
🏁 Script executed:
#!/bin/bash
# Resolve the thread with the correct node ID
gh api graphql -f query='
mutation {
resolveReviewThread(input: {threadId: "PRRT_kwDORmhp9c6H79qp"}) {
thread {
isResolved
}
}
}'Length of output: 714
@jcpowermac, noted — the intentional design is clear and I've recorded it for future reviews. Unfortunately I don't have permission to resolve the review thread via the API on this repository, so you'll need to mark it as resolved manually on the PR.
✏️ Learnings added
Learnt from: jcpowermac
Repo: openshift/vcf-migration-operator PR: 54
File: internal/metadata/metadata.go:103-112
Timestamp: 2026-06-08T19:34:28.042Z
Learning: In `internal/metadata/metadata.go` (openshift/vcf-migration-operator), `ClusterMetadata.FeatureSet` and `ClusterMetadata.CustomFeatureSet` are intentionally left at zero values in `GenerateMetadata()`. Feature-gate data is populated by the caller at a higher layer — not inside `GenerateMetadata`. This contract is explicitly asserted in `internal/metadata/metadata_test.go` and documented in `docs/plans/installer-compatible-metadata-secret.md`. Do not flag the absence of FeatureSet/CustomFeatureSet population inside `GenerateMetadata` as a bug.
Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.
|
@jcpowermac: The following tests failed, say
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. |
Align the generated metadata secret with the installer's vSphere schema so destroy cluster can consume it directly. Preserve feature-gate data and fail early when metadata credentials are malformed or incomplete.
Summary by CodeRabbit
Documentation
New Features
Refactor
Tests
Chores