Skip to content

Commit

Permalink
chore: enforce version to follow dns-1123
Browse files Browse the repository at this point in the history
  • Loading branch information
Kavinjsir committed Jun 14, 2024
1 parent 66bc30b commit c162179
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 22 deletions.
12 changes: 4 additions & 8 deletions pkg/model/resource/gvk.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,19 @@ package resource

import (
"fmt"
"regexp"
"strings"

"sigs.k8s.io/kubebuilder/v4/pkg/internal/validation"
)

const (
versionPattern = "^v\\d+(?:alpha\\d+|beta\\d+)?$"
versionInternal = "__internal"

groupRequired = "group cannot be empty if the domain is empty"
versionRequired = "version cannot be empty"
kindRequired = "kind cannot be empty"
)

var (
versionRegex = regexp.MustCompile(versionPattern)
)

// GVK stores the Group - Version - Kind triplet that uniquely identifies a resource.
// In kubebuilder, the k8s fully qualified group is stored as Group and Domain to improve UX.
type GVK struct {
Expand All @@ -60,8 +55,9 @@ func (gvk GVK) Validate() error {
if gvk.Version == "" {
return fmt.Errorf(versionRequired)
}
if !versionRegex.MatchString(gvk.Version) {
return fmt.Errorf("Version must match %s (was %s)", versionPattern, gvk.Version)
errs := validation.IsDNS1123Label(gvk.Version)
if len(errs) > 0 && gvk.Version != versionInternal {
return fmt.Errorf("Version must respect DNS-1123 (was %s)", gvk.Version)
}

// Check if kind has a valid DNS1035 label value
Expand Down
32 changes: 18 additions & 14 deletions pkg/model/resource/gvk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,18 +25,21 @@ import (

var _ = Describe("GVK", func() {
const (
group = "group"
domain = "my.domain"
version = "v1"
kind = "Kind"
group = "group"
domain = "my.domain"
version = "v1"
kind = "Kind"
internalVersion = "__internal"
)

gvk := GVK{Group: group, Domain: domain, Version: version, Kind: kind}

Context("Validate", func() {
It("should succeed for a valid GVK", func() {
Expect(gvk.Validate()).To(Succeed())
})
DescribeTable("should pass valid GVKs",
func(gvk GVK) { Expect(gvk.Validate()).To(Succeed()) },
Entry("Standard GVK", gvk),
Entry("Version (__internal)", GVK{Group: group, Domain: domain, Version: internalVersion, Kind: kind}),
)

DescribeTable("should fail for invalid GVKs",
func(gvk GVK) { Expect(gvk.Validate()).NotTo(Succeed()) },
Expand All @@ -47,13 +50,14 @@ var _ = Describe("GVK", func() {
Entry("Domain (non-alpha characters)", GVK{Group: group, Domain: "_*?", Version: version, Kind: kind}),
Entry("Group and Domain (empty)", GVK{Group: "", Domain: "", Version: version, Kind: kind}),
Entry("Version (empty)", GVK{Group: group, Domain: domain, Version: "", Kind: kind}),
Entry("Version (no v prefix)", GVK{Group: group, Domain: domain, Version: "1", Kind: kind}),
Entry("Version (wrong prefix)", GVK{Group: group, Domain: domain, Version: "a1", Kind: kind}),
Entry("Version (unstable no v prefix)", GVK{Group: group, Domain: domain, Version: "1beta1", Kind: kind}),
Entry("Version (unstable no alpha/beta number)",
GVK{Group: group, Domain: domain, Version: "v1beta", Kind: kind}),
Entry("Version (multiple unstable)",
GVK{Group: group, Domain: domain, Version: "v1beta1alpha1", Kind: kind}),
Entry("Version (wrong prefix)", GVK{Group: group, Domain: domain, Version: "-starts-with-hypen", Kind: kind}),
Entry("Version (wrong suffix)", GVK{Group: group, Domain: domain, Version: "ends-with-hypen-", Kind: kind}),
Entry("Version (uppercase)", GVK{Group: group, Domain: domain, Version: "ContainsUpperCase", Kind: kind}),
Entry("Version (special characters)", GVK{Group: group, Domain: domain, Version: "contains@symbol", Kind: kind}),
Entry("Version (exclusive numbers with invalid characters)",
GVK{Group: group, Domain: domain, Version: "12345^&*()", Kind: kind}),
Entry("Version (too long)",
GVK{Group: group, Domain: domain, Version: "a123456789012345678901234567890123456789012345678901234567890123", Kind: kind}),
Entry("Kind (empty)", GVK{Group: group, Domain: domain, Version: version, Kind: ""}),
Entry("Kind (whitespaces)", GVK{Group: group, Domain: domain, Version: version, Kind: "Ki nd"}),
Entry("Kind (lowercase)", GVK{Group: group, Domain: domain, Version: version, Kind: "kind"}),
Expand Down

0 comments on commit c162179

Please sign in to comment.