Skip to content

Commit 488bb98

Browse files
authored
Merge pull request #3787 from kubernetes-sigs/revert-3742-gh-3739
🐛 Revert ":bug: Align CRD version validation with apiextensions"
2 parents 2302f6e + 0912625 commit 488bb98

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

pkg/model/resource/gvk.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,24 @@ package resource
1818

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

2324
"sigs.k8s.io/kubebuilder/v3/pkg/internal/validation"
2425
)
2526

2627
const (
28+
versionPattern = "^v\\d+(?:alpha\\d+|beta\\d+)?$"
29+
2730
groupRequired = "group cannot be empty if the domain is empty"
2831
versionRequired = "version cannot be empty"
2932
kindRequired = "kind cannot be empty"
3033
)
3134

35+
var (
36+
versionRegex = regexp.MustCompile(versionPattern)
37+
)
38+
3239
// GVK stores the Group - Version - Kind triplet that uniquely identifies a resource.
3340
// In kubebuilder, the k8s fully qualified group is stored as Group and Domain to improve UX.
3441
type GVK struct {
@@ -53,9 +60,8 @@ func (gvk GVK) Validate() error {
5360
if gvk.Version == "" {
5461
return fmt.Errorf(versionRequired)
5562
}
56-
if err := validation.IsDNS1035Label(gvk.Version); err != nil {
57-
// NOTE: IsDNS1035Label returns a slice of strings instead of an error, so no wrapping
58-
return fmt.Errorf("invalid Version: %#v", err)
63+
if !versionRegex.MatchString(gvk.Version) {
64+
return fmt.Errorf("Version must match %s (was %s)", versionPattern, gvk.Version)
5965
}
6066

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

pkg/model/resource/gvk_test.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,13 @@ var _ = Describe("GVK", func() {
4747
Entry("Domain (non-alpha characters)", GVK{Group: group, Domain: "_*?", Version: version, Kind: kind}),
4848
Entry("Group and Domain (empty)", GVK{Group: "", Domain: "", Version: version, Kind: kind}),
4949
Entry("Version (empty)", GVK{Group: group, Domain: domain, Version: "", Kind: kind}),
50-
Entry("Version (starts with number)", GVK{Group: group, Domain: domain, Version: "1", Kind: kind}),
51-
Entry("Version (uppercase)", GVK{Group: group, Domain: domain, Version: "V1", Kind: kind}),
52-
Entry("Version (non-alpha characters)", 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}),
5357
Entry("Kind (empty)", GVK{Group: group, Domain: domain, Version: version, Kind: ""}),
5458
Entry("Kind (whitespaces)", GVK{Group: group, Domain: domain, Version: version, Kind: "Ki nd"}),
5559
Entry("Kind (lowercase)", GVK{Group: group, Domain: domain, Version: version, Kind: "kind"}),

0 commit comments

Comments
 (0)