Skip to content

Commit 85914c9

Browse files
authored
enhance: support v1 crd with multiple versions (#63)
Signed-off-by: amy <[email protected]>
1 parent a2418ab commit 85914c9

File tree

7 files changed

+2057
-29
lines changed

7 files changed

+2057
-29
lines changed

pkg/kube_resource/generator/generator.go

Lines changed: 45 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -122,29 +122,60 @@ func crdObj2CrdInternal(crdObj runtime.Object) (*apiextensions.CustomResourceDef
122122
default:
123123
return nil, errors.New(fmt.Sprintf("unknown crd object type %v", crdObj.GetObjectKind()))
124124
}
125-
if crd.Spec.Validation == nil || crd.Spec.Validation.OpenAPIV3Schema == nil {
126-
return nil, errors.New("no openapi schema found in the crd file. Please check following fields: spec.Validation.OpenAPIV3Schema, spec.Versions.0.Schema")
125+
126+
if !CRDContainsValidation(crd) {
127+
return nil, errors.New("no openapi schema found in the crd file. Please check following fields: \nspec.Versions.<n>.Schema, spec.Versions.<n>.Schema.OpenAPIV3Schema, spec.Validation.OpenAPIV3Schema, spec.Versions.0.Schema")
127128
}
128129
return crd, nil
129130
}
130131

132+
func CRDContainsValidation(crd *apiextensions.CustomResourceDefinition) bool {
133+
if crd.Spec.Validation != nil && crd.Spec.Validation.OpenAPIV3Schema != nil {
134+
return true
135+
}
136+
for _, version := range crd.Spec.Versions {
137+
if version.Schema != nil && version.Schema.OpenAPIV3Schema != nil {
138+
return true
139+
}
140+
}
141+
return false
142+
}
143+
131144
func buildSwagger(crd *apiextensions.CustomResourceDefinition) (*spec.Swagger, error) {
132-
var schema spec.Schema
133-
err := validation.ConvertJSONSchemaProps(crd.Spec.Validation.OpenAPIV3Schema, &schema)
134-
if err != nil {
135-
return nil, err
145+
var schemas spec.Definitions = map[string]spec.Schema{}
146+
group, kind := crd.Spec.Group, crd.Spec.Names.Kind
147+
if crd.Spec.Validation != nil && crd.Spec.Validation.OpenAPIV3Schema != nil {
148+
var schema spec.Schema
149+
err := validation.ConvertJSONSchemaProps(crd.Spec.Validation.OpenAPIV3Schema, &schema)
150+
if err != nil {
151+
return nil, err
152+
}
153+
version := crd.Spec.Version
154+
setKubeNative(&schema, group, version, kind)
155+
name := fmt.Sprintf("%s.%s.%s", group, version, kind)
156+
schemas[name] = schema
157+
} else if len(crd.Spec.Versions) > 0 {
158+
for _, version := range crd.Spec.Versions {
159+
if version.Schema != nil && version.Schema.OpenAPIV3Schema != nil {
160+
var schema spec.Schema
161+
err := validation.ConvertJSONSchemaProps(version.Schema.OpenAPIV3Schema, &schema)
162+
if err != nil {
163+
return nil, err
164+
}
165+
version := version.Name
166+
setKubeNative(&schema, group, version, kind)
167+
name := fmt.Sprintf("%s.%s.%s", group, version, kind)
168+
schemas[name] = schema
169+
}
170+
}
136171
}
137-
group, kind, version := kvg(crd)
138-
setKubeNative(&schema, group, version, kind)
172+
139173
// todo: set extensions, include kcl-type and user-defined extensions
140-
name := fmt.Sprintf("%s.%s.%s", group, version, kind)
141174
return &spec.Swagger{
142175
SwaggerProps: spec.SwaggerProps{
143-
Swagger: "2.0", // todo: support swagger 3.0
144-
Definitions: spec.Definitions{
145-
name: schema,
146-
},
147-
Paths: &spec.Paths{},
176+
Swagger: "2.0", // todo: support swagger 3.0
177+
Definitions: schemas,
178+
Paths: &spec.Paths{},
148179
Info: &spec.Info{
149180
InfoProps: spec.InfoProps{
150181
Title: "Kubernetes CRD Swagger",
@@ -173,18 +204,3 @@ func setKubeNative(schema *spec.Schema, group string, version string, kind strin
173204
WithDescription(swaggerPartialObjectMetadataDescriptions["metadata"]))
174205
// todo: update more k8s refs to kcl format
175206
}
176-
177-
func kvg(crd *apiextensions.CustomResourceDefinition) (string, string, string) {
178-
group := crd.Spec.Group
179-
kind := crd.Spec.Names.Kind
180-
var version string
181-
if crd.Spec.Version == "" {
182-
if len(crd.Spec.Versions) != 0 {
183-
// todo: fix hack: use last version
184-
version = crd.Spec.Versions[len(crd.Spec.Versions)-1].Name
185-
}
186-
} else {
187-
version = crd.Spec.Version
188-
}
189-
return group, kind, version
190-
}

0 commit comments

Comments
 (0)