@@ -118,69 +118,84 @@ func (b *SchemaBuilder) WithScope(rm meta.RESTMapper) *SchemaBuilder {
118
118
Str ("group" , gvks [0 ].Group ).
119
119
Str ("version" , gvks [0 ].Version ).
120
120
Str ("kind" , gvks [0 ].Kind ).
121
- Msg ("failed to determine if GVK is namespaced " )
121
+ Msg ("failed to get namespaced info for GVK " )
122
122
continue
123
123
}
124
124
125
125
if namespaced {
126
- schema .VendorExtensible .AddExtension (common .ScopeExtensionKey , apiextensionsv1 .NamespaceScoped )
126
+ if schema .VendorExtensible .Extensions == nil {
127
+ schema .VendorExtensible .Extensions = map [string ]any {}
128
+ }
129
+ schema .VendorExtensible .Extensions [common .ScopeExtensionKey ] = apiextensionsv1 .NamespaceScoped
127
130
} else {
128
- schema .VendorExtensible .AddExtension (common .ScopeExtensionKey , apiextensionsv1 .ClusterScoped )
131
+ if schema .VendorExtensible .Extensions == nil {
132
+ schema .VendorExtensible .Extensions = map [string ]any {}
133
+ }
134
+ schema .VendorExtensible .Extensions [common .ScopeExtensionKey ] = apiextensionsv1 .ClusterScoped
129
135
}
130
-
131
136
}
132
-
133
137
return b
134
138
}
135
139
136
140
func (b * SchemaBuilder ) WithCRDCategories (crd * apiextensionsv1.CustomResourceDefinition ) * SchemaBuilder {
137
- categories := crd .Spec .Names .Categories
138
- if len (categories ) == 0 {
139
- return b
140
- }
141
- gvk , err := getCRDGroupVersionKind (crd .Spec )
142
- if err != nil {
143
- b .err = multierror .Append (b .err , errors .Join (ErrGetCRDGVK , err ))
141
+ if crd == nil {
144
142
return b
145
143
}
146
144
147
- schema , ok := b .schemas [getOpenAPISchemaKey (* gvk )]
148
- if ! ok {
145
+ gkv , err := getCRDGroupVersionKind (crd .Spec )
146
+ if err != nil {
147
+ b .err = multierror .Append (b .err , ErrGetCRDGVK )
149
148
return b
150
149
}
151
150
152
- schema .VendorExtensible .AddExtension (common .CategoriesExtensionKey , categories )
151
+ for _ , v := range crd .Spec .Versions {
152
+ resourceKey := getOpenAPISchemaKey (metav1.GroupVersionKind {Group : gkv .Group , Version : v .Name , Kind : gkv .Kind })
153
+ resourceSchema , ok := b .schemas [resourceKey ]
154
+ if ! ok {
155
+ continue
156
+ }
153
157
158
+ if len (crd .Spec .Names .Categories ) == 0 {
159
+ b .log .Debug ().Str ("resource" , resourceKey ).Msg ("no categories provided for CRD kind" )
160
+ continue
161
+ }
162
+ if resourceSchema .VendorExtensible .Extensions == nil {
163
+ resourceSchema .VendorExtensible .Extensions = map [string ]any {}
164
+ }
165
+ resourceSchema .VendorExtensible .Extensions [common .CategoriesExtensionKey ] = crd .Spec .Names .Categories
166
+ b .schemas [resourceKey ] = resourceSchema
167
+ }
154
168
return b
155
169
}
156
170
157
171
func (b * SchemaBuilder ) WithApiResourceCategories (list []* metav1.APIResourceList ) * SchemaBuilder {
172
+ if len (list ) == 0 {
173
+ return b
174
+ }
175
+
158
176
for _ , apiResourceList := range list {
177
+ gv , err := runtimeSchema .ParseGroupVersion (apiResourceList .GroupVersion )
178
+ if err != nil {
179
+ b .err = multierror .Append (b .err , errors .Join (ErrParseGroupVersion , err ))
180
+ continue
181
+ }
159
182
for _ , apiResource := range apiResourceList .APIResources {
160
183
if apiResource .Categories == nil {
161
184
continue
162
185
}
163
-
164
- gv , err := runtimeSchema .ParseGroupVersion (apiResourceList .GroupVersion )
165
- if err != nil {
166
- b .err = multierror .Append (b .err , errors .Join (ErrParseGroupVersion , err ))
167
- continue
168
- }
169
- gvk := metav1.GroupVersionKind {
170
- Group : gv .Group ,
171
- Version : gv .Version ,
172
- Kind : apiResource .Kind ,
173
- }
174
-
175
- schema , ok := b .schemas [getOpenAPISchemaKey (gvk )]
186
+ gvk := metav1.GroupVersionKind {Group : gv .Group , Version : gv .Version , Kind : apiResource .Kind }
187
+ resourceKey := getOpenAPISchemaKey (gvk )
188
+ resourceSchema , ok := b .schemas [resourceKey ]
176
189
if ! ok {
177
190
continue
178
191
}
179
-
180
- schema .VendorExtensible .AddExtension (common .CategoriesExtensionKey , apiResource .Categories )
192
+ if resourceSchema .VendorExtensible .Extensions == nil {
193
+ resourceSchema .VendorExtensible .Extensions = map [string ]any {}
194
+ }
195
+ resourceSchema .VendorExtensible .Extensions [common .CategoriesExtensionKey ] = apiResource .Categories
196
+ b .schemas [resourceKey ] = resourceSchema
181
197
}
182
198
}
183
-
184
199
return b
185
200
}
186
201
@@ -298,10 +313,11 @@ func (b *SchemaBuilder) expandRelationships(schema *spec.Schema) {
298
313
}
299
314
}
300
315
301
- // Recursively process nested objects
302
- for _ , prop := range schema .Properties {
316
+ // Recursively process nested objects and write back modifications
317
+ for key , prop := range schema .Properties {
303
318
if prop .Type .Contains ("object" ) && prop .Properties != nil {
304
319
b .expandRelationships (& prop )
320
+ schema .Properties [key ] = prop
305
321
}
306
322
}
307
323
}
@@ -313,18 +329,18 @@ func (b *SchemaBuilder) Complete() ([]byte, error) {
313
329
},
314
330
})
315
331
if err != nil {
316
- b .err = multierror .Append (b .err , errors .Join (ErrMarshalOpenAPISchema , err ))
317
- return nil , b .err
332
+ return nil , errors .Join (ErrMarshalOpenAPISchema , err )
318
333
}
334
+
319
335
v2JSON , err := ConvertJSON (v3JSON )
320
336
if err != nil {
321
- b .err = multierror .Append (b .err , errors .Join (ErrConvertOpenAPISchema , err ))
322
- return nil , b .err
337
+ return nil , errors .Join (ErrConvertOpenAPISchema , err )
323
338
}
324
339
325
340
return v2JSON , nil
326
341
}
327
342
343
+ // getOpenAPISchemaKey creates the key that kubernetes uses in its OpenAPI Definitions
328
344
func getOpenAPISchemaKey (gvk metav1.GroupVersionKind ) string {
329
345
// we need to inverse group to match the runtimeSchema key(io.openmfp.core.v1alpha1.Account)
330
346
parts := strings .Split (gvk .Group , "." )
0 commit comments