diff --git a/pkg/endpoints/openapi/openapi.go b/pkg/endpoints/openapi/openapi.go index 7b8f3589e..e512f29b3 100644 --- a/pkg/endpoints/openapi/openapi.go +++ b/pkg/endpoints/openapi/openapi.go @@ -143,12 +143,24 @@ func typeName(t reflect.Type) string { } // NewDefinitionNamer constructs a new DefinitionNamer to be used to customize OpenAPI spec. -func NewDefinitionNamer(s *runtime.Scheme) DefinitionNamer { - ret := DefinitionNamer{ +func NewDefinitionNamer(schemes ...*runtime.Scheme) *DefinitionNamer { + ret := &DefinitionNamer{ typeGroupVersionKinds: map[string]groupVersionKinds{}, } - for gvk, rtype := range s.AllKnownTypes() { - ret.typeGroupVersionKinds[typeName(rtype)] = append(ret.typeGroupVersionKinds[typeName(rtype)], gvkConvert(gvk)) + for _, s := range schemes { + for gvk, rtype := range s.AllKnownTypes() { + newGVK := gvkConvert(gvk) + exists := false + for _, existingGVK := range ret.typeGroupVersionKinds[typeName(rtype)] { + if newGVK == existingGVK { + exists = true + break + } + } + if !exists { + ret.typeGroupVersionKinds[typeName(rtype)] = append(ret.typeGroupVersionKinds[typeName(rtype)], newGVK) + } + } } for _, gvk := range ret.typeGroupVersionKinds { sort.Sort(gvk) diff --git a/pkg/server/config.go b/pkg/server/config.go index eb1c27d14..75a2b5dcc 100644 --- a/pkg/server/config.go +++ b/pkg/server/config.go @@ -278,8 +278,7 @@ func NewRecommendedConfig(codecs serializer.CodecFactory) *RecommendedConfig { } } -func DefaultOpenAPIConfig(getDefinitions openapicommon.GetOpenAPIDefinitions, scheme *runtime.Scheme) *openapicommon.Config { - defNamer := apiopenapi.NewDefinitionNamer(scheme) +func DefaultOpenAPIConfig(getDefinitions openapicommon.GetOpenAPIDefinitions, defNamer *apiopenapi.DefinitionNamer) *openapicommon.Config { return &openapicommon.Config{ ProtocolList: []string{"https"}, IgnorePrefixes: []string{"/swaggerapi"}, diff --git a/pkg/server/genericapiserver_test.go b/pkg/server/genericapiserver_test.go index 4b6e7b7dd..fbe7235c2 100644 --- a/pkg/server/genericapiserver_test.go +++ b/pkg/server/genericapiserver_test.go @@ -44,6 +44,7 @@ import ( "k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/apiserver/pkg/endpoints/discovery" genericapifilters "k8s.io/apiserver/pkg/endpoints/filters" + openapinamer "k8s.io/apiserver/pkg/endpoints/openapi" "k8s.io/apiserver/pkg/registry/rest" genericfilters "k8s.io/apiserver/pkg/server/filters" "k8s.io/client-go/informers" @@ -95,7 +96,7 @@ func setUp(t *testing.T) (Config, *assert.Assertions) { t.Fatal("unable to create fake client set") } - config.OpenAPIConfig = DefaultOpenAPIConfig(testGetOpenAPIDefinitions, runtime.NewScheme()) + config.OpenAPIConfig = DefaultOpenAPIConfig(testGetOpenAPIDefinitions, openapinamer.NewDefinitionNamer(runtime.NewScheme())) config.OpenAPIConfig.Info.Version = "unversioned" config.SwaggerConfig = DefaultSwaggerConfig() sharedInformers := informers.NewSharedInformerFactory(clientset, config.LoopbackClientConfig.Timeout)