From 6c9e8a3126aa77fb5c883905b1274f64b8f1f055 Mon Sep 17 00:00:00 2001 From: "Per G. da Silva" Date: Tue, 23 Jun 2026 16:11:56 +0200 Subject: [PATCH 1/2] CONSOLE-5271: Gate lifecycle metadata on server-side OLM lifecycle flag Replace the frontend FeatureGate CRD watch with a server-side flag so that operator lifecycle metadata columns (cluster compatibility, support phase) on the Installed Operators page are controlled by the console operator configuration rather than requiring frontend RBAC to read the FeatureGate resource. - Add --olm-lifecycle bridge flag and OLMLifecycleEnabled config field - Pass olmLifecycle through SERVER_FLAGS to the frontend - Simplify detectLifecycleMetadata to read the server flag directly - Remove FeatureGateModel (no longer needed in frontend) - Add backend config test for the new flag Co-Authored-By: Claude Opus 4.6 (1M context) --- cmd/bridge/main.go | 2 ++ frontend/@types/console/window.d.ts | 1 + .../operator-lifecycle-manager/src/features.ts | 2 +- pkg/server/server.go | 3 +++ pkg/serverconfig/config.go | 4 ++++ pkg/serverconfig/config_test.go | 15 +++++++++++++++ pkg/serverconfig/types.go | 1 + 7 files changed, 27 insertions(+), 1 deletion(-) diff --git a/cmd/bridge/main.go b/cmd/bridge/main.go index d811fb0cf7d..882504436f6 100644 --- a/cmd/bridge/main.go +++ b/cmd/bridge/main.go @@ -178,6 +178,7 @@ func main() { fNodeOperatingSystems := fs.String("node-operating-systems", "", "List of node operating systems. Example --node-operating-system=linux,windows") fCopiedCSVsDisabled := fs.Bool("copied-csvs-disabled", false, "Flag to indicate if OLM copied CSVs are disabled.") fTechPreview := fs.Bool("tech-preview", false, "Enable console Technology Preview features.") + fOLMLifecycle := fs.Bool("olm-lifecycle", false, "Enable OLM operator lifecycle and compatibility features.") cfg, err := serverconfig.Parse(fs, os.Args[1:], "BRIDGE") if err != nil { @@ -357,6 +358,7 @@ func main() { K8sMode: *fK8sMode, CopiedCSVsDisabled: *fCopiedCSVsDisabled, TechPreview: *fTechPreview, + OLMLifecycle: *fOLMLifecycle, Capabilities: capabilities, } diff --git a/frontend/@types/console/window.d.ts b/frontend/@types/console/window.d.ts index 5baf55c51a6..5a199fddb10 100644 --- a/frontend/@types/console/window.d.ts +++ b/frontend/@types/console/window.d.ts @@ -64,6 +64,7 @@ declare interface Window { hubConsoleURL: string; k8sMode: string; techPreview: boolean; + olmLifecycle: boolean; capabilities: { name: string; visibility: { state: 'Enabled' | 'Disabled' }; diff --git a/frontend/packages/operator-lifecycle-manager/src/features.ts b/frontend/packages/operator-lifecycle-manager/src/features.ts index 66b8808969f..562b3990fc2 100644 --- a/frontend/packages/operator-lifecycle-manager/src/features.ts +++ b/frontend/packages/operator-lifecycle-manager/src/features.ts @@ -2,5 +2,5 @@ import type { FeatureFlagHandler } from '@console/dynamic-plugin-sdk/src/extensi import { Flags } from './const'; export const detectLifecycleMetadata: FeatureFlagHandler = (setFeatureFlag) => { - setFeatureFlag(Flags.OPERATOR_LIFECYCLE_METADATA, !!window.SERVER_FLAGS.techPreview); + setFeatureFlag(Flags.OPERATOR_LIFECYCLE_METADATA, !!window.SERVER_FLAGS.olmLifecycle); }; diff --git a/pkg/server/server.go b/pkg/server/server.go index b403a5c494a..0eb933a44cf 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -142,6 +142,7 @@ type jsGlobals struct { Telemetry serverconfig.MultiKeyValue `json:"telemetry"` ThanosPublicURL string `json:"thanosPublicURL"` TechPreview bool `json:"techPreview"` + OLMLifecycle bool `json:"olmLifecycle"` UserSettingsLocation string `json:"userSettingsLocation"` DevConsoleProxyAvailable bool `json:"devConsoleProxyAvailable"` } @@ -172,6 +173,7 @@ type Server struct { CSRFVerifier *csrfverifier.CSRFVerifier CustomLogoFiles serverconfig.LogosKeyValue TechPreview bool + OLMLifecycle bool CustomFaviconFiles serverconfig.LogosKeyValue CustomProductName string DevCatalogCategories string @@ -790,6 +792,7 @@ func (s *Server) indexHandler(w http.ResponseWriter, r *http.Request) { Telemetry: s.Telemetry, ThanosPublicURL: s.ThanosPublicURL.String(), TechPreview: s.TechPreview, + OLMLifecycle: s.OLMLifecycle, UserSettingsLocation: s.UserSettingsLocation, DevConsoleProxyAvailable: true, } diff --git a/pkg/serverconfig/config.go b/pkg/serverconfig/config.go index 0f6736783c0..02e41d8ffce 100644 --- a/pkg/serverconfig/config.go +++ b/pkg/serverconfig/config.go @@ -291,6 +291,10 @@ func addClusterInfo(fs *flag.FlagSet, clusterInfo *ClusterInfo) { if clusterInfo.TechPreviewEnabled { fs.Set("tech-preview", "true") } + + if clusterInfo.OLMLifecycleEnabled { + fs.Set("olm-lifecycle", "true") + } } func addProviders(fs *flag.FlagSet, providers *Providers) { diff --git a/pkg/serverconfig/config_test.go b/pkg/serverconfig/config_test.go index f2e6074edbf..ff7892ba96d 100644 --- a/pkg/serverconfig/config_test.go +++ b/pkg/serverconfig/config_test.go @@ -291,6 +291,20 @@ func TestSetFlagsFromConfig(t *testing.T) { }, expectedError: nil, }, + { + name: "Should apply OLM lifecycle enabled", + config: Config{ + APIVersion: "console.openshift.io/v1", + Kind: "ConsoleConfig", + ClusterInfo: ClusterInfo{ + OLMLifecycleEnabled: true, + }, + }, + expectedFlagValues: map[string]string{ + "olm-lifecycle": "true", + }, + expectedError: nil, + }, { name: "Should apply CSP configuration", config: Config{ @@ -314,6 +328,7 @@ func TestSetFlagsFromConfig(t *testing.T) { fs.Var(&MultiKeyValue{}, "plugins", "") fs.Var(&MultiKeyValue{}, "telemetry", "") fs.Var(&MultiKeyValue{}, "content-security-policy", "") + fs.Bool("olm-lifecycle", false, "") actualError := SetFlagsFromConfig(fs, &test.config) actual := make(map[string]string) diff --git a/pkg/serverconfig/types.go b/pkg/serverconfig/types.go index 9a161c93301..0420ce482b2 100644 --- a/pkg/serverconfig/types.go +++ b/pkg/serverconfig/types.go @@ -81,6 +81,7 @@ type ClusterInfo struct { NodeOperatingSystems []string `yaml:"nodeOperatingSystems,omitempty"` CopiedCSVsDisabled bool `yaml:"copiedCSVsDisabled,omitempty"` TechPreviewEnabled bool `yaml:"techPreviewEnabled,omitempty"` + OLMLifecycleEnabled bool `yaml:"olmLifecycleEnabled,omitempty"` } // Auth holds configuration for authenticating with OpenShift. The auth method is assumed to be "openshift". From 21eab53f0dc3465fccfc1e763080c58505e86cbf Mon Sep 17 00:00:00 2001 From: "Per G. da Silva" Date: Tue, 23 Jun 2026 16:57:29 +0200 Subject: [PATCH 2/2] CONSOLE-5271: Rename olmLifecycle to olmLifecycleMetadata for clarity Rename all occurrences of the OLM lifecycle config field, CLI flag, and SERVER_FLAGS property to include "Metadata" for consistency with the feature name (operator lifecycle metadata). Co-Authored-By: Claude Opus 4.6 (1M context) Signed-off-by: Per G. da Silva --- cmd/bridge/main.go | 4 ++-- frontend/@types/console/window.d.ts | 2 +- .../src/features.ts | 2 +- pkg/server/server.go | 6 +++--- pkg/serverconfig/config.go | 4 ++-- pkg/serverconfig/config_test.go | 8 ++++---- pkg/serverconfig/types.go | 20 +++++++++---------- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/cmd/bridge/main.go b/cmd/bridge/main.go index 882504436f6..c976a445d5c 100644 --- a/cmd/bridge/main.go +++ b/cmd/bridge/main.go @@ -178,7 +178,7 @@ func main() { fNodeOperatingSystems := fs.String("node-operating-systems", "", "List of node operating systems. Example --node-operating-system=linux,windows") fCopiedCSVsDisabled := fs.Bool("copied-csvs-disabled", false, "Flag to indicate if OLM copied CSVs are disabled.") fTechPreview := fs.Bool("tech-preview", false, "Enable console Technology Preview features.") - fOLMLifecycle := fs.Bool("olm-lifecycle", false, "Enable OLM operator lifecycle and compatibility features.") + fOLMLifecycleMetadata := fs.Bool("olm-lifecycle-metadata", false, "Enable OLM operator lifecycle and compatibility features.") cfg, err := serverconfig.Parse(fs, os.Args[1:], "BRIDGE") if err != nil { @@ -358,7 +358,7 @@ func main() { K8sMode: *fK8sMode, CopiedCSVsDisabled: *fCopiedCSVsDisabled, TechPreview: *fTechPreview, - OLMLifecycle: *fOLMLifecycle, + OLMLifecycleMetadata: *fOLMLifecycleMetadata, Capabilities: capabilities, } diff --git a/frontend/@types/console/window.d.ts b/frontend/@types/console/window.d.ts index 5a199fddb10..e6f45ccba27 100644 --- a/frontend/@types/console/window.d.ts +++ b/frontend/@types/console/window.d.ts @@ -64,7 +64,7 @@ declare interface Window { hubConsoleURL: string; k8sMode: string; techPreview: boolean; - olmLifecycle: boolean; + olmLifecycleMetadata: boolean; capabilities: { name: string; visibility: { state: 'Enabled' | 'Disabled' }; diff --git a/frontend/packages/operator-lifecycle-manager/src/features.ts b/frontend/packages/operator-lifecycle-manager/src/features.ts index 562b3990fc2..fd760bd6418 100644 --- a/frontend/packages/operator-lifecycle-manager/src/features.ts +++ b/frontend/packages/operator-lifecycle-manager/src/features.ts @@ -2,5 +2,5 @@ import type { FeatureFlagHandler } from '@console/dynamic-plugin-sdk/src/extensi import { Flags } from './const'; export const detectLifecycleMetadata: FeatureFlagHandler = (setFeatureFlag) => { - setFeatureFlag(Flags.OPERATOR_LIFECYCLE_METADATA, !!window.SERVER_FLAGS.olmLifecycle); + setFeatureFlag(Flags.OPERATOR_LIFECYCLE_METADATA, !!window.SERVER_FLAGS.olmLifecycleMetadata); }; diff --git a/pkg/server/server.go b/pkg/server/server.go index 0eb933a44cf..287de230d65 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -142,7 +142,7 @@ type jsGlobals struct { Telemetry serverconfig.MultiKeyValue `json:"telemetry"` ThanosPublicURL string `json:"thanosPublicURL"` TechPreview bool `json:"techPreview"` - OLMLifecycle bool `json:"olmLifecycle"` + OLMLifecycleMetadata bool `json:"olmLifecycleMetadata"` UserSettingsLocation string `json:"userSettingsLocation"` DevConsoleProxyAvailable bool `json:"devConsoleProxyAvailable"` } @@ -173,7 +173,7 @@ type Server struct { CSRFVerifier *csrfverifier.CSRFVerifier CustomLogoFiles serverconfig.LogosKeyValue TechPreview bool - OLMLifecycle bool + OLMLifecycleMetadata bool CustomFaviconFiles serverconfig.LogosKeyValue CustomProductName string DevCatalogCategories string @@ -792,7 +792,7 @@ func (s *Server) indexHandler(w http.ResponseWriter, r *http.Request) { Telemetry: s.Telemetry, ThanosPublicURL: s.ThanosPublicURL.String(), TechPreview: s.TechPreview, - OLMLifecycle: s.OLMLifecycle, + OLMLifecycleMetadata: s.OLMLifecycleMetadata, UserSettingsLocation: s.UserSettingsLocation, DevConsoleProxyAvailable: true, } diff --git a/pkg/serverconfig/config.go b/pkg/serverconfig/config.go index 02e41d8ffce..3f25b9338d9 100644 --- a/pkg/serverconfig/config.go +++ b/pkg/serverconfig/config.go @@ -292,8 +292,8 @@ func addClusterInfo(fs *flag.FlagSet, clusterInfo *ClusterInfo) { fs.Set("tech-preview", "true") } - if clusterInfo.OLMLifecycleEnabled { - fs.Set("olm-lifecycle", "true") + if clusterInfo.OLMLifecycleMetadataEnabled { + fs.Set("olm-lifecycle-metadata", "true") } } diff --git a/pkg/serverconfig/config_test.go b/pkg/serverconfig/config_test.go index ff7892ba96d..8262b4654e3 100644 --- a/pkg/serverconfig/config_test.go +++ b/pkg/serverconfig/config_test.go @@ -292,16 +292,16 @@ func TestSetFlagsFromConfig(t *testing.T) { expectedError: nil, }, { - name: "Should apply OLM lifecycle enabled", + name: "Should apply OLM lifecycle metadata enabled", config: Config{ APIVersion: "console.openshift.io/v1", Kind: "ConsoleConfig", ClusterInfo: ClusterInfo{ - OLMLifecycleEnabled: true, + OLMLifecycleMetadataEnabled: true, }, }, expectedFlagValues: map[string]string{ - "olm-lifecycle": "true", + "olm-lifecycle-metadata": "true", }, expectedError: nil, }, @@ -328,7 +328,7 @@ func TestSetFlagsFromConfig(t *testing.T) { fs.Var(&MultiKeyValue{}, "plugins", "") fs.Var(&MultiKeyValue{}, "telemetry", "") fs.Var(&MultiKeyValue{}, "content-security-policy", "") - fs.Bool("olm-lifecycle", false, "") + fs.Bool("olm-lifecycle-metadata", false, "") actualError := SetFlagsFromConfig(fs, &test.config) actual := make(map[string]string) diff --git a/pkg/serverconfig/types.go b/pkg/serverconfig/types.go index 0420ce482b2..2d62cd70e2f 100644 --- a/pkg/serverconfig/types.go +++ b/pkg/serverconfig/types.go @@ -72,16 +72,16 @@ type MonitoringInfo struct { // ClusterInfo holds information the about the cluster such as master public URL and console public URL. type ClusterInfo struct { - ConsoleBaseAddress string `yaml:"consoleBaseAddress,omitempty"` - ConsoleBasePath string `yaml:"consoleBasePath,omitempty"` - MasterPublicURL string `yaml:"masterPublicURL,omitempty"` - ControlPlaneTopology configv1.TopologyMode `yaml:"controlPlaneTopology,omitempty"` - ReleaseVersion string `yaml:"releaseVersion,omitempty"` - NodeArchitectures []string `yaml:"nodeArchitectures,omitempty"` - NodeOperatingSystems []string `yaml:"nodeOperatingSystems,omitempty"` - CopiedCSVsDisabled bool `yaml:"copiedCSVsDisabled,omitempty"` - TechPreviewEnabled bool `yaml:"techPreviewEnabled,omitempty"` - OLMLifecycleEnabled bool `yaml:"olmLifecycleEnabled,omitempty"` + ConsoleBaseAddress string `yaml:"consoleBaseAddress,omitempty"` + ConsoleBasePath string `yaml:"consoleBasePath,omitempty"` + MasterPublicURL string `yaml:"masterPublicURL,omitempty"` + ControlPlaneTopology configv1.TopologyMode `yaml:"controlPlaneTopology,omitempty"` + ReleaseVersion string `yaml:"releaseVersion,omitempty"` + NodeArchitectures []string `yaml:"nodeArchitectures,omitempty"` + NodeOperatingSystems []string `yaml:"nodeOperatingSystems,omitempty"` + CopiedCSVsDisabled bool `yaml:"copiedCSVsDisabled,omitempty"` + TechPreviewEnabled bool `yaml:"techPreviewEnabled,omitempty"` + OLMLifecycleMetadataEnabled bool `yaml:"olmLifecycleMetadataEnabled,omitempty"` } // Auth holds configuration for authenticating with OpenShift. The auth method is assumed to be "openshift".