Skip to content

Commit 1b5d0b2

Browse files
authored
fix(ske): make generate cluster payload work for eu02 (#1008)
relates to STACKITCLI-258 / #997
1 parent 85f5d79 commit 1b5d0b2

File tree

2 files changed

+66
-12
lines changed

2 files changed

+66
-12
lines changed

internal/pkg/services/ske/utils/utils.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"maps"
77
"os"
88
"path/filepath"
9+
"regexp"
910
"strconv"
1011

1112
"github.com/stackitcloud/stackit-cli/internal/pkg/utils"
@@ -16,13 +17,9 @@ import (
1617
)
1718

1819
const (
19-
defaultNodepoolAvailabilityZone = "eu01-3"
2020
defaultNodepoolCRI = ske.CRINAME_CONTAINERD
21-
defaultNodepoolMachineType = "b1.2"
2221
defaultNodepoolMachineImageName = "flatcar"
23-
defaultNodepoolMaxSurge = 1
2422
defaultNodepoolMaxUnavailable = 0
25-
defaultNodepoolMaximum = 2
2623
defaultNodepoolMinimum = 1
2724
defaultNodepoolName = "pool-default"
2825
defaultNodepoolVolumeType = "storage_premium_perf2"
@@ -110,22 +107,38 @@ func getDefaultPayloadKubernetes(resp *ske.ProviderOptions) (*ske.Kubernetes, er
110107
}
111108

112109
func getDefaultPayloadNodepool(resp *ske.ProviderOptions) (*ske.Nodepool, error) {
110+
if resp.AvailabilityZones == nil || len(*resp.AvailabilityZones) == 0 {
111+
return nil, fmt.Errorf("no availability zones found")
112+
}
113+
var availabilityZones []string
114+
for i := range *resp.AvailabilityZones {
115+
azName := (*resp.AvailabilityZones)[i].GetName()
116+
// don't include availability zones like eu01-m, eu02-m, not all flavors are available there
117+
if !regexp.MustCompile(`\w{2}\d{2}-m`).MatchString(azName) {
118+
availabilityZones = append(availabilityZones, azName)
119+
}
120+
}
121+
122+
if resp.MachineTypes == nil || len(*resp.MachineTypes) == 0 {
123+
return nil, fmt.Errorf("no machine types found")
124+
}
125+
machineType := (*resp.MachineTypes)[0].GetName()
126+
113127
output := &ske.Nodepool{
114-
AvailabilityZones: &[]string{
115-
defaultNodepoolAvailabilityZone,
116-
},
128+
AvailabilityZones: &availabilityZones,
117129
Cri: &ske.CRI{
118130
Name: utils.Ptr(defaultNodepoolCRI),
119131
},
120132
Machine: &ske.Machine{
121-
Type: utils.Ptr(defaultNodepoolMachineType),
133+
Type: &machineType,
122134
Image: &ske.Image{
123135
Name: utils.Ptr(defaultNodepoolMachineImageName),
124136
},
125137
},
126-
MaxSurge: utils.Ptr(int64(defaultNodepoolMaxSurge)),
138+
// there must be as many nodes as availability zones are given
139+
MaxSurge: utils.Ptr(int64(len(availabilityZones))),
127140
MaxUnavailable: utils.Ptr(int64(defaultNodepoolMaxUnavailable)),
128-
Maximum: utils.Ptr(int64(defaultNodepoolMaximum)),
141+
Maximum: utils.Ptr(int64(len(availabilityZones))),
129142
Minimum: utils.Ptr(int64(defaultNodepoolMinimum)),
130143
Name: utils.Ptr(defaultNodepoolName),
131144
Volume: &ske.Volume{

internal/pkg/services/ske/utils/utils_test.go

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,17 @@ func TestClusterExists(t *testing.T) {
146146

147147
func fixtureProviderOptions(mods ...func(*ske.ProviderOptions)) *ske.ProviderOptions {
148148
providerOptions := &ske.ProviderOptions{
149+
AvailabilityZones: &[]ske.AvailabilityZone{
150+
{Name: utils.Ptr("eu01-m")},
151+
{Name: utils.Ptr("eu01-1")},
152+
{Name: utils.Ptr("eu01-2")},
153+
{Name: utils.Ptr("eu01-3")},
154+
},
155+
MachineTypes: &[]ske.MachineType{
156+
{
157+
Name: utils.Ptr("b1.2"),
158+
},
159+
},
149160
KubernetesVersions: &[]ske.KubernetesVersion{
150161
{
151162
State: utils.Ptr("supported"),
@@ -263,6 +274,8 @@ func fixtureGetDefaultPayload(mods ...func(*ske.CreateOrUpdateClusterPayload)) *
263274
Nodepools: &[]ske.Nodepool{
264275
{
265276
AvailabilityZones: &[]string{
277+
"eu01-1",
278+
"eu01-2",
266279
"eu01-3",
267280
},
268281
Cri: &ske.CRI{
@@ -275,9 +288,9 @@ func fixtureGetDefaultPayload(mods ...func(*ske.CreateOrUpdateClusterPayload)) *
275288
Name: utils.Ptr("flatcar"),
276289
},
277290
},
278-
MaxSurge: utils.Ptr(int64(1)),
291+
MaxSurge: utils.Ptr(int64(3)),
279292
MaxUnavailable: utils.Ptr(int64(0)),
280-
Maximum: utils.Ptr(int64(2)),
293+
Maximum: utils.Ptr(int64(3)),
281294
Minimum: utils.Ptr(int64(1)),
282295
Name: utils.Ptr("pool-default"),
283296
Volume: &ske.Volume{
@@ -312,6 +325,34 @@ func TestGetDefaultPayload(t *testing.T) {
312325
listProviderOptionsFails: true,
313326
isValid: false,
314327
},
328+
{
329+
description: "availability zones nil",
330+
listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) {
331+
po.AvailabilityZones = nil
332+
}),
333+
isValid: false,
334+
},
335+
{
336+
description: "no availability zones",
337+
listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) {
338+
po.AvailabilityZones = &[]ske.AvailabilityZone{}
339+
}),
340+
isValid: false,
341+
},
342+
{
343+
description: "machine types nil",
344+
listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) {
345+
po.MachineTypes = nil
346+
}),
347+
isValid: false,
348+
},
349+
{
350+
description: "no machine types",
351+
listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) {
352+
po.MachineTypes = &[]ske.MachineType{}
353+
}),
354+
isValid: false,
355+
},
315356
{
316357
description: "no Kubernetes versions 1",
317358
listProviderOptionsResp: fixtureProviderOptions(func(po *ske.ProviderOptions) {

0 commit comments

Comments
 (0)