@@ -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,64 @@ 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
66
92
67
93
return crd , nil
68
94
}
95
+
96
+ // SerializeV1FromExisting takes in either a v1beta1 CRD or a v1 CRD type and returns a v1 CRD type.
97
+ func SerializeV1FromExisting (crd interface {}) (* apiextensionsv1.CustomResourceDefinition , error ) {
98
+ if c , ok := crd .(* apiextensionsv1.CustomResourceDefinition ); ok {
99
+ return c , nil
100
+ }
101
+ if c , ok := crd .(* apiextensionsv1beta1.CustomResourceDefinition ); ok {
102
+ unversioned := & apiextensions.CustomResourceDefinition {}
103
+ if err := scheme .Convert (c , unversioned , nil ); err != nil {
104
+ return nil , fmt .Errorf ("failed to convert crd from unstructured to internal: %s\n to v1: %s" , c .String (), err )
105
+ }
106
+
107
+ c := & apiextensionsv1.CustomResourceDefinition {}
108
+ if err := scheme .Convert (unversioned , crd , nil ); err != nil {
109
+ return nil , fmt .Errorf ("failed to convert crd from internal to v1: %s\n to v1: %s" , c .String (), err )
110
+ }
111
+ return c , nil
112
+ }
113
+ return nil , fmt .Errorf ("unable to determine crd type" )
114
+ }
0 commit comments