@@ -8,18 +8,18 @@ import (
8
8
9
9
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions"
10
10
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
11
+ "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
11
12
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
12
13
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/validation"
13
14
"k8s.io/apimachinery/pkg/conversion"
14
15
"k8s.io/apimachinery/pkg/runtime"
15
16
"k8s.io/apimachinery/pkg/runtime/schema"
16
- "k8s.io/client-go/kubernetes/scheme"
17
17
)
18
18
19
- var Scheme = scheme . Scheme
19
+ var scheme = runtime . NewScheme ()
20
20
21
21
func init () {
22
- install .Install (Scheme )
22
+ install .Install (scheme )
23
23
}
24
24
25
25
var CRDValidator interfaces.Validator = interfaces .ValidatorFunc (validateCRDs )
@@ -28,31 +28,54 @@ func validateCRDs(objs ...interface{}) (results []errors.ManifestResult) {
28
28
for _ , obj := range objs {
29
29
switch v := obj .(type ) {
30
30
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 ))
32
34
}
33
35
}
34
36
return results
35
37
}
36
38
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 )
40
44
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 ))
42
46
return result
43
47
}
48
+
44
49
gv := crd .GetObjectKind ().GroupVersionKind ().GroupVersion ()
45
- result = validateCRDUnversioned (& unversionedCRD , gv )
46
- result .Name = unversionedCRD .GetName ()
50
+ result = validateInternalCRD (internalCRD , gv )
47
51
return result
48
52
}
49
53
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 ) {
51
70
errList := validation .ValidateCustomResourceDefinition (crd , gv )
52
71
for _ , err := range errList {
53
72
if ! strings .Contains (err .Field , "openAPIV3Schema" ) && ! strings .Contains (err .Field , "status" ) {
54
73
result .Add (errors .NewError (errors .ErrorType (err .Type ), err .Error (), err .Field , err .BadValue ))
55
74
}
56
75
}
76
+
77
+ if result .HasError () {
78
+ result .Name = crd .GetName ()
79
+ }
57
80
return result
58
81
}
0 commit comments