expose apiregistration.k8s.io into OpenAPIV3

This commit is contained in:
Alexander Zielenski 2023-06-26 13:04:59 -07:00 committed by Filip Křepinský
parent b3d94ae74f
commit ad2b4368e2
3 changed files with 27 additions and 4 deletions

View File

@ -440,6 +440,8 @@ func (s *APIAggregator) PrepareRun() (preparedAPIAggregator, error) {
openAPIV3Aggregator, err := openapiv3aggregator.BuildAndRegisterAggregator( openAPIV3Aggregator, err := openapiv3aggregator.BuildAndRegisterAggregator(
specDownloaderV3, specDownloaderV3,
s.GenericAPIServer.NextDelegate(), s.GenericAPIServer.NextDelegate(),
s.GenericAPIServer.Handler.GoRestfulContainer,
s.openAPIConfig,
s.GenericAPIServer.Handler.NonGoRestfulMux) s.GenericAPIServer.Handler.NonGoRestfulMux)
if err != nil { if err != nil {
return preparedAPIAggregator{}, err return preparedAPIAggregator{}, err

View File

@ -25,9 +25,13 @@ import (
"sync" "sync"
"time" "time"
"github.com/emicklei/go-restful/v3"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apiserver/pkg/endpoints/metrics" "k8s.io/apiserver/pkg/endpoints/metrics"
"k8s.io/apiserver/pkg/server" "k8s.io/apiserver/pkg/server"
"k8s.io/apiserver/pkg/server/mux" "k8s.io/apiserver/pkg/server/mux"
"k8s.io/apiserver/pkg/server/routes"
"k8s.io/klog/v2" "k8s.io/klog/v2"
v1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" v1 "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1"
"k8s.io/kube-openapi/pkg/common" "k8s.io/kube-openapi/pkg/common"
@ -73,12 +77,29 @@ func (s *specProxier) GetAPIServiceNames() []string {
} }
// BuildAndRegisterAggregator registered OpenAPI aggregator handler. This function is not thread safe as it only being called on startup. // BuildAndRegisterAggregator registered OpenAPI aggregator handler. This function is not thread safe as it only being called on startup.
func BuildAndRegisterAggregator(downloader Downloader, delegationTarget server.DelegationTarget, pathHandler common.PathHandlerByGroupVersion) (SpecProxier, error) { func BuildAndRegisterAggregator(downloader Downloader, delegationTarget server.DelegationTarget, aggregatorService *restful.Container, openAPIConfig *common.Config, pathHandler common.PathHandlerByGroupVersion) (SpecProxier, error) {
s := &specProxier{ s := &specProxier{
apiServiceInfo: map[string]*openAPIV3APIServiceInfo{}, apiServiceInfo: map[string]*openAPIV3APIServiceInfo{},
downloader: downloader, downloader: downloader,
} }
if aggregatorService != nil && openAPIConfig != nil {
// Make native types exposed by aggregator available to the aggregated
// OpenAPI (normal handle is disabled by skipOpenAPIInstallation option)
aggregatorLocalServiceName := "k8s_internal_local_kube_aggregator_types"
v3Mux := mux.NewPathRecorderMux(aggregatorLocalServiceName)
_ = routes.OpenAPI{
Config: openAPIConfig,
}.InstallV3(aggregatorService, v3Mux)
s.AddUpdateAPIService(v3Mux, &v1.APIService{
ObjectMeta: metav1.ObjectMeta{
Name: aggregatorLocalServiceName,
},
})
s.UpdateAPIServiceSpec(aggregatorLocalServiceName)
}
i := 1 i := 1
for delegate := delegationTarget; delegate != nil; delegate = delegate.NextDelegate() { for delegate := delegationTarget; delegate != nil; delegate = delegate.NextDelegate() {
handler := delegate.UnprotectedHandler() handler := delegate.UnprotectedHandler()

View File

@ -89,7 +89,7 @@ func TestV2APIService(t *testing.T) {
downloader := Downloader{} downloader := Downloader{}
pathHandler := mux.NewPathRecorderMux("aggregator_test") pathHandler := mux.NewPathRecorderMux("aggregator_test")
var serveHandler http.Handler = pathHandler var serveHandler http.Handler = pathHandler
specProxier, err := BuildAndRegisterAggregator(downloader, genericapiserver.NewEmptyDelegate(), pathHandler) specProxier, err := BuildAndRegisterAggregator(downloader, genericapiserver.NewEmptyDelegate(), nil, nil, pathHandler)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -133,7 +133,7 @@ func TestV3APIService(t *testing.T) {
pathHandler := mux.NewPathRecorderMux("aggregator_test") pathHandler := mux.NewPathRecorderMux("aggregator_test")
var serveHandler http.Handler = pathHandler var serveHandler http.Handler = pathHandler
specProxier, err := BuildAndRegisterAggregator(downloader, genericapiserver.NewEmptyDelegate(), pathHandler) specProxier, err := BuildAndRegisterAggregator(downloader, genericapiserver.NewEmptyDelegate(), nil, nil, pathHandler)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -178,7 +178,7 @@ func TestOpenAPIRequestMetrics(t *testing.T) {
pathHandler := mux.NewPathRecorderMux("aggregator_metrics_test") pathHandler := mux.NewPathRecorderMux("aggregator_metrics_test")
var serveHandler http.Handler = pathHandler var serveHandler http.Handler = pathHandler
specProxier, err := BuildAndRegisterAggregator(downloader, genericapiserver.NewEmptyDelegate(), pathHandler) specProxier, err := BuildAndRegisterAggregator(downloader, genericapiserver.NewEmptyDelegate(), nil, nil, pathHandler)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }