@@ -7,14 +7,15 @@ import (
7
7
8
8
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/install"
9
9
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
10
+ apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
10
11
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
11
12
"k8s.io/apimachinery/pkg/runtime"
12
13
"k8s.io/apimachinery/pkg/util/yaml"
13
14
)
14
15
15
16
const (
16
- Kind = "CustomResourceDefinition"
17
- APIVersion = "apiextensions.k8s.io/v1 "
17
+ Kind = "CustomResourceDefinition"
18
+ Group = "apiextensions.k8s.io/"
18
19
)
19
20
20
21
var (
@@ -26,17 +27,16 @@ func init() {
26
27
install .Install (scheme )
27
28
}
28
29
29
- // Serialize takes in a CRD manifest and returns a v1 versioned CRD object.
30
+ // SerializeV1 takes in a CRD manifest and returns a v1 versioned CRD object.
30
31
// Compatible with v1beta1 or v1 CRD manifests.
31
- func Serialize (manifest string ) (* apiextensionsv1.CustomResourceDefinition , error ) {
32
+ func SerializeV1 (manifest string ) (* apiextensionsv1.CustomResourceDefinition , error ) {
32
33
u := & unstructured.Unstructured {}
33
34
reader := bytes .NewReader ([]byte (manifest ))
34
35
decoder := yaml .NewYAMLOrJSONDecoder (reader , 30 )
35
36
if err := decoder .Decode (u ); err != nil {
36
37
return nil , fmt .Errorf ("crd unmarshaling failed: %s" , err )
37
38
}
38
39
39
-
40
40
// Step through unversioned type to support v1beta1 -> v1
41
41
unversioned := & apiextensions.CustomResourceDefinition {}
42
42
if err := scheme .Convert (u , unversioned , nil ); err != nil {
@@ -51,18 +51,74 @@ func Serialize(manifest string) (*apiextensionsv1.CustomResourceDefinition, erro
51
51
// set CRD type meta
52
52
// for purposes of fake client for unit tests to pass
53
53
crd .TypeMeta .Kind = Kind
54
- crd .TypeMeta .APIVersion = APIVersion
55
-
54
+ crd .TypeMeta .APIVersion = Group + V1Version
56
55
57
56
// for each version in the CRD, check and make sure there is a schema
58
57
// if not a schema, give a default schema of props
59
58
for i := range crd .Spec .Versions {
60
59
if crd .Spec .Versions [i ].Schema == nil {
61
60
schema := & apiextensionsv1.JSONSchemaProps {Type : "object" }
62
- crd .Spec .Versions [i ].Schema = & apiextensionsv1.CustomResourceValidation {OpenAPIV3Schema :schema }
61
+ crd .Spec .Versions [i ].Schema = & apiextensionsv1.CustomResourceValidation {OpenAPIV3Schema : schema }
63
62
}
64
63
}
65
64
65
+ return crd , nil
66
+ }
67
+
68
+ // SerializeV1 takes in a CRD manifest and returns a v1 versioned CRD object.
69
+ // Compatible with v1beta1 or v1 CRD manifests.
70
+ func SerializeV1Beta1 (manifest string ) (* apiextensionsv1beta1.CustomResourceDefinition , error ) {
71
+ u := & unstructured.Unstructured {}
72
+ reader := bytes .NewReader ([]byte (manifest ))
73
+ decoder := yaml .NewYAMLOrJSONDecoder (reader , 30 )
74
+ if err := decoder .Decode (u ); err != nil {
75
+ return nil , fmt .Errorf ("crd unmarshaling failed: %s" , err )
76
+ }
77
+
78
+ unversioned := & apiextensions.CustomResourceDefinition {}
79
+ if err := scheme .Convert (u , unversioned , nil ); err != nil {
80
+ return nil , fmt .Errorf ("failed to convert crd from unstructured to internal: %s\n to v1: %s" , u , err )
81
+ }
82
+
83
+ crd := & apiextensionsv1beta1.CustomResourceDefinition {}
84
+ if err := scheme .Convert (unversioned , crd , nil ); err != nil {
85
+ return nil , fmt .Errorf ("failed to convert crd from internal to v1: %s\n to v1: %s" , u , err )
86
+ }
87
+
88
+ // set CRD type meta
89
+ // for purposes of fake client for unit tests to pass
90
+ crd .TypeMeta .Kind = Kind
91
+ crd .TypeMeta .APIVersion = Group + V1Beta1Version
92
+
93
+ // for each version in the CRD, check and make sure there is a schema
94
+ // if not a schema, give a default schema of props
95
+ // kube 1.18 requires a schema for all CRDs regardless of version
96
+ for i := range crd .Spec .Versions {
97
+ if crd .Spec .Versions [i ].Schema == nil {
98
+ schema := & apiextensionsv1beta1.JSONSchemaProps {Type : "object" }
99
+ crd .Spec .Versions [i ].Schema = & apiextensionsv1beta1.CustomResourceValidation {OpenAPIV3Schema : schema }
100
+ }
101
+ }
66
102
67
103
return crd , nil
68
104
}
105
+
106
+ // SerializeV1FromExisting takes in either a v1beta1 CRD or a v1 CRD type and returns a v1 CRD type.
107
+ func SerializeV1FromExisting (crd interface {}) (* apiextensionsv1.CustomResourceDefinition , error ) {
108
+ if c , ok := crd .(* apiextensionsv1.CustomResourceDefinition ); ok {
109
+ return c , nil
110
+ }
111
+ if c , ok := crd .(* apiextensionsv1beta1.CustomResourceDefinition ); ok {
112
+ unversioned := & apiextensions.CustomResourceDefinition {}
113
+ if err := scheme .Convert (c , unversioned , nil ); err != nil {
114
+ return nil , fmt .Errorf ("failed to convert crd from unstructured to internal: %s\n to v1: %s" , c .String (), err )
115
+ }
116
+
117
+ c := & apiextensionsv1.CustomResourceDefinition {}
118
+ if err := scheme .Convert (unversioned , crd , nil ); err != nil {
119
+ return nil , fmt .Errorf ("failed to convert crd from internal to v1: %s\n to v1: %s" , c .String (), err )
120
+ }
121
+ return c , nil
122
+ }
123
+ return nil , fmt .Errorf ("unable to determine crd type" )
124
+ }
0 commit comments