Skip to content

Commit a7119ae

Browse files
committed
Refactor validate CRD to fix conversion error
1. Fix conversion error due to incompatible type 1. Refactor validate CRD code to reduce duplication 2. Support v1.CRD type Signed-off-by: Vu Dinh <[email protected]>
1 parent 9066a6e commit a7119ae

File tree

1 file changed

+34
-11
lines changed

1 file changed

+34
-11
lines changed

pkg/validation/internal/crd.go

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@ import (
88

99
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
1010
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
11+
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
1112
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
1213
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation"
1314
"k8s.io/apimachinery/pkg/conversion"
1415
"k8s.io/apimachinery/pkg/runtime"
1516
"k8s.io/apimachinery/pkg/runtime/schema"
16-
"k8s.io/client-go/kubernetes/scheme"
1717
)
1818

19-
var Scheme = scheme.Scheme
19+
var scheme = runtime.NewScheme()
2020

2121
func init() {
22-
install.Install(Scheme)
22+
install.Install(scheme)
2323
}
2424

2525
var CRDValidator interfaces.Validator = interfaces.ValidatorFunc(validateCRDs)
@@ -28,31 +28,54 @@ func validateCRDs(objs ...interface{}) (results []errors.ManifestResult) {
2828
for _, obj := range objs {
2929
switch v := obj.(type) {
3030
case *v1beta1.CustomResourceDefinition:
31-
results = append(results, validateCRD(v))
31+
results = append(results, validateV1Beta1CRD(v))
32+
case *v1.CustomResourceDefinition:
33+
results = append(results, validateV1CRD(v))
3234
}
3335
}
3436
return results
3537
}
3638

37-
func validateCRD(crd runtime.Object) (result errors.ManifestResult) {
38-
unversionedCRD := apiextensions.CustomResourceDefinition{}
39-
err := Scheme.Converter().Convert(&crd, &unversionedCRD, conversion.SourceToDest, nil)
39+
func validateV1Beta1CRD(crd *v1beta1.CustomResourceDefinition) (result errors.ManifestResult) {
40+
internalCRD := &apiextensions.CustomResourceDefinition{}
41+
v1beta1.SetDefaults_CustomResourceDefinition(crd)
42+
v1beta1.SetDefaults_CustomResourceDefinitionSpec(&crd.Spec)
43+
err := scheme.Converter().Convert(crd, internalCRD, conversion.SourceToDest, nil)
4044
if err != nil {
41-
result.Add(errors.ErrInvalidParse("error converting versioned crd to unversioned crd", err))
45+
result.Add(errors.ErrInvalidParse("error converting crd", err))
4246
return result
4347
}
48+
4449
gv := crd.GetObjectKind().GroupVersionKind().GroupVersion()
45-
result = validateCRDUnversioned(&unversionedCRD, gv)
46-
result.Name = unversionedCRD.GetName()
50+
result = validateInternalCRD(internalCRD, gv)
4751
return result
4852
}
4953

50-
func validateCRDUnversioned(crd *apiextensions.CustomResourceDefinition, gv schema.GroupVersion) (result errors.ManifestResult) {
54+
func validateV1CRD(crd *v1.CustomResourceDefinition) (result errors.ManifestResult) {
55+
internalCRD := &apiextensions.CustomResourceDefinition{}
56+
v1.SetDefaults_CustomResourceDefinition(crd)
57+
v1.SetDefaults_CustomResourceDefinitionSpec(&crd.Spec)
58+
err := scheme.Converter().Convert(crd, internalCRD, conversion.SourceToDest, nil)
59+
if err != nil {
60+
result.Add(errors.ErrInvalidParse("error converting crd", err))
61+
return result
62+
}
63+
64+
gv := crd.GetObjectKind().GroupVersionKind().GroupVersion()
65+
result = validateInternalCRD(internalCRD, gv)
66+
return result
67+
}
68+
69+
func validateInternalCRD(crd *apiextensions.CustomResourceDefinition, gv schema.GroupVersion) (result errors.ManifestResult) {
5170
errList := validation.ValidateCustomResourceDefinition(crd, gv)
5271
for _, err := range errList {
5372
if !strings.Contains(err.Field, "openAPIV3Schema") && !strings.Contains(err.Field, "status") {
5473
result.Add(errors.NewError(errors.ErrorType(err.Type), err.Error(), err.Field, err.BadValue))
5574
}
5675
}
76+
77+
if result.HasError() {
78+
result.Name = crd.GetName()
79+
}
5780
return result
5881
}

0 commit comments

Comments
 (0)