Skip to content

Commit 4c61ef6

Browse files
committed
Reviews
1 parent becac55 commit 4c61ef6

File tree

5 files changed

+70
-43
lines changed

5 files changed

+70
-43
lines changed

exp/internal/webhooks/machinepool_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import (
3535
"sigs.k8s.io/cluster-api/internal/webhooks/util"
3636
)
3737

38-
var ctx = admission.NewContextWithRequest(ctrl.SetupSignalHandler(), admission.Request{})
38+
var ctx = ctrl.SetupSignalHandler()
3939

4040
func TestMachinePoolDefault(t *testing.T) {
4141
// NOTE: MachinePool feature flag is disabled by default, thus preventing to create or update MachinePool.
@@ -58,6 +58,7 @@ func TestMachinePoolDefault(t *testing.T) {
5858
},
5959
}
6060
webhook := &MachinePool{}
61+
ctx = admission.NewContextWithRequest(ctx, admission.Request{})
6162
t.Run("for MachinePool", util.CustomDefaultValidateTest(ctx, mp, webhook))
6263
g.Expect(webhook.Default(ctx, mp)).To(Succeed())
6364

test/e2e/autoscaler.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ type AutoscalerSpecInput struct {
6161
// Example: dockermachinetemplates.
6262
InfrastructureMachineTemplateKind string
6363
InfrastructureMachinePoolTemplateKind string
64+
InfrastructureMachinePoolKind string
6465
AutoscalerVersion string
6566

6667
// Allows to inject a function to be run after test namespace is created.
@@ -72,7 +73,9 @@ type AutoscalerSpecInput struct {
7273
// being deployed in the workload cluster.
7374
func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput) {
7475
var (
75-
specName = "autoscaler"
76+
specName = "autoscaler"
77+
// We need to set the min size to 1 because the MachinePool is initially created without the
78+
// annotations and the replicas field set. The MachinePool webhook will then set 1 in that case.
7679
mpNodeGroupMinSize = "1"
7780
mpNodeGroupMaxSize = "5"
7881
input AutoscalerSpecInput
@@ -144,21 +147,27 @@ func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput)
144147

145148
// Ensure the MachinePoolTopology does NOT have the autoscaler annotations so we can test MachineDeployments first.
146149
mpTopology := clusterResources.Cluster.Spec.Topology.Workers.MachinePools[0]
147-
Expect(mpTopology.Metadata.Annotations).To(BeNil(), "MachinePool is expected to have autoscaler annotations")
150+
if mpTopology.Metadata.Annotations != nil {
151+
_, ok = mpTopology.Metadata.Annotations[clusterv1.AutoscalerMinSizeAnnotation]
152+
Expect(ok).To(BeFalse(), "MachinePoolTopology %s does have the %q autoscaler annotation", mpTopology.Name, clusterv1.AutoscalerMinSizeAnnotation)
153+
_, ok = mpTopology.Metadata.Annotations[clusterv1.AutoscalerMaxSizeAnnotation]
154+
Expect(ok).To(BeFalse(), "MachinePoolTopology %s does have the %q autoscaler annotation", mpTopology.Name, clusterv1.AutoscalerMaxSizeAnnotation)
155+
}
148156

149157
// Get a ClusterProxy so we can interact with the workload cluster
150158
workloadClusterProxy := input.BootstrapClusterProxy.GetWorkloadCluster(ctx, clusterResources.Cluster.Namespace, clusterResources.Cluster.Name)
151159
mdOriginalReplicas := *clusterResources.MachineDeployments[0].Spec.Replicas
152160
Expect(strconv.Itoa(int(mdOriginalReplicas))).To(Equal(mdNodeGroupMinSize), "MachineDeployment should have replicas as defined in %s", clusterv1.AutoscalerMinSizeAnnotation)
153161
mpOriginalReplicas := *clusterResources.MachinePools[0].Spec.Replicas
154-
Expect(strconv.Itoa(int(mpOriginalReplicas))).To(Equal(mpNodeGroupMinSize), "MachinePool should have replicas as defined in %s", clusterv1.AutoscalerMinSizeAnnotation)
162+
Expect(int(mpOriginalReplicas)).To(Equal(1), "MachinePool should default to 1 replica via the MachinePool webhook")
155163

156164
By("Installing the autoscaler on the workload cluster")
157165
autoscalerWorkloadYAMLPath := input.E2EConfig.GetVariable(AutoscalerWorkloadYAMLPath)
158166
framework.ApplyAutoscalerToWorkloadCluster(ctx, framework.ApplyAutoscalerToWorkloadClusterInput{
159167
ArtifactFolder: input.ArtifactFolder,
160168
InfrastructureMachineTemplateKind: input.InfrastructureMachineTemplateKind,
161169
InfrastructureMachinePoolTemplateKind: input.InfrastructureMachinePoolTemplateKind,
170+
InfrastructureMachinePoolKind: input.InfrastructureMachinePoolKind,
162171
WorkloadYamlPath: autoscalerWorkloadYAMLPath,
163172
ManagementClusterProxy: input.BootstrapClusterProxy,
164173
WorkloadClusterProxy: workloadClusterProxy,
@@ -181,7 +190,7 @@ func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput)
181190
})
182191

183192
By("Disabling the autoscaler")
184-
framework.DisableAutoscalerForMachineDeploymentTopologyAndWait(ctx, framework.DisableAutoscalerForMachineTopologyAndWaitInput{
193+
framework.DisableAutoscalerForMachineDeploymentTopologyAndWait(ctx, framework.DisableAutoscalerForMachineDeploymentTopologyAndWaitInput{
185194
ClusterProxy: input.BootstrapClusterProxy,
186195
Cluster: clusterResources.Cluster,
187196
WaitForAnnotationsToBeDropped: input.E2EConfig.GetIntervals(specName, "wait-controllers"),
@@ -199,7 +208,7 @@ func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput)
199208

200209
By("Checking enabling autoscaler will scale down the MachineDeployment to correct size")
201210
// Enable autoscaler on the MachineDeployment.
202-
framework.EnableAutoscalerForMachineDeploymentTopologyAndWait(ctx, framework.EnableAutoscalerForMachineTopologyAndWaitInput{
211+
framework.EnableAutoscalerForMachineDeploymentTopologyAndWait(ctx, framework.EnableAutoscalerForMachineDeploymentTopologyAndWaitInput{
203212
ClusterProxy: input.BootstrapClusterProxy,
204213
Cluster: clusterResources.Cluster,
205214
NodeGroupMinSize: mdNodeGroupMinSize,
@@ -218,7 +227,7 @@ func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput)
218227
})
219228

220229
By("Disabling the autoscaler for MachineDeployments to test MachinePools")
221-
framework.DisableAutoscalerForMachineDeploymentTopologyAndWait(ctx, framework.DisableAutoscalerForMachineTopologyAndWaitInput{
230+
framework.DisableAutoscalerForMachineDeploymentTopologyAndWait(ctx, framework.DisableAutoscalerForMachineDeploymentTopologyAndWaitInput{
222231
ClusterProxy: input.BootstrapClusterProxy,
223232
Cluster: clusterResources.Cluster,
224233
WaitForAnnotationsToBeDropped: input.E2EConfig.GetIntervals(specName, "wait-controllers"),
@@ -232,7 +241,7 @@ func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput)
232241

233242
By("Enabling autoscaler for the MachinePool")
234243
// Enable autoscaler on the MachinePool.
235-
framework.EnableAutoscalerForMachinePoolTopologyAndWait(ctx, framework.EnableAutoscalerForMachineTopologyAndWaitInput{
244+
framework.EnableAutoscalerForMachinePoolTopologyAndWait(ctx, framework.EnableAutoscalerForMachinePoolTopologyAndWaitInput{
236245
ClusterProxy: input.BootstrapClusterProxy,
237246
Cluster: clusterResources.Cluster,
238247
NodeGroupMinSize: mpNodeGroupMinSize,
@@ -243,7 +252,6 @@ func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput)
243252
By("Creating workload that forces the system to scale up")
244253
framework.AddScaleUpDeploymentAndWait(ctx, framework.AddScaleUpDeploymentAndWaitInput{
245254
ClusterProxy: workloadClusterProxy,
246-
Name: "mp-scale-up",
247255
}, input.E2EConfig.GetIntervals(specName, "wait-autoscaler")...)
248256

249257
By("Checking the MachinePool is scaled up")
@@ -256,7 +264,7 @@ func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput)
256264
})
257265

258266
By("Disabling the autoscaler")
259-
framework.DisableAutoscalerForMachinePoolTopologyAndWait(ctx, framework.DisableAutoscalerForMachineTopologyAndWaitInput{
267+
framework.DisableAutoscalerForMachinePoolTopologyAndWait(ctx, framework.DisableAutoscalerForMachinePoolTopologyAndWaitInput{
260268
ClusterProxy: input.BootstrapClusterProxy,
261269
Cluster: clusterResources.Cluster,
262270
WaitForAnnotationsToBeDropped: input.E2EConfig.GetIntervals(specName, "wait-controllers"),
@@ -270,11 +278,12 @@ func AutoscalerSpec(ctx context.Context, inputGetter func() AutoscalerSpecInput)
270278
Cluster: clusterResources.Cluster,
271279
Replicas: mpExcessReplicas,
272280
WaitForMachinePools: input.E2EConfig.GetIntervals(specName, "wait-worker-nodes"),
281+
Getter: input.BootstrapClusterProxy.GetClient(),
273282
})
274283

275284
By("Checking enabling autoscaler will scale down the MachinePool to correct size")
276285
// Enable autoscaler on the MachinePool.
277-
framework.EnableAutoscalerForMachinePoolTopologyAndWait(ctx, framework.EnableAutoscalerForMachineTopologyAndWaitInput{
286+
framework.EnableAutoscalerForMachinePoolTopologyAndWait(ctx, framework.EnableAutoscalerForMachinePoolTopologyAndWaitInput{
278287
ClusterProxy: input.BootstrapClusterProxy,
279288
Cluster: clusterResources.Cluster,
280289
NodeGroupMinSize: mpNodeGroupMinSize,

test/e2e/autoscaler_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ var _ = Describe("When using the autoscaler with Cluster API using ClusterClass
3535
InfrastructureProvider: ptr.To("docker"),
3636
InfrastructureMachineTemplateKind: "dockermachinetemplates",
3737
InfrastructureMachinePoolTemplateKind: "dockermachinepooltemplates",
38+
InfrastructureMachinePoolKind: "dockermachinepools",
3839
Flavor: ptr.To("topology-autoscaler"),
3940
AutoscalerVersion: "v1.29.0",
4041
}

test/framework/autoscaler_helpers.go

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ import (
2626

2727
. "github.com/onsi/ginkgo/v2"
2828
. "github.com/onsi/gomega"
29-
"github.com/pkg/errors"
3029
appsv1 "k8s.io/api/apps/v1"
3130
authenticationv1 "k8s.io/api/authentication/v1"
3231
corev1 "k8s.io/api/core/v1"
3332
rbacv1 "k8s.io/api/rbac/v1"
33+
apierrors "k8s.io/apimachinery/pkg/api/errors"
3434
"k8s.io/apimachinery/pkg/api/resource"
3535
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3636
"k8s.io/client-go/tools/clientcmd"
@@ -51,6 +51,7 @@ type ApplyAutoscalerToWorkloadClusterInput struct {
5151
ArtifactFolder string
5252
InfrastructureMachineTemplateKind string
5353
InfrastructureMachinePoolTemplateKind string
54+
InfrastructureMachinePoolKind string
5455
// WorkloadYamlPath should point the yaml that will be applied on the workload cluster.
5556
// The YAML file should:
5657
// - Be creating the autoscaler deployment in the workload cluster
@@ -91,7 +92,7 @@ func ApplyAutoscalerToWorkloadCluster(ctx context.Context, input ApplyAutoscaler
9192
// This address should be accessible from the workload cluster.
9293
serverAddr, mgtClusterCA := getServerAddrAndCA(ctx, input.ManagementClusterProxy)
9394
// Generate a token with the required permission that can be used by the autoscaler.
94-
token := getAuthenticationTokenForAutoscaler(ctx, input.ManagementClusterProxy, input.Cluster.Namespace, input.Cluster.Name, input.InfrastructureMachineTemplateKind, input.InfrastructureMachinePoolTemplateKind)
95+
token := getAuthenticationTokenForAutoscaler(ctx, input.ManagementClusterProxy, input.Cluster.Namespace, input.Cluster.Name, input.InfrastructureMachineTemplateKind, input.InfrastructureMachinePoolTemplateKind, input.InfrastructureMachinePoolKind)
9596

9697
workloadYaml, err := ProcessYAML(&ProcessYAMLInput{
9798
Template: workloadYamlTemplate,
@@ -135,7 +136,6 @@ func ApplyAutoscalerToWorkloadCluster(ctx context.Context, input ApplyAutoscaler
135136
// AddScaleUpDeploymentAndWaitInput is the input for AddScaleUpDeploymentAndWait.
136137
type AddScaleUpDeploymentAndWaitInput struct {
137138
ClusterProxy ClusterProxy
138-
Name string
139139
}
140140

141141
// AddScaleUpDeploymentAndWait create a deployment that will trigger the autoscaler to scale up and create a new machine.
@@ -166,30 +166,26 @@ func AddScaleUpDeploymentAndWait(ctx context.Context, input AddScaleUpDeployment
166166
replicas := workers + 1
167167
memoryRequired := int64(float64(memory.Value()) * 0.6)
168168
podMemory := resource.NewQuantity(memoryRequired, resource.BinarySI)
169-
deploymentName := "scale-up"
170-
if input.Name != "" {
171-
deploymentName = input.Name
172-
}
173169

174170
scaleUpDeployment := &appsv1.Deployment{
175171
ObjectMeta: metav1.ObjectMeta{
176-
Name: deploymentName,
172+
Name: "scale-up",
177173
Namespace: metav1.NamespaceDefault,
178174
Labels: map[string]string{
179-
"app": deploymentName,
175+
"app": "scale-up",
180176
},
181177
},
182178
Spec: appsv1.DeploymentSpec{
183179
Replicas: ptr.To[int32](int32(replicas)),
184180
Selector: &metav1.LabelSelector{
185181
MatchLabels: map[string]string{
186-
"app": deploymentName,
182+
"app": "scale-up",
187183
},
188184
},
189185
Template: corev1.PodTemplateSpec{
190186
ObjectMeta: metav1.ObjectMeta{
191187
Labels: map[string]string{
192-
"app": deploymentName,
188+
"app": "scale-up",
193189
},
194190
},
195191
Spec: corev1.PodSpec{
@@ -235,20 +231,16 @@ func DeleteScaleUpDeploymentAndWait(ctx context.Context, input DeleteScaleUpDepl
235231
if input.Name != "" {
236232
deploymentName = input.Name
237233
}
238-
Expect(input.ClusterProxy.GetClient().Get(ctx, client.ObjectKey{Name: deploymentName, Namespace: metav1.NamespaceDefault}, deployment)).To(Succeed(), "failed to get the scale up pod")
234+
Expect(input.ClusterProxy.GetClient().Get(ctx, client.ObjectKey{Name: deploymentName, Namespace: metav1.NamespaceDefault}, deployment)).To(Succeed(), "failed to get the scale up deployment")
239235

240236
By("Deleting the scale up deployment")
241-
Expect(input.ClusterProxy.GetClient().Delete(ctx, deployment)).To(Succeed(), "failed to delete the scale up pod")
237+
Expect(input.ClusterProxy.GetClient().Delete(ctx, deployment)).To(Succeed(), "failed to delete the scale up deployment")
242238

243239
By("Waiting for the scale up deployment to be deleted")
244-
deploymentList := &appsv1.DeploymentList{}
245-
Eventually(func() error {
246-
Expect(input.ClusterProxy.GetClient().List(ctx, deploymentList, client.InNamespace(metav1.NamespaceDefault))).To(Succeed(), "failed to list deployments")
247-
if len(deploymentList.Items) != 0 {
248-
return errors.Errorf("expected no deployments for %s, found %d", deploymentName, len(deploymentList.Items))
249-
}
250-
return nil
251-
}, input.WaitForDelete...).Should(BeNil())
240+
Eventually(func(g Gomega) {
241+
err := input.ClusterProxy.GetClient().Get(ctx, client.ObjectKey{Name: deploymentName, Namespace: metav1.NamespaceDefault}, deployment)
242+
g.Expect(apierrors.IsNotFound(err)).To(BeTrue())
243+
}, input.WaitForDelete...).Should(Succeed())
252244
}
253245

254246
type ProcessYAMLInput struct {
@@ -287,7 +279,7 @@ func ProcessYAML(input *ProcessYAMLInput) ([]byte, error) {
287279
return out, nil
288280
}
289281

290-
type DisableAutoscalerForMachineTopologyAndWaitInput struct {
282+
type DisableAutoscalerForMachineDeploymentTopologyAndWaitInput struct {
291283
ClusterProxy ClusterProxy
292284
Cluster *clusterv1.Cluster
293285
WaitForAnnotationsToBeDropped []interface{}
@@ -296,7 +288,7 @@ type DisableAutoscalerForMachineTopologyAndWaitInput struct {
296288
// DisableAutoscalerForMachineDeploymentTopologyAndWait drop the autoscaler annotations from the MachineDeploymentTopology
297289
// and waits till the annotations are dropped from the underlying MachineDeployment. It also verifies that the replicas
298290
// fields of the MachineDeployments are not affected after the annotations are dropped.
299-
func DisableAutoscalerForMachineDeploymentTopologyAndWait(ctx context.Context, input DisableAutoscalerForMachineTopologyAndWaitInput) {
291+
func DisableAutoscalerForMachineDeploymentTopologyAndWait(ctx context.Context, input DisableAutoscalerForMachineDeploymentTopologyAndWaitInput) {
300292
Expect(ctx).NotTo(BeNil(), "ctx is required for DisableAutoscalerForMachineDeploymentTopologyAndWait")
301293
Expect(input.ClusterProxy).ToNot(BeNil(), "Invalid argument. input.ClusterProxy can't be nil when calling DisableAutoscalerForMachineDeploymentTopologyAndWait")
302294

@@ -343,15 +335,15 @@ func DisableAutoscalerForMachineDeploymentTopologyAndWait(ctx context.Context, i
343335
}, input.WaitForAnnotationsToBeDropped...).Should(Succeed(), "Auto scaler annotations are not dropped or replicas changed for the MachineDeployments")
344336
}
345337

346-
type EnableAutoscalerForMachineTopologyAndWaitInput struct {
338+
type EnableAutoscalerForMachineDeploymentTopologyAndWaitInput struct {
347339
ClusterProxy ClusterProxy
348340
Cluster *clusterv1.Cluster
349341
NodeGroupMinSize string
350342
NodeGroupMaxSize string
351343
WaitForAnnotationsToBeAdded []interface{}
352344
}
353345

354-
func EnableAutoscalerForMachineDeploymentTopologyAndWait(ctx context.Context, input EnableAutoscalerForMachineTopologyAndWaitInput) {
346+
func EnableAutoscalerForMachineDeploymentTopologyAndWait(ctx context.Context, input EnableAutoscalerForMachineDeploymentTopologyAndWaitInput) {
355347
Expect(ctx).NotTo(BeNil(), "ctx is required for EnableAutoscalerForMachineDeploymentTopologyAndWait")
356348
Expect(input.ClusterProxy).ToNot(BeNil(), "Invalid argument. input.ClusterProxy can't be nil when calling EnableAutoscalerForMachineDeploymentTopologyAndWait")
357349

@@ -391,10 +383,16 @@ func EnableAutoscalerForMachineDeploymentTopologyAndWait(ctx context.Context, in
391383
}, input.WaitForAnnotationsToBeAdded...).Should(Succeed(), "Auto scaler annotations are missing from the MachineDeployments")
392384
}
393385

386+
type DisableAutoscalerForMachinePoolTopologyAndWaitInput struct {
387+
ClusterProxy ClusterProxy
388+
Cluster *clusterv1.Cluster
389+
WaitForAnnotationsToBeDropped []interface{}
390+
}
391+
394392
// DisableAutoscalerForMachinePoolTopologyAndWait drop the autoscaler annotations from the MachinePoolTopology
395393
// and waits till the annotations are dropped from the underlying MachinePool. It also verifies that the replicas
396394
// fields of the MachinePools are not affected after the annotations are dropped.
397-
func DisableAutoscalerForMachinePoolTopologyAndWait(ctx context.Context, input DisableAutoscalerForMachineTopologyAndWaitInput) {
395+
func DisableAutoscalerForMachinePoolTopologyAndWait(ctx context.Context, input DisableAutoscalerForMachinePoolTopologyAndWaitInput) {
398396
Expect(ctx).NotTo(BeNil(), "ctx is required for DisableAutoscalerForMachinePoolTopologyAndWait")
399397
Expect(input.ClusterProxy).ToNot(BeNil(), "Invalid argument. input.ClusterProxy can't be nil when calling DisableAutoscalerForMachinePoolTopologyAndWait")
400398

@@ -441,7 +439,15 @@ func DisableAutoscalerForMachinePoolTopologyAndWait(ctx context.Context, input D
441439
}, input.WaitForAnnotationsToBeDropped...).Should(Succeed(), "Auto scaler annotations are not dropped or replicas changed for the MachinePools")
442440
}
443441

444-
func EnableAutoscalerForMachinePoolTopologyAndWait(ctx context.Context, input EnableAutoscalerForMachineTopologyAndWaitInput) {
442+
type EnableAutoscalerForMachinePoolTopologyAndWaitInput struct {
443+
ClusterProxy ClusterProxy
444+
Cluster *clusterv1.Cluster
445+
NodeGroupMinSize string
446+
NodeGroupMaxSize string
447+
WaitForAnnotationsToBeAdded []interface{}
448+
}
449+
450+
func EnableAutoscalerForMachinePoolTopologyAndWait(ctx context.Context, input EnableAutoscalerForMachinePoolTopologyAndWaitInput) {
445451
Expect(ctx).NotTo(BeNil(), "ctx is required for EnableAutoscalerForMachinePoolTopologyAndWait")
446452
Expect(input.ClusterProxy).ToNot(BeNil(), "Invalid argument. input.ClusterProxy can't be nil when calling EnableAutoscalerForMachinePoolTopologyAndWait")
447453

@@ -483,7 +489,7 @@ func EnableAutoscalerForMachinePoolTopologyAndWait(ctx context.Context, input En
483489

484490
// getAuthenticationTokenForAutoscaler returns a bearer authenticationToken with minimal RBAC permissions that will be used
485491
// by the autoscaler running on the workload cluster to access the management cluster.
486-
func getAuthenticationTokenForAutoscaler(ctx context.Context, managementClusterProxy ClusterProxy, namespace string, cluster string, infraMachineTemplateKind string, infraMachinePoolTemplateKind string) string {
492+
func getAuthenticationTokenForAutoscaler(ctx context.Context, managementClusterProxy ClusterProxy, namespace string, cluster string, infraMachineTemplateKind, infraMachinePoolTemplateKind, infraMachinePoolKind string) string {
487493
name := fmt.Sprintf("cluster-%s", cluster)
488494
sa := &corev1.ServiceAccount{
489495
ObjectMeta: metav1.ObjectMeta{
@@ -507,7 +513,7 @@ func getAuthenticationTokenForAutoscaler(ctx context.Context, managementClusterP
507513
{
508514
Verbs: []string{"get", "list"},
509515
APIGroups: []string{"infrastructure.cluster.x-k8s.io"},
510-
Resources: []string{infraMachineTemplateKind, infraMachinePoolTemplateKind, "dockermachinepools"},
516+
Resources: []string{infraMachineTemplateKind, infraMachinePoolTemplateKind, infraMachinePoolKind},
511517
},
512518
},
513519
}

0 commit comments

Comments
 (0)