Skip to content

Commit 6bb9d29

Browse files
authored
Merge pull request #3986 from Kavinjsir/chore/version-pattern
🐛 fix validation used to ensure Kind versions pattern
2 parents 66d6b4f + dfbf688 commit 6bb9d29

File tree

2 files changed

+19
-22
lines changed

2 files changed

+19
-22
lines changed

pkg/model/resource/gvk.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,24 +18,19 @@ package resource
1818

1919
import (
2020
"fmt"
21-
"regexp"
2221
"strings"
2322

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

2726
const (
28-
versionPattern = "^v\\d+(?:alpha\\d+|beta\\d+)?$"
27+
versionInternal = "__internal"
2928

3029
groupRequired = "group cannot be empty if the domain is empty"
3130
versionRequired = "version cannot be empty"
3231
kindRequired = "kind cannot be empty"
3332
)
3433

35-
var (
36-
versionRegex = regexp.MustCompile(versionPattern)
37-
)
38-
3934
// GVK stores the Group - Version - Kind triplet that uniquely identifies a resource.
4035
// In kubebuilder, the k8s fully qualified group is stored as Group and Domain to improve UX.
4136
type GVK struct {
@@ -60,8 +55,9 @@ func (gvk GVK) Validate() error {
6055
if gvk.Version == "" {
6156
return fmt.Errorf(versionRequired)
6257
}
63-
if !versionRegex.MatchString(gvk.Version) {
64-
return fmt.Errorf("Version must match %s (was %s)", versionPattern, gvk.Version)
58+
errs := validation.IsDNS1123Subdomain(gvk.Version)
59+
if len(errs) > 0 && gvk.Version != versionInternal {
60+
return fmt.Errorf("Version must respect DNS-1123 (was %s)", gvk.Version)
6561
}
6662

6763
// Check if kind has a valid DNS1035 label value

pkg/model/resource/gvk_test.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,21 @@ import (
2525

2626
var _ = Describe("GVK", func() {
2727
const (
28-
group = "group"
29-
domain = "my.domain"
30-
version = "v1"
31-
kind = "Kind"
28+
group = "group"
29+
domain = "my.domain"
30+
version = "v1"
31+
kind = "Kind"
32+
internalVersion = "__internal"
3233
)
3334

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

3637
Context("Validate", func() {
37-
It("should succeed for a valid GVK", func() {
38-
Expect(gvk.Validate()).To(Succeed())
39-
})
38+
DescribeTable("should pass valid GVKs",
39+
func(gvk GVK) { Expect(gvk.Validate()).To(Succeed()) },
40+
Entry("Standard GVK", gvk),
41+
Entry("Version (__internal)", GVK{Group: group, Domain: domain, Version: internalVersion, Kind: kind}),
42+
)
4043

4144
DescribeTable("should fail for invalid GVKs",
4245
func(gvk GVK) { Expect(gvk.Validate()).NotTo(Succeed()) },
@@ -47,13 +50,11 @@ var _ = Describe("GVK", func() {
4750
Entry("Domain (non-alpha characters)", GVK{Group: group, Domain: "_*?", Version: version, Kind: kind}),
4851
Entry("Group and Domain (empty)", GVK{Group: "", Domain: "", Version: version, Kind: kind}),
4952
Entry("Version (empty)", GVK{Group: group, Domain: domain, Version: "", Kind: kind}),
50-
Entry("Version (no v prefix)", GVK{Group: group, Domain: domain, Version: "1", Kind: kind}),
51-
Entry("Version (wrong prefix)", GVK{Group: group, Domain: domain, Version: "a1", Kind: kind}),
52-
Entry("Version (unstable no v prefix)", GVK{Group: group, Domain: domain, Version: "1beta1", Kind: kind}),
53-
Entry("Version (unstable no alpha/beta number)",
54-
GVK{Group: group, Domain: domain, Version: "v1beta", Kind: kind}),
55-
Entry("Version (multiple unstable)",
56-
GVK{Group: group, Domain: domain, Version: "v1beta1alpha1", Kind: kind}),
53+
Entry("Version (wrong prefix)", GVK{Group: group, Domain: domain, Version: "-example.com", Kind: kind}),
54+
Entry("Version (wrong suffix)", GVK{Group: group, Domain: domain, Version: "example.com-", Kind: kind}),
55+
Entry("Version (uppercase)", GVK{Group: group, Domain: domain, Version: "Example.com", Kind: kind}),
56+
Entry("Version (special characters)", GVK{Group: group, Domain: domain, Version: "example!domain.com", Kind: kind}),
57+
Entry("Version (consecutive dots)", GVK{Group: group, Domain: domain, Version: "example..com", Kind: kind}),
5758
Entry("Kind (empty)", GVK{Group: group, Domain: domain, Version: version, Kind: ""}),
5859
Entry("Kind (whitespaces)", GVK{Group: group, Domain: domain, Version: version, Kind: "Ki nd"}),
5960
Entry("Kind (lowercase)", GVK{Group: group, Domain: domain, Version: version, Kind: "kind"}),

0 commit comments

Comments
 (0)