Skip to content

Commit 8b772a9

Browse files
committed
Ensure MachineAPI is enabled before trying to use its resources
Currently, NHC only checks if it runs on OCP before trying to access MachineAPI resources, however not all OCP clusters have MachineAPI enabled. This change gets if MachineAPI is enabled and creates resources accordingly. Signed-off-by: Carlo Lobrano <[email protected]>
1 parent ff1a2eb commit 8b772a9

File tree

5 files changed

+71
-10
lines changed

5 files changed

+71
-10
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package cluster
2+
3+
import (
4+
"context"
5+
6+
"github.com/pkg/errors"
7+
8+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
9+
"k8s.io/client-go/rest"
10+
11+
v1 "github.com/openshift/api/config/v1"
12+
configv1 "github.com/openshift/client-go/config/clientset/versioned/typed/config/v1"
13+
)
14+
15+
type Capabilities struct {
16+
HasEtcdPDBQuorum, HasMachineAPI bool
17+
}
18+
19+
// HasMachineAPICapability returns true if the cluster has the MachineAPI Enabled
20+
func HasMachineAPICapability(config *rest.Config) (bool, error) {
21+
configV1Client, err := configv1.NewForConfig(config)
22+
if err != nil {
23+
return false, errors.Wrapf(err, "failed to create cluster version client")
24+
}
25+
cvs, err := configV1Client.ClusterVersions().List(context.Background(), metav1.ListOptions{})
26+
if err != nil {
27+
return false, errors.Wrapf(err, "failed to get ClusterVersion")
28+
}
29+
30+
for _, cv := range cvs.Items {
31+
if cv.Status.Capabilities.EnabledCapabilities == nil {
32+
return false, nil
33+
}
34+
var MachineAPI v1.ClusterVersionCapability = "MachineAPI"
35+
for _, capability := range cv.Status.Capabilities.EnabledCapabilities {
36+
if capability == MachineAPI {
37+
return true, nil
38+
}
39+
}
40+
}
41+
return false, nil
42+
}

controllers/mhc/checker.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ type Checker interface {
2525
}
2626

2727
// NewMHCChecker creates a new Checker
28-
func NewMHCChecker(mgr manager.Manager, onOpenshift bool, mhcEvents chan<- event.GenericEvent) (Checker, error) {
28+
func NewMHCChecker(mgr manager.Manager, hasMachineAPI bool, mhcEvents chan<- event.GenericEvent) (Checker, error) {
2929

30-
if !onOpenshift {
30+
if !hasMachineAPI {
3131
return DummyChecker{}, nil
3232
}
3333

controllers/nodehealthcheck_controller.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ type NodeHealthCheckReconciler struct {
8484
Recorder record.EventRecorder
8585
ClusterUpgradeStatusChecker cluster.UpgradeChecker
8686
MHCChecker mhc.Checker
87-
OnOpenShift bool
87+
Capabilities cluster.Capabilities
8888
MHCEvents chan event.GenericEvent
8989
controller controller.Controller
9090
watches map[string]struct{}
@@ -162,7 +162,7 @@ func (r *NodeHealthCheckReconciler) Reconcile(ctx context.Context, req ctrl.Requ
162162
if err != nil {
163163
return result, err
164164
}
165-
resourceManager := resources.NewManager(r.Client, ctx, r.Log, r.OnOpenShift, leaseManager, r.Recorder)
165+
resourceManager := resources.NewManager(r.Client, ctx, r.Log, r.Capabilities.HasMachineAPI, leaseManager, r.Recorder)
166166

167167
// always check if we need to patch status before we exit Reconcile
168168
nhcOrig := nhc.DeepCopy()
@@ -683,8 +683,7 @@ func (r *NodeHealthCheckReconciler) isControlPlaneRemediationAllowed(ctx context
683683
}
684684

685685
// no ongoing control plane remediation, check etcd quorum
686-
if !r.OnOpenShift {
687-
// etcd quorum PDB is only installed in OpenShift
686+
if !r.Capabilities.HasEtcdPDBQuorum {
688687
return true, nil
689688
}
690689
var allowed bool

controllers/suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ var _ = BeforeSuite(func() {
197197
ClusterUpgradeStatusChecker: upgradeChecker,
198198
MHCChecker: mhcChecker,
199199
MHCEvents: mhcEvents,
200-
OnOpenShift: true,
200+
Capabilities: cluster.Capabilities{HasEtcdPDBQuorum: true, HasMachineAPI: true},
201201
}).SetupWithManager(k8sManager)
202202
Expect(err).NotTo(HaveOccurred())
203203

main.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,22 @@ func main() {
143143
os.Exit(1)
144144
}
145145

146+
var hasMachineAPI bool
147+
if onOpenshift {
148+
hasMachineAPI, err := cluster.HasMachineAPICapability(mgr.GetConfig())
149+
if err != nil {
150+
setupLog.Error(err, "failed to check if MachineAPI is enabled")
151+
os.Exit(1)
152+
}
153+
if hasMachineAPI {
154+
setupLog.Info("MachineAPI is enabled")
155+
} else {
156+
setupLog.Info("MachineAPI is not enabled")
157+
}
158+
}
159+
146160
mhcEvents := make(chan event.GenericEvent)
147-
mhcChecker, err := mhc.NewMHCChecker(mgr, onOpenshift, mhcEvents)
161+
mhcChecker, err := mhc.NewMHCChecker(mgr, hasMachineAPI, mhcEvents)
148162
if err != nil {
149163
setupLog.Error(err, "unable initialize MHC checker")
150164
os.Exit(1)
@@ -154,20 +168,26 @@ func main() {
154168
os.Exit(1)
155169
}
156170

171+
clusterCapabilities := cluster.Capabilities{
172+
// etcd quorum PDB is only installed in OpenShift
173+
HasEtcdPDBQuorum: onOpenshift,
174+
HasMachineAPI: hasMachineAPI,
175+
}
176+
157177
if err := (&controllers.NodeHealthCheckReconciler{
158178
Client: mgr.GetClient(),
159179
Log: ctrl.Log.WithName("controllers").WithName("NodeHealthCheck"),
160180
Recorder: mgr.GetEventRecorderFor("NodeHealthCheck"),
161181
ClusterUpgradeStatusChecker: upgradeChecker,
162182
MHCChecker: mhcChecker,
163-
OnOpenShift: onOpenshift,
183+
Capabilities: clusterCapabilities,
164184
MHCEvents: mhcEvents,
165185
}).SetupWithManager(mgr); err != nil {
166186
setupLog.Error(err, "unable to create controller", "controller", "NodeHealthCheck")
167187
os.Exit(1)
168188
}
169189

170-
if onOpenshift {
190+
if hasMachineAPI {
171191
featureGateMHCControllerDisabledEvents := make(chan event.GenericEvent)
172192
featureGateAccessor := featuregates.NewAccessor(mgr.GetConfig(), featureGateMHCControllerDisabledEvents)
173193
if err = mgr.Add(featureGateAccessor); err != nil {

0 commit comments

Comments
 (0)