Skip to content

Commit

Permalink
Add semver version validation rules to Machine type
Browse files Browse the repository at this point in the history
  • Loading branch information
Sedef committed Mar 13, 2020
1 parent ba1aa04 commit d220560
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 0 deletions.
12 changes: 12 additions & 0 deletions api/v1alpha3/machine_webhook.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ package v1alpha3

import (
"fmt"
"strings"

"github.com/blang/semver"
apierrors "k8s.io/apimachinery/pkg/api/errors"
runtime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/util/validation/field"
Expand Down Expand Up @@ -114,6 +116,16 @@ func (m *Machine) validate(old *Machine) error {
)
}

if m.Spec.Version != nil {
*m.Spec.Version = strings.TrimSpace(*m.Spec.Version)
*m.Spec.Version = strings.TrimPrefix(*m.Spec.Version, "v")
_, err := semver.Parse(*m.Spec.Version)
if err != nil {
allErrs = append(allErrs, field.Invalid(field.NewPath("spec", "version"), *m.Spec.Version, "must be a valid semantic version"))
}

}

if len(allErrs) == 0 {
return nil
}
Expand Down
55 changes: 55 additions & 0 deletions api/v1alpha3/machine_webhook_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,3 +189,58 @@ func TestMachineClusterNameImmutable(t *testing.T) {
})
}
}

func TestMachineVersionValidation(t *testing.T) {
tests := []struct {
name string
version string
expectErr bool
}{
{
name: "should succeed when given a valid semantic version with prepended 'v'",
version: "v1.17.2",
expectErr: false,
},
{
name: "should succeed when given a valid semantic version without 'v'",
version: "1.17.2",
expectErr: false,
},
{
name: "should return error when given an invalid semantic version",
version: "1",
expectErr: true,
},
{
name: "should return error when given an invalid semantic version",
version: "v1",
expectErr: true,
},
{
name: "should return error when given an invalid semantic version",
version: "wrong_version",
expectErr: true,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
g := NewWithT(t)

m := &Machine{
Spec: MachineSpec{
Version: &tt.version,
Bootstrap: Bootstrap{ConfigRef: nil, DataSecretName: pointer.StringPtr("test")},
},
}

if tt.expectErr {
g.Expect(m.ValidateCreate()).NotTo(Succeed())
g.Expect(m.ValidateUpdate(m)).NotTo(Succeed())
} else {
g.Expect(m.ValidateCreate()).To(Succeed())
g.Expect(m.ValidateUpdate(m)).To(Succeed())
}
})
}
}

0 comments on commit d220560

Please sign in to comment.