Skip to content

Commit 21c07c9

Browse files
authored
Merge pull request #2674 from sedefsavas/machinesemver
🏃Add semver version validation rules to Machine type and fix KCP version validation
2 parents 3af8e0a + 84f0b3b commit 21c07c9

File tree

3 files changed

+65
-2
lines changed

3 files changed

+65
-2
lines changed

api/v1alpha3/machine_webhook.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ package v1alpha3
1818

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

23+
"github.com/blang/semver"
2224
apierrors "k8s.io/apimachinery/pkg/api/errors"
2325
runtime "k8s.io/apimachinery/pkg/runtime"
2426
"k8s.io/apimachinery/pkg/util/validation/field"
@@ -114,6 +116,12 @@ func (m *Machine) validate(old *Machine) error {
114116
)
115117
}
116118

119+
if m.Spec.Version != nil {
120+
if _, err := semver.Parse(strings.TrimPrefix(strings.TrimSpace(*m.Spec.Version), "v")); err != nil {
121+
allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "version"), *m.Spec.Version, "must be a valid semantic version"))
122+
}
123+
}
124+
117125
if len(allErrs) == 0 {
118126
return nil
119127
}

api/v1alpha3/machine_webhook_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,3 +189,58 @@ func TestMachineClusterNameImmutable(t *testing.T) {
189189
})
190190
}
191191
}
192+
193+
func TestMachineVersionValidation(t *testing.T) {
194+
tests := []struct {
195+
name string
196+
version string
197+
expectErr bool
198+
}{
199+
{
200+
name: "should succeed when given a valid semantic version with prepended 'v'",
201+
version: "v1.17.2",
202+
expectErr: false,
203+
},
204+
{
205+
name: "should succeed when given a valid semantic version without 'v'",
206+
version: "1.17.2",
207+
expectErr: false,
208+
},
209+
{
210+
name: "should return error when given an invalid semantic version",
211+
version: "1",
212+
expectErr: true,
213+
},
214+
{
215+
name: "should return error when given an invalid semantic version",
216+
version: "v1",
217+
expectErr: true,
218+
},
219+
{
220+
name: "should return error when given an invalid semantic version",
221+
version: "wrong_version",
222+
expectErr: true,
223+
},
224+
}
225+
226+
for _, tt := range tests {
227+
t.Run(tt.name, func(t *testing.T) {
228+
g := NewWithT(t)
229+
230+
m := &Machine{
231+
Spec: MachineSpec{
232+
Version: &tt.version,
233+
Bootstrap: Bootstrap{ConfigRef: nil, DataSecretName: pointer.StringPtr("test")},
234+
},
235+
}
236+
237+
if tt.expectErr {
238+
g.Expect(m.ValidateCreate()).NotTo(Succeed())
239+
g.Expect(m.ValidateUpdate(m)).NotTo(Succeed())
240+
} else {
241+
g.Expect(m.ValidateCreate()).To(Succeed())
242+
g.Expect(m.ValidateUpdate(m)).To(Succeed())
243+
}
244+
})
245+
}
246+
}

controlplane/kubeadm/api/v1alpha3/kubeadm_control_plane_webhook.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package v1alpha3
1919
import (
2020
"encoding/json"
2121
"fmt"
22+
"strings"
2223

2324
"github.com/blang/semver"
2425
jsonpatch "github.com/evanphx/json-patch"
@@ -232,8 +233,7 @@ func (in *KubeadmControlPlane) validateCommon() (allErrs field.ErrorList) {
232233
)
233234
}
234235

235-
_, err := semver.ParseTolerant(in.Spec.Version)
236-
if err != nil {
236+
if _, err := semver.Parse(strings.TrimPrefix(strings.TrimSpace(in.Spec.Version), "v")); err != nil {
237237
allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "version"), in.Spec.Version, "must be a valid semantic version"))
238238
}
239239

0 commit comments

Comments
 (0)