@@ -30,10 +30,8 @@ import (
3030
3131 systemd "github.com/coreos/go-systemd/daemon"
3232 "github.com/emicklei/go-restful"
33- "github.com/emicklei/go-restful/swagger"
3433 "github.com/golang/glog"
3534
36- "github.com/go-openapi/spec"
3735 "k8s.io/kubernetes/pkg/admission"
3836 "k8s.io/kubernetes/pkg/api"
3937 "k8s.io/kubernetes/pkg/api/rest"
@@ -43,8 +41,8 @@ import (
4341 "k8s.io/kubernetes/pkg/apiserver"
4442 "k8s.io/kubernetes/pkg/client/restclient"
4543 genericmux "k8s.io/kubernetes/pkg/genericapiserver/mux"
46- "k8s.io/kubernetes/pkg/genericapiserver/openapi"
4744 "k8s.io/kubernetes/pkg/genericapiserver/openapi/common"
45+ "k8s.io/kubernetes/pkg/genericapiserver/routes"
4846 "k8s.io/kubernetes/pkg/runtime"
4947 certutil "k8s.io/kubernetes/pkg/util/cert"
5048 utilnet "k8s.io/kubernetes/pkg/util/net"
@@ -151,9 +149,6 @@ type GenericAPIServer struct {
151149
152150 // See Config.$name for documentation of these flags:
153151
154- openAPIInfo spec.Info
155- openAPIDefaultResponse spec.Response
156- openAPIDefinitions * common.OpenAPIDefinitions
157152 MasterCount int
158153 KubernetesServiceNodePort int // TODO(sttts): move into master
159154 ServiceReadWriteIP net.IP
@@ -179,15 +174,25 @@ func (s *GenericAPIServer) MinRequestTimeout() time.Duration {
179174 return s .minRequestTimeout
180175}
181176
182- func (s * GenericAPIServer ) Run () {
177+ type preparedGenericAPIServer struct {
178+ * GenericAPIServer
179+ }
180+
181+ // PrepareRun does post API installation setup steps.
182+ func (s * GenericAPIServer ) PrepareRun () preparedGenericAPIServer {
183183 // install APIs which depend on other APIs to be installed
184184 if s .enableSwaggerSupport {
185- s . InstallSwaggerAPI ( )
185+ routes. Swagger { ExternalAddress : s . ExternalAddress }. Install ( s . HandlerContainer )
186186 }
187187 if s .enableOpenAPISupport {
188- s .InstallOpenAPI ()
188+ routes.OpenAPI {
189+ Config : s .openAPIConfig ,
190+ }.Install (s .HandlerContainer )
189191 }
192+ return preparedGenericAPIServer {s }
193+ }
190194
195+ func (s preparedGenericAPIServer ) Run () {
191196 if s .SecureServingInfo != nil && s .Handler != nil {
192197 secureServer := & http.Server {
193198 Addr : s .SecureServingInfo .BindAddress ,
@@ -424,60 +429,6 @@ func (s *GenericAPIServer) newAPIGroupVersion(apiGroupInfo *APIGroupInfo, groupV
424429 }, nil
425430}
426431
427- // getSwaggerConfig returns swagger config shared between SwaggerAPI and OpenAPI spec generators
428- func (s * GenericAPIServer ) getSwaggerConfig () * swagger.Config {
429- hostAndPort := s .ExternalAddress
430- protocol := "https://"
431- webServicesUrl := protocol + hostAndPort
432- return & swagger.Config {
433- WebServicesUrl : webServicesUrl ,
434- WebServices : s .HandlerContainer .RegisteredWebServices (),
435- ApiPath : "/swaggerapi/" ,
436- SwaggerPath : "/swaggerui/" ,
437- SwaggerFilePath : "/swagger-ui/" ,
438- SchemaFormatHandler : func (typeName string ) string {
439- switch typeName {
440- case "unversioned.Time" , "*unversioned.Time" :
441- return "date-time"
442- }
443- return ""
444- },
445- }
446- }
447-
448- // InstallSwaggerAPI installs the /swaggerapi/ endpoint to allow schema discovery
449- // and traversal. It is optional to allow consumers of the Kubernetes GenericAPIServer to
450- // register their own web services into the Kubernetes mux prior to initialization
451- // of swagger, so that other resource types show up in the documentation.
452- func (s * GenericAPIServer ) InstallSwaggerAPI () {
453- // Enable swagger UI and discovery API
454- swagger .RegisterSwaggerService (* s .getSwaggerConfig (), s .HandlerContainer .Container )
455- }
456-
457- // InstallOpenAPI installs spec endpoints for each web service.
458- func (s * GenericAPIServer ) InstallOpenAPI () {
459- // Install one spec per web service, an ideal client will have a ClientSet containing one client
460- // per each of these specs.
461- for _ , w := range s .HandlerContainer .RegisteredWebServices () {
462- if strings .HasPrefix (w .RootPath (), "/swaggerapi" ) {
463- continue
464- }
465- config := * s .openAPIConfig
466- config .Info = new (spec.Info )
467- * config .Info = * s .openAPIConfig .Info
468- config .Info .Title = config .Info .Title + " " + w .RootPath ()
469- err := openapi .RegisterOpenAPIService (w .RootPath ()+ "/swagger.json" , []* restful.WebService {w }, & config , s .HandlerContainer .Container )
470- if err != nil {
471- glog .Fatalf ("Failed to register open api spec for %v: %v" , w .RootPath (), err )
472- }
473- }
474- err := openapi .RegisterOpenAPIService ("/swagger.json" , s .HandlerContainer .RegisteredWebServices (), s .openAPIConfig , s .HandlerContainer .Container )
475-
476- if err != nil {
477- glog .Fatalf ("Failed to register open api spec for root: %v" , err )
478- }
479- }
480-
481432// DynamicApisDiscovery returns a webservice serving api group discovery.
482433// Note: during the server runtime apiGroupsForDiscovery might change.
483434func (s * GenericAPIServer ) DynamicApisDiscovery () * restful.WebService {
0 commit comments