@@ -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: \n spec.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+
131144func 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