Skip to content

Conversation

@jianzhangbjz
Copy link
Member

@jianzhangbjz jianzhangbjz commented Oct 28, 2025

Fix Conflicting Feature Gate Settings in Catalogd

Problem

APIV1MetasHandler was set to both true and false due to helm values
files conflicting with cluster feature gate configuration.

    jiazha-mac:cluster-olm-operator jiazha$ oc get deploy catalogd-controller-manager -o yaml |grep APIV1MetasHandler
        - --feature-gates=APIV1MetasHandler=true
        - --feature-gates=APIV1MetasHandler=false    

Solution

Clear helm values file feature gates before applying cluster configuration.
This ensures cluster-driven settings take precedence.

Changes

  • Add ClearFeatureGates() to helmvalues package
  • Call ClearFeatureGates() before merging cluster config in helm.go
  • Add comprehensive unit tests

Result

Feature gates are now set correctly based on cluster configuration:

  • Standard: --feature-gates=APIV1MetasHandler=false
  • TechPreview: --feature-gates=APIV1MetasHandler=true

Assisted-by: Claude Code

@openshift-ci-robot openshift-ci-robot added jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. jira/valid-bug Indicates that a referenced Jira bug is valid for the branch this PR is targeting. labels Oct 28, 2025
@openshift-ci-robot
Copy link

@jianzhangbjz: This pull request references Jira Issue OCPBUGS-63617, 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.21.0) matches configured target version for branch (4.21.0)
  • bug is in the state New, 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 ([email protected]), skipping review request.

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

Details

In response to this:

Fix Conflicting Feature Gate Settings in Catalogd

Problem

APIV1MetasHandler was set to both true and false due to helm values
files conflicting with cluster feature gate configuration.

Solution

Clear helm values file feature gates before applying cluster configuration.
This ensures cluster-driven settings take precedence.

Changes

  • Add ClearFeatureGates() to helmvalues package
  • Call ClearFeatureGates() before merging cluster config in helm.go
  • Add comprehensive unit tests

Result

Feature gates are now set correctly based on cluster configuration:

  • Standard: --feature-gates=APIV1MetasHandler=false
  • TechPreview: --feature-gates=APIV1MetasHandler=true

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-robot
Copy link

@jianzhangbjz: This pull request references Jira Issue OCPBUGS-63617, which is valid.

3 validation(s) were run on this bug
  • bug is open, matching expected state (open)
  • bug target version (4.21.0) matches configured target version for branch (4.21.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 ([email protected]), skipping review request.

Details

In response to this:

Fix Conflicting Feature Gate Settings in Catalogd

Problem

APIV1MetasHandler was set to both true and false due to helm values
files conflicting with cluster feature gate configuration.

   jiazha-mac:cluster-olm-operator jiazha$ oc get deploy catalogd-controller-manager -o yaml |grep APIV1MetasHandler
       - --feature-gates=APIV1MetasHandler=true
       - --feature-gates=APIV1MetasHandler=false    

Solution

Clear helm values file feature gates before applying cluster configuration.
This ensures cluster-driven settings take precedence.

Changes

  • Add ClearFeatureGates() to helmvalues package
  • Call ClearFeatureGates() before merging cluster config in helm.go
  • Add comprehensive unit tests

Result

Feature gates are now set correctly based on cluster configuration:

  • Standard: --feature-gates=APIV1MetasHandler=false
  • TechPreview: --feature-gates=APIV1MetasHandler=true

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.

@jianzhangbjz
Copy link
Member Author

Hi @tmshort , could you help take a look when you get a chance? Thanks!

@jianzhangbjz
Copy link
Member Author

@grokspawn
Copy link
Contributor

/retest-required

1 similar comment
@jianzhangbjz
Copy link
Member Author

/retest-required

@jianzhangbjz
Copy link
Member Author

Test passed, details: https://issues.redhat.com/browse/OCPBUGS-63617
/verified by @jianzhangbjz

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Oct 29, 2025
@openshift-ci-robot
Copy link

@jianzhangbjz: This PR has been marked as verified by @jianzhangbjz.

Details

In response to this:

Test passed, details: https://issues.redhat.com/browse/OCPBUGS-63617
/verified by @jianzhangbjz

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.

@tmshort
Copy link
Contributor

tmshort commented Oct 31, 2025

In what scenario did this happen?

I suspect this happened because the experimental.yaml file enabled it, but it was disabled by the feature-gates. We should really modify that file to remove the feature gate configuration as well.

Copy link
Contributor

@tmshort tmshort left a comment

Choose a reason for hiding this comment

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

Good catch.
There's an optimization (that I strongly recommend) that can be done in ClearFeatureGates().
Even with this fix as a safety check, the experimental.yaml file in openshift/operator-framework-operator-controller should still be updated

// over any feature gates defined in helm values files
func (v *HelmValues) ClearFeatureGates() error {
// Clear operator-controller feature gates if they exist
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(EnableOperatorController, ".")...); found {
Copy link
Contributor

@tmshort tmshort Oct 31, 2025

Choose a reason for hiding this comment

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

Retrieving the NestedStringSlice() is not necessary. Every one of these can simply be a SetNestedStringSlice().

Comment on lines 115 to 135
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(EnableOperatorController, ".")...); found {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(EnableOperatorController, ".")...); err != nil {
return err
}
}
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(DisableOperatorController, ".")...); found {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(DisableOperatorController, ".")...); err != nil {
return err
}
}
// Clear catalogd feature gates if they exist
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(EnableCatalogd, ".")...); found {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(EnableCatalogd, ".")...); err != nil {
return err
}
}
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(DisableCatalogd, ".")...); found {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(DisableCatalogd, ".")...); err != nil {
return err
}
}
Copy link
Contributor

Choose a reason for hiding this comment

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

This can be greatly simplified by using a string slice and iterating over that slice. Less chance of copy/paste errors, and the code is smaller, to boot.

Suggested change
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(EnableOperatorController, ".")...); found {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(EnableOperatorController, ".")...); err != nil {
return err
}
}
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(DisableOperatorController, ".")...); found {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(DisableOperatorController, ".")...); err != nil {
return err
}
}
// Clear catalogd feature gates if they exist
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(EnableCatalogd, ".")...); found {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(EnableCatalogd, ".")...); err != nil {
return err
}
}
if _, found, _ := unstructured.NestedStringSlice(v.values, strings.Split(DisableCatalogd, ".")...); found {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(DisableCatalogd, ".")...); err != nil {
return err
}
}
locationsToClear := []string{
EnableOperatorController,
DisableOperatorController,
EnableCatalogd,
DisableCatalogd,
}
for _, s := range locationsToClear {
if err := unstructured.SetNestedStringSlice(v.values, []string{}, strings.Split(s, ".")...); err != nil {
return err
}
}

@jianzhangbjz
Copy link
Member Author

jianzhangbjz commented Oct 31, 2025

In what scenario did this happen?

No specific configuration. Just a fresh OCP 4.21 cluster.

jiazha-mac:~ jiazha$ oc get clusterversion
NAME      VERSION                              AVAILABLE   PROGRESSING   SINCE   STATUS
version   4.21.0-0.nightly-2025-10-30-125804   True        False         40m     Cluster version is 4.21.0-0.nightly-2025-10-30-125804
jiazha-mac:long_duration jiazha$  oc get deploy -n openshift-operator-controller  operator-controller-controller-manager -o yaml |grep feature-gates
        - --feature-gates=WebhookProviderOpenshiftServiceCA=true
        - --feature-gates=SingleOwnNamespaceInstallSupport=true
        - --feature-gates=PreflightPermissions=true
        - --feature-gates=WebhookProviderOpenshiftServiceCA=true
        - --feature-gates=WebhookProviderCertManager=false
        - --feature-gates=HelmChartSupport=false
        - --feature-gates=BoxcutterRuntime=false
        - --feature-gates=PreflightPermissions=false
        - --feature-gates=SingleOwnNamespaceInstallSupport=false
        - --feature-gates=WebhookProviderCertManager=false
jiazha-mac:long_duration jiazha$ oc get deploy catalogd-controller-manager -o yaml -n openshift-catalogd |grep feature-gates
        - --feature-gates=APIV1MetasHandler=true
        - --feature-gates=APIV1MetasHandler=false
jiazha-mac:~ jiazha$ oc get featuregate cluster -o yaml
apiVersion: config.openshift.io/v1
kind: FeatureGate
metadata:
  annotations:
    include.release.openshift.io/self-managed-high-availability: "true"
  creationTimestamp: "2025-10-31T06:15:54Z"
  generation: 1
  name: cluster
  resourceVersion: "639"
  uid: c041dbef-c894-41a4-93a9-8c4a7682b5a9
spec: {}
status:
  featureGates:
  - disabled:
    - name: AWSClusterHostedDNS
    - name: AWSClusterHostedDNSInstall
    - name: AWSDedicatedHosts
    - name: AWSDualStackInstall
    - name: AWSServiceLBNetworkSecurityGroup
    - name: AutomatedEtcdBackup
    - name: AzureClusterHostedDNSInstall
    - name: AzureDedicatedHosts
    - name: AzureDualStackInstall
    - name: AzureMultiDisk
    - name: BootImageSkewEnforcement
    - name: BootcNodeManagement
    - name: CBORServingAndStorage
    - name: ClientsAllowCBOR
    - name: ClientsPreferCBOR
    - name: ClusterAPIInstall
    - name: ClusterAPIInstallIBMCloud
    - name: ClusterAPIMachineManagementVSphere
    - name: ClusterMonitoringConfig
    - name: ClusterVersionOperatorConfiguration
    - name: DNSNameResolver
    - name: DualReplica
    - name: DyanmicServiceEndpointIBMCloud
    - name: DynamicResourceAllocation
    - name: EtcdBackendQuota
    - name: EventTTL
    - name: EventedPLEG
    - name: Example
    - name: Example2
    - name: ExternalSnapshotMetadata
    - name: GCPClusterHostedDNS
    - name: GCPCustomAPIEndpoints
    - name: GCPCustomAPIEndpointsInstall
    - name: GCPDualStackInstall
    - name: ImageModeStatusReporting
    - name: ImageStreamImportMode
    - name: IngressControllerDynamicConfigurationManager
    - name: InsightsConfig
    - name: InsightsOnDemandDataGather
    - name: IrreconcilableMachineConfig
    - name: KMSEncryptionProvider
    - name: MachineAPIMigration
    - name: MachineAPIOperatorDisableMachineHealthCheckController
    - name: ManagedBootImagesCPMS
    - name: MaxUnavailableStatefulSet
    - name: MinimumKubeletVersion
    - name: MixedCPUsAllocation
    - name: MultiArchInstallAzure
    - name: MultiDiskSetup
    - name: MutableCSINodeAllocatableCount
    - name: MutatingAdmissionPolicy
    - name: NewOLMCatalogdAPIV1Metas
    - name: NewOLMOwnSingleNamespace
    - name: NewOLMPreflightPermissionChecks
    - name: NoRegistryClusterOperations
    - name: NutanixMultiSubnets
    - name: OSStreams
    - name: OVNObservability
    - name: SELinuxMount
    - name: ShortCertRotation
    - name: SignatureStores
    - name: SigstoreImageVerificationPKI
    - name: TranslateStreamCloseWebsocketRequests
    - name: VSphereConfigurableMaxAllowedBlockVolumesPerNode
    - name: VSphereHostVMGroupZonal
    - name: VSphereMixedNodeEnv
    - name: VolumeGroupSnapshot
    enabled:
    - name: AdditionalRoutingCapabilities
    - name: AdminNetworkPolicy
    - name: AlibabaPlatform
    - name: AzureWorkloadIdentity
    - name: BuildCSIVolumes
    - name: CPMSMachineNamePrefix
    - name: ConsolePluginContentSecurityPolicy
    - name: ExternalOIDC
    - name: ExternalOIDCWithUIDAndExtraClaimMappings
    - name: GCPClusterHostedDNSInstall
    - name: GatewayAPI
    - name: GatewayAPIController
    - name: HighlyAvailableArbiter
    - name: ImageVolume
    - name: KMSv1
    - name: MachineConfigNodes
    - name: ManagedBootImages
    - name: ManagedBootImagesAWS
    - name: ManagedBootImagesAzure
    - name: ManagedBootImagesvSphere
    - name: MetricsCollectionProfiles
    - name: NetworkDiagnosticsConfig
    - name: NetworkLiveMigration
    - name: NetworkSegmentation
    - name: NewOLM
    - name: NewOLMWebhookProviderOpenshiftServiceCA
    - name: OpenShiftPodSecurityAdmission
    - name: PinnedImages
    - name: PreconfiguredUDNAddresses
    - name: ProcMountType
    - name: RouteAdvertisements
    - name: RouteExternalCertificate
    - name: ServiceAccountTokenNodeBinding
    - name: SigstoreImageVerification
    - name: StoragePerformantSecurityPolicy
    - name: UpgradeStatus
    - name: UserNamespacesPodSecurityStandards
    - name: UserNamespacesSupport
    - name: VSphereMultiDisk
    - name: VSphereMultiNetworks
    - name: VolumeAttributesClass
    version: 4.21.0-0.nightly-2025-10-30-125804

@openshift-ci-robot openshift-ci-robot removed the verified Signifies that the PR passed pre-merge verification criteria label Oct 31, 2025
@jianzhangbjz
Copy link
Member Author

Hi @tmshort , I have updated it based on your comments, thanks very much! And, I don't think we need to explicitly set --feature-gates=FeatureName=false. Please have a review, thanks!

@jianzhangbjz
Copy link
Member Author

Test passed, details:

1. Build an OCP cluster with this unmerged PR via the cluster-bot
jiazha-mac:~ jiazha$ oc get clusterversion
NAME      VERSION                                                AVAILABLE   PROGRESSING   SINCE   STATUS
version   4.21.0-0-2025-10-31-101545-test-ci-ln-97i27lk-latest   True        False         6m32s   Cluster version is 4.21.0-0-2025-10-31-101545-test-ci-ln-97i27lk-latest

jiazha-mac:~ jiazha$ oc get featuregate cluster -o yaml
apiVersion: config.openshift.io/v1
kind: FeatureGate
metadata:
  annotations:
    include.release.openshift.io/self-managed-high-availability: "true"
  creationTimestamp: "2025-10-31T10:34:21Z"
  generation: 1
  name: cluster
  resourceVersion: "701"
  uid: 7b745465-5fc0-4456-822e-38cbdaeb65a7
spec: {}
status:
  featureGates:
  - disabled:
    - name: AWSClusterHostedDNS
    - name: AWSClusterHostedDNSInstall
    - name: AWSDedicatedHosts
    - name: AWSDualStackInstall
    - name: AWSServiceLBNetworkSecurityGroup
    - name: AutomatedEtcdBackup
    - name: AzureClusterHostedDNSInstall
    - name: AzureDedicatedHosts
    - name: AzureDualStackInstall
    - name: AzureMultiDisk
    - name: BootImageSkewEnforcement
    - name: BootcNodeManagement
    - name: CBORServingAndStorage
    - name: ClientsAllowCBOR
    - name: ClientsPreferCBOR
    - name: ClusterAPIInstall
    - name: ClusterAPIInstallIBMCloud
    - name: ClusterAPIMachineManagementVSphere
    - name: ClusterMonitoringConfig
    - name: ClusterVersionOperatorConfiguration
    - name: DNSNameResolver
    - name: DualReplica
    - name: DyanmicServiceEndpointIBMCloud
    - name: DynamicResourceAllocation
    - name: EtcdBackendQuota
    - name: EventTTL
    - name: EventedPLEG
    - name: Example
    - name: Example2
    - name: ExternalSnapshotMetadata
    - name: GCPClusterHostedDNS
    - name: GCPCustomAPIEndpoints
    - name: GCPCustomAPIEndpointsInstall
    - name: GCPDualStackInstall
    - name: ImageModeStatusReporting
    - name: ImageStreamImportMode
    - name: IngressControllerDynamicConfigurationManager
    - name: InsightsConfig
    - name: InsightsOnDemandDataGather
    - name: IrreconcilableMachineConfig
    - name: KMSEncryptionProvider
    - name: MachineAPIMigration
    - name: MachineAPIOperatorDisableMachineHealthCheckController
    - name: ManagedBootImagesCPMS
    - name: MaxUnavailableStatefulSet
    - name: MinimumKubeletVersion
    - name: MixedCPUsAllocation
    - name: MultiArchInstallAzure
    - name: MultiDiskSetup
    - name: MutableCSINodeAllocatableCount
    - name: MutatingAdmissionPolicy
    - name: NewOLMCatalogdAPIV1Metas
    - name: NewOLMOwnSingleNamespace
    - name: NewOLMPreflightPermissionChecks
    - name: NoRegistryClusterOperations
    - name: NutanixMultiSubnets
    - name: OSStreams
    - name: OVNObservability
    - name: SELinuxMount
    - name: ShortCertRotation
    - name: SignatureStores
    - name: SigstoreImageVerificationPKI
    - name: TranslateStreamCloseWebsocketRequests
    - name: VSphereConfigurableMaxAllowedBlockVolumesPerNode
    - name: VSphereHostVMGroupZonal
    - name: VSphereMixedNodeEnv
    - name: VolumeGroupSnapshot
    enabled:
    - name: AdditionalRoutingCapabilities
    - name: AdminNetworkPolicy
    - name: AlibabaPlatform
    - name: AzureWorkloadIdentity
    - name: BuildCSIVolumes
    - name: CPMSMachineNamePrefix
    - name: ConsolePluginContentSecurityPolicy
    - name: ExternalOIDC
    - name: ExternalOIDCWithUIDAndExtraClaimMappings
    - name: GCPClusterHostedDNSInstall
    - name: GatewayAPI
    - name: GatewayAPIController
    - name: HighlyAvailableArbiter
    - name: ImageVolume
    - name: KMSv1
    - name: MachineConfigNodes
    - name: ManagedBootImages
    - name: ManagedBootImagesAWS
    - name: ManagedBootImagesAzure
    - name: ManagedBootImagesvSphere
    - name: MetricsCollectionProfiles
    - name: NetworkDiagnosticsConfig
    - name: NetworkLiveMigration
    - name: NetworkSegmentation
    - name: NewOLM
    - name: NewOLMWebhookProviderOpenshiftServiceCA
    - name: OpenShiftPodSecurityAdmission
    - name: PinnedImages
    - name: PreconfiguredUDNAddresses
    - name: ProcMountType
    - name: RouteAdvertisements
    - name: RouteExternalCertificate
    - name: ServiceAccountTokenNodeBinding
    - name: SigstoreImageVerification
    - name: StoragePerformantSecurityPolicy
    - name: UpgradeStatus
    - name: UserNamespacesPodSecurityStandards
    - name: UserNamespacesSupport
    - name: VSphereMultiDisk
    - name: VSphereMultiNetworks
    - name: VolumeAttributesClass
    version: 4.21.0-0-2025-10-31-101545-test-ci-ln-97i27lk-latest

2, Check those feature-gates settings, no explicitly set --feature-gates=FeatureNamexx=false, LGTM.
jiazha-mac:~ jiazha$  oc get deploy catalogd-controller-manager -o yaml -n openshift-catalogd |grep feature-gates
jiazha-mac:~ jiazha$ 
jiazha-mac:~ jiazha$ oc get deploy -n openshift-operator-controller  operator-controller-controller-manager -o yaml |grep feature-gates
        - --feature-gates=WebhookProviderOpenshiftServiceCA=true
        - --feature-gates=WebhookProviderCertManager=false
        -
3. Enable TP.
jiazha-mac:cluster-olm-operator jiazha$ oc patch featuregate cluster -p '{"spec": {"featureSet": "TechPreviewNoUpgrade"}}' --type=merge
featuregate.config.openshift.io/cluster patched

4, Check those feature-gates settings, LGTM.
jiazha-mac:cluster-olm-operator jiazha$  oc get deploy catalogd-controller-manager -o yaml -n openshift-catalogd |grep feature-gates
        - --feature-gates=APIV1MetasHandler=true
jiazha-mac:cluster-olm-operator jiazha$ oc get deploy -n openshift-operator-controller  operator-controller-controller-manager -o yaml |grep feature-gates
        - --feature-gates=PreflightPermissions=true
        - --feature-gates=SingleOwnNamespaceInstallSupport=true
        - --feature-gates=WebhookProviderOpenshiftServiceCA=true
        - --feature-gates=WebhookProviderCertManager=false

@jianzhangbjz
Copy link
Member Author

/verified by @jianzhangbjz

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Oct 31, 2025
@openshift-ci-robot
Copy link

@jianzhangbjz: This PR has been marked as verified by @jianzhangbjz.

Details

In response to this:

/verified by @jianzhangbjz

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
Contributor

@tmshort tmshort left a comment

Choose a reason for hiding this comment

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

There was a Slack discussion regarding the GA of WebHook enablement, and the need to explicitly disable feature-gates.

Copy link
Contributor

@tmshort tmshort Oct 31, 2025

Choose a reason for hiding this comment

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

Actually, we do want to explicitly disable (regardless of Kubernetes "best practices"), as this allows us to have features GA'd upstream and not downstream. That was the whole point of #144.

We need to explicitly disable WebHookCertManager, otherwise, it takes precedence over WebHookOpenshiftServiceCA (although you did leave that disablement in).

Please revert mapper.go and mapper_test.go.

@tmshort
Copy link
Contributor

tmshort commented Oct 31, 2025

Hi @tmshort , I have updated it based on your comments, thanks very much! And, I don't think we need to explicitly set --feature-gates=FeatureName=false. Please have a review, thanks!

I hate to harp on this, but this was done on purpose due to the WebHookCertManager and WebHookOpenshiftServiceCA feature-gates and the (now reverted) upstream GA of the Single/Own Namespace feature.

Fundamentally, this mechanism allows operator-framework to GA features upstream without doing it upstream, and allows CustomNoUpgrade to work as expected for features that are GA'd, but still have a feature flag (because features can still be disabled).

@tmshort
Copy link
Contributor

tmshort commented Oct 31, 2025

Alternative in #148 that keeps the experimental.yaml file relevant.

@jianzhangbjz
Copy link
Member Author

Closed this PR since

  • The experimental.yaml configuration is completely ignored.

  • Once a feature is GA upstream, downstream cannot force-disable it.

  • Users with CustomNoUpgrade cannot disable GA features.

@openshift-ci-robot
Copy link

@jianzhangbjz: This pull request references Jira Issue OCPBUGS-63617. The bug has been updated to no longer refer to the pull request using the external bug tracker.

Details

In response to this:

Fix Conflicting Feature Gate Settings in Catalogd

Problem

APIV1MetasHandler was set to both true and false due to helm values
files conflicting with cluster feature gate configuration.

   jiazha-mac:cluster-olm-operator jiazha$ oc get deploy catalogd-controller-manager -o yaml |grep APIV1MetasHandler
       - --feature-gates=APIV1MetasHandler=true
       - --feature-gates=APIV1MetasHandler=false    

Solution

Clear helm values file feature gates before applying cluster configuration.
This ensures cluster-driven settings take precedence.

Changes

  • Add ClearFeatureGates() to helmvalues package
  • Call ClearFeatureGates() before merging cluster config in helm.go
  • Add comprehensive unit tests

Result

Feature gates are now set correctly based on cluster configuration:

  • Standard: --feature-gates=APIV1MetasHandler=false
  • TechPreview: --feature-gates=APIV1MetasHandler=true

Assisted-by: Claude Code

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.

@jianzhangbjz jianzhangbjz reopened this Nov 3, 2025
@openshift-ci-robot
Copy link

@jianzhangbjz: This pull request references Jira Issue OCPBUGS-63617, which is valid.

3 validation(s) were run on this bug
  • bug is open, matching expected state (open)
  • bug target version (4.21.0) matches configured target version for branch (4.21.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 ([email protected]), skipping review request.

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

Details

In response to this:

Fix Conflicting Feature Gate Settings in Catalogd

Problem

APIV1MetasHandler was set to both true and false due to helm values
files conflicting with cluster feature gate configuration.

   jiazha-mac:cluster-olm-operator jiazha$ oc get deploy catalogd-controller-manager -o yaml |grep APIV1MetasHandler
       - --feature-gates=APIV1MetasHandler=true
       - --feature-gates=APIV1MetasHandler=false    

Solution

Clear helm values file feature gates before applying cluster configuration.
This ensures cluster-driven settings take precedence.

Changes

  • Add ClearFeatureGates() to helmvalues package
  • Call ClearFeatureGates() before merging cluster config in helm.go
  • Add comprehensive unit tests

Result

Feature gates are now set correctly based on cluster configuration:

  • Standard: --feature-gates=APIV1MetasHandler=false
  • TechPreview: --feature-gates=APIV1MetasHandler=true

Assisted-by: Claude Code

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
Copy link
Contributor

openshift-ci bot commented Nov 3, 2025

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: jianzhangbjz
Once this PR has been reviewed and has the lgtm label, please ask for approval from tmshort. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found 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-robot openshift-ci-robot removed the verified Signifies that the PR passed pre-merge verification criteria label Nov 3, 2025
@jianzhangbjz
Copy link
Member Author

/retest-required

@tmshort
Copy link
Contributor

tmshort commented Nov 3, 2025

/test openshift-e2e-aws-techpreview

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Nov 3, 2025

@jianzhangbjz: all tests passed!

Full PR test history. Your PR dashboard.

Details

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

@jianzhangbjz
Copy link
Member Author

Closed it since #148 has fixed this issue.

@openshift-ci-robot
Copy link

@jianzhangbjz: This pull request references Jira Issue OCPBUGS-63617. The bug has been updated to no longer refer to the pull request using the external bug tracker.

Details

In response to this:

Fix Conflicting Feature Gate Settings in Catalogd

Problem

APIV1MetasHandler was set to both true and false due to helm values
files conflicting with cluster feature gate configuration.

   jiazha-mac:cluster-olm-operator jiazha$ oc get deploy catalogd-controller-manager -o yaml |grep APIV1MetasHandler
       - --feature-gates=APIV1MetasHandler=true
       - --feature-gates=APIV1MetasHandler=false    

Solution

Clear helm values file feature gates before applying cluster configuration.
This ensures cluster-driven settings take precedence.

Changes

  • Add ClearFeatureGates() to helmvalues package
  • Call ClearFeatureGates() before merging cluster config in helm.go
  • Add comprehensive unit tests

Result

Feature gates are now set correctly based on cluster configuration:

  • Standard: --feature-gates=APIV1MetasHandler=false
  • TechPreview: --feature-gates=APIV1MetasHandler=true

Assisted-by: Claude Code

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-merge-robot openshift-merge-robot added the needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD. label Nov 5, 2025
@openshift-merge-robot
Copy link
Contributor

PR needs rebase.

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.

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

Labels

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. needs-rebase Indicates a PR cannot be merged because it has merge conflicts with HEAD.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants