From 6c75e922f31b9b3963fd5f1466b9ebc6f9c4b8d2 Mon Sep 17 00:00:00 2001 From: "Dr. Stefan Schimanski" Date: Tue, 27 Sep 2016 11:35:39 +0200 Subject: [PATCH] Decouple NewRequestInfoResolver from GenericApiServer instance --- pkg/apiserver/filters/requestinfo.go | 1 + pkg/apiserver/proxy.go | 1 + pkg/genericapiserver/config.go | 14 ++++++++++++-- pkg/genericapiserver/genericapiserver.go | 9 --------- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/pkg/apiserver/filters/requestinfo.go b/pkg/apiserver/filters/requestinfo.go index 0da847bbf27..0838e23e360 100644 --- a/pkg/apiserver/filters/requestinfo.go +++ b/pkg/apiserver/filters/requestinfo.go @@ -37,6 +37,7 @@ func WithRequestInfo(handler http.Handler, resolver *request.RequestInfoResolver info, err := resolver.GetRequestInfo(req) if err != nil { internalError(w, req, fmt.Errorf("failed to create RequestInfo: %v", err)) + return } requestContextMapper.Update(req, request.WithRequestInfo(ctx, info)) diff --git a/pkg/apiserver/proxy.go b/pkg/apiserver/proxy.go index 0ed1fab196e..8f49c23945f 100644 --- a/pkg/apiserver/proxy.go +++ b/pkg/apiserver/proxy.go @@ -63,6 +63,7 @@ func (r *ProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { ctx, ok := r.mapper.Get(req) if !ok { internalError(w, req, errors.New("Error getting request context")) + httpCode = http.StatusInternalServerError return } diff --git a/pkg/genericapiserver/config.go b/pkg/genericapiserver/config.go index 24cdd6573f3..d73fe21fad1 100644 --- a/pkg/genericapiserver/config.go +++ b/pkg/genericapiserver/config.go @@ -25,6 +25,7 @@ import ( "os" "regexp" "strconv" + "strings" "time" "github.com/emicklei/go-restful" @@ -37,6 +38,7 @@ import ( "k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/apiserver" apiserverfilters "k8s.io/kubernetes/pkg/apiserver/filters" + "k8s.io/kubernetes/pkg/apiserver/request" "k8s.io/kubernetes/pkg/auth/authenticator" "k8s.io/kubernetes/pkg/auth/authorizer" authhandlers "k8s.io/kubernetes/pkg/auth/handlers" @@ -49,6 +51,7 @@ import ( ipallocator "k8s.io/kubernetes/pkg/registry/core/service/ipallocator" "k8s.io/kubernetes/pkg/runtime" utilnet "k8s.io/kubernetes/pkg/util/net" + "k8s.io/kubernetes/pkg/util/sets" ) // Config is a structure used to configure a GenericAPIServer. @@ -355,7 +358,7 @@ func (s *GenericAPIServer) buildHandlerChains(c *Config, handler http.Handler) ( // insecure filters insecure = handler insecure = genericfilters.WithPanicRecovery(insecure, c.RequestContextMapper) - insecure = apiserverfilters.WithRequestInfo(insecure, s.NewRequestInfoResolver(), c.RequestContextMapper) + insecure = apiserverfilters.WithRequestInfo(insecure, NewRequestInfoResolver(c), c.RequestContextMapper) insecure = api.WithRequestContext(insecure, c.RequestContextMapper) insecure = genericfilters.WithTimeoutForNonLongRunningRequests(insecure, c.LongRunningFunc) @@ -367,7 +370,7 @@ func (s *GenericAPIServer) buildHandlerChains(c *Config, handler http.Handler) ( secure = apiserverfilters.WithAudit(secure, attributeGetter, c.AuditWriter) // before impersonation to read original user secure = authhandlers.WithAuthentication(secure, c.RequestContextMapper, c.Authenticator, authhandlers.Unauthorized(c.SupportsBasicAuth)) secure = genericfilters.WithPanicRecovery(secure, c.RequestContextMapper) - secure = apiserverfilters.WithRequestInfo(secure, s.NewRequestInfoResolver(), c.RequestContextMapper) + secure = apiserverfilters.WithRequestInfo(secure, NewRequestInfoResolver(c), c.RequestContextMapper) secure = api.WithRequestContext(secure, c.RequestContextMapper) secure = genericfilters.WithTimeoutForNonLongRunningRequests(secure, c.LongRunningFunc) secure = genericfilters.WithMaxInFlightLimit(secure, c.MaxRequestsInFlight, c.LongRunningFunc) @@ -440,3 +443,10 @@ func DefaultAndValidateRunOptions(options *options.ServerRunOptions) { } } } + +func NewRequestInfoResolver(c *Config) *request.RequestInfoResolver { + return &request.RequestInfoResolver{ + APIPrefixes: sets.NewString(strings.Trim(c.APIPrefix, "/"), strings.Trim(c.APIGroupPrefix, "/")), // all possible API prefixes + GrouplessAPIPrefixes: sets.NewString(strings.Trim(c.APIPrefix, "/")), // APIPrefixes that won't have groups (legacy) + } +} diff --git a/pkg/genericapiserver/genericapiserver.go b/pkg/genericapiserver/genericapiserver.go index 0eb30ce3c03..5bd4b7e5a42 100644 --- a/pkg/genericapiserver/genericapiserver.go +++ b/pkg/genericapiserver/genericapiserver.go @@ -42,7 +42,6 @@ import ( "k8s.io/kubernetes/pkg/apimachinery" "k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apiserver" - "k8s.io/kubernetes/pkg/apiserver/request" "k8s.io/kubernetes/pkg/genericapiserver/openapi" "k8s.io/kubernetes/pkg/genericapiserver/openapi/common" "k8s.io/kubernetes/pkg/genericapiserver/options" @@ -50,7 +49,6 @@ import ( certutil "k8s.io/kubernetes/pkg/util/cert" utilnet "k8s.io/kubernetes/pkg/util/net" utilruntime "k8s.io/kubernetes/pkg/util/runtime" - "k8s.io/kubernetes/pkg/util/sets" ) // Info about an API group. @@ -188,13 +186,6 @@ func (s *GenericAPIServer) MinRequestTimeout() time.Duration { return s.minRequestTimeout } -func (s *GenericAPIServer) NewRequestInfoResolver() *request.RequestInfoResolver { - return &request.RequestInfoResolver{ - APIPrefixes: sets.NewString(strings.Trim(s.legacyAPIPrefix, "/"), strings.Trim(s.apiPrefix, "/")), // all possible API prefixes - GrouplessAPIPrefixes: sets.NewString(strings.Trim(s.legacyAPIPrefix, "/")), // APIPrefixes that won't have groups (legacy) - } -} - // HandleWithAuth adds an http.Handler for pattern to an http.ServeMux // Applies the same authentication and authorization (if any is configured) // to the request is used for the GenericAPIServer's built-in endpoints.