@@ -18,6 +18,7 @@ package server
18
18
19
19
import (
20
20
"context"
21
+ "encoding/json"
21
22
"fmt"
22
23
"io"
23
24
"net"
@@ -37,6 +38,7 @@ import (
37
38
utilversionpkg "k8s.io/apiserver/pkg/util/version"
38
39
"k8s.io/component-base/featuregate"
39
40
baseversion "k8s.io/component-base/version"
41
+ "k8s.io/kube-openapi/pkg/validation/spec"
40
42
netutils "k8s.io/utils/net"
41
43
)
42
44
@@ -156,6 +158,22 @@ func (o AppsServerOptions) Validate(args []string) error {
156
158
return utilerrors .NewAggregate (allErrors )
157
159
}
158
160
161
+ // DeepCopySchema делает глубокую копию структуры spec.Schema
162
+ func DeepCopySchema (schema * spec.Schema ) (* spec.Schema , error ) {
163
+ data , err := json .Marshal (schema )
164
+ if err != nil {
165
+ return nil , fmt .Errorf ("failed to marshal schema: %w" , err )
166
+ }
167
+
168
+ var newSchema spec.Schema
169
+ err = json .Unmarshal (data , & newSchema )
170
+ if err != nil {
171
+ return nil , fmt .Errorf ("failed to unmarshal schema: %w" , err )
172
+ }
173
+
174
+ return & newSchema , nil
175
+ }
176
+
159
177
// Config returns the configuration for the API server based on AppsServerOptions
160
178
func (o * AppsServerOptions ) Config () (* apiserver.Config , error ) {
161
179
// TODO: set the "real" external address
@@ -165,6 +183,12 @@ func (o *AppsServerOptions) Config() (*apiserver.Config, error) {
165
183
return nil , fmt .Errorf ("error creating self-signed certificates: %v" , err )
166
184
}
167
185
186
+ // First, register the dynamic types
187
+ err := v1alpha1 .RegisterDynamicTypes (apiserver .Scheme , o .ResourceConfig )
188
+ if err != nil {
189
+ return nil , fmt .Errorf ("failed to register dynamic types: %v" , err )
190
+ }
191
+
168
192
serverConfig := genericapiserver .NewRecommendedConfig (apiserver .Codecs )
169
193
170
194
serverConfig .OpenAPIConfig = genericapiserver .DefaultOpenAPIConfig (
@@ -173,6 +197,68 @@ func (o *AppsServerOptions) Config() (*apiserver.Config, error) {
173
197
serverConfig .OpenAPIConfig .Info .Title = "Apps"
174
198
serverConfig .OpenAPIConfig .Info .Version = "0.1"
175
199
200
+ serverConfig .OpenAPIConfig .PostProcessSpec = func (swagger * spec.Swagger ) (* spec.Swagger , error ) {
201
+ defs := swagger .Definitions
202
+
203
+ // Check basic Application definition
204
+ appDef , exists := defs ["com.github.aenix.io.cozystack.pkg.apis.apps.v1alpha1.Application" ]
205
+ if ! exists {
206
+ return swagger , fmt .Errorf ("Application definition not found" )
207
+ }
208
+
209
+ // Check basic ApplicationList definition
210
+ listDef , exists := defs ["com.github.aenix.io.cozystack.pkg.apis.apps.v1alpha1.ApplicationList" ]
211
+ if ! exists {
212
+ return swagger , fmt .Errorf ("ApplicationList definition not found" )
213
+ }
214
+
215
+ for _ , gvk := range v1alpha1 .RegisteredGVKs {
216
+ resourceName := fmt .Sprintf ("com.github.aenix.io.cozystack.pkg.apis.apps.v1alpha1.%s" , gvk .Kind )
217
+ newDef , err := DeepCopySchema (& appDef )
218
+ if err != nil {
219
+ return nil , fmt .Errorf ("failed to deepcopy schema for %s: %w" , gvk .Kind , err )
220
+ }
221
+
222
+ // Fix Extensions for resource
223
+ if newDef .Extensions == nil {
224
+ newDef .Extensions = map [string ]interface {}{}
225
+ }
226
+ newDef .Extensions ["x-kubernetes-group-version-kind" ] = []map [string ]interface {}{
227
+ {
228
+ "group" : gvk .Group ,
229
+ "version" : gvk .Version ,
230
+ "kind" : gvk .Kind ,
231
+ },
232
+ }
233
+ defs [resourceName ] = * newDef
234
+ fmt .Printf ("PostProcessSpec: Added OpenAPI definition for %s\n " , resourceName )
235
+
236
+ // List resource
237
+ listResourceName := fmt .Sprintf ("com.github.aenix.io.cozystack.pkg.apis.apps.v1alpha1.%sList" , gvk .Kind )
238
+ newListDef , err := DeepCopySchema (& listDef )
239
+ if err != nil {
240
+ return nil , fmt .Errorf ("failed to deepcopy schema for %sList: %w" , gvk .Kind , err )
241
+ }
242
+
243
+ // Fix Extensions for List resource
244
+ if newListDef .Extensions == nil {
245
+ newListDef .Extensions = map [string ]interface {}{}
246
+ }
247
+ newListDef .Extensions ["x-kubernetes-group-version-kind" ] = []map [string ]interface {}{
248
+ {
249
+ "group" : gvk .Group ,
250
+ "version" : gvk .Version ,
251
+ "kind" : fmt .Sprintf ("%sList" , gvk .Kind ),
252
+ },
253
+ }
254
+ defs [listResourceName ] = * newListDef
255
+ fmt .Printf ("PostProcessSpec: Added OpenAPI definition for %s\n " , listResourceName )
256
+ }
257
+
258
+ swagger .Definitions = defs
259
+ return swagger , nil
260
+ }
261
+
176
262
serverConfig .OpenAPIV3Config = genericapiserver .DefaultOpenAPIV3Config (
177
263
sampleopenapi .GetOpenAPIDefinitions , openapi .NewDefinitionNamer (apiserver .Scheme ),
178
264
)
0 commit comments