-
Notifications
You must be signed in to change notification settings - Fork 213
Set OKD as default featureset for OKD clusters #1287
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Add 'scos' build tag support to enable OKD-specific behavior: - Use OKD featureset as default when FeatureGate is not found - Migrate existing clusters from Default to OKD featureset on upgrade
WalkthroughThe pull request introduces SCOS (OKD) build support with conditional feature gate migration. Changes include build infrastructure updates to support build tags, new version detection flags for SCOS builds, feature gate initialization logic that migrates from Default to OKD for SCOS builds, and corresponding dependency updates. Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~22 minutes ✨ Finishing touches
Comment |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: Prashanth684 The full list of commands accepted by this bot can be found 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Cache: Disabled due to data retention organization setting
Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting
⛔ Files ignored due to path filters (51)
go.sumis excluded by!**/*.sumvendor/github.com/openshift/api/config/v1/register.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/types_feature.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/types_image_policy.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/types_insights.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/types_scheduling.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_00_cluster-version-operator_01_clusterversions-OKD.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_apiservers-OKD.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_clusterimagepolicies-Default.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_clusterimagepolicies-DevPreviewNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_clusterimagepolicies-TechPreviewNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_clusterimagepolicies.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_featuregates.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_imagepolicies-Default.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_imagepolicies-DevPreviewNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_imagepolicies-TechPreviewNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_imagepolicies.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_infrastructures-OKD.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-CustomNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-DevPreviewNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_insightsdatagathers-TechPreviewNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_nodes-OKD.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_schedulers-SelfManagedHA-DevPreviewNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_schedulers-SelfManagedHA-OKD.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.crd-manifests/0000_10_config-operator_01_schedulers-SelfManagedHA-TechPreviewNoUpgrade.crd.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.deepcopy.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.featuregated-crd-manifests.yamlis excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/config/v1/zz_generated.swagger_doc_generated.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/api/features/features.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/custom.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/gatherconfig.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/gathererconfig.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/gatherers.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/insightsdatagather.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/insightsdatagatherspec.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/persistentvolumeclaimreference.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/persistentvolumeconfig.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/config/v1/storage.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/internal/internal.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/applyconfigurations/utils.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/config_client.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/fake/fake_config_client.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/fake/fake_insightsdatagather.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/generated_expansion.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/clientset/versioned/typed/config/v1/insightsdatagather.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/insightsdatagather.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/informers/externalversions/config/v1/interface.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/informers/externalversions/generic.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/listers/config/v1/expansion_generated.gois excluded by!vendor/**,!**/vendor/**vendor/github.com/openshift/client-go/config/listers/config/v1/insightsdatagather.gois excluded by!vendor/**,!**/vendor/**vendor/modules.txtis excluded by!vendor/**,!**/vendor/**
📒 Files selected for processing (7)
Dockerfile.rhelgo.modhack/build-go.shpkg/start/start.gopkg/start/start_integration_test.gopkg/version/scos.gopkg/version/version.go
🧰 Additional context used
📓 Path-based instructions (1)
**
⚙️ CodeRabbit configuration file
-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.
Files:
pkg/version/version.gopkg/version/scos.gogo.modDockerfile.rhelpkg/start/start_integration_test.gohack/build-go.shpkg/start/start.go
🧬 Code graph analysis (2)
pkg/version/scos.go (1)
pkg/version/version.go (1)
SCOS(23-23)
pkg/start/start.go (3)
lib/resourcebuilder/interface.go (1)
Interface(76-80)pkg/featuregates/featuregates.go (2)
CvoGates(43-52)CvoGatesFromFeatureGate(78-107)pkg/version/version.go (1)
IsSCOS(28-30)
🔇 Additional comments (15)
pkg/version/version.go (1)
20-30: LGTM!The SCOS flag and
IsSCOS()function provide a clean runtime interface for detecting OKD builds. The implementation is straightforward and follows Go conventions for build-tag-controlled behavior.Dockerfile.rhel (1)
4-5: LGTM!The
TAGSbuild argument is properly defined and passed to the build script, enabling build-tag support for OKD/SCOS builds while maintaining backward compatibility with an empty default.pkg/version/scos.go (1)
1-7: LGTM!The build-tag-guarded init function correctly enables SCOS mode when compiled with the
scostag. This is a standard Go pattern for build-time configuration.hack/build-go.sh (3)
25-28: LGTM!The conditional
TAGS_FLAGsetup correctly handles both empty and non-emptyTAGSvalues, enabling build tag support when needed.
32-32: LGTM!Build tags are properly passed to the
cluster-version-operator-testsbinary build.
43-43: LGTM!Build tags are properly passed to the
cluster-version-operatorbinary build, ensuring consistent tag support across both binaries.go.mod (1)
13-14: Both dependency versions are valid and available.The commits for
github.com/openshift/api(bfa868a22401) andgithub.com/openshift/client-go(96a6cbc1420c) exist in their respective repositories.pkg/start/start_integration_test.go (3)
195-196: LGTM: Test correctly adapted to new function signature.The test properly creates a
configClientand passes it toprocessInitialFeatureGate, matching the updated signature inpkg/start/start.go.
337-338: LGTM: Test correctly adapted to new function signature.Consistent with the other test updates.
541-542: LGTM: Test correctly adapted to new function signature.All three integration tests now properly handle the new
configClientparameter.pkg/start/start.go (5)
20-20: LGTM: Import required for patch operations.The
typespackage is correctly imported for use withtypes.MergePatchTypein the feature gate migration logic at line 298.
50-50: LGTM: Import required for SCOS detection.The
versionpackage is correctly imported to enable SCOS/OKD build detection viaversion.IsSCOS()in the feature gate initialization logic.
193-194: LGTM: Client properly created for feature gate migration.The dedicated
configClientwith user agent "feature-gate-migration" is appropriately created and passed to the updated function signature.
248-248: LGTM: Function signature correctly extended.The addition of
configClient clientset.Interfaceparameter enables the feature gate migration logic while maintaining backward compatibility with existing behavior.
272-279: LGTM: Appropriate default for SCOS builds.When the FeatureGate resource is not found, SCOS builds correctly default to the OKD feature set, while non-SCOS builds maintain the existing default behavior. The logging clearly indicates which path was taken.
|
|
||
| // Migrate from Default ("") to OKD for existing clusters during upgrade (only for OKD builds) | ||
| if version.IsSCOS() && (startingFeatureSet == "" || startingFeatureSet == configv1.Default) { | ||
| klog.Infof("Detected Default feature set, migrating to OKD feature set") | ||
|
|
||
| // Patch the FeatureGate to change from Default to OKD | ||
| patchData := []byte(fmt.Sprintf(`{"spec":{"featureSet":"%s"}}`, configv1.OKD)) | ||
| patchedGate, patchErr := configClient.ConfigV1().FeatureGates().Patch( | ||
| ctx, | ||
| "cluster", | ||
| types.MergePatchType, | ||
| patchData, | ||
| metav1.PatchOptions{}, | ||
| ) | ||
| if patchErr != nil { | ||
| klog.Errorf("Failed to migrate FeatureGate from Default to OKD: %v", patchErr) | ||
| klog.Warningf("Continuing with Default feature set; migration will be retried on next restart") | ||
| // Continue with Default - don't fail startup | ||
| } else { | ||
| klog.Infof("Successfully migrated FeatureGate from Default to OKD") | ||
| startingFeatureSet = configv1.FeatureSet(configv1.OKD) | ||
| clusterFeatureGate = patchedGate | ||
|
|
||
| // Note: The FeatureChangeStopper will detect this change and trigger a restart | ||
| // This is expected and ensures CVO starts cleanly with the new feature set | ||
| klog.Infof("CVO will restart to apply OKD feature set changes") | ||
| } | ||
| } | ||
| // Compute CVO gates from the feature gate (potentially migrated) | ||
| cvoGates = featuregates.CvoGatesFromFeatureGate(clusterFeatureGate, cvoOpenShiftVersion) | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
# First, let's examine the actual file to see the code in context
head -320 pkg/start/start.go | tail -50Repository: openshift/cluster-version-operator
Length of output: 2518
🏁 Script executed:
# Also check the line count of the file
wc -l pkg/start/start.goRepository: openshift/cluster-version-operator
Length of output: 100
🏁 Script executed:
# Search for tests related to SCOS migration or feature set migration
find . -name "*test*.go" -type f | xargs rg -l "SCOS|migration|OKD.*featureSet" 2>/dev/null | head -20Repository: openshift/cluster-version-operator
Length of output: 150
🏁 Script executed:
# Look for test files specifically in the start package
find pkg/start -name "*test*.go" -type fRepository: openshift/cluster-version-operator
Length of output: 113
🏁 Script executed:
# Check the integration test file for migration-related tests
cat pkg/start/start_integration_test.go | head -100Repository: openshift/cluster-version-operator
Length of output: 2464
🏁 Script executed:
# Search specifically for tests covering the migration path
rg -n "IsSCOS|Default.*OKD|featureSet.*migration|SCOS" pkg/start/start_integration_test.go -B2 -A10Repository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Check what version.IsSCOS() checks
rg -n "IsSCOS" pkg/ -A3 | head -40Repository: openshift/cluster-version-operator
Length of output: 1007
🏁 Script executed:
# Look for tests that cover the patch operation on FeatureGates
rg -n "Patch|featureSet" pkg/start/start_integration_test.go -B3 -A5Repository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Let's check the full integration test file to see what's covered
wc -l pkg/start/start_integration_test.goRepository: openshift/cluster-version-operator
Length of output: 117
🏁 Script executed:
# Search for all test functions in the integration test file
rg -n "^func Test" pkg/start/start_integration_test.goRepository: openshift/cluster-version-operator
Length of output: 265
🏁 Script executed:
# Search more broadly for any mention of migration or Default in tests
rg -n "migration|Default|OKD" pkg/start/start_integration_test.goRepository: openshift/cluster-version-operator
Length of output: 1019
🏁 Script executed:
# Look at the actual MergePatchType implementation to understand idempotency
rg -n "MergePatchType" pkg/ -B2 -A2Repository: openshift/cluster-version-operator
Length of output: 284
🏁 Script executed:
# Check if there are unit tests or other tests that might cover the migration
find pkg/ -name "*.go" -type f -exec grep -l "SCOS.*Default\|Default.*OKD\|migration" {} \;Repository: openshift/cluster-version-operator
Length of output: 165
🏁 Script executed:
# Look at what the "feature-gate-migration" test infrastructure does
rg -n "feature-gate-migration" pkg/start/start_integration_test.go -B5 -A15Repository: openshift/cluster-version-operator
Length of output: 3341
🏁 Script executed:
# Search for tests that actually set up Default feature set scenario
rg -n "Default\|configv1.Default" pkg/start/start_integration_test.go -B3 -A3Repository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Check the full context around line 195 to see the actual test setup
sed -n '190,250p' pkg/start/start_integration_test.goRepository: openshift/cluster-version-operator
Length of output: 2519
🏁 Script executed:
# Look for any setup or test helper functions that configure feature gates
rg -n "featureSet|FeatureGate" pkg/start/start_integration_test.go -B2 -A5Repository: openshift/cluster-version-operator
Length of output: 1586
🏁 Script executed:
# Find the processInitialFeatureGate function to see if it contains the migration logic
rg -n "func.*processInitialFeatureGate" pkg/ -A100 | head -150Repository: openshift/cluster-version-operator
Length of output: 7139
🏁 Script executed:
# Alternatively, search for it in start.go
rg -n "processInitialFeatureGate" pkg/start/start.go -B5 -A50 | head -100Repository: openshift/cluster-version-operator
Length of output: 5458
🏁 Script executed:
# Look for the exact function in the file
ast-grep --pattern 'func $(name) processInitialFeatureGate($_) {
$$$
}'Repository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Let's check where the migration code snippet appears in the file
sed -n '250,330p' pkg/start/start.goRepository: openshift/cluster-version-operator
Length of output: 3697
🏁 Script executed:
# Let's verify if there are any specific test cases for the Default->OKD migration scenario
rg -n "Default|OKD" pkg/start/start_integration_test.go -B5 -A5 | head -80Repository: openshift/cluster-version-operator
Length of output: 1922
🏁 Script executed:
# Check if the FeatureGate resource is actually set up in test fixtures with Default value
rg -n "FeatureGate\|featureSet" pkg/start/start_integration_test.go -B3 -A3 | head -100Repository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Look for any test setup that creates FeatureGate objects
rg -n "FeatureGate.*Default\|Default.*featureSet" pkg/ -type go -B2 -A2Repository: openshift/cluster-version-operator
Length of output: 105
🏁 Script executed:
# Search for where FeatureGate is created/set up in tests
rg -n "FeatureGate" pkg/start/start_integration_test.go -B3 -A3Repository: openshift/cluster-version-operator
Length of output: 1127
🏁 Script executed:
# Look for test helper functions that might set up featuresets
rg -n "func.*Helper\|func.*Setup" pkg/start/start_integration_test.go -A5Repository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Check if Default is mentioned anywhere in test files
rg -n "configv1.Default" pkg/start/ --type goRepository: openshift/cluster-version-operator
Length of output: 196
🏁 Script executed:
# Search more broadly for migration-related tests in the whole repo
find pkg -name "*.go" -type f -exec grep -l "Default.*OKD\|migration.*Default" {} \;Repository: openshift/cluster-version-operator
Length of output: 96
🏁 Script executed:
# Check the full test file to understand test setup and if Default featureset is ever created
grep -n "FeatureSet\|featureSet" pkg/start/start_integration_test.goRepository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Look for helper functions in test file that might create FeatureGate fixtures
rg -n "func.*feature\|NewFeatureGate\|FeatureGate" pkg/start/start_integration_test.go -iRepository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Check if there's a testutil or helper package that sets up feature gates
find pkg -name "*testutil*" -o -name "*test*helper*" | xargs ls -la 2>/dev/nullRepository: openshift/cluster-version-operator
Length of output: 1593
🏁 Script executed:
# Verify that the migration scenario (Default->OKD) is explicitly tested
rg -n "startingFeatureSet.*Default\|Default.*startingFeatureSet" pkg/ --type go -B2 -A2Repository: openshift/cluster-version-operator
Length of output: 60
🏁 Script executed:
# Check if JSON merge patch is truly idempotent by looking at how k8s handles it
web_search
Kubernetes JSON merge patch idempotency behaviorRepository: openshift/cluster-version-operator
Length of output: 177
🌐 Web query:
Kubernetes JSON merge patch idempotency behavior MergePatchType
💡 Result:
Short answer: JSON Merge Patch (MergePatchType / application/merge-patch+json) is effectively idempotent — applying the same merge patch repeatedly yields the same resulting resource after the first application. This follows the RFC 7386 MergePatch rules (fields are added/replaced; null removes a member), and Kubernetes implements this behavior (JSON-merge replaces lists entirely and uses null to remove fields). Caveats: if your patch is a non-object it replaces the whole document; lists are replaced (not merged); and strategic-merge (the default) has different list semantics. (rfc-editor.org)
Sources:
- RFC 7386 (JSON Merge Patch) — processing rules and null-for-delete semantics. [1]
- Kubernetes docs on patch types (kubectl patch / JSON merge patch behavior). [2]
Citations:
🏁 Script executed:
# Let's check if there are any dedicated tests for this migration path
find pkg -name "*.go" -type f | xargs grep -l "processInitialFeatureGate"Repository: openshift/cluster-version-operator
Length of output: 132
🏁 Script executed:
# Check test file setup to see how featuresets are being initialized
sed -n '100,200p' pkg/start/start_integration_test.goRepository: openshift/cluster-version-operator
Length of output: 2933
🏁 Script executed:
# Look at the whole test structure to understand the test cases
rg -n "func Test" pkg/start/start_integration_test.go -A1Repository: openshift/cluster-version-operator
Length of output: 370
🏁 Script executed:
# Let's see if there's any setup in the test that creates a FeatureGate with Default value
sed -n '150,250p' pkg/start/start_integration_test.go | grep -i "featuregate\|defaultclusterprofile"Repository: openshift/cluster-version-operator
Length of output: 445
🏁 Script executed:
# Check if there are any unit tests (as opposed to integration tests) for the migration logic
find pkg/start -name "*.go" | xargs grep -l "TestUnit\|Test.*processInitialFeatureGate" 2>/dev/nullRepository: openshift/cluster-version-operator
Length of output: 62
🏁 Script executed:
# Look at what happens when FeatureGate is not found vs Default value
sed -n '270,320p' pkg/start/start.goRepository: openshift/cluster-version-operator
Length of output: 2528
🏁 Script executed:
# Verify the exact conditions: both "" and configv1.Default trigger migration
rg -n "configv1.OKD\|configv1.Default" pkg/start/start.go -B2 -A2Repository: openshift/cluster-version-operator
Length of output: 60
Add test coverage for Default→OKD migration scenario.
The migration logic is well-implemented and safe:
- Correctly triggers only for SCOS builds with Default/empty feature set
- Uses appropriate
MergePatchTypepatch (idempotent per RFC 7386) - Handles errors gracefully without failing startup
- Updates local state consistently after successful patch
- Properly computes CVO gates from the potentially-migrated feature gate
However, the integration tests call processInitialFeatureGate() but don't explicitly test the migration path itself—they don't set up a cluster with a Default featureset to verify the patch operation and state transition. Consider adding a test case that creates a FeatureGate with Default value and verifies it gets migrated to OKD during startup.
|
@Prashanth684: 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. |
Add 'scos' build tag support to enable OKD-specific behavior:
ref: openshift/enhancements#1899