Skip to content

Commit cb023b9

Browse files
committed
Clean-up cluster discovery code
1 parent 7584e54 commit cb023b9

File tree

1 file changed

+63
-38
lines changed

1 file changed

+63
-38
lines changed

pkg/clioptions/clusterdiscovery/cluster.go

Lines changed: 63 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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
108164
func 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

Comments
 (0)