@@ -104,6 +104,62 @@ type ClusterState struct {
104104 FeatureGates sets.Set [string ]
105105}
106106
107+ // discoverAPIGroups discovers available API groups in the cluster
108+ func discoverAPIGroups (coreClient clientset.Interface ) (sets.Set [string ], error ) {
109+ logrus .Infof ("Discovering API Groups..." )
110+ discoveryClient := coreClient .Discovery ()
111+ groups , err := discoveryClient .ServerGroups ()
112+ if err != nil {
113+ return nil , err
114+ }
115+
116+ apiGroups := sets .New [string ]()
117+ for _ , apiGroup := range groups .Groups {
118+ // ignore the empty group
119+ if apiGroup .Name == "" {
120+ continue
121+ }
122+ apiGroups .Insert (apiGroup .Name )
123+ }
124+ logrus .Infof ("Discovered %d API Groups" , apiGroups .Len ())
125+ return apiGroups , nil
126+ }
127+
128+ // discoverFeatureGates discovers enabled feature gates in the cluster
129+ func discoverFeatureGates (configClient configclient.Interface , clusterVersion * configv1.ClusterVersion ) (sets.Set [string ], error ) {
130+ logrus .Infof ("Discovering feature gates..." )
131+ featureGate , err := configClient .ConfigV1 ().FeatureGates ().Get (context .Background (), "cluster" , metav1.GetOptions {})
132+ if err != nil {
133+ logrus .Warningf ("Encountered an error while discovering feature gates: %+v" , err )
134+ return nil , nil // Return nil set instead of error to maintain existing behavior
135+ }
136+
137+ desiredVersion := clusterVersion .Status .Desired .Version
138+ if len (desiredVersion ) == 0 && len (clusterVersion .Status .History ) > 0 {
139+ desiredVersion = clusterVersion .Status .History [0 ].Version
140+ }
141+
142+ featureGates := sets .New [string ]()
143+ for _ , featureGateValues := range featureGate .Status .FeatureGates {
144+ if featureGateValues .Version != desiredVersion {
145+ logrus .Warningf ("Feature gates for version %s not found, skipping" , desiredVersion )
146+ continue
147+ }
148+ for _ , enabledGate := range featureGateValues .Enabled {
149+ featureGates .Insert (string (enabledGate .Name ))
150+ }
151+ break
152+ }
153+
154+ sortedEnabledGates := featureGates .UnsortedList ()
155+ slices .Sort (sortedEnabledGates )
156+
157+ logrus .WithField ("enabled" , sortedEnabledGates ).
158+ Infof ("Discovered %d enabled feature gates" , featureGates .Len ())
159+
160+ return featureGates , nil
161+ }
162+
107163// DiscoverClusterState creates a ClusterState based on a live cluster
108164func DiscoverClusterState (clientConfig * rest.Config ) (* ClusterState , error ) {
109165 coreClient , err := clientset .NewForConfig (clientConfig )
@@ -168,51 +224,20 @@ func DiscoverClusterState(clientConfig *rest.Config) (*ClusterState, error) {
168224 state .OptionalCapabilities = clusterVersion .Status .Capabilities .EnabledCapabilities
169225
170226 // Discover available API groups
171- logrus .Infof ("Discovering API Groups..." )
172- discoveryClient := coreClient .Discovery ()
173- groups , err := discoveryClient .ServerGroups ()
227+ state .APIGroups , err = discoverAPIGroups (coreClient )
174228 if err != nil {
175229 return nil , err
176230 }
177- state .APIGroups = sets .New [string ]()
178- for _ , apiGroup := range groups .Groups {
179- // ignore the empty group
180- if apiGroup .Name == "" {
181- continue
182- }
183- state .APIGroups .Insert (apiGroup .Name )
184- }
185- logrus .Infof ("Discovered %d API Groups" , state .APIGroups .Len ())
186231
187232 // Discover feature gates
188- logrus .Infof ("Discovering feature gates..." )
189- featureGate , err := configClient .ConfigV1 ().FeatureGates ().Get (context .Background (), "cluster" , metav1.GetOptions {})
190- if err != nil {
191- logrus .Warningf ("Encountered an error while discovering feature gates: %+v" , err )
192- } else {
193- desiredVersion := clusterVersion .Status .Desired .Version
194- if len (desiredVersion ) == 0 && len (clusterVersion .Status .History ) > 0 {
195- desiredVersion = clusterVersion .Status .History [0 ].Version
233+ if state .APIGroups .Has ("config.openshift.io" ) {
234+ state .FeatureGates , err = discoverFeatureGates (configClient , clusterVersion )
235+ if err != nil {
236+ logrus .WithError (err ).Warn ("ignoring error from discoverFeatureGates" )
196237 }
197-
238+ } else {
198239 state .FeatureGates = sets .New [string ]()
199- for _ , featureGateValues := range featureGate .Status .FeatureGates {
200- if featureGateValues .Version != desiredVersion {
201- logrus .Warningf ("Feature gates for version %s not found, skipping" , desiredVersion )
202- continue
203- }
204- for _ , enabledGate := range featureGateValues .Enabled {
205- state .FeatureGates .Insert (string (enabledGate .Name ))
206- }
207- break
208- }
209-
210- sortedEnabledGates := state .FeatureGates .UnsortedList ()
211- slices .Sort (sortedEnabledGates )
212-
213- logrus .WithField ("enabled" , sortedEnabledGates ).
214- Infof ("Discovered %d enabled feature gates" ,
215- state .FeatureGates .Len ())
240+ logrus .Infof ("config.openshift.io API group not found, skipping feature gate discovery" )
216241 }
217242
218243 return state , nil
0 commit comments