Skip to content

Commit 2d45b18

Browse files
committed
test: align managed mp webhook tests
Signed-off-by: Carlos Salas <[email protected]>
1 parent 72b8710 commit 2d45b18

File tree

1 file changed

+166
-128
lines changed

1 file changed

+166
-128
lines changed
Lines changed: 166 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
Copyright 2023 The Kubernetes Authors.
2+
Copyright 2024 The Kubernetes Authors.
33
44
Licensed under the Apache License, Version 2.0 (the "License");
55
you may not use this file except in compliance with the License.
@@ -18,149 +18,187 @@ package v1beta1
1818

1919
import (
2020
"strings"
21+
"testing"
2122

22-
. "github.com/onsi/ginkgo/v2"
2323
. "github.com/onsi/gomega"
2424
infrav1 "sigs.k8s.io/cluster-api-provider-gcp/api/v1beta1"
2525
)
2626

27-
var gcpmmp *GCPManagedMachinePool
28-
29-
var _ = Describe("Test GCPManagedMachinePool Webhooks", func() {
30-
BeforeEach(func() {
31-
machineType := "e2-medium"
32-
diskSizeGb := int32(100)
27+
var (
28+
minCount = int32(1)
29+
maxCount = int32(3)
30+
invalidMinCount = int32(-1)
31+
enableAutoscaling = false
32+
diskSizeGb = int32(200)
33+
maxPods = int64(10)
34+
localSsds = int32(0)
35+
invalidDiskSizeGb = int32(-200)
36+
invalidMaxPods = int64(-10)
37+
invalidLocalSsds = int32(-0)
38+
)
3339

34-
gcpmmp = &GCPManagedMachinePool{
35-
Spec: GCPManagedMachinePoolSpec{
36-
NodePoolName: "test-gke-pool",
37-
MachineType: &machineType,
38-
DiskSizeGb: &diskSizeGb,
40+
func TestGCPManagedMachinePoolValidatingWebhookCreate(t *testing.T) {
41+
tests := []struct {
42+
name string
43+
spec GCPManagedMachinePoolSpec
44+
expectError bool
45+
}{
46+
{
47+
name: "valid node pool name",
48+
spec: GCPManagedMachinePoolSpec{
49+
NodePoolName: "nodepool1",
3950
},
40-
}
41-
})
42-
43-
Context("Test validateSpec", func() {
44-
It("should error when node pool name is too long", func() {
45-
gcpmmp.Spec.NodePoolName = strings.Repeat("A", maxNodePoolNameLength+1)
46-
errs := gcpmmp.validateSpec()
47-
Expect(errs).ToNot(BeEmpty())
48-
})
49-
It("should pass when node pool name is within limit", func() {
50-
gcpmmp.Spec.NodePoolName = strings.Repeat("A", maxNodePoolNameLength)
51-
errs := gcpmmp.validateSpec()
52-
Expect(errs).To(BeEmpty())
53-
})
54-
})
51+
expectError: false,
52+
},
53+
{
54+
name: "node pool name is too long",
55+
spec: GCPManagedMachinePoolSpec{
56+
NodePoolName: strings.Repeat("A", maxNodePoolNameLength+1),
57+
},
58+
expectError: true,
59+
},
60+
{
61+
name: "scaling with valid min/max count",
62+
spec: GCPManagedMachinePoolSpec{
63+
NodePoolName: "nodepool1",
64+
Scaling: &NodePoolAutoScaling{
65+
MinCount: &minCount,
66+
MaxCount: &maxCount,
67+
},
68+
},
69+
expectError: false,
70+
},
71+
{
72+
name: "scaling with invalid min/max count",
73+
spec: GCPManagedMachinePoolSpec{
74+
NodePoolName: "nodepool1",
75+
Scaling: &NodePoolAutoScaling{
76+
MinCount: &invalidMinCount,
77+
MaxCount: &maxCount,
78+
},
79+
},
80+
expectError: true,
81+
},
82+
{
83+
name: "scaling with max < min count",
84+
spec: GCPManagedMachinePoolSpec{
85+
NodePoolName: "nodepool1",
86+
Scaling: &NodePoolAutoScaling{
87+
MinCount: &maxCount,
88+
MaxCount: &minCount,
89+
},
90+
},
91+
expectError: true,
92+
},
93+
{
94+
name: "autoscaling disabled and min/max provided",
95+
spec: GCPManagedMachinePoolSpec{
96+
NodePoolName: "nodepool1",
97+
Scaling: &NodePoolAutoScaling{
98+
EnableAutoscaling: &enableAutoscaling,
99+
MinCount: &minCount,
100+
MaxCount: &maxCount,
101+
},
102+
},
103+
expectError: true,
104+
},
105+
{
106+
name: "valid non-negative values",
107+
spec: GCPManagedMachinePoolSpec{
108+
NodePoolName: "nodepool1",
109+
DiskSizeGb: &diskSizeGb,
110+
MaxPodsPerNode: &maxPods,
111+
LocalSsdCount: &localSsds,
112+
},
113+
expectError: false,
114+
},
115+
{
116+
name: "invalid negative values",
117+
spec: GCPManagedMachinePoolSpec{
118+
NodePoolName: "nodepool1",
119+
DiskSizeGb: &invalidDiskSizeGb,
120+
MaxPodsPerNode: &invalidMaxPods,
121+
LocalSsdCount: &invalidLocalSsds,
122+
},
123+
expectError: true,
124+
},
125+
}
55126

56-
Context("Test validateScaling", func() {
57-
It("should pass when scaling is not specified", func() {
58-
errs := gcpmmp.validateScaling()
59-
Expect(errs).To(BeEmpty())
60-
})
61-
It("should pass when min/max count is valid", func() {
62-
minCount := int32(1)
63-
maxCount := int32(3)
64-
gcpmmp.Spec.Scaling = &NodePoolAutoScaling{
65-
MinCount: &minCount,
66-
MaxCount: &maxCount,
67-
}
127+
for _, tc := range tests {
128+
t.Run(tc.name, func(t *testing.T) {
129+
g := NewWithT(t)
68130

69-
errs := gcpmmp.validateScaling()
70-
Expect(errs).To(BeEmpty())
71-
})
72-
It("should fail when min is negative", func() {
73-
minCount := int32(-1)
74-
gcpmmp.Spec.Scaling = &NodePoolAutoScaling{
75-
MinCount: &minCount,
131+
mmp := &GCPManagedMachinePool{
132+
Spec: tc.spec,
76133
}
134+
warn, err := mmp.ValidateCreate()
77135

78-
errs := gcpmmp.validateScaling()
79-
Expect(errs).ToNot(BeEmpty())
80-
})
81-
It("should fail when min > max", func() {
82-
minCount := int32(3)
83-
maxCount := int32(1)
84-
gcpmmp.Spec.Scaling = &NodePoolAutoScaling{
85-
MinCount: &minCount,
86-
MaxCount: &maxCount,
136+
if tc.expectError {
137+
g.Expect(err).To(HaveOccurred())
138+
} else {
139+
g.Expect(err).ToNot(HaveOccurred())
87140
}
88-
89-
errs := gcpmmp.validateScaling()
90-
Expect(errs).ToNot(BeEmpty())
141+
// Nothing emits warnings yet
142+
g.Expect(warn).To(BeEmpty())
91143
})
92-
It("should fail when autoscaling is disabled and min/max is specified", func() {
93-
minCount := int32(1)
94-
maxCount := int32(3)
95-
enabled := false
96-
locationPolicy := ManagedNodePoolLocationPolicyAny
97-
gcpmmp.Spec.Scaling = &NodePoolAutoScaling{
98-
MinCount: &minCount,
99-
MaxCount: &maxCount,
100-
EnableAutoscaling: &enabled,
101-
LocationPolicy: &locationPolicy,
102-
}
144+
}
145+
}
146+
147+
func TestGCPManagedMachinePoolValidatingWebhookUpdate(t *testing.T) {
148+
tests := []struct {
149+
name string
150+
spec GCPManagedMachinePoolSpec
151+
expectError bool
152+
}{
153+
{
154+
name: "node pool is not mutated",
155+
spec: GCPManagedMachinePoolSpec{
156+
NodePoolName: "nodepool1",
157+
},
158+
expectError: false,
159+
},
160+
{
161+
name: "mutable fields are mutated",
162+
spec: GCPManagedMachinePoolSpec{
163+
NodePoolName: "nodepool1",
164+
AdditionalLabels: infrav1.Labels{
165+
"testKey": "testVal",
166+
},
167+
},
168+
expectError: false,
169+
},
170+
{
171+
name: "immutable field disk size is mutated",
172+
spec: GCPManagedMachinePoolSpec{
173+
NodePoolName: "nodepool1",
174+
DiskSizeGb: &diskSizeGb,
175+
},
176+
expectError: true,
177+
},
178+
}
103179

104-
errs := gcpmmp.validateScaling()
105-
Expect(errs).To(HaveLen(3))
106-
})
107-
})
108-
Context("Test validateImmutable", func() {
109-
It("should pass when node pool is not mutated", func() {
110-
old := gcpmmp.DeepCopy()
111-
errs := gcpmmp.validateImmutable(old)
112-
Expect(errs).To(BeEmpty())
113-
})
114-
It("should pass when mutable fields are mutated", func() {
115-
old := gcpmmp.DeepCopy()
116-
gcpmmp.Spec.AdditionalLabels = infrav1.Labels{
117-
"testKey": "testVal",
118-
}
180+
for _, tc := range tests {
181+
t.Run(tc.name, func(t *testing.T) {
182+
g := NewWithT(t)
119183

120-
errs := gcpmmp.validateImmutable(old)
121-
Expect(errs).To(BeEmpty())
122-
})
123-
It("should fail when immutable fields are mutated", func() {
124-
old := gcpmmp.DeepCopy()
125-
diskSizeGb := int32(200)
126-
gcpmmp.Spec.DiskSizeGb = &diskSizeGb
127-
gcpmmp.Spec.NodePoolName = "new-name"
128-
gcpmmp.Spec.Management = &NodePoolManagement{
129-
AutoUpgrade: false,
130-
AutoRepair: false,
184+
newMMP := &GCPManagedMachinePool{
185+
Spec: tc.spec,
186+
}
187+
oldMMP := &GCPManagedMachinePool{
188+
Spec: GCPManagedMachinePoolSpec{
189+
NodePoolName: "nodepool1",
190+
},
131191
}
132192

133-
errs := gcpmmp.validateImmutable(old)
134-
Expect(errs).To(HaveLen(3))
135-
})
136-
})
193+
warn, err := newMMP.ValidateUpdate(oldMMP)
137194

138-
Context("Test validateNonNegative", func() {
139-
It("should pass when number fields are not specified", func() {
140-
errs := gcpmmp.validateNonNegative()
141-
Expect(errs).To(BeEmpty())
142-
})
143-
It("should pass when number fields are non-negative", func() {
144-
maxPods := int64(10)
145-
localSsds := int32(0)
146-
diskSize := int32(200)
147-
gcpmmp.Spec.MaxPodsPerNode = &maxPods
148-
gcpmmp.Spec.LocalSsdCount = &localSsds
149-
gcpmmp.Spec.DiskSizeGb = &diskSize
150-
151-
errs := gcpmmp.validateNonNegative()
152-
Expect(errs).To(BeEmpty())
153-
})
154-
It("should pass when some number fields are negative", func() {
155-
maxPods := int64(-1)
156-
localSsds := int32(0)
157-
diskSize := int32(-100)
158-
gcpmmp.Spec.MaxPodsPerNode = &maxPods
159-
gcpmmp.Spec.LocalSsdCount = &localSsds
160-
gcpmmp.Spec.DiskSizeGb = &diskSize
161-
162-
errs := gcpmmp.validateNonNegative()
163-
Expect(errs).To(HaveLen(2))
195+
if tc.expectError {
196+
g.Expect(err).To(HaveOccurred())
197+
} else {
198+
g.Expect(err).ToNot(HaveOccurred())
199+
}
200+
// Nothing emits warnings yet
201+
g.Expect(warn).To(BeEmpty())
164202
})
165-
})
166-
})
203+
}
204+
}

0 commit comments

Comments
 (0)