@@ -19,9 +19,7 @@ package controllers
19
19
import (
20
20
"context"
21
21
"fmt"
22
- "strings"
23
- "time"
24
-
22
+ ocmsdk "github.com/openshift-online/ocm-sdk-go"
25
23
"github.com/project-codeflare/instascale/pkg/config"
26
24
arbv1 "github.com/project-codeflare/multi-cluster-app-dispatcher/pkg/apis/controller/v1beta1"
27
25
corev1 "k8s.io/api/core/v1"
@@ -30,6 +28,8 @@ import (
30
28
"k8s.io/apimachinery/pkg/runtime"
31
29
"k8s.io/client-go/kubernetes"
32
30
"k8s.io/klog"
31
+ "strings"
32
+ "time"
33
33
34
34
"k8s.io/apimachinery/pkg/labels"
35
35
ctrl "sigs.k8s.io/controller-runtime"
@@ -38,15 +38,19 @@ import (
38
38
"sigs.k8s.io/controller-runtime/pkg/log"
39
39
)
40
40
41
+ type MachineType string
42
+
41
43
// AppWrapperReconciler reconciles a AppWrapper object
42
44
type AppWrapperReconciler struct {
43
45
client.Client
44
- Scheme * runtime.Scheme
45
- Config config.InstaScaleConfiguration
46
- kubeClient * kubernetes.Clientset
47
- ocmClusterID string
48
- ocmToken string
49
- useMachineSets bool
46
+ Scheme * runtime.Scheme
47
+ Config config.InstaScaleConfiguration
48
+ kubeClient * kubernetes.Clientset
49
+ ocmClusterID string
50
+ ocmToken string
51
+ ocmConnection * ocmsdk.Connection
52
+ MachineType MachineType
53
+ machineCheck bool
50
54
}
51
55
52
56
var (
55
59
)
56
60
57
61
const (
58
- namespaceToList = "openshift-machine-api"
59
- minResyncPeriod = 10 * time .Minute
60
- finalizerName = "instascale.codeflare.dev/finalizer"
62
+ namespaceToList = "openshift-machine-api"
63
+ minResyncPeriod = 10 * time .Minute
64
+ finalizerName = "instascale.codeflare.dev/finalizer"
65
+ MachineTypeMachineSet MachineType = "MachineSet"
66
+ MachineTypeMachinePool MachineType = "MachinePool"
67
+ MachineTypeNodePool MachineType = "NodePool"
61
68
)
62
69
63
70
// +kubebuilder:rbac:groups=workload.codeflare.dev,resources=appwrappers,verbs=get;list;watch;create;update;patch;delete
@@ -81,15 +88,25 @@ const (
81
88
// For more details, check Reconcile and its Result here:
82
89
// - https://pkg.go.dev/sigs.k8s.io/[email protected] /pkg/reconcile
83
90
func (r * AppWrapperReconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (ctrl.Result , error ) {
84
-
85
91
_ = log .FromContext (ctx )
86
- // todo: Move the getOCMClusterID call out of reconcile loop.
92
+
93
+ // todo: Move the "machineCheck" locic out of reconcile loop.
87
94
// Only reason we are calling it here is that the client is not able to make
88
95
// calls until it is started, so SetupWithManager is not working.
89
- if ! r .useMachineSets && r .ocmClusterID == "" {
90
- if err := r .getOCMClusterID (ctx ); err != nil {
91
- return ctrl.Result {Requeue : true , RequeueAfter : timeFiveSeconds }, err
96
+ if r .machineCheck == false {
97
+ if r .MachineType != MachineTypeMachineSet && r .ocmClusterID == "" {
98
+ if err := r .getOCMClusterID (); err != nil {
99
+ return ctrl.Result {}, err
100
+ }
101
+ }
102
+ hypershiftEnabled , err := r .checkHypershiftEnabled (ctx )
103
+ if err != nil {
104
+ return ctrl.Result {}, fmt .Errorf ("error checking if hypershift is enabled: %w" , err )
92
105
}
106
+ if hypershiftEnabled {
107
+ r .MachineType = MachineTypeNodePool
108
+ }
109
+ r .machineCheck = true
93
110
}
94
111
var appwrapper arbv1.AppWrapper
95
112
@@ -124,8 +141,14 @@ func (r *AppWrapperReconciler) Reconcile(ctx context.Context, req ctrl.Request)
124
141
125
142
demandPerInstanceType := r .discoverInstanceTypes (& appwrapper )
126
143
if ocmSecretRef := r .Config .OCMSecretRef ; ocmSecretRef != nil {
127
- return r .scaleMachinePool (ctx , & appwrapper , demandPerInstanceType )
144
+ switch r .MachineType {
145
+ case MachineTypeNodePool :
146
+ return r .scaleNodePool (ctx , & appwrapper , demandPerInstanceType )
147
+ case MachineTypeMachinePool :
148
+ return r .scaleMachinePool (ctx , & appwrapper , demandPerInstanceType )
149
+ }
128
150
} else {
151
+ // use MachineSets
129
152
switch strings .ToLower (r .Config .MachineSetsStrategy ) {
130
153
case "reuse" :
131
154
return r .reconcileReuseMachineSet (ctx , & appwrapper , demandPerInstanceType )
@@ -142,7 +165,8 @@ func (r *AppWrapperReconciler) finalizeScalingDownMachines(ctx context.Context,
142
165
} else {
143
166
deletionMessage = "deleted"
144
167
}
145
- if r .useMachineSets {
168
+ switch r .MachineType {
169
+ case MachineTypeMachineSet :
146
170
switch strings .ToLower (r .Config .MachineSetsStrategy ) {
147
171
case "reuse" :
148
172
matchedAw := r .findExactMatch (ctx , appwrapper )
@@ -163,7 +187,14 @@ func (r *AppWrapperReconciler) finalizeScalingDownMachines(ctx context.Context,
163
187
return err
164
188
}
165
189
}
166
- } else {
190
+
191
+ case MachineTypeNodePool :
192
+ klog .Infof ("Appwrapper %s scale-down node pool: %s " , deletionMessage , appwrapper .Name )
193
+ if _ , err := r .deleteNodePool (ctx , appwrapper ); err != nil {
194
+ return err
195
+ }
196
+
197
+ case MachineTypeMachinePool :
167
198
klog .Infof ("Appwrapper %s scale-down machine pool: %s " , deletionMessage , appwrapper .Name )
168
199
if _ , err := r .deleteMachinePool (ctx , appwrapper ); err != nil {
169
200
return err
@@ -174,7 +205,6 @@ func (r *AppWrapperReconciler) finalizeScalingDownMachines(ctx context.Context,
174
205
175
206
// SetupWithManager sets up the controller with the Manager.
176
207
func (r * AppWrapperReconciler ) SetupWithManager (ctx context.Context , mgr ctrl.Manager ) error {
177
-
178
208
restConfig := mgr .GetConfig ()
179
209
180
210
var err error
@@ -184,21 +214,16 @@ func (r *AppWrapperReconciler) SetupWithManager(ctx context.Context, mgr ctrl.Ma
184
214
}
185
215
186
216
maxScaleNodesAllowed = int (r .Config .MaxScaleoutAllowed )
187
- r .useMachineSets = true
217
+ r .MachineType = MachineTypeMachineSet // default to MachineSet
188
218
if ocmSecretRef := r .Config .OCMSecretRef ; ocmSecretRef != nil {
189
- r .useMachineSets = false
190
219
if ocmSecret , err := r .getOCMSecret (ctx , ocmSecretRef ); err != nil {
191
220
return fmt .Errorf ("error reading OCM Secret from ref %q: %w" , ocmSecretRef , err )
192
221
} else if token := ocmSecret .Data ["token" ]; len (token ) > 0 {
193
222
r .ocmToken = string (token )
223
+ r .MachineType = MachineTypeMachinePool
194
224
} else {
195
225
return fmt .Errorf ("token is missing from OCM Secret %q" , ocmSecretRef )
196
226
}
197
- if ok , err := r .machinePoolExists (); err != nil {
198
- return err
199
- } else if ok {
200
- klog .Info ("Using machine pools for cluster auto-scaling" )
201
- }
202
227
}
203
228
204
229
return ctrl .NewControllerManagedBy (mgr ).
0 commit comments