Skip to content

Commit

Permalink
Align CRD version validation with apiextensions
Browse files Browse the repository at this point in the history
  • Loading branch information
robzienert committed Jan 25, 2024
1 parent 165af70 commit 728af3b
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 16 deletions.
12 changes: 3 additions & 9 deletions pkg/model/resource/gvk.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,17 @@ package resource

import (
"fmt"
"regexp"
"strings"

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

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

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 +53,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)
if err := validation.IsDNS1035Label(gvk.Version); err != nil {
// NOTE: IsDNS1035Label returns a slice of strings instead of an error, so no wrapping
return fmt.Errorf("invalid Version: %#v", err)
}

// Check if kind has a valid DNS1035 label value
Expand Down
10 changes: 3 additions & 7 deletions pkg/model/resource/gvk_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,9 @@ 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 (starts with number)", GVK{Group: group, Domain: domain, Version: "1", Kind: kind}),
Entry("Version (uppercase)", GVK{Group: group, Domain: domain, Version: "V1", Kind: kind}),
Entry("Version (non-alpha characters)", GVK{Group: group, Domain: domain, Version: "_*?", 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 728af3b

Please sign in to comment.