@@ -8,9 +8,16 @@ import (
88 corev1 "k8s.io/api/core/v1"
99 apierrors "k8s.io/apimachinery/pkg/api/errors"
1010 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+ "k8s.io/apimachinery/pkg/runtime/schema"
12+ "k8s.io/client-go/discovery"
13+ "k8s.io/client-go/dynamic"
14+ "k8s.io/client-go/rest"
15+ "k8s.io/client-go/scale"
1116 "k8s.io/utils/pointer"
1217 clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
1318 "sigs.k8s.io/controller-runtime/pkg/client"
19+ "sigs.k8s.io/controller-runtime/pkg/client/apiutil"
20+ "sigs.k8s.io/controller-runtime/pkg/client/config"
1421)
1522
1623type machineSetParams struct {
@@ -188,3 +195,55 @@ func GetMachinesFromMachineSet(cl client.Client, machineSet *clusterv1.MachineSe
188195 }
189196 return machinesForSet , nil
190197}
198+
199+
200+ // ScaleMachineSet scales a machineSet with a given name to the given number of replicas.
201+ func ScaleMachineSet (name string , replicas int ) error {
202+ scaleClient , err := getScaleClient ()
203+ if err != nil {
204+ return fmt .Errorf ("error calling getScaleClient %w" , err )
205+ }
206+
207+ scale , err := scaleClient .Scales (CAPINamespace ).Get (ctx , schema.GroupResource {Group : "cluster.x-k8s.io" , Resource : "MachineSet" }, name , metav1.GetOptions {})
208+ if err != nil {
209+ return fmt .Errorf ("error calling scaleClient.Scales get: %w" , err )
210+ }
211+
212+ scaleUpdate := scale .DeepCopy ()
213+ scaleUpdate .Spec .Replicas = int32 (replicas )
214+
215+ _ , err = scaleClient .Scales (CAPINamespace ).Update (ctx , schema.GroupResource {Group : "cluster.x-k8s.io" , Resource : "MachineSet" }, scaleUpdate , metav1.UpdateOptions {})
216+ if err != nil {
217+ return fmt .Errorf ("error calling scaleClient.Scales update: %w" , err )
218+ }
219+
220+ return nil
221+ }
222+
223+ // getScaleClient returns a ScalesGetter object to manipulate scale subresources.
224+ func getScaleClient () (scale.ScalesGetter , error ) {
225+ cfg , err := config .GetConfig ()
226+ if err != nil {
227+ return nil , fmt .Errorf ("error getting config %w" , err )
228+ }
229+
230+ httpClient , err := rest .HTTPClientFor (cfg )
231+ if err != nil {
232+ return nil , fmt .Errorf ("error calling rest.HTTPClientFor %w" , err )
233+ }
234+
235+ mapper , err := apiutil .NewDynamicRESTMapper (cfg , httpClient )
236+ if err != nil {
237+ return nil , fmt .Errorf ("error calling NewDiscoveryRESTMapper %w" , err )
238+ }
239+
240+ discovery := discovery .NewDiscoveryClientForConfigOrDie (cfg )
241+ scaleKindResolver := scale .NewDiscoveryScaleKindResolver (discovery )
242+
243+ scaleClient , err := scale .NewForConfig (cfg , mapper , dynamic .LegacyAPIPathResolverFunc , scaleKindResolver )
244+ if err != nil {
245+ return nil , fmt .Errorf ("error calling building scale client %w" , err )
246+ }
247+
248+ return scaleClient , nil
249+ }
0 commit comments