Merge pull request #39353 from sttts/sttts-requestcontextmapper-move

Automatic merge from submit-queue (batch tested with PRs 39075, 39350, 39353)

Move pkg/api.{Context,RequestContextMapper} into pkg/genericapiserver/api/request

**Based on #39350**
This commit is contained in:
Kubernetes Submit Queue 2017-01-03 07:40:30 -08:00 committed by GitHub
commit 63eec9608d
265 changed files with 1256 additions and 1043 deletions

View File

@ -41,6 +41,7 @@ go_library(
"//pkg/genericapiserver:go_default_library", "//pkg/genericapiserver:go_default_library",
"//pkg/genericapiserver/api/filters:go_default_library", "//pkg/genericapiserver/api/filters:go_default_library",
"//pkg/genericapiserver/api/handlers/responsewriters:go_default_library", "//pkg/genericapiserver/api/handlers/responsewriters:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/genericapiserver/filters:go_default_library", "//pkg/genericapiserver/filters:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",

View File

@ -21,7 +21,6 @@ import (
"os" "os"
"time" "time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
authhandlers "k8s.io/kubernetes/pkg/auth/handlers" authhandlers "k8s.io/kubernetes/pkg/auth/handlers"
kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" kubeclientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
@ -29,6 +28,7 @@ import (
v1listers "k8s.io/kubernetes/pkg/client/listers/core/v1" v1listers "k8s.io/kubernetes/pkg/client/listers/core/v1"
"k8s.io/kubernetes/pkg/genericapiserver" "k8s.io/kubernetes/pkg/genericapiserver"
genericapifilters "k8s.io/kubernetes/pkg/genericapiserver/api/filters" genericapifilters "k8s.io/kubernetes/pkg/genericapiserver/api/filters"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
genericfilters "k8s.io/kubernetes/pkg/genericapiserver/filters" genericfilters "k8s.io/kubernetes/pkg/genericapiserver/filters"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
@ -63,7 +63,7 @@ type Config struct {
type APIDiscoveryServer struct { type APIDiscoveryServer struct {
GenericAPIServer *genericapiserver.GenericAPIServer GenericAPIServer *genericapiserver.GenericAPIServer
contextMapper api.RequestContextMapper contextMapper genericapirequest.RequestContextMapper
// proxyClientCert/Key are the client cert used to identify this proxy. Backing APIServices use // proxyClientCert/Key are the client cert used to identify this proxy. Backing APIServices use
// this to confirm the proxy's identity // this to confirm the proxy's identity
@ -198,7 +198,7 @@ func (h *handlerChainConfig) handlerChain(apiHandler http.Handler, c *genericapi
handler = genericfilters.WithTimeoutForNonLongRunningRequests(handler, c.RequestContextMapper, c.LongRunningFunc) handler = genericfilters.WithTimeoutForNonLongRunningRequests(handler, c.RequestContextMapper, c.LongRunningFunc)
handler = genericfilters.WithMaxInFlightLimit(handler, c.MaxRequestsInFlight, c.MaxMutatingRequestsInFlight, c.RequestContextMapper, c.LongRunningFunc) handler = genericfilters.WithMaxInFlightLimit(handler, c.MaxRequestsInFlight, c.MaxMutatingRequestsInFlight, c.RequestContextMapper, c.LongRunningFunc)
handler = genericapifilters.WithRequestInfo(handler, genericapiserver.NewRequestInfoResolver(c), c.RequestContextMapper) handler = genericapifilters.WithRequestInfo(handler, genericapiserver.NewRequestInfoResolver(c), c.RequestContextMapper)
handler = api.WithRequestContext(handler, c.RequestContextMapper) handler = genericapirequest.WithRequestContext(handler, c.RequestContextMapper)
return handler, nil return handler, nil
} }

View File

@ -21,10 +21,10 @@ import (
"net/url" "net/url"
"sync" "sync"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
"k8s.io/kubernetes/pkg/client/transport" "k8s.io/kubernetes/pkg/client/transport"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
genericrest "k8s.io/kubernetes/pkg/registry/generic/rest" genericrest "k8s.io/kubernetes/pkg/registry/generic/rest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/httpstream/spdy" "k8s.io/kubernetes/pkg/util/httpstream/spdy"
@ -35,7 +35,7 @@ import (
// proxyHandler provides a http.Handler which will proxy traffic to locations // proxyHandler provides a http.Handler which will proxy traffic to locations
// specified by items implementing Redirector. // specified by items implementing Redirector.
type proxyHandler struct { type proxyHandler struct {
contextMapper api.RequestContextMapper contextMapper genericapirequest.RequestContextMapper
// proxyClientCert/Key are the client cert used to identify this proxy. Backing APIServices use // proxyClientCert/Key are the client cert used to identify this proxy. Backing APIServices use
// this to confirm the proxy's identity // this to confirm the proxy's identity
@ -71,7 +71,7 @@ func (r *proxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
http.Error(w, "missing context", http.StatusInternalServerError) http.Error(w, "missing context", http.StatusInternalServerError)
return return
} }
user, ok := api.UserFrom(ctx) user, ok := genericapirequest.UserFrom(ctx)
if !ok { if !ok {
http.Error(w, "missing user", http.StatusInternalServerError) http.Error(w, "missing user", http.StatusInternalServerError)
return return

View File

@ -56,10 +56,10 @@ type fakeRequestContextMapper struct {
user user.Info user user.Info
} }
func (m *fakeRequestContextMapper) Get(req *http.Request) (api.Context, bool) { func (m *fakeRequestContextMapper) Get(req *http.Request) (genericapirequest.Context, bool) {
ctx := api.NewContext() ctx := genericapirequest.NewContext()
if m.user != nil { if m.user != nil {
ctx = api.WithUser(ctx, m.user) ctx = genericapirequest.WithUser(ctx, m.user)
} }
resolver := &genericapirequest.RequestInfoFactory{ resolver := &genericapirequest.RequestInfoFactory{
@ -74,7 +74,7 @@ func (m *fakeRequestContextMapper) Get(req *http.Request) (api.Context, bool) {
return ctx, true return ctx, true
} }
func (*fakeRequestContextMapper) Update(req *http.Request, context api.Context) error { func (*fakeRequestContextMapper) Update(req *http.Request, context genericapirequest.Context) error {
return nil return nil
} }

View File

@ -16,6 +16,7 @@ go_library(
"//cmd/kubernetes-discovery/pkg/apis/apiregistration/validation:go_default_library", "//cmd/kubernetes-discovery/pkg/apis/apiregistration/validation:go_default_library",
"//pkg/api:go_default_library", "//pkg/api:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",

View File

@ -21,6 +21,7 @@ import (
kapi "k8s.io/kubernetes/pkg/api" kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -42,17 +43,17 @@ func (apiServerStrategy) NamespaceScoped() bool {
return false return false
} }
func (apiServerStrategy) PrepareForCreate(ctx kapi.Context, obj runtime.Object) { func (apiServerStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
_ = obj.(*apiregistration.APIService) _ = obj.(*apiregistration.APIService)
} }
func (apiServerStrategy) PrepareForUpdate(ctx kapi.Context, obj, old runtime.Object) { func (apiServerStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newAPIService := obj.(*apiregistration.APIService) newAPIService := obj.(*apiregistration.APIService)
oldAPIService := old.(*apiregistration.APIService) oldAPIService := old.(*apiregistration.APIService)
newAPIService.Status = oldAPIService.Status newAPIService.Status = oldAPIService.Status
} }
func (apiServerStrategy) Validate(ctx kapi.Context, obj runtime.Object) field.ErrorList { func (apiServerStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
return validation.ValidateAPIService(obj.(*apiregistration.APIService)) return validation.ValidateAPIService(obj.(*apiregistration.APIService))
} }
@ -67,7 +68,7 @@ func (apiServerStrategy) AllowUnconditionalUpdate() bool {
func (apiServerStrategy) Canonicalize(obj runtime.Object) { func (apiServerStrategy) Canonicalize(obj runtime.Object) {
} }
func (apiServerStrategy) ValidateUpdate(ctx kapi.Context, obj, old runtime.Object) field.ErrorList { func (apiServerStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
return validation.ValidateAPIServiceUpdate(obj.(*apiregistration.APIService), old.(*apiregistration.APIService)) return validation.ValidateAPIServiceUpdate(obj.(*apiregistration.APIService), old.(*apiregistration.APIService))
} }

View File

@ -15,6 +15,7 @@ go_library(
"//cmd/libs/go2idl/client-gen/test_apis/testgroup:go_default_library", "//cmd/libs/go2idl/client-gen/test_apis/testgroup:go_default_library",
"//pkg/api:go_default_library", "//pkg/api:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/registry/generic/registry:go_default_library", "//pkg/registry/generic/registry:go_default_library",

View File

@ -22,6 +22,7 @@ import (
"k8s.io/kubernetes/cmd/libs/go2idl/client-gen/test_apis/testgroup" "k8s.io/kubernetes/cmd/libs/go2idl/client-gen/test_apis/testgroup"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry" genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry"
@ -64,8 +65,10 @@ type fakeStrategy struct {
} }
func (*fakeStrategy) NamespaceScoped() bool { return false } func (*fakeStrategy) NamespaceScoped() bool { return false }
func (*fakeStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object) {} func (*fakeStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {}
func (*fakeStrategy) Validate(ctx api.Context, obj runtime.Object) field.ErrorList { return nil } func (*fakeStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
return nil
}
func (*fakeStrategy) Canonicalize(obj runtime.Object) {} func (*fakeStrategy) Canonicalize(obj runtime.Object) {}
var strategy = &fakeStrategy{api.Scheme, api.SimpleNameGenerator} var strategy = &fakeStrategy{api.Scheme, api.SimpleNameGenerator}

View File

@ -22,6 +22,7 @@ go_library(
"//pkg/api/rest:go_default_library", "//pkg/api/rest:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
@ -42,6 +43,7 @@ go_test(
"//pkg/api/testing:go_default_library", "//pkg/api/testing:go_default_library",
"//pkg/apimachinery/registered:go_default_library", "//pkg/apimachinery/registered:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
], ],
) )

View File

@ -15,8 +15,8 @@ go_library(
deps = [ deps = [
"//federation/apis/federation:go_default_library", "//federation/apis/federation:go_default_library",
"//federation/registry/cluster:go_default_library", "//federation/registry/cluster:go_default_library",
"//pkg/api:go_default_library",
"//pkg/api/rest:go_default_library", "//pkg/api/rest:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/registry/generic/registry:go_default_library", "//pkg/registry/generic/registry:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",

View File

@ -19,8 +19,8 @@ package etcd
import ( import (
"k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/federation/apis/federation"
"k8s.io/kubernetes/federation/registry/cluster" "k8s.io/kubernetes/federation/registry/cluster"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry" genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -39,7 +39,7 @@ func (r *StatusREST) New() runtime.Object {
} }
// Update alters the status subset of an object. // Update alters the status subset of an object.
func (r *StatusREST) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) {
return r.store.Update(ctx, name, objInfo) return r.store.Update(ctx, name, objInfo)
} }

View File

@ -21,17 +21,18 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
) )
// Registry is an interface implemented by things that know how to store Cluster objects. // Registry is an interface implemented by things that know how to store Cluster objects.
type Registry interface { type Registry interface {
ListClusters(ctx api.Context, options *api.ListOptions) (*federation.ClusterList, error) ListClusters(ctx genericapirequest.Context, options *api.ListOptions) (*federation.ClusterList, error)
WatchCluster(ctx api.Context, options *api.ListOptions) (watch.Interface, error) WatchCluster(ctx genericapirequest.Context, options *api.ListOptions) (watch.Interface, error)
GetCluster(ctx api.Context, name string, options *metav1.GetOptions) (*federation.Cluster, error) GetCluster(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (*federation.Cluster, error)
CreateCluster(ctx api.Context, cluster *federation.Cluster) error CreateCluster(ctx genericapirequest.Context, cluster *federation.Cluster) error
UpdateCluster(ctx api.Context, cluster *federation.Cluster) error UpdateCluster(ctx genericapirequest.Context, cluster *federation.Cluster) error
DeleteCluster(ctx api.Context, name string) error DeleteCluster(ctx genericapirequest.Context, name string) error
} }
// storage puts strong typing around storage calls // storage puts strong typing around storage calls
@ -45,7 +46,7 @@ func NewRegistry(s rest.StandardStorage) Registry {
return &storage{s} return &storage{s}
} }
func (s *storage) ListClusters(ctx api.Context, options *api.ListOptions) (*federation.ClusterList, error) { func (s *storage) ListClusters(ctx genericapirequest.Context, options *api.ListOptions) (*federation.ClusterList, error) {
obj, err := s.List(ctx, options) obj, err := s.List(ctx, options)
if err != nil { if err != nil {
return nil, err return nil, err
@ -53,11 +54,11 @@ func (s *storage) ListClusters(ctx api.Context, options *api.ListOptions) (*fede
return obj.(*federation.ClusterList), nil return obj.(*federation.ClusterList), nil
} }
func (s *storage) WatchCluster(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { func (s *storage) WatchCluster(ctx genericapirequest.Context, options *api.ListOptions) (watch.Interface, error) {
return s.Watch(ctx, options) return s.Watch(ctx, options)
} }
func (s *storage) GetCluster(ctx api.Context, name string, options *metav1.GetOptions) (*federation.Cluster, error) { func (s *storage) GetCluster(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (*federation.Cluster, error) {
obj, err := s.Get(ctx, name, options) obj, err := s.Get(ctx, name, options)
if err != nil { if err != nil {
return nil, err return nil, err
@ -65,17 +66,17 @@ func (s *storage) GetCluster(ctx api.Context, name string, options *metav1.GetOp
return obj.(*federation.Cluster), nil return obj.(*federation.Cluster), nil
} }
func (s *storage) CreateCluster(ctx api.Context, cluster *federation.Cluster) error { func (s *storage) CreateCluster(ctx genericapirequest.Context, cluster *federation.Cluster) error {
_, err := s.Create(ctx, cluster) _, err := s.Create(ctx, cluster)
return err return err
} }
func (s *storage) UpdateCluster(ctx api.Context, cluster *federation.Cluster) error { func (s *storage) UpdateCluster(ctx genericapirequest.Context, cluster *federation.Cluster) error {
_, _, err := s.Update(ctx, cluster.Name, rest.DefaultUpdatedObjectInfo(cluster, api.Scheme)) _, _, err := s.Update(ctx, cluster.Name, rest.DefaultUpdatedObjectInfo(cluster, api.Scheme))
return err return err
} }
func (s *storage) DeleteCluster(ctx api.Context, name string) error { func (s *storage) DeleteCluster(ctx genericapirequest.Context, name string) error {
_, err := s.Delete(ctx, name, nil) _, err := s.Delete(ctx, name, nil)
return err return err
} }

View File

@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/federation/apis/federation/validation" "k8s.io/kubernetes/federation/apis/federation/validation"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -63,13 +64,13 @@ func MatchCluster(label labels.Selector, field fields.Selector) apistorage.Selec
} }
// PrepareForCreate clears fields that are not allowed to be set by end users on creation. // PrepareForCreate clears fields that are not allowed to be set by end users on creation.
func (clusterStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object) { func (clusterStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
cluster := obj.(*federation.Cluster) cluster := obj.(*federation.Cluster)
cluster.Status = federation.ClusterStatus{} cluster.Status = federation.ClusterStatus{}
} }
// Validate validates a new cluster. // Validate validates a new cluster.
func (clusterStrategy) Validate(ctx api.Context, obj runtime.Object) field.ErrorList { func (clusterStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
cluster := obj.(*federation.Cluster) cluster := obj.(*federation.Cluster)
return validation.ValidateCluster(cluster) return validation.ValidateCluster(cluster)
} }
@ -84,14 +85,14 @@ func (clusterStrategy) AllowCreateOnUpdate() bool {
} }
// PrepareForUpdate clears fields that are not allowed to be set by end users on update. // PrepareForUpdate clears fields that are not allowed to be set by end users on update.
func (clusterStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (clusterStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
cluster := obj.(*federation.Cluster) cluster := obj.(*federation.Cluster)
oldCluster := old.(*federation.Cluster) oldCluster := old.(*federation.Cluster)
cluster.Status = oldCluster.Status cluster.Status = oldCluster.Status
} }
// ValidateUpdate is the default update validation for an end user. // ValidateUpdate is the default update validation for an end user.
func (clusterStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (clusterStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
return validation.ValidateClusterUpdate(obj.(*federation.Cluster), old.(*federation.Cluster)) return validation.ValidateClusterUpdate(obj.(*federation.Cluster), old.(*federation.Cluster))
} }
func (clusterStrategy) AllowUnconditionalUpdate() bool { func (clusterStrategy) AllowUnconditionalUpdate() bool {
@ -104,16 +105,16 @@ type clusterStatusStrategy struct {
var StatusStrategy = clusterStatusStrategy{Strategy} var StatusStrategy = clusterStatusStrategy{Strategy}
func (clusterStatusStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object) { func (clusterStatusStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
_ = obj.(*federation.Cluster) _ = obj.(*federation.Cluster)
} }
func (clusterStatusStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (clusterStatusStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
cluster := obj.(*federation.Cluster) cluster := obj.(*federation.Cluster)
oldCluster := old.(*federation.Cluster) oldCluster := old.(*federation.Cluster)
cluster.Spec = oldCluster.Spec cluster.Spec = oldCluster.Spec
} }
// ValidateUpdate is the default update validation for an end user. // ValidateUpdate is the default update validation for an end user.
func (clusterStatusStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (clusterStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
return validation.ValidateClusterStatusUpdate(obj.(*federation.Cluster), old.(*federation.Cluster)) return validation.ValidateClusterStatusUpdate(obj.(*federation.Cluster), old.(*federation.Cluster))
} }

View File

@ -26,6 +26,7 @@ import (
apitesting "k8s.io/kubernetes/pkg/api/testing" apitesting "k8s.io/kubernetes/pkg/api/testing"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
) )
@ -70,7 +71,7 @@ func invalidNewCluster() *federation.Cluster {
} }
func TestClusterStrategy(t *testing.T) { func TestClusterStrategy(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
if Strategy.NamespaceScoped() { if Strategy.NamespaceScoped() {
t.Errorf("Cluster should not be namespace scoped") t.Errorf("Cluster should not be namespace scoped")
} }
@ -104,7 +105,7 @@ func TestClusterStrategy(t *testing.T) {
} }
func TestClusterStatusStrategy(t *testing.T) { func TestClusterStatusStrategy(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
if StatusStrategy.NamespaceScoped() { if StatusStrategy.NamespaceScoped() {
t.Errorf("Cluster should not be namespace scoped") t.Errorf("Cluster should not be namespace scoped")
} }

View File

@ -179,6 +179,7 @@ pkg/credentialprovider/aws
pkg/genericapiserver/api/audit pkg/genericapiserver/api/audit
pkg/genericapiserver/api/handlers/responsewriters pkg/genericapiserver/api/handlers/responsewriters
pkg/genericapiserver/api/openapi pkg/genericapiserver/api/openapi
pkg/genericapiserver/api/request
pkg/genericapiserver/filters pkg/genericapiserver/filters
pkg/genericapiserver/mux pkg/genericapiserver/mux
pkg/genericapiserver/routes pkg/genericapiserver/routes

View File

@ -11,7 +11,6 @@ load(
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"context.go",
"conversion.go", "conversion.go",
"defaults.go", "defaults.go",
"doc.go", "doc.go",
@ -22,7 +21,6 @@ go_library(
"meta.go", "meta.go",
"ref.go", "ref.go",
"register.go", "register.go",
"requestcontext.go",
"resource_helpers.go", "resource_helpers.go",
"types.go", "types.go",
"zz_generated.deepcopy.go", "zz_generated.deepcopy.go",
@ -32,9 +30,9 @@ go_library(
"//pkg/api/meta:go_default_library", "//pkg/api/meta:go_default_library",
"//pkg/api/resource:go_default_library", "//pkg/api/resource:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/auth/user:go_default_library",
"//pkg/conversion:go_default_library", "//pkg/conversion:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/runtime/schema:go_default_library", "//pkg/runtime/schema:go_default_library",
@ -48,8 +46,6 @@ go_library(
"//pkg/util/uuid:go_default_library", "//pkg/util/uuid:go_default_library",
"//pkg/util/validation/field:go_default_library", "//pkg/util/validation/field:go_default_library",
"//vendor:github.com/davecgh/go-spew/spew", "//vendor:github.com/davecgh/go-spew/spew",
"//vendor:github.com/golang/glog",
"//vendor:golang.org/x/net/context",
], ],
) )
@ -75,7 +71,6 @@ go_test(
go_test( go_test(
name = "go_default_xtest", name = "go_default_xtest",
srcs = [ srcs = [
"context_test.go",
"conversion_test.go", "conversion_test.go",
"copy_test.go", "copy_test.go",
"deep_copy_test.go", "deep_copy_test.go",
@ -96,8 +91,8 @@ go_test(
"//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions:go_default_library",
"//pkg/apis/extensions/v1beta1:go_default_library", "//pkg/apis/extensions/v1beta1:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/auth/user:go_default_library",
"//pkg/conversion:go_default_library", "//pkg/conversion:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/runtime/schema:go_default_library", "//pkg/runtime/schema:go_default_library",
"//pkg/runtime/serializer/protobuf:go_default_library", "//pkg/runtime/serializer/protobuf:go_default_library",

View File

@ -20,17 +20,18 @@ import (
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/conversion"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
"k8s.io/kubernetes/pkg/util/uuid" "k8s.io/kubernetes/pkg/util/uuid"
) )
// FillObjectMetaSystemFields populates fields that are managed by the system on ObjectMeta. // FillObjectMetaSystemFields populates fields that are managed by the system on ObjectMeta.
func FillObjectMetaSystemFields(ctx Context, meta *ObjectMeta) { func FillObjectMetaSystemFields(ctx genericapirequest.Context, meta *ObjectMeta) {
meta.CreationTimestamp = metav1.Now() meta.CreationTimestamp = metav1.Now()
// allows admission controllers to assign a UID earlier in the request processing // allows admission controllers to assign a UID earlier in the request processing
// to support tracking resources pending creation. // to support tracking resources pending creation.
uid, found := UIDFrom(ctx) uid, found := genericapirequest.UIDFrom(ctx)
if !found { if !found {
uid = uuid.NewUUID() uid = uuid.NewUUID()
} }

View File

@ -26,6 +26,7 @@ import (
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/apimachinery/registered" "k8s.io/kubernetes/pkg/apimachinery/registered"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/util/uuid" "k8s.io/kubernetes/pkg/util/uuid"
@ -35,7 +36,7 @@ var _ meta.Object = &api.ObjectMeta{}
// TestFillObjectMetaSystemFields validates that system populated fields are set on an object // TestFillObjectMetaSystemFields validates that system populated fields are set on an object
func TestFillObjectMetaSystemFields(t *testing.T) { func TestFillObjectMetaSystemFields(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
resource := api.ObjectMeta{} resource := api.ObjectMeta{}
api.FillObjectMetaSystemFields(ctx, &resource) api.FillObjectMetaSystemFields(ctx, &resource)
if resource.CreationTimestamp.Time.IsZero() { if resource.CreationTimestamp.Time.IsZero() {
@ -45,7 +46,7 @@ func TestFillObjectMetaSystemFields(t *testing.T) {
} }
// verify we can inject a UID // verify we can inject a UID
uid := uuid.NewUUID() uid := uuid.NewUUID()
ctx = api.WithUID(ctx, uid) ctx = genericapirequest.WithUID(ctx, uid)
resource = api.ObjectMeta{} resource = api.ObjectMeta{}
api.FillObjectMetaSystemFields(ctx, &resource) api.FillObjectMetaSystemFields(ctx, &resource)
if resource.UID != uid { if resource.UID != uid {
@ -55,7 +56,7 @@ func TestFillObjectMetaSystemFields(t *testing.T) {
// TestHasObjectMetaSystemFieldValues validates that true is returned if and only if all fields are populated // TestHasObjectMetaSystemFieldValues validates that true is returned if and only if all fields are populated
func TestHasObjectMetaSystemFieldValues(t *testing.T) { func TestHasObjectMetaSystemFieldValues(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
resource := api.ObjectMeta{} resource := api.ObjectMeta{}
if api.HasObjectMetaSystemFieldValues(&resource) { if api.HasObjectMetaSystemFieldValues(&resource) {
t.Errorf("the resource does not have all fields yet populated, but incorrectly reports it does") t.Errorf("the resource does not have all fields yet populated, but incorrectly reports it does")

View File

@ -21,6 +21,7 @@ import (
"k8s.io/kubernetes/pkg/api/resource" "k8s.io/kubernetes/pkg/api/resource"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
// Returns string version of ResourceName. // Returns string version of ResourceName.
@ -227,3 +228,13 @@ func PodRequestsAndLimits(pod *Pod) (reqs map[ResourceName]resource.Quantity, li
} }
return return
} }
// ValidNamespace returns false if the namespace on the context differs from the resource. If the resource has no namespace, it is set to the value in the context.
// TODO(sttts): move into pkg/genericapiserver/api
func ValidNamespace(ctx genericapirequest.Context, resource *ObjectMeta) bool {
ns, ok := genericapirequest.NamespaceFrom(ctx)
if len(resource.Namespace) == 0 {
resource.Namespace = ns
}
return ns == resource.Namespace && ok
}

View File

@ -26,6 +26,7 @@ go_library(
"//pkg/api/validation:go_default_library", "//pkg/api/validation:go_default_library",
"//pkg/api/validation/path:go_default_library", "//pkg/api/validation/path:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/runtime/schema:go_default_library", "//pkg/runtime/schema:go_default_library",
"//pkg/util/validation/field:go_default_library", "//pkg/util/validation/field:go_default_library",

View File

@ -21,6 +21,7 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
path "k8s.io/kubernetes/pkg/api/validation/path" path "k8s.io/kubernetes/pkg/api/validation/path"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/util/validation/field" "k8s.io/kubernetes/pkg/util/validation/field"
@ -41,10 +42,10 @@ type RESTCreateStrategy interface {
// the object. For example: remove fields that are not to be persisted, // the object. For example: remove fields that are not to be persisted,
// sort order-insensitive list fields, etc. This should not remove fields // sort order-insensitive list fields, etc. This should not remove fields
// whose presence would be considered a validation error. // whose presence would be considered a validation error.
PrepareForCreate(ctx api.Context, obj runtime.Object) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object)
// Validate is invoked after default fields in the object have been filled in before // Validate is invoked after default fields in the object have been filled in before
// the object is persisted. This method should not mutate the object. // the object is persisted. This method should not mutate the object.
Validate(ctx api.Context, obj runtime.Object) field.ErrorList Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList
// Canonicalize is invoked after validation has succeeded but before the // Canonicalize is invoked after validation has succeeded but before the
// object has been persisted. This method may mutate the object. // object has been persisted. This method may mutate the object.
Canonicalize(obj runtime.Object) Canonicalize(obj runtime.Object)
@ -53,7 +54,7 @@ type RESTCreateStrategy interface {
// BeforeCreate ensures that common operations for all resources are performed on creation. It only returns // BeforeCreate ensures that common operations for all resources are performed on creation. It only returns
// errors that can be converted to api.Status. It invokes PrepareForCreate, then GenerateName, then Validate. // errors that can be converted to api.Status. It invokes PrepareForCreate, then GenerateName, then Validate.
// It returns nil if the object should be created. // It returns nil if the object should be created.
func BeforeCreate(strategy RESTCreateStrategy, ctx api.Context, obj runtime.Object) error { func BeforeCreate(strategy RESTCreateStrategy, ctx genericapirequest.Context, obj runtime.Object) error {
objectMeta, kind, kerr := objectMetaAndKind(strategy, obj) objectMeta, kind, kerr := objectMetaAndKind(strategy, obj)
if kerr != nil { if kerr != nil {
return kerr return kerr

View File

@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
) )
@ -52,7 +53,7 @@ type GarbageCollectionDeleteStrategy interface {
type RESTGracefulDeleteStrategy interface { type RESTGracefulDeleteStrategy interface {
// CheckGracefulDelete should return true if the object can be gracefully deleted and set // CheckGracefulDelete should return true if the object can be gracefully deleted and set
// any default values on the DeleteOptions. // any default values on the DeleteOptions.
CheckGracefulDelete(ctx api.Context, obj runtime.Object, options *api.DeleteOptions) bool CheckGracefulDelete(ctx genericapirequest.Context, obj runtime.Object, options *api.DeleteOptions) bool
} }
// BeforeDelete tests whether the object can be gracefully deleted. If graceful is set the object // BeforeDelete tests whether the object can be gracefully deleted. If graceful is set the object
@ -61,7 +62,7 @@ type RESTGracefulDeleteStrategy interface {
// condition cannot be checked or the gracePeriodSeconds is invalid. The options argument may be updated with // condition cannot be checked or the gracePeriodSeconds is invalid. The options argument may be updated with
// default values if graceful is true. Second place where we set deletionTimestamp is pkg/registry/generic/registry/store.go // default values if graceful is true. Second place where we set deletionTimestamp is pkg/registry/generic/registry/store.go
// this function is responsible for setting deletionTimestamp during gracefulDeletion, other one for cascading deletions. // this function is responsible for setting deletionTimestamp during gracefulDeletion, other one for cascading deletions.
func BeforeDelete(strategy RESTDeleteStrategy, ctx api.Context, obj runtime.Object, options *api.DeleteOptions) (graceful, gracefulPending bool, err error) { func BeforeDelete(strategy RESTDeleteStrategy, ctx genericapirequest.Context, obj runtime.Object, options *api.DeleteOptions) (graceful, gracefulPending bool, err error) {
objectMeta, gvk, kerr := objectMetaAndKind(strategy, obj) objectMeta, gvk, kerr := objectMetaAndKind(strategy, obj)
if kerr != nil { if kerr != nil {
return false, false, kerr return false, false, kerr

View File

@ -17,7 +17,7 @@ limitations under the License.
package rest package rest
import ( import (
"k8s.io/kubernetes/pkg/api" genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -25,5 +25,5 @@ import (
type RESTExportStrategy interface { type RESTExportStrategy interface {
// Export strips fields that can not be set by the user. If 'exact' is false // Export strips fields that can not be set by the user. If 'exact' is false
// fields specific to the cluster are also stripped // fields specific to the cluster are also stripped
Export(ctx api.Context, obj runtime.Object, exact bool) error Export(ctx genericapirequest.Context, obj runtime.Object, exact bool) error
} }

View File

@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/watch" "k8s.io/kubernetes/pkg/watch"
@ -70,7 +71,7 @@ type Lister interface {
// This object must be a pointer type for use with Codec.DecodeInto([]byte, runtime.Object) // This object must be a pointer type for use with Codec.DecodeInto([]byte, runtime.Object)
NewList() runtime.Object NewList() runtime.Object
// List selects resources in the storage which match to the selector. 'options' can be nil. // List selects resources in the storage which match to the selector. 'options' can be nil.
List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) List(ctx genericapirequest.Context, options *api.ListOptions) (runtime.Object, error)
} }
// Exporter is an object that knows how to strip a RESTful resource for export // Exporter is an object that knows how to strip a RESTful resource for export
@ -78,7 +79,7 @@ type Exporter interface {
// Export an object. Fields that are not user specified (e.g. Status, ObjectMeta.ResourceVersion) are stripped out // Export an object. Fields that are not user specified (e.g. Status, ObjectMeta.ResourceVersion) are stripped out
// Returns the stripped object. If 'exact' is true, fields that are specific to the cluster (e.g. namespace) are // Returns the stripped object. If 'exact' is true, fields that are specific to the cluster (e.g. namespace) are
// retained, otherwise they are stripped also. // retained, otherwise they are stripped also.
Export(ctx api.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) Export(ctx genericapirequest.Context, name string, opts metav1.ExportOptions) (runtime.Object, error)
} }
// Getter is an object that can retrieve a named RESTful resource. // Getter is an object that can retrieve a named RESTful resource.
@ -86,7 +87,7 @@ type Getter interface {
// Get finds a resource in the storage by name and returns it. // Get finds a resource in the storage by name and returns it.
// Although it can return an arbitrary error value, IsNotFound(err) is true for the // Although it can return an arbitrary error value, IsNotFound(err) is true for the
// returned error value err when the specified resource is not found. // returned error value err when the specified resource is not found.
Get(ctx api.Context, name string, options *metav1.GetOptions) (runtime.Object, error) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error)
} }
// GetterWithOptions is an object that retrieve a named RESTful resource and takes // GetterWithOptions is an object that retrieve a named RESTful resource and takes
@ -99,7 +100,7 @@ type GetterWithOptions interface {
// The options object passed to it is of the same type returned by the NewGetOptions // The options object passed to it is of the same type returned by the NewGetOptions
// method. // method.
// TODO: Pass metav1.GetOptions. // TODO: Pass metav1.GetOptions.
Get(ctx api.Context, name string, options runtime.Object) (runtime.Object, error) Get(ctx genericapirequest.Context, name string, options runtime.Object) (runtime.Object, error)
// NewGetOptions returns an empty options object that will be used to pass // NewGetOptions returns an empty options object that will be used to pass
// options to the Get method. It may return a bool and a string, if true, the // options to the Get method. It may return a bool and a string, if true, the
@ -117,7 +118,7 @@ type Deleter interface {
// returned error value err when the specified resource is not found. // returned error value err when the specified resource is not found.
// Delete *may* return the object that was deleted, or a status object indicating additional // Delete *may* return the object that was deleted, or a status object indicating additional
// information about deletion. // information about deletion.
Delete(ctx api.Context, name string) (runtime.Object, error) Delete(ctx genericapirequest.Context, name string) (runtime.Object, error)
} }
// GracefulDeleter knows how to pass deletion options to allow delayed deletion of a // GracefulDeleter knows how to pass deletion options to allow delayed deletion of a
@ -130,7 +131,7 @@ type GracefulDeleter interface {
// returned error value err when the specified resource is not found. // returned error value err when the specified resource is not found.
// Delete *may* return the object that was deleted, or a status object indicating additional // Delete *may* return the object that was deleted, or a status object indicating additional
// information about deletion. // information about deletion.
Delete(ctx api.Context, name string, options *api.DeleteOptions) (runtime.Object, error) Delete(ctx genericapirequest.Context, name string, options *api.DeleteOptions) (runtime.Object, error)
} }
// GracefulDeleteAdapter adapts the Deleter interface to GracefulDeleter // GracefulDeleteAdapter adapts the Deleter interface to GracefulDeleter
@ -139,7 +140,7 @@ type GracefulDeleteAdapter struct {
} }
// Delete implements RESTGracefulDeleter in terms of Deleter // Delete implements RESTGracefulDeleter in terms of Deleter
func (w GracefulDeleteAdapter) Delete(ctx api.Context, name string, options *api.DeleteOptions) (runtime.Object, error) { func (w GracefulDeleteAdapter) Delete(ctx genericapirequest.Context, name string, options *api.DeleteOptions) (runtime.Object, error) {
return w.Deleter.Delete(ctx, name) return w.Deleter.Delete(ctx, name)
} }
@ -151,7 +152,7 @@ type CollectionDeleter interface {
// them or return an invalid request error. // them or return an invalid request error.
// DeleteCollection may not be atomic - i.e. it may delete some objects and still // DeleteCollection may not be atomic - i.e. it may delete some objects and still
// return an error after it. On success, returns a list of deleted objects. // return an error after it. On success, returns a list of deleted objects.
DeleteCollection(ctx api.Context, options *api.DeleteOptions, listOptions *api.ListOptions) (runtime.Object, error) DeleteCollection(ctx genericapirequest.Context, options *api.DeleteOptions, listOptions *api.ListOptions) (runtime.Object, error)
} }
// Creater is an object that can create an instance of a RESTful object. // Creater is an object that can create an instance of a RESTful object.
@ -161,7 +162,7 @@ type Creater interface {
New() runtime.Object New() runtime.Object
// Create creates a new version of a resource. // Create creates a new version of a resource.
Create(ctx api.Context, obj runtime.Object) (runtime.Object, error) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error)
} }
// NamedCreater is an object that can create an instance of a RESTful object using a name parameter. // NamedCreater is an object that can create an instance of a RESTful object using a name parameter.
@ -173,7 +174,7 @@ type NamedCreater interface {
// Create creates a new version of a resource. It expects a name parameter from the path. // Create creates a new version of a resource. It expects a name parameter from the path.
// This is needed for create operations on subresources which include the name of the parent // This is needed for create operations on subresources which include the name of the parent
// resource in the path. // resource in the path.
Create(ctx api.Context, name string, obj runtime.Object) (runtime.Object, error) Create(ctx genericapirequest.Context, name string, obj runtime.Object) (runtime.Object, error)
} }
// UpdatedObjectInfo provides information about an updated object to an Updater. // UpdatedObjectInfo provides information about an updated object to an Updater.
@ -186,7 +187,7 @@ type UpdatedObjectInfo interface {
// UpdatedObject returns the updated object, given a context and old object. // UpdatedObject returns the updated object, given a context and old object.
// The only time an empty oldObj should be passed in is if a "create on update" is occurring (there is no oldObj). // The only time an empty oldObj should be passed in is if a "create on update" is occurring (there is no oldObj).
UpdatedObject(ctx api.Context, oldObj runtime.Object) (newObj runtime.Object, err error) UpdatedObject(ctx genericapirequest.Context, oldObj runtime.Object) (newObj runtime.Object, err error)
} }
// Updater is an object that can update an instance of a RESTful object. // Updater is an object that can update an instance of a RESTful object.
@ -198,14 +199,14 @@ type Updater interface {
// Update finds a resource in the storage and updates it. Some implementations // Update finds a resource in the storage and updates it. Some implementations
// may allow updates creates the object - they should set the created boolean // may allow updates creates the object - they should set the created boolean
// to true. // to true.
Update(ctx api.Context, name string, objInfo UpdatedObjectInfo) (runtime.Object, bool, error) Update(ctx genericapirequest.Context, name string, objInfo UpdatedObjectInfo) (runtime.Object, bool, error)
} }
// CreaterUpdater is a storage object that must support both create and update. // CreaterUpdater is a storage object that must support both create and update.
// Go prevents embedded interfaces that implement the same method. // Go prevents embedded interfaces that implement the same method.
type CreaterUpdater interface { type CreaterUpdater interface {
Creater Creater
Update(ctx api.Context, name string, objInfo UpdatedObjectInfo) (runtime.Object, bool, error) Update(ctx genericapirequest.Context, name string, objInfo UpdatedObjectInfo) (runtime.Object, bool, error)
} }
// CreaterUpdater must satisfy the Updater interface. // CreaterUpdater must satisfy the Updater interface.
@ -224,7 +225,7 @@ type Watcher interface {
// are supported; an error should be returned if 'field' tries to select on a field that // are supported; an error should be returned if 'field' tries to select on a field that
// isn't supported. 'resourceVersion' allows for continuing/starting a watch at a // isn't supported. 'resourceVersion' allows for continuing/starting a watch at a
// particular version. // particular version.
Watch(ctx api.Context, options *api.ListOptions) (watch.Interface, error) Watch(ctx genericapirequest.Context, options *api.ListOptions) (watch.Interface, error)
} }
// StandardStorage is an interface covering the common verbs. Provided for testing whether a // StandardStorage is an interface covering the common verbs. Provided for testing whether a
@ -241,7 +242,7 @@ type StandardStorage interface {
// Redirector know how to return a remote resource's location. // Redirector know how to return a remote resource's location.
type Redirector interface { type Redirector interface {
// ResourceLocation should return the remote location of the given resource, and an optional transport to use to request it, or an error. // ResourceLocation should return the remote location of the given resource, and an optional transport to use to request it, or an error.
ResourceLocation(ctx api.Context, id string) (remoteLocation *url.URL, transport http.RoundTripper, err error) ResourceLocation(ctx genericapirequest.Context, id string) (remoteLocation *url.URL, transport http.RoundTripper, err error)
} }
// Responder abstracts the normal response behavior for a REST method and is passed to callers that // Responder abstracts the normal response behavior for a REST method and is passed to callers that
@ -261,7 +262,7 @@ type Connecter interface {
// code and body, so the ServeHTTP method should exit after invoking the responder. The Handler will // code and body, so the ServeHTTP method should exit after invoking the responder. The Handler will
// be used for a single API request and then discarded. The Responder is guaranteed to write to the // be used for a single API request and then discarded. The Responder is guaranteed to write to the
// same http.ResponseWriter passed to ServeHTTP. // same http.ResponseWriter passed to ServeHTTP.
Connect(ctx api.Context, id string, options runtime.Object, r Responder) (http.Handler, error) Connect(ctx genericapirequest.Context, id string, options runtime.Object, r Responder) (http.Handler, error)
// NewConnectOptions returns an empty options object that will be used to pass // NewConnectOptions returns an empty options object that will be used to pass
// options to the Connect method. If nil, then a nil options object is passed to // options to the Connect method. If nil, then a nil options object is passed to

View File

@ -19,6 +19,7 @@ go_library(
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/conversion:go_default_library", "//pkg/conversion:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",

View File

@ -30,6 +30,7 @@ import (
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/conversion"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
@ -96,11 +97,11 @@ func (t *Tester) TestNamespace() string {
// TestContext returns a namespaced context that will be used when making storage calls. // TestContext returns a namespaced context that will be used when making storage calls.
// Namespace is determined by TestNamespace() // Namespace is determined by TestNamespace()
func (t *Tester) TestContext() api.Context { func (t *Tester) TestContext() genericapirequest.Context {
if t.clusterScope { if t.clusterScope {
return api.NewContext() return genericapirequest.NewContext()
} }
return api.WithNamespace(api.NewContext(), t.TestNamespace()) return genericapirequest.WithNamespace(genericapirequest.NewContext(), t.TestNamespace())
} }
func (t *Tester) getObjectMetaOrFail(obj runtime.Object) *api.ObjectMeta { func (t *Tester) getObjectMetaOrFail(obj runtime.Object) *api.ObjectMeta {
@ -117,7 +118,7 @@ func (t *Tester) setObjectMeta(obj runtime.Object, name string) {
if t.clusterScope { if t.clusterScope {
meta.Namespace = api.NamespaceNone meta.Namespace = api.NamespaceNone
} else { } else {
meta.Namespace = api.NamespaceValue(t.TestContext()) meta.Namespace = genericapirequest.NamespaceValue(t.TestContext())
} }
meta.GenerateName = "" meta.GenerateName = ""
meta.Generation = 1 meta.Generation = 1
@ -133,11 +134,11 @@ func copyOrDie(obj runtime.Object) runtime.Object {
type AssignFunc func([]runtime.Object) []runtime.Object type AssignFunc func([]runtime.Object) []runtime.Object
type EmitFunc func(runtime.Object, string) error type EmitFunc func(runtime.Object, string) error
type GetFunc func(api.Context, runtime.Object) (runtime.Object, error) type GetFunc func(genericapirequest.Context, runtime.Object) (runtime.Object, error)
type InitWatchFunc func() type InitWatchFunc func()
type InjectErrFunc func(err error) type InjectErrFunc func(err error)
type IsErrorFunc func(err error) bool type IsErrorFunc func(err error) bool
type CreateFunc func(api.Context, runtime.Object) error type CreateFunc func(genericapirequest.Context, runtime.Object) error
type SetRVFunc func(uint64) type SetRVFunc func(uint64)
type UpdateFunc func(runtime.Object) runtime.Object type UpdateFunc func(runtime.Object) runtime.Object
@ -223,7 +224,7 @@ func (t *Tester) TestWatch(
// ============================================================================= // =============================================================================
// Creation tests. // Creation tests.
func (t *Tester) delete(ctx api.Context, obj runtime.Object) error { func (t *Tester) delete(ctx genericapirequest.Context, obj runtime.Object) error {
objectMeta, err := api.ObjectMetaFor(obj) objectMeta, err := api.ObjectMetaFor(obj)
if err != nil { if err != nil {
return err return err
@ -332,7 +333,7 @@ func (t *Tester) testCreateHasMetadata(valid runtime.Object) {
func (t *Tester) testCreateIgnoresContextNamespace(valid runtime.Object) { func (t *Tester) testCreateIgnoresContextNamespace(valid runtime.Object) {
// Ignore non-empty namespace in context // Ignore non-empty namespace in context
ctx := api.WithNamespace(api.NewContext(), "not-default2") ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), "not-default2")
// Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted // Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted
created, err := t.storage.(rest.Creater).Create(ctx, copyOrDie(valid)) created, err := t.storage.(rest.Creater).Create(ctx, copyOrDie(valid))
@ -351,7 +352,7 @@ func (t *Tester) testCreateIgnoresMismatchedNamespace(valid runtime.Object) {
// Ignore non-empty namespace in object meta // Ignore non-empty namespace in object meta
objectMeta.Namespace = "not-default" objectMeta.Namespace = "not-default"
ctx := api.WithNamespace(api.NewContext(), "not-default2") ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), "not-default2")
// Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted // Ideally, we'd get an error back here, but at least verify the namespace wasn't persisted
created, err := t.storage.(rest.Creater).Create(ctx, copyOrDie(valid)) created, err := t.storage.(rest.Creater).Create(ctx, copyOrDie(valid))
@ -580,7 +581,7 @@ func (t *Tester) testUpdateRetrievesOldObject(obj runtime.Object, createFn Creat
// Make sure a custom transform is called, and sees the expected updatedObject and oldObject // Make sure a custom transform is called, and sees the expected updatedObject and oldObject
// This tests the mechanism used to pass the old and new object to admission // This tests the mechanism used to pass the old and new object to admission
calledUpdatedObject := 0 calledUpdatedObject := 0
noopTransform := func(_ api.Context, updatedObject runtime.Object, oldObject runtime.Object) (runtime.Object, error) { noopTransform := func(_ genericapirequest.Context, updatedObject runtime.Object, oldObject runtime.Object) (runtime.Object, error) {
if !reflect.DeepEqual(storedFoo, oldObject) { if !reflect.DeepEqual(storedFoo, oldObject) {
t.Errorf("Expected\n\t%#v\ngot\n\t%#v", storedFoo, oldObject) t.Errorf("Expected\n\t%#v\ngot\n\t%#v", storedFoo, oldObject)
} }
@ -622,7 +623,7 @@ func (t *Tester) testUpdatePropagatesUpdatedObjectError(obj runtime.Object, crea
// Make sure our transform is called, and sees the expected updatedObject and oldObject // Make sure our transform is called, and sees the expected updatedObject and oldObject
propagateErr := fmt.Errorf("custom updated object error for %v", foo) propagateErr := fmt.Errorf("custom updated object error for %v", foo)
noopTransform := func(_ api.Context, updatedObject runtime.Object, oldObject runtime.Object) (runtime.Object, error) { noopTransform := func(_ genericapirequest.Context, updatedObject runtime.Object, oldObject runtime.Object) (runtime.Object, error) {
return nil, propagateErr return nil, propagateErr
} }
@ -1029,15 +1030,15 @@ func (t *Tester) testGetDifferentNamespace(obj runtime.Object) {
objMeta := t.getObjectMetaOrFail(obj) objMeta := t.getObjectMetaOrFail(obj)
objMeta.Name = t.namer(5) objMeta.Name = t.namer(5)
ctx1 := api.WithNamespace(api.NewContext(), "bar3") ctx1 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar3")
objMeta.Namespace = api.NamespaceValue(ctx1) objMeta.Namespace = genericapirequest.NamespaceValue(ctx1)
_, err := t.storage.(rest.Creater).Create(ctx1, obj) _, err := t.storage.(rest.Creater).Create(ctx1, obj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
} }
ctx2 := api.WithNamespace(api.NewContext(), "bar4") ctx2 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar4")
objMeta.Namespace = api.NamespaceValue(ctx2) objMeta.Namespace = genericapirequest.NamespaceValue(ctx2)
_, err = t.storage.(rest.Creater).Create(ctx2, obj) _, err = t.storage.(rest.Creater).Create(ctx2, obj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -1051,8 +1052,8 @@ func (t *Tester) testGetDifferentNamespace(obj runtime.Object) {
if got1Meta.Name != objMeta.Name { if got1Meta.Name != objMeta.Name {
t.Errorf("unexpected name of object: %#v, expected: %s", got1, objMeta.Name) t.Errorf("unexpected name of object: %#v, expected: %s", got1, objMeta.Name)
} }
if got1Meta.Namespace != api.NamespaceValue(ctx1) { if got1Meta.Namespace != genericapirequest.NamespaceValue(ctx1) {
t.Errorf("unexpected namespace of object: %#v, expected: %s", got1, api.NamespaceValue(ctx1)) t.Errorf("unexpected namespace of object: %#v, expected: %s", got1, genericapirequest.NamespaceValue(ctx1))
} }
got2, err := t.storage.(rest.Getter).Get(ctx2, objMeta.Name, &metav1.GetOptions{}) got2, err := t.storage.(rest.Getter).Get(ctx2, objMeta.Name, &metav1.GetOptions{})
@ -1063,8 +1064,8 @@ func (t *Tester) testGetDifferentNamespace(obj runtime.Object) {
if got2Meta.Name != objMeta.Name { if got2Meta.Name != objMeta.Name {
t.Errorf("unexpected name of object: %#v, expected: %s", got2, objMeta.Name) t.Errorf("unexpected name of object: %#v, expected: %s", got2, objMeta.Name)
} }
if got2Meta.Namespace != api.NamespaceValue(ctx2) { if got2Meta.Namespace != genericapirequest.NamespaceValue(ctx2) {
t.Errorf("unexpected namespace of object: %#v, expected: %s", got2, api.NamespaceValue(ctx2)) t.Errorf("unexpected namespace of object: %#v, expected: %s", got2, genericapirequest.NamespaceValue(ctx2))
} }
} }
@ -1090,11 +1091,11 @@ func (t *Tester) testGetFound(obj runtime.Object) {
} }
func (t *Tester) testGetMimatchedNamespace(obj runtime.Object) { func (t *Tester) testGetMimatchedNamespace(obj runtime.Object) {
ctx1 := api.WithNamespace(api.NewContext(), "bar1") ctx1 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar1")
ctx2 := api.WithNamespace(api.NewContext(), "bar2") ctx2 := genericapirequest.WithNamespace(genericapirequest.NewContext(), "bar2")
objMeta := t.getObjectMetaOrFail(obj) objMeta := t.getObjectMetaOrFail(obj)
objMeta.Name = t.namer(4) objMeta.Name = t.namer(4)
objMeta.Namespace = api.NamespaceValue(ctx1) objMeta.Namespace = genericapirequest.NamespaceValue(ctx1)
_, err := t.storage.(rest.Creater).Create(ctx1, obj) _, err := t.storage.(rest.Creater).Create(ctx1, obj)
if err != nil { if err != nil {
t.Errorf("unexpected error: %v", err) t.Errorf("unexpected error: %v", err)
@ -1181,7 +1182,7 @@ func (t *Tester) testListMatchLabels(obj runtime.Object, assignFn AssignFunc) {
foo4 := copyOrDie(obj) foo4 := copyOrDie(obj)
foo4Meta := t.getObjectMetaOrFail(foo4) foo4Meta := t.getObjectMetaOrFail(foo4)
foo4Meta.Name = "foo4" foo4Meta.Name = "foo4"
foo4Meta.Namespace = api.NamespaceValue(ctx) foo4Meta.Namespace = genericapirequest.NamespaceValue(ctx)
foo4Meta.Labels = testLabels foo4Meta.Labels = testLabels
objs := ([]runtime.Object{foo3, foo4}) objs := ([]runtime.Object{foo3, foo4})

View File

@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/validation" "k8s.io/kubernetes/pkg/api/validation"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/validation/field" "k8s.io/kubernetes/pkg/util/validation/field"
) )
@ -41,11 +42,11 @@ type RESTUpdateStrategy interface {
// the object. For example: remove fields that are not to be persisted, // the object. For example: remove fields that are not to be persisted,
// sort order-insensitive list fields, etc. This should not remove fields // sort order-insensitive list fields, etc. This should not remove fields
// whose presence would be considered a validation error. // whose presence would be considered a validation error.
PrepareForUpdate(ctx api.Context, obj, old runtime.Object) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object)
// ValidateUpdate is invoked after default fields in the object have been // ValidateUpdate is invoked after default fields in the object have been
// filled in before the object is persisted. This method should not mutate // filled in before the object is persisted. This method should not mutate
// the object. // the object.
ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList
// Canonicalize is invoked after validation has succeeded but before the // Canonicalize is invoked after validation has succeeded but before the
// object has been persisted. This method may mutate the object. // object has been persisted. This method may mutate the object.
Canonicalize(obj runtime.Object) Canonicalize(obj runtime.Object)
@ -74,7 +75,7 @@ func validateCommonFields(obj, old runtime.Object) (field.ErrorList, error) {
// BeforeUpdate ensures that common operations for all resources are performed on update. It only returns // BeforeUpdate ensures that common operations for all resources are performed on update. It only returns
// errors that can be converted to api.Status. It will invoke update validation with the provided existing // errors that can be converted to api.Status. It will invoke update validation with the provided existing
// and updated objects. // and updated objects.
func BeforeUpdate(strategy RESTUpdateStrategy, ctx api.Context, obj, old runtime.Object) error { func BeforeUpdate(strategy RESTUpdateStrategy, ctx genericapirequest.Context, obj, old runtime.Object) error {
objectMeta, kind, kerr := objectMetaAndKind(strategy, obj) objectMeta, kind, kerr := objectMetaAndKind(strategy, obj)
if kerr != nil { if kerr != nil {
return kerr return kerr
@ -115,7 +116,7 @@ func BeforeUpdate(strategy RESTUpdateStrategy, ctx api.Context, obj, old runtime
} }
// TransformFunc is a function to transform and return newObj // TransformFunc is a function to transform and return newObj
type TransformFunc func(ctx api.Context, newObj runtime.Object, oldObj runtime.Object) (transformedNewObj runtime.Object, err error) type TransformFunc func(ctx genericapirequest.Context, newObj runtime.Object, oldObj runtime.Object) (transformedNewObj runtime.Object, err error)
// defaultUpdatedObjectInfo implements UpdatedObjectInfo // defaultUpdatedObjectInfo implements UpdatedObjectInfo
type defaultUpdatedObjectInfo struct { type defaultUpdatedObjectInfo struct {
@ -157,7 +158,7 @@ func (i *defaultUpdatedObjectInfo) Preconditions() *api.Preconditions {
// UpdatedObject satisfies the UpdatedObjectInfo interface. // UpdatedObject satisfies the UpdatedObjectInfo interface.
// It returns a copy of the held obj, passed through any configured transformers. // It returns a copy of the held obj, passed through any configured transformers.
func (i *defaultUpdatedObjectInfo) UpdatedObject(ctx api.Context, oldObj runtime.Object) (runtime.Object, error) { func (i *defaultUpdatedObjectInfo) UpdatedObject(ctx genericapirequest.Context, oldObj runtime.Object) (runtime.Object, error) {
var err error var err error
// Start with the configured object // Start with the configured object
newObj := i.obj newObj := i.obj
@ -207,7 +208,7 @@ func (i *wrappedUpdatedObjectInfo) Preconditions() *api.Preconditions {
// UpdatedObject satisfies the UpdatedObjectInfo interface. // UpdatedObject satisfies the UpdatedObjectInfo interface.
// It delegates to the wrapped objInfo and passes the result through any configured transformers. // It delegates to the wrapped objInfo and passes the result through any configured transformers.
func (i *wrappedUpdatedObjectInfo) UpdatedObject(ctx api.Context, oldObj runtime.Object) (runtime.Object, error) { func (i *wrappedUpdatedObjectInfo) UpdatedObject(ctx genericapirequest.Context, oldObj runtime.Object) (runtime.Object, error) {
newObj, err := i.objInfo.UpdatedObject(ctx, oldObj) newObj, err := i.objInfo.UpdatedObject(ctx, oldObj)
if err != nil { if err != nil {
return newObj, err return newObj, err

View File

@ -17,12 +17,12 @@ go_library(
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library", "//pkg/api/errors:go_default_library",
"//pkg/api/validation:go_default_library", "//pkg/api/validation:go_default_library",
"//pkg/api/validation/path:go_default_library", "//pkg/api/validation/path:go_default_library",
"//pkg/apis/rbac:go_default_library", "//pkg/apis/rbac:go_default_library",
"//pkg/auth/user:go_default_library", "//pkg/auth/user:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/serviceaccount:go_default_library", "//pkg/serviceaccount:go_default_library",
"//pkg/util/errors:go_default_library", "//pkg/util/errors:go_default_library",
"//pkg/util/validation/field:go_default_library", "//pkg/util/validation/field:go_default_library",

View File

@ -21,10 +21,10 @@ import (
"fmt" "fmt"
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api"
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/apis/rbac"
"k8s.io/kubernetes/pkg/auth/user" "k8s.io/kubernetes/pkg/auth/user"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/serviceaccount" "k8s.io/kubernetes/pkg/serviceaccount"
utilerrors "k8s.io/kubernetes/pkg/util/errors" utilerrors "k8s.io/kubernetes/pkg/util/errors"
) )
@ -41,14 +41,14 @@ type AuthorizationRuleResolver interface {
} }
// ConfirmNoEscalation determines if the roles for a given user in a given namespace encompass the provided role. // ConfirmNoEscalation determines if the roles for a given user in a given namespace encompass the provided role.
func ConfirmNoEscalation(ctx api.Context, ruleResolver AuthorizationRuleResolver, rules []rbac.PolicyRule) error { func ConfirmNoEscalation(ctx genericapirequest.Context, ruleResolver AuthorizationRuleResolver, rules []rbac.PolicyRule) error {
ruleResolutionErrors := []error{} ruleResolutionErrors := []error{}
user, ok := api.UserFrom(ctx) user, ok := genericapirequest.UserFrom(ctx)
if !ok { if !ok {
return fmt.Errorf("no user on context") return fmt.Errorf("no user on context")
} }
namespace, _ := api.NamespaceFrom(ctx) namespace, _ := genericapirequest.NamespaceFrom(ctx)
ownerRules, err := ruleResolver.RulesFor(user, namespace) ownerRules, err := ruleResolver.RulesFor(user, namespace)
if err != nil { if err != nil {
@ -59,7 +59,7 @@ func ConfirmNoEscalation(ctx api.Context, ruleResolver AuthorizationRuleResolver
ownerRightsCover, missingRights := Covers(ownerRules, rules) ownerRightsCover, missingRights := Covers(ownerRules, rules)
if !ownerRightsCover { if !ownerRightsCover {
user, _ := api.UserFrom(ctx) user, _ := genericapirequest.UserFrom(ctx)
return apierrors.NewUnauthorized(fmt.Sprintf("attempt to grant extra privileges: %v user=%v ownerrules=%v ruleResolutionErrors=%v", missingRights, user, ownerRules, ruleResolutionErrors)) return apierrors.NewUnauthorized(fmt.Sprintf("attempt to grant extra privileges: %v user=%v ownerrules=%v ruleResolutionErrors=%v", missingRights, user, ownerRules, ruleResolutionErrors))
} }
return nil return nil

View File

@ -13,8 +13,8 @@ go_library(
srcs = ["handlers.go"], srcs = ["handlers.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/auth/authenticator:go_default_library", "//pkg/auth/authenticator:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//vendor:github.com/golang/glog", "//vendor:github.com/golang/glog",
"//vendor:github.com/prometheus/client_golang/prometheus", "//vendor:github.com/prometheus/client_golang/prometheus",
], ],
@ -26,8 +26,8 @@ go_test(
library = ":go_default_library", library = ":go_default_library",
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/auth/authenticator:go_default_library", "//pkg/auth/authenticator:go_default_library",
"//pkg/auth/user:go_default_library", "//pkg/auth/user:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
], ],
) )

View File

@ -23,8 +23,8 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/auth/authenticator" "k8s.io/kubernetes/pkg/auth/authenticator"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
var ( var (
@ -45,12 +45,12 @@ func init() {
// stores any such user found onto the provided context for the request. If authentication fails or returns an error // stores any such user found onto the provided context for the request. If authentication fails or returns an error
// the failed handler is used. On success, "Authorization" header is removed from the request and handler // the failed handler is used. On success, "Authorization" header is removed from the request and handler
// is invoked to serve the request. // is invoked to serve the request.
func WithAuthentication(handler http.Handler, mapper api.RequestContextMapper, auth authenticator.Request, failed http.Handler) http.Handler { func WithAuthentication(handler http.Handler, mapper genericapirequest.RequestContextMapper, auth authenticator.Request, failed http.Handler) http.Handler {
if auth == nil { if auth == nil {
glog.Warningf("Authentication is disabled") glog.Warningf("Authentication is disabled")
return handler return handler
} }
return api.WithRequestContext( return genericapirequest.WithRequestContext(
http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
user, ok, err := auth.AuthenticateRequest(req) user, ok, err := auth.AuthenticateRequest(req)
if err != nil || !ok { if err != nil || !ok {
@ -65,7 +65,7 @@ func WithAuthentication(handler http.Handler, mapper api.RequestContextMapper, a
req.Header.Del("Authorization") req.Header.Del("Authorization")
if ctx, ok := mapper.Get(req); ok { if ctx, ok := mapper.Get(req); ok {
mapper.Update(req, api.WithUser(ctx, user)) mapper.Update(req, genericapirequest.WithUser(ctx, user))
} }
authenticatedUserCounter.WithLabelValues(compressUsername(user.GetName())).Inc() authenticatedUserCounter.WithLabelValues(compressUsername(user.GetName())).Inc()

View File

@ -22,21 +22,21 @@ import (
"net/http/httptest" "net/http/httptest"
"testing" "testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/auth/authenticator" "k8s.io/kubernetes/pkg/auth/authenticator"
"k8s.io/kubernetes/pkg/auth/user" "k8s.io/kubernetes/pkg/auth/user"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
func TestAuthenticateRequest(t *testing.T) { func TestAuthenticateRequest(t *testing.T) {
success := make(chan struct{}) success := make(chan struct{})
contextMapper := api.NewRequestContextMapper() contextMapper := genericapirequest.NewRequestContextMapper()
auth := WithAuthentication( auth := WithAuthentication(
http.HandlerFunc(func(_ http.ResponseWriter, req *http.Request) { http.HandlerFunc(func(_ http.ResponseWriter, req *http.Request) {
ctx, ok := contextMapper.Get(req) ctx, ok := contextMapper.Get(req)
if ctx == nil || !ok { if ctx == nil || !ok {
t.Errorf("no context stored on contextMapper: %#v", contextMapper) t.Errorf("no context stored on contextMapper: %#v", contextMapper)
} }
user, ok := api.UserFrom(ctx) user, ok := genericapirequest.UserFrom(ctx)
if user == nil || !ok { if user == nil || !ok {
t.Errorf("no user stored in context: %#v", ctx) t.Errorf("no user stored in context: %#v", ctx)
} }
@ -60,7 +60,7 @@ func TestAuthenticateRequest(t *testing.T) {
auth.ServeHTTP(httptest.NewRecorder(), &http.Request{Header: map[string][]string{"Authorization": {"Something"}}}) auth.ServeHTTP(httptest.NewRecorder(), &http.Request{Header: map[string][]string{"Authorization": {"Something"}}})
<-success <-success
empty, err := api.IsEmpty(contextMapper) empty, err := genericapirequest.IsEmpty(contextMapper)
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -71,7 +71,7 @@ func TestAuthenticateRequest(t *testing.T) {
func TestAuthenticateRequestFailed(t *testing.T) { func TestAuthenticateRequestFailed(t *testing.T) {
failed := make(chan struct{}) failed := make(chan struct{})
contextMapper := api.NewRequestContextMapper() contextMapper := genericapirequest.NewRequestContextMapper()
auth := WithAuthentication( auth := WithAuthentication(
http.HandlerFunc(func(_ http.ResponseWriter, req *http.Request) { http.HandlerFunc(func(_ http.ResponseWriter, req *http.Request) {
t.Errorf("unexpected call to handler") t.Errorf("unexpected call to handler")
@ -88,7 +88,7 @@ func TestAuthenticateRequestFailed(t *testing.T) {
auth.ServeHTTP(httptest.NewRecorder(), &http.Request{}) auth.ServeHTTP(httptest.NewRecorder(), &http.Request{})
<-failed <-failed
empty, err := api.IsEmpty(contextMapper) empty, err := genericapirequest.IsEmpty(contextMapper)
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }
@ -99,7 +99,7 @@ func TestAuthenticateRequestFailed(t *testing.T) {
func TestAuthenticateRequestError(t *testing.T) { func TestAuthenticateRequestError(t *testing.T) {
failed := make(chan struct{}) failed := make(chan struct{})
contextMapper := api.NewRequestContextMapper() contextMapper := genericapirequest.NewRequestContextMapper()
auth := WithAuthentication( auth := WithAuthentication(
http.HandlerFunc(func(_ http.ResponseWriter, req *http.Request) { http.HandlerFunc(func(_ http.ResponseWriter, req *http.Request) {
t.Errorf("unexpected call to handler") t.Errorf("unexpected call to handler")
@ -116,7 +116,7 @@ func TestAuthenticateRequestError(t *testing.T) {
auth.ServeHTTP(httptest.NewRecorder(), &http.Request{}) auth.ServeHTTP(httptest.NewRecorder(), &http.Request{})
<-failed <-failed
empty, err := api.IsEmpty(contextMapper) empty, err := genericapirequest.IsEmpty(contextMapper)
if err != nil { if err != nil {
t.Fatalf("unexpected error: %v", err) t.Fatalf("unexpected error: %v", err)
} }

View File

@ -28,6 +28,7 @@ go_library(
"//pkg/client/retry:go_default_library", "//pkg/client/retry:go_default_library",
"//pkg/controller/informers:go_default_library", "//pkg/controller/informers:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/core/secret:go_default_library", "//pkg/registry/core/secret:go_default_library",
"//pkg/registry/core/secret/etcd:go_default_library", "//pkg/registry/core/secret/etcd:go_default_library",
"//pkg/registry/core/serviceaccount:go_default_library", "//pkg/registry/core/serviceaccount:go_default_library",

View File

@ -17,10 +17,10 @@ limitations under the License.
package serviceaccount package serviceaccount
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/registry/core/secret" "k8s.io/kubernetes/pkg/registry/core/secret"
secretetcd "k8s.io/kubernetes/pkg/registry/core/secret/etcd" secretetcd "k8s.io/kubernetes/pkg/registry/core/secret/etcd"
serviceaccountregistry "k8s.io/kubernetes/pkg/registry/core/serviceaccount" serviceaccountregistry "k8s.io/kubernetes/pkg/registry/core/serviceaccount"
@ -61,7 +61,7 @@ func NewGetterFromRegistries(serviceAccounts serviceaccountregistry.Registry, se
return &registryGetter{serviceAccounts, secrets} return &registryGetter{serviceAccounts, secrets}
} }
func (r *registryGetter) GetServiceAccount(namespace, name string) (*v1.ServiceAccount, error) { func (r *registryGetter) GetServiceAccount(namespace, name string) (*v1.ServiceAccount, error) {
ctx := api.WithNamespace(api.NewContext(), namespace) ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), namespace)
internalServiceAccount, err := r.serviceAccounts.GetServiceAccount(ctx, name, &metav1.GetOptions{}) internalServiceAccount, err := r.serviceAccounts.GetServiceAccount(ctx, name, &metav1.GetOptions{})
if err != nil { if err != nil {
return nil, err return nil, err
@ -72,7 +72,7 @@ func (r *registryGetter) GetServiceAccount(namespace, name string) (*v1.ServiceA
} }
func (r *registryGetter) GetSecret(namespace, name string) (*v1.Secret, error) { func (r *registryGetter) GetSecret(namespace, name string) (*v1.Secret, error) {
ctx := api.WithNamespace(api.NewContext(), namespace) ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), namespace)
internalSecret, err := r.secrets.GetSecret(ctx, name, &metav1.GetOptions{}) internalSecret, err := r.secrets.GetSecret(ctx, name, &metav1.GetOptions{})
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -107,6 +107,7 @@ go_test(
"//pkg/auth/authorizer:go_default_library", "//pkg/auth/authorizer:go_default_library",
"//pkg/auth/user:go_default_library", "//pkg/auth/user:go_default_library",
"//pkg/generated/openapi:go_default_library", "//pkg/generated/openapi:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/genericapiserver/options:go_default_library", "//pkg/genericapiserver/options:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/runtime/schema:go_default_library", "//pkg/runtime/schema:go_default_library",

View File

@ -31,6 +31,7 @@ go_library(
"//pkg/genericapiserver/api/handlers/negotiation:go_default_library", "//pkg/genericapiserver/api/handlers/negotiation:go_default_library",
"//pkg/genericapiserver/api/handlers/responsewriters:go_default_library", "//pkg/genericapiserver/api/handlers/responsewriters:go_default_library",
"//pkg/genericapiserver/api/metrics:go_default_library", "//pkg/genericapiserver/api/metrics:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/runtime/schema:go_default_library", "//pkg/runtime/schema:go_default_library",
"//pkg/util/errors:go_default_library", "//pkg/util/errors:go_default_library",

View File

@ -85,7 +85,7 @@ var accessor = meta.NewAccessor()
var selfLinker runtime.SelfLinker = accessor var selfLinker runtime.SelfLinker = accessor
var mapper, namespaceMapper meta.RESTMapper // The mappers with namespace and with legacy namespace scopes. var mapper, namespaceMapper meta.RESTMapper // The mappers with namespace and with legacy namespace scopes.
var admissionControl admission.Interface var admissionControl admission.Interface
var requestContextMapper api.RequestContextMapper var requestContextMapper request.RequestContextMapper
func interfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) { func interfacesFor(version schema.GroupVersion) (*meta.VersionInterfaces, error) {
switch version { switch version {
@ -209,7 +209,7 @@ func init() {
mapper = nsMapper mapper = nsMapper
namespaceMapper = nsMapper namespaceMapper = nsMapper
admissionControl = admit.NewAlwaysAdmit() admissionControl = admit.NewAlwaysAdmit()
requestContextMapper = api.NewRequestContextMapper() requestContextMapper = request.NewRequestContextMapper()
api.Scheme.AddFieldLabelConversionFunc(grouplessGroupVersion.String(), "Simple", api.Scheme.AddFieldLabelConversionFunc(grouplessGroupVersion.String(), "Simple",
func(label, value string) (string, string, error) { func(label, value string) (string, string, error) {
@ -380,7 +380,7 @@ type SimpleRESTStorage struct {
injectedFunction func(obj runtime.Object) (returnObj runtime.Object, err error) injectedFunction func(obj runtime.Object) (returnObj runtime.Object, err error)
} }
func (storage *SimpleRESTStorage) Export(ctx api.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) { func (storage *SimpleRESTStorage) Export(ctx request.Context, name string, opts metav1.ExportOptions) (runtime.Object, error) {
obj, err := storage.Get(ctx, name, &metav1.GetOptions{}) obj, err := storage.Get(ctx, name, &metav1.GetOptions{})
if err != nil { if err != nil {
return nil, err return nil, err
@ -395,7 +395,7 @@ func (storage *SimpleRESTStorage) Export(ctx api.Context, name string, opts meta
return obj, storage.errors["export"] return obj, storage.errors["export"]
} }
func (storage *SimpleRESTStorage) List(ctx api.Context, options *api.ListOptions) (runtime.Object, error) { func (storage *SimpleRESTStorage) List(ctx request.Context, options *api.ListOptions) (runtime.Object, error) {
storage.checkContext(ctx) storage.checkContext(ctx)
result := &genericapitesting.SimpleList{ result := &genericapitesting.SimpleList{
Items: storage.list, Items: storage.list,
@ -442,7 +442,7 @@ func (h *OutputConnect) ServeHTTP(w http.ResponseWriter, req *http.Request) {
w.Write([]byte(h.response)) w.Write([]byte(h.response))
} }
func (storage *SimpleRESTStorage) Get(ctx api.Context, id string, options *metav1.GetOptions) (runtime.Object, error) { func (storage *SimpleRESTStorage) Get(ctx request.Context, id string, options *metav1.GetOptions) (runtime.Object, error) {
storage.checkContext(ctx) storage.checkContext(ctx)
if id == "binary" { if id == "binary" {
return storage.stream, storage.errors["get"] return storage.stream, storage.errors["get"]
@ -454,11 +454,11 @@ func (storage *SimpleRESTStorage) Get(ctx api.Context, id string, options *metav
return copied, storage.errors["get"] return copied, storage.errors["get"]
} }
func (storage *SimpleRESTStorage) checkContext(ctx api.Context) { func (storage *SimpleRESTStorage) checkContext(ctx request.Context) {
storage.actualNamespace, storage.namespacePresent = api.NamespaceFrom(ctx) storage.actualNamespace, storage.namespacePresent = request.NamespaceFrom(ctx)
} }
func (storage *SimpleRESTStorage) Delete(ctx api.Context, id string, options *api.DeleteOptions) (runtime.Object, error) { func (storage *SimpleRESTStorage) Delete(ctx request.Context, id string, options *api.DeleteOptions) (runtime.Object, error) {
storage.checkContext(ctx) storage.checkContext(ctx)
storage.deleted = id storage.deleted = id
storage.deleteOptions = options storage.deleteOptions = options
@ -481,7 +481,7 @@ func (storage *SimpleRESTStorage) NewList() runtime.Object {
return &genericapitesting.SimpleList{} return &genericapitesting.SimpleList{}
} }
func (storage *SimpleRESTStorage) Create(ctx api.Context, obj runtime.Object) (runtime.Object, error) { func (storage *SimpleRESTStorage) Create(ctx request.Context, obj runtime.Object) (runtime.Object, error) {
storage.checkContext(ctx) storage.checkContext(ctx)
storage.created = obj.(*genericapitesting.Simple) storage.created = obj.(*genericapitesting.Simple)
if err := storage.errors["create"]; err != nil { if err := storage.errors["create"]; err != nil {
@ -494,7 +494,7 @@ func (storage *SimpleRESTStorage) Create(ctx api.Context, obj runtime.Object) (r
return obj, err return obj, err
} }
func (storage *SimpleRESTStorage) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { func (storage *SimpleRESTStorage) Update(ctx request.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) {
storage.checkContext(ctx) storage.checkContext(ctx)
obj, err := objInfo.UpdatedObject(ctx, &storage.item) obj, err := objInfo.UpdatedObject(ctx, &storage.item)
if err != nil { if err != nil {
@ -511,7 +511,7 @@ func (storage *SimpleRESTStorage) Update(ctx api.Context, name string, objInfo r
} }
// Implement ResourceWatcher. // Implement ResourceWatcher.
func (storage *SimpleRESTStorage) Watch(ctx api.Context, options *api.ListOptions) (watch.Interface, error) { func (storage *SimpleRESTStorage) Watch(ctx request.Context, options *api.ListOptions) (watch.Interface, error) {
storage.lock.Lock() storage.lock.Lock()
defer storage.lock.Unlock() defer storage.lock.Unlock()
storage.checkContext(ctx) storage.checkContext(ctx)
@ -527,7 +527,7 @@ func (storage *SimpleRESTStorage) Watch(ctx api.Context, options *api.ListOption
if options != nil { if options != nil {
storage.requestedResourceVersion = options.ResourceVersion storage.requestedResourceVersion = options.ResourceVersion
} }
storage.requestedResourceNamespace = api.NamespaceValue(ctx) storage.requestedResourceNamespace = request.NamespaceValue(ctx)
if err := storage.errors["watch"]; err != nil { if err := storage.errors["watch"]; err != nil {
return nil, err return nil, err
} }
@ -545,10 +545,10 @@ func (storage *SimpleRESTStorage) Watcher() *watch.FakeWatcher {
var _ = rest.Redirector(&SimpleRESTStorage{}) var _ = rest.Redirector(&SimpleRESTStorage{})
// Implement Redirector. // Implement Redirector.
func (storage *SimpleRESTStorage) ResourceLocation(ctx api.Context, id string) (*url.URL, http.RoundTripper, error) { func (storage *SimpleRESTStorage) ResourceLocation(ctx request.Context, id string) (*url.URL, http.RoundTripper, error) {
storage.checkContext(ctx) storage.checkContext(ctx)
// validate that the namespace context on the request matches the expected input // validate that the namespace context on the request matches the expected input
storage.requestedResourceNamespace = api.NamespaceValue(ctx) storage.requestedResourceNamespace = request.NamespaceValue(ctx)
if storage.expectedResourceNamespace != storage.requestedResourceNamespace { if storage.expectedResourceNamespace != storage.requestedResourceNamespace {
return nil, nil, fmt.Errorf("Expected request namespace %s, but got namespace %s", storage.expectedResourceNamespace, storage.requestedResourceNamespace) return nil, nil, fmt.Errorf("Expected request namespace %s, but got namespace %s", storage.expectedResourceNamespace, storage.requestedResourceNamespace)
} }
@ -580,7 +580,7 @@ func (s *ConnecterRESTStorage) New() runtime.Object {
return &genericapitesting.Simple{} return &genericapitesting.Simple{}
} }
func (s *ConnecterRESTStorage) Connect(ctx api.Context, id string, options runtime.Object, responder rest.Responder) (http.Handler, error) { func (s *ConnecterRESTStorage) Connect(ctx request.Context, id string, options runtime.Object, responder rest.Responder) (http.Handler, error) {
s.receivedConnectOptions = options s.receivedConnectOptions = options
s.receivedID = id s.receivedID = id
s.receivedResponder = responder s.receivedResponder = responder
@ -605,7 +605,7 @@ type LegacyRESTStorage struct {
*SimpleRESTStorage *SimpleRESTStorage
} }
func (storage LegacyRESTStorage) Delete(ctx api.Context, id string) (runtime.Object, error) { func (storage LegacyRESTStorage) Delete(ctx request.Context, id string) (runtime.Object, error) {
return storage.SimpleRESTStorage.Delete(ctx, id, nil) return storage.SimpleRESTStorage.Delete(ctx, id, nil)
} }
@ -630,7 +630,7 @@ type GetWithOptionsRESTStorage struct {
takesPath string takesPath string
} }
func (r *GetWithOptionsRESTStorage) Get(ctx api.Context, name string, options runtime.Object) (runtime.Object, error) { func (r *GetWithOptionsRESTStorage) Get(ctx request.Context, name string, options runtime.Object) (runtime.Object, error) {
if _, ok := options.(*genericapitesting.SimpleGetOptions); !ok { if _, ok := options.(*genericapitesting.SimpleGetOptions); !ok {
return nil, fmt.Errorf("Unexpected options object: %#v", options) return nil, fmt.Errorf("Unexpected options object: %#v", options)
} }
@ -652,7 +652,7 @@ type NamedCreaterRESTStorage struct {
createdName string createdName string
} }
func (storage *NamedCreaterRESTStorage) Create(ctx api.Context, name string, obj runtime.Object) (runtime.Object, error) { func (storage *NamedCreaterRESTStorage) Create(ctx request.Context, name string, obj runtime.Object) (runtime.Object, error) {
storage.checkContext(ctx) storage.checkContext(ctx)
storage.created = obj.(*genericapitesting.Simple) storage.created = obj.(*genericapitesting.Simple)
storage.createdName = name storage.createdName = name
@ -679,7 +679,7 @@ func (storage *SimpleTypedStorage) New() runtime.Object {
return storage.baseType return storage.baseType
} }
func (storage *SimpleTypedStorage) Get(ctx api.Context, id string, options *metav1.GetOptions) (runtime.Object, error) { func (storage *SimpleTypedStorage) Get(ctx request.Context, id string, options *metav1.GetOptions) (runtime.Object, error) {
storage.checkContext(ctx) storage.checkContext(ctx)
copied, err := api.Scheme.Copy(storage.item) copied, err := api.Scheme.Copy(storage.item)
if err != nil { if err != nil {
@ -688,8 +688,8 @@ func (storage *SimpleTypedStorage) Get(ctx api.Context, id string, options *meta
return copied, storage.errors["get"] return copied, storage.errors["get"]
} }
func (storage *SimpleTypedStorage) checkContext(ctx api.Context) { func (storage *SimpleTypedStorage) checkContext(ctx request.Context) {
storage.actualNamespace, storage.namespacePresent = api.NamespaceFrom(ctx) storage.actualNamespace, storage.namespacePresent = request.NamespaceFrom(ctx)
} }
func extractBody(response *http.Response, object runtime.Object) (string, error) { func extractBody(response *http.Response, object runtime.Object) (string, error) {
@ -3255,7 +3255,7 @@ func (storage *SimpleXGSubresourceRESTStorage) New() runtime.Object {
return &SimpleXGSubresource{} return &SimpleXGSubresource{}
} }
func (storage *SimpleXGSubresourceRESTStorage) Get(ctx api.Context, id string, options *metav1.GetOptions) (runtime.Object, error) { func (storage *SimpleXGSubresourceRESTStorage) Get(ctx request.Context, id string, options *metav1.GetOptions) (runtime.Object, error) {
copied, err := api.Scheme.Copy(&storage.item) copied, err := api.Scheme.Copy(&storage.item)
if err != nil { if err != nil {
panic(err) panic(err)
@ -3400,7 +3400,7 @@ func BenchmarkUpdateProtobuf(b *testing.B) {
func newTestServer(handler http.Handler) *httptest.Server { func newTestServer(handler http.Handler) *httptest.Server {
handler = genericapifilters.WithRequestInfo(handler, newTestRequestInfoResolver(), requestContextMapper) handler = genericapifilters.WithRequestInfo(handler, newTestRequestInfoResolver(), requestContextMapper)
handler = api.WithRequestContext(handler, requestContextMapper) handler = request.WithRequestContext(handler, requestContextMapper)
return httptest.NewServer(handler) return httptest.NewServer(handler)
} }

View File

@ -44,7 +44,6 @@ go_test(
library = ":go_default_library", library = ":go_default_library",
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/apis/authentication:go_default_library", "//pkg/apis/authentication:go_default_library",
"//pkg/apis/batch:go_default_library", "//pkg/apis/batch:go_default_library",
"//pkg/auth/authorizer:go_default_library", "//pkg/auth/authorizer:go_default_library",

View File

@ -29,9 +29,9 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/pborman/uuid" "github.com/pborman/uuid"
"k8s.io/kubernetes/pkg/api"
authenticationapi "k8s.io/kubernetes/pkg/apis/authentication" authenticationapi "k8s.io/kubernetes/pkg/apis/authentication"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters"
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
utilnet "k8s.io/kubernetes/pkg/util/net" utilnet "k8s.io/kubernetes/pkg/util/net"
) )
@ -89,7 +89,7 @@ var _ http.Hijacker = &fancyResponseWriterDelegator{}
// 2. the response line containing: // 2. the response line containing:
// - the unique id from 1 // - the unique id from 1
// - response code // - response code
func WithAudit(handler http.Handler, requestContextMapper api.RequestContextMapper, out io.Writer) http.Handler { func WithAudit(handler http.Handler, requestContextMapper request.RequestContextMapper, out io.Writer) http.Handler {
if out == nil { if out == nil {
return handler return handler
} }

View File

@ -28,7 +28,6 @@ import (
"strings" "strings"
"testing" "testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/auth/user" "k8s.io/kubernetes/pkg/auth/user"
"k8s.io/kubernetes/pkg/genericapiserver/api/request" "k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
@ -105,10 +104,10 @@ type fakeRequestContextMapper struct {
user *user.DefaultInfo user *user.DefaultInfo
} }
func (m *fakeRequestContextMapper) Get(req *http.Request) (api.Context, bool) { func (m *fakeRequestContextMapper) Get(req *http.Request) (request.Context, bool) {
ctx := api.NewContext() ctx := request.NewContext()
if m.user != nil { if m.user != nil {
ctx = api.WithUser(ctx, m.user) ctx = request.WithUser(ctx, m.user)
} }
resolver := newTestRequestInfoResolver() resolver := newTestRequestInfoResolver()
@ -120,7 +119,7 @@ func (m *fakeRequestContextMapper) Get(req *http.Request) (api.Context, bool) {
return ctx, true return ctx, true
} }
func (*fakeRequestContextMapper) Update(req *http.Request, context api.Context) error { func (*fakeRequestContextMapper) Update(req *http.Request, context request.Context) error {
return nil return nil
} }

View File

@ -22,14 +22,13 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters"
"k8s.io/kubernetes/pkg/genericapiserver/api/request" "k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
// WithAuthorizationCheck passes all authorized requests on to handler, and returns a forbidden error otherwise. // WithAuthorizationCheck passes all authorized requests on to handler, and returns a forbidden error otherwise.
func WithAuthorization(handler http.Handler, requestContextMapper api.RequestContextMapper, a authorizer.Authorizer) http.Handler { func WithAuthorization(handler http.Handler, requestContextMapper request.RequestContextMapper, a authorizer.Authorizer) http.Handler {
if a == nil { if a == nil {
glog.Warningf("Authorization is disabled") glog.Warningf("Authorization is disabled")
return handler return handler
@ -61,10 +60,10 @@ func WithAuthorization(handler http.Handler, requestContextMapper api.RequestCon
}) })
} }
func GetAuthorizerAttributes(ctx api.Context) (authorizer.Attributes, error) { func GetAuthorizerAttributes(ctx request.Context) (authorizer.Attributes, error) {
attribs := authorizer.AttributesRecord{} attribs := authorizer.AttributesRecord{}
user, ok := api.UserFrom(ctx) user, ok := request.UserFrom(ctx)
if ok { if ok {
attribs.User = user attribs.User = user
} }

View File

@ -23,14 +23,14 @@ import (
"reflect" "reflect"
"testing" "testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters"
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
func TestGetAuthorizerAttributes(t *testing.T) { func TestGetAuthorizerAttributes(t *testing.T) {
mapper := api.NewRequestContextMapper() mapper := request.NewRequestContextMapper()
testcases := map[string]struct { testcases := map[string]struct {
Verb string Verb string
@ -117,7 +117,7 @@ func TestGetAuthorizerAttributes(t *testing.T) {
attribs, err = GetAuthorizerAttributes(ctx) attribs, err = GetAuthorizerAttributes(ctx)
}) })
handler = WithRequestInfo(handler, newTestRequestInfoResolver(), mapper) handler = WithRequestInfo(handler, newTestRequestInfoResolver(), mapper)
handler = api.WithRequestContext(handler, mapper) handler = request.WithRequestContext(handler, mapper)
handler.ServeHTTP(httptest.NewRecorder(), req) handler.ServeHTTP(httptest.NewRecorder(), req)
if err != nil { if err != nil {

View File

@ -29,12 +29,13 @@ import (
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"
"k8s.io/kubernetes/pkg/auth/user" "k8s.io/kubernetes/pkg/auth/user"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters"
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/httplog" "k8s.io/kubernetes/pkg/httplog"
"k8s.io/kubernetes/pkg/serviceaccount" "k8s.io/kubernetes/pkg/serviceaccount"
) )
// WithImpersonation is a filter that will inspect and check requests that attempt to change the user.Info for their requests // WithImpersonation is a filter that will inspect and check requests that attempt to change the user.Info for their requests
func WithImpersonation(handler http.Handler, requestContextMapper api.RequestContextMapper, a authorizer.Authorizer) http.Handler { func WithImpersonation(handler http.Handler, requestContextMapper request.RequestContextMapper, a authorizer.Authorizer) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
impersonationRequests, err := buildImpersonationRequests(req.Header) impersonationRequests, err := buildImpersonationRequests(req.Header)
if err != nil { if err != nil {
@ -52,7 +53,7 @@ func WithImpersonation(handler http.Handler, requestContextMapper api.RequestCon
responsewriters.InternalError(w, req, errors.New("no context found for request")) responsewriters.InternalError(w, req, errors.New("no context found for request"))
return return
} }
requestor, exists := api.UserFrom(ctx) requestor, exists := request.UserFrom(ctx)
if !exists { if !exists {
responsewriters.InternalError(w, req, errors.New("no user found for request")) responsewriters.InternalError(w, req, errors.New("no user found for request"))
return return
@ -120,9 +121,9 @@ func WithImpersonation(handler http.Handler, requestContextMapper api.RequestCon
Groups: groups, Groups: groups,
Extra: userExtra, Extra: userExtra,
} }
requestContextMapper.Update(req, api.WithUser(ctx, newUser)) requestContextMapper.Update(req, request.WithUser(ctx, newUser))
oldUser, _ := api.UserFrom(ctx) oldUser, _ := request.UserFrom(ctx)
httplog.LogOf(req, w).Addf("%v is acting as %v", oldUser, newUser) httplog.LogOf(req, w).Addf("%v is acting as %v", oldUser, newUser)
// clear all the impersonation headers from the request // clear all the impersonation headers from the request

View File

@ -24,10 +24,10 @@ import (
"sync" "sync"
"testing" "testing"
"k8s.io/kubernetes/pkg/api"
authenticationapi "k8s.io/kubernetes/pkg/apis/authentication" authenticationapi "k8s.io/kubernetes/pkg/apis/authentication"
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"
"k8s.io/kubernetes/pkg/auth/user" "k8s.io/kubernetes/pkg/auth/user"
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
type impersonateAuthorizer struct{} type impersonateAuthorizer struct{}
@ -264,14 +264,14 @@ func TestImpersonationFilter(t *testing.T) {
}, },
} }
requestContextMapper := api.NewRequestContextMapper() requestContextMapper := request.NewRequestContextMapper()
var ctx api.Context var ctx request.Context
var actualUser user.Info var actualUser user.Info
var lock sync.Mutex var lock sync.Mutex
doNothingHandler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { doNothingHandler := http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
currentCtx, _ := requestContextMapper.Get(req) currentCtx, _ := requestContextMapper.Get(req)
user, exists := api.UserFrom(currentCtx) user, exists := request.UserFrom(currentCtx)
if !exists { if !exists {
actualUser = nil actualUser = nil
return return
@ -291,7 +291,7 @@ func TestImpersonationFilter(t *testing.T) {
requestContextMapper.Update(req, ctx) requestContextMapper.Update(req, ctx)
currentCtx, _ := requestContextMapper.Get(req) currentCtx, _ := requestContextMapper.Get(req)
user, exists := api.UserFrom(currentCtx) user, exists := request.UserFrom(currentCtx)
if !exists { if !exists {
actualUser = nil actualUser = nil
return return
@ -302,7 +302,7 @@ func TestImpersonationFilter(t *testing.T) {
delegate.ServeHTTP(w, req) delegate.ServeHTTP(w, req)
}) })
}(WithImpersonation(doNothingHandler, requestContextMapper, impersonateAuthorizer{})) }(WithImpersonation(doNothingHandler, requestContextMapper, impersonateAuthorizer{}))
handler = api.WithRequestContext(handler, requestContextMapper) handler = request.WithRequestContext(handler, requestContextMapper)
server := httptest.NewServer(handler) server := httptest.NewServer(handler)
defer server.Close() defer server.Close()
@ -311,7 +311,7 @@ func TestImpersonationFilter(t *testing.T) {
func() { func() {
lock.Lock() lock.Lock()
defer lock.Unlock() defer lock.Unlock()
ctx = api.WithUser(api.NewContext(), tc.user) ctx = request.WithUser(request.NewContext(), tc.user)
}() }()
req, err := http.NewRequest("GET", server.URL, nil) req, err := http.NewRequest("GET", server.URL, nil)

View File

@ -21,13 +21,12 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters"
"k8s.io/kubernetes/pkg/genericapiserver/api/request" "k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
// WithRequestInfo attaches a RequestInfo to the context. // WithRequestInfo attaches a RequestInfo to the context.
func WithRequestInfo(handler http.Handler, resolver *request.RequestInfoFactory, requestContextMapper api.RequestContextMapper) http.Handler { func WithRequestInfo(handler http.Handler, resolver *request.RequestInfoFactory, requestContextMapper request.RequestContextMapper) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
ctx, ok := requestContextMapper.Get(req) ctx, ok := requestContextMapper.Get(req)
if !ok { if !ok {

View File

@ -24,12 +24,12 @@ import (
"github.com/emicklei/go-restful" "github.com/emicklei/go-restful"
"k8s.io/kubernetes/pkg/admission" "k8s.io/kubernetes/pkg/admission"
"k8s.io/kubernetes/pkg/api"
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/meta" "k8s.io/kubernetes/pkg/api/meta"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers"
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
utilerrors "k8s.io/kubernetes/pkg/util/errors" utilerrors "k8s.io/kubernetes/pkg/util/errors"
@ -68,7 +68,7 @@ type APIGroupVersion struct {
Linker runtime.SelfLinker Linker runtime.SelfLinker
Admit admission.Interface Admit admission.Interface
Context api.RequestContextMapper Context request.RequestContextMapper
MinRequestTimeout time.Duration MinRequestTimeout time.Duration

View File

@ -20,6 +20,7 @@ go_test(
"//pkg/api/testapi:go_default_library", "//pkg/api/testapi:go_default_library",
"//pkg/api/v1:go_default_library", "//pkg/api/v1:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/runtime/schema:go_default_library", "//pkg/runtime/schema:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",

View File

@ -49,7 +49,7 @@ type ProxyHandler struct {
Prefix string Prefix string
Storage map[string]rest.Storage Storage map[string]rest.Storage
Serializer runtime.NegotiatedSerializer Serializer runtime.NegotiatedSerializer
Mapper api.RequestContextMapper Mapper request.RequestContextMapper
} }
func (r *ProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { func (r *ProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
@ -87,7 +87,7 @@ func (r *ProxyHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
verb = requestInfo.Verb verb = requestInfo.Verb
namespace, resource, parts := requestInfo.Namespace, requestInfo.Resource, requestInfo.Parts namespace, resource, parts := requestInfo.Namespace, requestInfo.Resource, requestInfo.Parts
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
if len(parts) < 2 { if len(parts) < 2 {
responsewriters.NotFound(w, req) responsewriters.NotFound(w, req)
httpCode = http.StatusNotFound httpCode = http.StatusNotFound

View File

@ -8,6 +8,19 @@ load(
"go_test", "go_test",
) )
go_test(
name = "go_default_test",
srcs = ["status_test.go"],
library = ":go_default_library",
tags = ["automanaged"],
deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library",
"//pkg/apis/meta/v1:go_default_library",
"//pkg/runtime/schema:go_default_library",
],
)
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
@ -30,16 +43,3 @@ go_library(
"//pkg/util/wsstream:go_default_library", "//pkg/util/wsstream:go_default_library",
], ],
) )
go_test(
name = "go_default_test",
srcs = ["status_test.go"],
library = ":go_default_library",
tags = ["automanaged"],
deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library",
"//pkg/apis/meta/v1:go_default_library",
"//pkg/runtime/schema:go_default_library",
],
)

View File

@ -36,6 +36,7 @@ import (
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/negotiation" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/negotiation"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/responsewriters"
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/util" "k8s.io/kubernetes/pkg/util"
@ -48,7 +49,7 @@ import (
) )
// ContextFunc returns a Context given a request - a context must be returned // ContextFunc returns a Context given a request - a context must be returned
type ContextFunc func(req *restful.Request) api.Context type ContextFunc func(req *restful.Request) request.Context
// ScopeNamer handles accessing names from requests and objects // ScopeNamer handles accessing names from requests and objects
type ScopeNamer interface { type ScopeNamer interface {
@ -94,7 +95,7 @@ func (scope *RequestScope) err(err error, w http.ResponseWriter, req *http.Reque
// getterFunc performs a get request with the given context and object name. The request // getterFunc performs a get request with the given context and object name. The request
// may be used to deserialize an options object to pass to the getter. // may be used to deserialize an options object to pass to the getter.
type getterFunc func(ctx api.Context, name string, req *restful.Request) (runtime.Object, error) type getterFunc func(ctx request.Context, name string, req *restful.Request) (runtime.Object, error)
// maxRetryWhenPatchConflicts is the maximum number of conflicts retry during a patch operation before returning failure // maxRetryWhenPatchConflicts is the maximum number of conflicts retry during a patch operation before returning failure
const maxRetryWhenPatchConflicts = 5 const maxRetryWhenPatchConflicts = 5
@ -110,7 +111,7 @@ func getResourceHandler(scope RequestScope, getter getterFunc) restful.RouteFunc
return return
} }
ctx := scope.ContextFunc(req) ctx := scope.ContextFunc(req)
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
result, err := getter(ctx, name, req) result, err := getter(ctx, name, req)
if err != nil { if err != nil {
@ -128,7 +129,7 @@ func getResourceHandler(scope RequestScope, getter getterFunc) restful.RouteFunc
// GetResource returns a function that handles retrieving a single resource from a rest.Storage object. // GetResource returns a function that handles retrieving a single resource from a rest.Storage object.
func GetResource(r rest.Getter, e rest.Exporter, scope RequestScope) restful.RouteFunction { func GetResource(r rest.Getter, e rest.Exporter, scope RequestScope) restful.RouteFunction {
return getResourceHandler(scope, return getResourceHandler(scope,
func(ctx api.Context, name string, req *restful.Request) (runtime.Object, error) { func(ctx request.Context, name string, req *restful.Request) (runtime.Object, error) {
// For performance tracking purposes. // For performance tracking purposes.
trace := util.NewTrace("Get " + req.Request.URL.Path) trace := util.NewTrace("Get " + req.Request.URL.Path)
defer trace.LogIfLong(500 * time.Millisecond) defer trace.LogIfLong(500 * time.Millisecond)
@ -158,7 +159,7 @@ func GetResource(r rest.Getter, e rest.Exporter, scope RequestScope) restful.Rou
// GetResourceWithOptions returns a function that handles retrieving a single resource from a rest.Storage object. // GetResourceWithOptions returns a function that handles retrieving a single resource from a rest.Storage object.
func GetResourceWithOptions(r rest.GetterWithOptions, scope RequestScope) restful.RouteFunction { func GetResourceWithOptions(r rest.GetterWithOptions, scope RequestScope) restful.RouteFunction {
return getResourceHandler(scope, return getResourceHandler(scope,
func(ctx api.Context, name string, req *restful.Request) (runtime.Object, error) { func(ctx request.Context, name string, req *restful.Request) (runtime.Object, error) {
opts, subpath, subpathKey := r.NewGetOptions() opts, subpath, subpathKey := r.NewGetOptions()
if err := getRequestOptions(req, scope, opts, subpath, subpathKey); err != nil { if err := getRequestOptions(req, scope, opts, subpath, subpathKey); err != nil {
return nil, err return nil, err
@ -194,7 +195,7 @@ func ConnectResource(connecter rest.Connecter, scope RequestScope, admit admissi
return return
} }
ctx := scope.ContextFunc(req) ctx := scope.ContextFunc(req)
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
opts, subpath, subpathKey := connecter.NewConnectOptions() opts, subpath, subpathKey := connecter.NewConnectOptions()
if err := getRequestOptions(req, scope, opts, subpath, subpathKey); err != nil { if err := getRequestOptions(req, scope, opts, subpath, subpathKey); err != nil {
scope.err(err, res.ResponseWriter, req.Request) scope.err(err, res.ResponseWriter, req.Request)
@ -206,7 +207,7 @@ func ConnectResource(connecter rest.Connecter, scope RequestScope, admit admissi
Options: opts, Options: opts,
ResourcePath: restPath, ResourcePath: restPath,
} }
userInfo, _ := api.UserFrom(ctx) userInfo, _ := request.UserFrom(ctx)
err = admit.Admit(admission.NewAttributesRecord(connectRequest, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Connect, userInfo)) err = admit.Admit(admission.NewAttributesRecord(connectRequest, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Connect, userInfo))
if err != nil { if err != nil {
@ -261,7 +262,7 @@ func ListResource(r rest.Lister, rw rest.Watcher, scope RequestScope, forceWatch
} }
ctx := scope.ContextFunc(req) ctx := scope.ContextFunc(req)
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
opts := api.ListOptions{} opts := api.ListOptions{}
if err := scope.ParameterCodec.DecodeParameters(req.Request.URL.Query(), scope.Kind.GroupVersion(), &opts); err != nil { if err := scope.ParameterCodec.DecodeParameters(req.Request.URL.Query(), scope.Kind.GroupVersion(), &opts); err != nil {
@ -364,7 +365,7 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object
} }
ctx := scope.ContextFunc(req) ctx := scope.ContextFunc(req)
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
gv := scope.Kind.GroupVersion() gv := scope.Kind.GroupVersion()
s, err := negotiation.NegotiateInputSerializer(req.Request, scope.Serializer) s, err := negotiation.NegotiateInputSerializer(req.Request, scope.Serializer)
@ -397,7 +398,7 @@ func createHandler(r rest.NamedCreater, scope RequestScope, typer runtime.Object
trace.Step("Conversion done") trace.Step("Conversion done")
if admit != nil && admit.Handles(admission.Create) { if admit != nil && admit.Handles(admission.Create) {
userInfo, _ := api.UserFrom(ctx) userInfo, _ := request.UserFrom(ctx)
err = admit.Admit(admission.NewAttributesRecord(obj, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Create, userInfo)) err = admit.Admit(admission.NewAttributesRecord(obj, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Create, userInfo))
if err != nil { if err != nil {
@ -444,7 +445,7 @@ type namedCreaterAdapter struct {
rest.Creater rest.Creater
} }
func (c *namedCreaterAdapter) Create(ctx api.Context, name string, obj runtime.Object) (runtime.Object, error) { func (c *namedCreaterAdapter) Create(ctx request.Context, name string, obj runtime.Object) (runtime.Object, error) {
return c.Creater.Create(ctx, obj) return c.Creater.Create(ctx, obj)
} }
@ -466,7 +467,7 @@ func PatchResource(r rest.Patcher, scope RequestScope, typer runtime.ObjectTyper
} }
ctx := scope.ContextFunc(req) ctx := scope.ContextFunc(req)
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
versionedObj, err := converter.ConvertToVersion(r.New(), scope.Kind.GroupVersion()) versionedObj, err := converter.ConvertToVersion(r.New(), scope.Kind.GroupVersion())
if err != nil { if err != nil {
@ -501,7 +502,7 @@ func PatchResource(r rest.Patcher, scope RequestScope, typer runtime.ObjectTyper
updateAdmit := func(updatedObject runtime.Object, currentObject runtime.Object) error { updateAdmit := func(updatedObject runtime.Object, currentObject runtime.Object) error {
if admit != nil && admit.Handles(admission.Update) { if admit != nil && admit.Handles(admission.Update) {
userInfo, _ := api.UserFrom(ctx) userInfo, _ := request.UserFrom(ctx)
return admit.Admit(admission.NewAttributesRecord(updatedObject, currentObject, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Update, userInfo)) return admit.Admit(admission.NewAttributesRecord(updatedObject, currentObject, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Update, userInfo))
} }
@ -528,7 +529,7 @@ type updateAdmissionFunc func(updatedObject runtime.Object, currentObject runtim
// patchResource divides PatchResource for easier unit testing // patchResource divides PatchResource for easier unit testing
func patchResource( func patchResource(
ctx api.Context, ctx request.Context,
admit updateAdmissionFunc, admit updateAdmissionFunc,
timeout time.Duration, timeout time.Duration,
versionedObj runtime.Object, versionedObj runtime.Object,
@ -542,7 +543,7 @@ func patchResource(
codec runtime.Codec, codec runtime.Codec,
) (runtime.Object, error) { ) (runtime.Object, error) {
namespace := api.NamespaceValue(ctx) namespace := request.NamespaceValue(ctx)
var ( var (
originalObjJS []byte originalObjJS []byte
@ -552,7 +553,7 @@ func patchResource(
// applyPatch is called every time GuaranteedUpdate asks for the updated object, // applyPatch is called every time GuaranteedUpdate asks for the updated object,
// and is given the currently persisted object as input. // and is given the currently persisted object as input.
applyPatch := func(_ api.Context, _, currentObject runtime.Object) (runtime.Object, error) { applyPatch := func(_ request.Context, _, currentObject runtime.Object) (runtime.Object, error) {
// Make sure we actually have a persisted currentObject // Make sure we actually have a persisted currentObject
if hasUID, err := hasUID(currentObject); err != nil { if hasUID, err := hasUID(currentObject); err != nil {
return nil, err return nil, err
@ -643,7 +644,7 @@ func patchResource(
// applyAdmission is called every time GuaranteedUpdate asks for the updated object, // applyAdmission is called every time GuaranteedUpdate asks for the updated object,
// and is given the currently persisted object and the patched object as input. // and is given the currently persisted object and the patched object as input.
applyAdmission := func(ctx api.Context, patchedObject runtime.Object, currentObject runtime.Object) (runtime.Object, error) { applyAdmission := func(ctx request.Context, patchedObject runtime.Object, currentObject runtime.Object) (runtime.Object, error) {
return patchedObject, admit(patchedObject, currentObject) return patchedObject, admit(patchedObject, currentObject)
} }
@ -677,7 +678,7 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
return return
} }
ctx := scope.ContextFunc(req) ctx := scope.ContextFunc(req)
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
body, err := readBody(req.Request) body, err := readBody(req.Request)
if err != nil { if err != nil {
@ -713,8 +714,8 @@ func UpdateResource(r rest.Updater, scope RequestScope, typer runtime.ObjectType
var transformers []rest.TransformFunc var transformers []rest.TransformFunc
if admit != nil && admit.Handles(admission.Update) { if admit != nil && admit.Handles(admission.Update) {
transformers = append(transformers, func(ctx api.Context, newObj, oldObj runtime.Object) (runtime.Object, error) { transformers = append(transformers, func(ctx request.Context, newObj, oldObj runtime.Object) (runtime.Object, error) {
userInfo, _ := api.UserFrom(ctx) userInfo, _ := request.UserFrom(ctx)
return newObj, admit.Admit(admission.NewAttributesRecord(newObj, oldObj, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Update, userInfo)) return newObj, admit.Admit(admission.NewAttributesRecord(newObj, oldObj, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Update, userInfo))
}) })
} }
@ -764,7 +765,7 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope RequestSco
return return
} }
ctx := scope.ContextFunc(req) ctx := scope.ContextFunc(req)
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
options := &api.DeleteOptions{} options := &api.DeleteOptions{}
if allowsOptions { if allowsOptions {
@ -800,7 +801,7 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope RequestSco
} }
if admit != nil && admit.Handles(admission.Delete) { if admit != nil && admit.Handles(admission.Delete) {
userInfo, _ := api.UserFrom(ctx) userInfo, _ := request.UserFrom(ctx)
err = admit.Admit(admission.NewAttributesRecord(nil, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Delete, userInfo)) err = admit.Admit(admission.NewAttributesRecord(nil, nil, scope.Kind, namespace, name, scope.Resource, scope.Subresource, admission.Delete, userInfo))
if err != nil { if err != nil {
@ -858,10 +859,10 @@ func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope RequestSco
} }
ctx := scope.ContextFunc(req) ctx := scope.ContextFunc(req)
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
if admit != nil && admit.Handles(admission.Delete) { if admit != nil && admit.Handles(admission.Delete) {
userInfo, _ := api.UserFrom(ctx) userInfo, _ := request.UserFrom(ctx)
err = admit.Admit(admission.NewAttributesRecord(nil, nil, scope.Kind, namespace, "", scope.Resource, scope.Subresource, admission.Delete, userInfo)) err = admit.Admit(admission.NewAttributesRecord(nil, nil, scope.Kind, namespace, "", scope.Resource, scope.Subresource, admission.Delete, userInfo))
if err != nil { if err != nil {

View File

@ -32,6 +32,7 @@ import (
"k8s.io/kubernetes/pkg/api/testapi" "k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
@ -83,7 +84,7 @@ func (p *testPatcher) New() runtime.Object {
return &api.Pod{} return &api.Pod{}
} }
func (p *testPatcher) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { func (p *testPatcher) Update(ctx request.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) {
currentPod := p.startingPod currentPod := p.startingPod
if p.numUpdates > 0 { if p.numUpdates > 0 {
currentPod = p.updatePod currentPod = p.updatePod
@ -102,7 +103,7 @@ func (p *testPatcher) Update(ctx api.Context, name string, objInfo rest.UpdatedO
return inPod, false, nil return inPod, false, nil
} }
func (p *testPatcher) Get(ctx api.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { func (p *testPatcher) Get(ctx request.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
p.t.Fatal("Unexpected call to testPatcher.Get") p.t.Fatal("Unexpected call to testPatcher.Get")
return nil, errors.New("Unexpected call to testPatcher.Get") return nil, errors.New("Unexpected call to testPatcher.Get")
} }
@ -182,8 +183,8 @@ func (tc *patchTestCase) Run(t *testing.T) {
testPatcher.startingPod = tc.startingPod testPatcher.startingPod = tc.startingPod
testPatcher.updatePod = tc.updatePod testPatcher.updatePod = tc.updatePod
ctx := api.NewDefaultContext() ctx := request.NewDefaultContext()
ctx = api.WithNamespace(ctx, namespace) ctx = request.WithNamespace(ctx, namespace)
namer := &testNamer{namespace, name} namer := &testNamer{namespace, name}
copier := runtime.ObjectCopier(api.Scheme) copier := runtime.ObjectCopier(api.Scheme)

View File

@ -37,6 +37,7 @@ import (
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers"
"k8s.io/kubernetes/pkg/genericapiserver/api/handlers/negotiation" "k8s.io/kubernetes/pkg/genericapiserver/api/handlers/negotiation"
"k8s.io/kubernetes/pkg/genericapiserver/api/metrics" "k8s.io/kubernetes/pkg/genericapiserver/api/metrics"
"k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
utilstrings "k8s.io/kubernetes/pkg/util/strings" utilstrings "k8s.io/kubernetes/pkg/util/strings"
@ -341,14 +342,14 @@ func (a *APIInstaller) registerResourceHandlers(path string, storage rest.Storag
} }
var ctxFn handlers.ContextFunc var ctxFn handlers.ContextFunc
ctxFn = func(req *restful.Request) api.Context { ctxFn = func(req *restful.Request) request.Context {
if context == nil { if context == nil {
return api.WithUserAgent(api.NewContext(), req.HeaderParameter("User-Agent")) return request.WithUserAgent(request.NewContext(), req.HeaderParameter("User-Agent"))
} }
if ctx, ok := context.Get(req.Request); ok { if ctx, ok := context.Get(req.Request); ok {
return api.WithUserAgent(ctx, req.HeaderParameter("User-Agent")) return request.WithUserAgent(ctx, req.HeaderParameter("User-Agent"))
} }
return api.WithUserAgent(api.NewContext(), req.HeaderParameter("User-Agent")) return request.WithUserAgent(request.NewContext(), req.HeaderParameter("User-Agent"))
} }
allowWatchList := isWatcher && isLister // watching on lists is allowed only for kinds that support both watch and list. allowWatchList := isWatcher && isLister // watching on lists is allowed only for kinds that support both watch and list.

View File

@ -11,13 +11,18 @@ load(
go_library( go_library(
name = "go_default_library", name = "go_default_library",
srcs = [ srcs = [
"context.go",
"doc.go", "doc.go",
"requestcontext.go",
"requestinfo.go", "requestinfo.go",
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library", "//pkg/auth/user:go_default_library",
"//pkg/types:go_default_library",
"//pkg/util/sets:go_default_library", "//pkg/util/sets:go_default_library",
"//vendor:github.com/golang/glog",
"//vendor:golang.org/x/net/context",
], ],
) )
@ -26,9 +31,17 @@ go_test(
srcs = ["requestinfo_test.go"], srcs = ["requestinfo_test.go"],
library = ":go_default_library", library = ":go_default_library",
tags = ["automanaged"], tags = ["automanaged"],
deps = ["//pkg/util/sets:go_default_library"],
)
go_test(
name = "go_default_xtest",
srcs = ["context_test.go"],
tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library", "//pkg/api:go_default_library",
"//pkg/api/testapi:go_default_library", "//pkg/auth/user:go_default_library",
"//pkg/util/sets:go_default_library", "//pkg/genericapiserver/api/request:go_default_library",
"//pkg/types:go_default_library",
], ],
) )

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package request
import ( import (
stderrs "errors" stderrs "errors"
@ -62,6 +62,8 @@ const (
// userAgentKey is the context key for the request user agent. // userAgentKey is the context key for the request user agent.
userAgentKey userAgentKey
namespaceDefault = "default" // TODO(sttts): solve import cycle when using api.NamespaceDefault
) )
// NewContext instantiates a base context object for request flows. // NewContext instantiates a base context object for request flows.
@ -71,7 +73,7 @@ func NewContext() Context {
// NewDefaultContext instantiates a base context object for request flows in the default namespace // NewDefaultContext instantiates a base context object for request flows in the default namespace
func NewDefaultContext() Context { func NewDefaultContext() Context {
return WithNamespace(NewContext(), NamespaceDefault) return WithNamespace(NewContext(), namespaceDefault)
} }
// WithValue returns a copy of parent in which the value associated with key is val. // WithValue returns a copy of parent in which the value associated with key is val.
@ -100,20 +102,11 @@ func NamespaceValue(ctx Context) string {
return namespace return namespace
} }
// ValidNamespace returns false if the namespace on the context differs from the resource. If the resource has no namespace, it is set to the value in the context.
func ValidNamespace(ctx Context, resource *ObjectMeta) bool {
ns, ok := NamespaceFrom(ctx)
if len(resource.Namespace) == 0 {
resource.Namespace = ns
}
return ns == resource.Namespace && ok
}
// WithNamespaceDefaultIfNone returns a context whose namespace is the default if and only if the parent context has no namespace value // WithNamespaceDefaultIfNone returns a context whose namespace is the default if and only if the parent context has no namespace value
func WithNamespaceDefaultIfNone(parent Context) Context { func WithNamespaceDefaultIfNone(parent Context) Context {
namespace, ok := NamespaceFrom(parent) namespace, ok := NamespaceFrom(parent)
if !ok || len(namespace) == 0 { if !ok || len(namespace) == 0 {
return WithNamespace(parent, NamespaceDefault) return WithNamespace(parent, namespaceDefault)
} }
return parent return parent
} }

View File

@ -14,20 +14,21 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api_test package request_test
import ( import (
"testing" "testing"
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/auth/user" "k8s.io/kubernetes/pkg/auth/user"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
) )
// TestNamespaceContext validates that a namespace can be get/set on a context object // TestNamespaceContext validates that a namespace can be get/set on a context object
func TestNamespaceContext(t *testing.T) { func TestNamespaceContext(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
result, ok := api.NamespaceFrom(ctx) result, ok := genericapirequest.NamespaceFrom(ctx)
if !ok { if !ok {
t.Fatalf("Error getting namespace") t.Fatalf("Error getting namespace")
} }
@ -35,8 +36,8 @@ func TestNamespaceContext(t *testing.T) {
t.Fatalf("Expected: %s, Actual: %s", api.NamespaceDefault, result) t.Fatalf("Expected: %s, Actual: %s", api.NamespaceDefault, result)
} }
ctx = api.NewContext() ctx = genericapirequest.NewContext()
result, ok = api.NamespaceFrom(ctx) result, ok = genericapirequest.NamespaceFrom(ctx)
if ok { if ok {
t.Fatalf("Should not be ok because there is no namespace on the context") t.Fatalf("Should not be ok because there is no namespace on the context")
} }
@ -44,8 +45,8 @@ func TestNamespaceContext(t *testing.T) {
// TestValidNamespace validates that namespace rules are enforced on a resource prior to create or update // TestValidNamespace validates that namespace rules are enforced on a resource prior to create or update
func TestValidNamespace(t *testing.T) { func TestValidNamespace(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
namespace, _ := api.NamespaceFrom(ctx) namespace, _ := genericapirequest.NamespaceFrom(ctx)
resource := api.ReplicationController{} resource := api.ReplicationController{}
if !api.ValidNamespace(ctx, &resource.ObjectMeta) { if !api.ValidNamespace(ctx, &resource.ObjectMeta) {
t.Fatalf("expected success") t.Fatalf("expected success")
@ -57,13 +58,13 @@ func TestValidNamespace(t *testing.T) {
if api.ValidNamespace(ctx, &resource.ObjectMeta) { if api.ValidNamespace(ctx, &resource.ObjectMeta) {
t.Fatalf("Expected error that resource and context errors do not match because resource has different namespace") t.Fatalf("Expected error that resource and context errors do not match because resource has different namespace")
} }
ctx = api.NewContext() ctx = genericapirequest.NewContext()
if api.ValidNamespace(ctx, &resource.ObjectMeta) { if api.ValidNamespace(ctx, &resource.ObjectMeta) {
t.Fatalf("Expected error that resource and context errors do not match since context has no namespace") t.Fatalf("Expected error that resource and context errors do not match since context has no namespace")
} }
ctx = api.NewContext() ctx = genericapirequest.NewContext()
ns := api.NamespaceValue(ctx) ns := genericapirequest.NamespaceValue(ctx)
if ns != "" { if ns != "" {
t.Fatalf("Expected the empty string") t.Fatalf("Expected the empty string")
} }
@ -71,12 +72,12 @@ func TestValidNamespace(t *testing.T) {
//TestUserContext validates that a userinfo can be get/set on a context object //TestUserContext validates that a userinfo can be get/set on a context object
func TestUserContext(t *testing.T) { func TestUserContext(t *testing.T) {
ctx := api.NewContext() ctx := genericapirequest.NewContext()
_, ok := api.UserFrom(ctx) _, ok := genericapirequest.UserFrom(ctx)
if ok { if ok {
t.Fatalf("Should not be ok because there is no user.Info on the context") t.Fatalf("Should not be ok because there is no user.Info on the context")
} }
ctx = api.WithUser( ctx = genericapirequest.WithUser(
ctx, ctx,
&user.DefaultInfo{ &user.DefaultInfo{
Name: "bob", Name: "bob",
@ -86,7 +87,7 @@ func TestUserContext(t *testing.T) {
}, },
) )
result, ok := api.UserFrom(ctx) result, ok := genericapirequest.UserFrom(ctx)
if !ok { if !ok {
t.Fatalf("Error getting user info") t.Fatalf("Error getting user info")
} }
@ -122,16 +123,16 @@ func TestUserContext(t *testing.T) {
//TestUIDContext validates that a UID can be get/set on a context object //TestUIDContext validates that a UID can be get/set on a context object
func TestUIDContext(t *testing.T) { func TestUIDContext(t *testing.T) {
ctx := api.NewContext() ctx := genericapirequest.NewContext()
_, ok := api.UIDFrom(ctx) _, ok := genericapirequest.UIDFrom(ctx)
if ok { if ok {
t.Fatalf("Should not be ok because there is no UID on the context") t.Fatalf("Should not be ok because there is no UID on the context")
} }
ctx = api.WithUID( ctx = genericapirequest.WithUID(
ctx, ctx,
types.UID("testUID"), types.UID("testUID"),
) )
_, ok = api.UIDFrom(ctx) _, ok = genericapirequest.UIDFrom(ctx)
if !ok { if !ok {
t.Fatalf("Error getting UID") t.Fatalf("Error getting UID")
} }
@ -139,17 +140,17 @@ func TestUIDContext(t *testing.T) {
//TestUserAgentContext validates that a useragent can be get/set on a context object //TestUserAgentContext validates that a useragent can be get/set on a context object
func TestUserAgentContext(t *testing.T) { func TestUserAgentContext(t *testing.T) {
ctx := api.NewContext() ctx := genericapirequest.NewContext()
_, ok := api.UserAgentFrom(ctx) _, ok := genericapirequest.UserAgentFrom(ctx)
if ok { if ok {
t.Fatalf("Should not be ok because there is no UserAgent on the context") t.Fatalf("Should not be ok because there is no UserAgent on the context")
} }
ctx = api.WithUserAgent( ctx = genericapirequest.WithUserAgent(
ctx, ctx,
"TestUserAgent", "TestUserAgent",
) )
result, ok := api.UserAgentFrom(ctx) result, ok := genericapirequest.UserAgentFrom(ctx)
if !ok { if !ok {
t.Fatalf("Error getting UserAgent") t.Fatalf("Error getting UserAgent")
} }

View File

@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package api package request
import ( import (
"errors" "errors"

View File

@ -21,7 +21,6 @@ import (
"net/http" "net/http"
"strings" "strings"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
@ -177,7 +176,7 @@ func (r *RequestInfoFactory) NewRequestInfo(req *http.Request) (*RequestInfo, er
} }
} }
} else { } else {
requestInfo.Namespace = api.NamespaceNone requestInfo.Namespace = "" // TODO(sttts): solve import cycle when using api.NamespaceNone
} }
// parsing successful, so we now know the proper value for .Parts // parsing successful, so we now know the proper value for .Parts
@ -222,12 +221,12 @@ type requestInfoKeyType int
const requestInfoKey requestInfoKeyType = iota const requestInfoKey requestInfoKeyType = iota
// WithRequestInfo returns a copy of parent in which the request info value is set // WithRequestInfo returns a copy of parent in which the request info value is set
func WithRequestInfo(parent api.Context, info *RequestInfo) api.Context { func WithRequestInfo(parent Context, info *RequestInfo) Context {
return api.WithValue(parent, requestInfoKey, info) return WithValue(parent, requestInfoKey, info)
} }
// RequestInfoFrom returns the value of the RequestInfo key on the ctx // RequestInfoFrom returns the value of the RequestInfo key on the ctx
func RequestInfoFrom(ctx api.Context) (*RequestInfo, bool) { func RequestInfoFrom(ctx Context) (*RequestInfo, bool) {
info, ok := ctx.Value(requestInfoKey).(*RequestInfo) info, ok := ctx.Value(requestInfoKey).(*RequestInfo)
return info, ok return info, ok
} }

View File

@ -21,8 +21,6 @@ import (
"reflect" "reflect"
"testing" "testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/testapi"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
) )
@ -32,15 +30,8 @@ func (fakeRL) Stop() {}
func (f fakeRL) TryAccept() bool { return bool(f) } func (f fakeRL) TryAccept() bool { return bool(f) }
func (f fakeRL) Accept() {} func (f fakeRL) Accept() {}
func getPath(resource, namespace, name string) string {
return testapi.Default.ResourcePath(resource, namespace, name)
}
func pathWithPrefix(prefix, resource, namespace, name string) string {
return testapi.Default.ResourcePathWithPrefix(prefix, resource, namespace, name)
}
func TestGetAPIRequestInfo(t *testing.T) { func TestGetAPIRequestInfo(t *testing.T) {
namespaceAll := "" // TODO(sttts): solve import cycle when using api.NamespaceAll
successCases := []struct { successCases := []struct {
method string method string
url string url string
@ -62,8 +53,8 @@ func TestGetAPIRequestInfo(t *testing.T) {
{"GET", "/api/v1/namespaces/other/pods", "list", "api", "", "v1", "other", "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/namespaces/other/pods", "list", "api", "", "v1", "other", "pods", "", "", []string{"pods"}},
{"GET", "/api/v1/namespaces/other/pods/foo", "get", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo"}}, {"GET", "/api/v1/namespaces/other/pods/foo", "get", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo"}},
{"HEAD", "/api/v1/namespaces/other/pods/foo", "get", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo"}}, {"HEAD", "/api/v1/namespaces/other/pods/foo", "get", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo"}},
{"GET", "/api/v1/pods", "list", "api", "", "v1", api.NamespaceAll, "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/pods", "list", "api", "", "v1", namespaceAll, "pods", "", "", []string{"pods"}},
{"HEAD", "/api/v1/pods", "list", "api", "", "v1", api.NamespaceAll, "pods", "", "", []string{"pods"}}, {"HEAD", "/api/v1/pods", "list", "api", "", "v1", namespaceAll, "pods", "", "", []string{"pods"}},
{"GET", "/api/v1/namespaces/other/pods/foo", "get", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo"}}, {"GET", "/api/v1/namespaces/other/pods/foo", "get", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo"}},
{"GET", "/api/v1/namespaces/other/pods", "list", "api", "", "v1", "other", "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/namespaces/other/pods", "list", "api", "", "v1", "other", "pods", "", "", []string{"pods"}},
@ -72,9 +63,9 @@ func TestGetAPIRequestInfo(t *testing.T) {
{"GET", "/api/v1/proxy/namespaces/other/pods/foo/subpath/not/a/subresource", "proxy", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo", "subpath", "not", "a", "subresource"}}, {"GET", "/api/v1/proxy/namespaces/other/pods/foo/subpath/not/a/subresource", "proxy", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo", "subpath", "not", "a", "subresource"}},
{"GET", "/api/v1/redirect/namespaces/other/pods/foo", "redirect", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo"}}, {"GET", "/api/v1/redirect/namespaces/other/pods/foo", "redirect", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo"}},
{"GET", "/api/v1/redirect/namespaces/other/pods/foo/subpath/not/a/subresource", "redirect", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo", "subpath", "not", "a", "subresource"}}, {"GET", "/api/v1/redirect/namespaces/other/pods/foo/subpath/not/a/subresource", "redirect", "api", "", "v1", "other", "pods", "", "foo", []string{"pods", "foo", "subpath", "not", "a", "subresource"}},
{"GET", "/api/v1/watch/pods", "watch", "api", "", "v1", api.NamespaceAll, "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/watch/pods", "watch", "api", "", "v1", namespaceAll, "pods", "", "", []string{"pods"}},
{"GET", "/api/v1/pods?watch=true", "watch", "api", "", "v1", api.NamespaceAll, "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/pods?watch=true", "watch", "api", "", "v1", namespaceAll, "pods", "", "", []string{"pods"}},
{"GET", "/api/v1/pods?watch=false", "list", "api", "", "v1", api.NamespaceAll, "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/pods?watch=false", "list", "api", "", "v1", namespaceAll, "pods", "", "", []string{"pods"}},
{"GET", "/api/v1/watch/namespaces/other/pods", "watch", "api", "", "v1", "other", "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/watch/namespaces/other/pods", "watch", "api", "", "v1", "other", "pods", "", "", []string{"pods"}},
{"GET", "/api/v1/namespaces/other/pods?watch=1", "watch", "api", "", "v1", "other", "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/namespaces/other/pods?watch=1", "watch", "api", "", "v1", "other", "pods", "", "", []string{"pods"}},
{"GET", "/api/v1/namespaces/other/pods?watch=0", "list", "api", "", "v1", "other", "pods", "", "", []string{"pods"}}, {"GET", "/api/v1/namespaces/other/pods?watch=0", "list", "api", "", "v1", "other", "pods", "", "", []string{"pods"}},

View File

@ -126,7 +126,7 @@ type Config struct {
LegacyAPIGroupPrefixes sets.String LegacyAPIGroupPrefixes sets.String
// RequestContextMapper maps requests to contexts. Exported so downstream consumers can provider their own mappers // RequestContextMapper maps requests to contexts. Exported so downstream consumers can provider their own mappers
// TODO confirm that anyone downstream actually uses this and doesn't just need an accessor // TODO confirm that anyone downstream actually uses this and doesn't just need an accessor
RequestContextMapper api.RequestContextMapper RequestContextMapper apirequest.RequestContextMapper
// Serializer is required and provides the interface for serializing and converting objects to and from the wire // Serializer is required and provides the interface for serializing and converting objects to and from the wire
// The default (api.Codecs) usually works fine. // The default (api.Codecs) usually works fine.
Serializer runtime.NegotiatedSerializer Serializer runtime.NegotiatedSerializer
@ -195,7 +195,7 @@ func NewConfig() *Config {
config := &Config{ config := &Config{
Serializer: api.Codecs, Serializer: api.Codecs,
ReadWritePort: 6443, ReadWritePort: 6443,
RequestContextMapper: api.NewRequestContextMapper(), RequestContextMapper: apirequest.NewRequestContextMapper(),
BuildHandlerChainsFunc: DefaultBuildHandlerChain, BuildHandlerChainsFunc: DefaultBuildHandlerChain,
LegacyAPIGroupPrefixes: sets.NewString(DefaultLegacyAPIPrefix), LegacyAPIGroupPrefixes: sets.NewString(DefaultLegacyAPIPrefix),
HealthzChecks: []healthz.HealthzChecker{healthz.PingHealthz}, HealthzChecks: []healthz.HealthzChecker{healthz.PingHealthz},
@ -563,7 +563,7 @@ func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) (secure, insec
handler = genericfilters.WithTimeoutForNonLongRunningRequests(handler, c.RequestContextMapper, c.LongRunningFunc) handler = genericfilters.WithTimeoutForNonLongRunningRequests(handler, c.RequestContextMapper, c.LongRunningFunc)
handler = genericfilters.WithMaxInFlightLimit(handler, c.MaxRequestsInFlight, c.MaxMutatingRequestsInFlight, c.RequestContextMapper, c.LongRunningFunc) handler = genericfilters.WithMaxInFlightLimit(handler, c.MaxRequestsInFlight, c.MaxMutatingRequestsInFlight, c.RequestContextMapper, c.LongRunningFunc)
handler = genericapifilters.WithRequestInfo(handler, NewRequestInfoResolver(c), c.RequestContextMapper) handler = genericapifilters.WithRequestInfo(handler, NewRequestInfoResolver(c), c.RequestContextMapper)
handler = api.WithRequestContext(handler, c.RequestContextMapper) handler = apirequest.WithRequestContext(handler, c.RequestContextMapper)
return handler return handler
} }
audit := func(handler http.Handler) http.Handler { audit := func(handler http.Handler) http.Handler {

View File

@ -41,7 +41,6 @@ go_test(
library = ":go_default_library", library = ":go_default_library",
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library", "//pkg/api/errors:go_default_library",
"//pkg/genericapiserver/api/filters:go_default_library", "//pkg/genericapiserver/api/filters:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library", "//pkg/genericapiserver/api/request:go_default_library",

View File

@ -20,9 +20,9 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
apirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request" apirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/httplog" "k8s.io/kubernetes/pkg/httplog"
"k8s.io/kubernetes/pkg/util/sets" "k8s.io/kubernetes/pkg/util/sets"
@ -46,7 +46,7 @@ func WithMaxInFlightLimit(
handler http.Handler, handler http.Handler,
nonMutatingLimit int, nonMutatingLimit int,
mutatingLimit int, mutatingLimit int,
requestContextMapper api.RequestContextMapper, requestContextMapper genericapirequest.RequestContextMapper,
longRunningRequestCheck LongRunningRequestCheck, longRunningRequestCheck LongRunningRequestCheck,
) http.Handler { ) http.Handler {
if nonMutatingLimit == 0 && mutatingLimit == 0 { if nonMutatingLimit == 0 && mutatingLimit == 0 {

View File

@ -24,7 +24,6 @@ import (
"sync" "sync"
"testing" "testing"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
apifilters "k8s.io/kubernetes/pkg/genericapiserver/api/filters" apifilters "k8s.io/kubernetes/pkg/genericapiserver/api/filters"
apirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request" apirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
@ -35,7 +34,7 @@ func createMaxInflightServer(callsWg, blockWg *sync.WaitGroup, disableCallsWg *b
longRunningRequestCheck := BasicLongRunningRequestCheck(sets.NewString("watch"), sets.NewString("proxy")) longRunningRequestCheck := BasicLongRunningRequestCheck(sets.NewString("watch"), sets.NewString("proxy"))
requestContextMapper := api.NewRequestContextMapper() requestContextMapper := apirequest.NewRequestContextMapper()
requestInfoFactory := &apirequest.RequestInfoFactory{APIPrefixes: sets.NewString("apis", "api"), GrouplessAPIPrefixes: sets.NewString("api")} requestInfoFactory := &apirequest.RequestInfoFactory{APIPrefixes: sets.NewString("apis", "api"), GrouplessAPIPrefixes: sets.NewString("api")}
handler := WithMaxInFlightLimit( handler := WithMaxInFlightLimit(
http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@ -57,7 +56,7 @@ func createMaxInflightServer(callsWg, blockWg *sync.WaitGroup, disableCallsWg *b
longRunningRequestCheck, longRunningRequestCheck,
) )
handler = apifilters.WithRequestInfo(handler, requestInfoFactory, requestContextMapper) handler = apifilters.WithRequestInfo(handler, requestInfoFactory, requestContextMapper)
handler = api.WithRequestContext(handler, requestContextMapper) handler = apirequest.WithRequestContext(handler, requestContextMapper)
return httptest.NewServer(handler) return httptest.NewServer(handler)
} }

View File

@ -22,7 +22,6 @@ import (
"github.com/golang/glog" "github.com/golang/glog"
"k8s.io/kubernetes/pkg/api"
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
apirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request" apirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/httplog" "k8s.io/kubernetes/pkg/httplog"
@ -30,7 +29,7 @@ import (
) )
// WithPanicRecovery wraps an http Handler to recover and log panics. // WithPanicRecovery wraps an http Handler to recover and log panics.
func WithPanicRecovery(handler http.Handler, requestContextMapper api.RequestContextMapper) http.Handler { func WithPanicRecovery(handler http.Handler, requestContextMapper apirequest.RequestContextMapper) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
defer runtime.HandleCrash(func(err interface{}) { defer runtime.HandleCrash(func(err interface{}) {
http.Error(w, "This request caused apisever to panic. Look in log for details.", http.StatusInternalServerError) http.Error(w, "This request caused apisever to panic. Look in log for details.", http.StatusInternalServerError)

View File

@ -35,7 +35,7 @@ const globalTimeout = time.Minute
var errConnKilled = fmt.Errorf("kill connection/stream") var errConnKilled = fmt.Errorf("kill connection/stream")
// WithTimeoutForNonLongRunningRequests times out non-long-running requests after the time given by globalTimeout. // WithTimeoutForNonLongRunningRequests times out non-long-running requests after the time given by globalTimeout.
func WithTimeoutForNonLongRunningRequests(handler http.Handler, requestContextMapper api.RequestContextMapper, longRunning LongRunningRequestCheck) http.Handler { func WithTimeoutForNonLongRunningRequests(handler http.Handler, requestContextMapper apirequest.RequestContextMapper, longRunning LongRunningRequestCheck) http.Handler {
if longRunning == nil { if longRunning == nil {
return handler return handler
} }

View File

@ -38,6 +38,7 @@ import (
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
genericapi "k8s.io/kubernetes/pkg/genericapiserver/api" genericapi "k8s.io/kubernetes/pkg/genericapiserver/api"
apirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
genericmux "k8s.io/kubernetes/pkg/genericapiserver/mux" genericmux "k8s.io/kubernetes/pkg/genericapiserver/mux"
openapicommon "k8s.io/kubernetes/pkg/genericapiserver/openapi/common" openapicommon "k8s.io/kubernetes/pkg/genericapiserver/openapi/common"
"k8s.io/kubernetes/pkg/genericapiserver/routes" "k8s.io/kubernetes/pkg/genericapiserver/routes"
@ -95,7 +96,7 @@ type GenericAPIServer struct {
admissionControl admission.Interface admissionControl admission.Interface
// requestContextMapper provides a way to get the context for a request. It may be nil. // requestContextMapper provides a way to get the context for a request. It may be nil.
requestContextMapper api.RequestContextMapper requestContextMapper apirequest.RequestContextMapper
// The registered APIs // The registered APIs
HandlerContainer *genericmux.APIContainer HandlerContainer *genericmux.APIContainer
@ -152,7 +153,7 @@ func init() {
// RequestContextMapper is exposed so that third party resource storage can be build in a different location. // RequestContextMapper is exposed so that third party resource storage can be build in a different location.
// TODO refactor third party resource storage // TODO refactor third party resource storage
func (s *GenericAPIServer) RequestContextMapper() api.RequestContextMapper { func (s *GenericAPIServer) RequestContextMapper() apirequest.RequestContextMapper {
return s.requestContextMapper return s.requestContextMapper
} }

View File

@ -38,6 +38,7 @@ import (
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"
"k8s.io/kubernetes/pkg/auth/user" "k8s.io/kubernetes/pkg/auth/user"
openapigen "k8s.io/kubernetes/pkg/generated/openapi" openapigen "k8s.io/kubernetes/pkg/generated/openapi"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing" etcdtesting "k8s.io/kubernetes/pkg/storage/etcd/testing"
@ -55,7 +56,7 @@ func setUp(t *testing.T) (*etcdtesting.EtcdTestServer, Config, *assert.Assertion
config := NewConfig() config := NewConfig()
config.PublicAddress = net.ParseIP("192.168.10.4") config.PublicAddress = net.ParseIP("192.168.10.4")
config.RequestContextMapper = api.NewRequestContextMapper() config.RequestContextMapper = genericapirequest.NewRequestContextMapper()
config.LegacyAPIGroupPrefixes = sets.NewString("/api") config.LegacyAPIGroupPrefixes = sets.NewString("/api")
config.OpenAPIConfig = DefaultOpenAPIConfig(openapigen.OpenAPIDefinitions) config.OpenAPIConfig = DefaultOpenAPIConfig(openapigen.OpenAPIDefinitions)
@ -601,7 +602,7 @@ func (p *testGetterStorage) New() runtime.Object {
} }
} }
func (p *testGetterStorage) Get(ctx api.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { func (p *testGetterStorage) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
return nil, nil return nil, nil
} }

View File

@ -13,7 +13,6 @@ go_library(
srcs = ["kubelet_client.go"], srcs = ["kubelet_client.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/v1:go_default_library", "//pkg/api/v1:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/client/restclient:go_default_library", "//pkg/client/restclient:go_default_library",

View File

@ -21,7 +21,6 @@ import (
"strconv" "strconv"
"time" "time"
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/kubernetes/pkg/api/v1"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
@ -62,7 +61,7 @@ type ConnectionInfo struct {
// ConnectionInfoGetter provides ConnectionInfo for the kubelet running on a named node // ConnectionInfoGetter provides ConnectionInfo for the kubelet running on a named node
type ConnectionInfoGetter interface { type ConnectionInfoGetter interface {
GetConnectionInfo(ctx api.Context, nodeName types.NodeName) (*ConnectionInfo, error) GetConnectionInfo(nodeName types.NodeName) (*ConnectionInfo, error)
} }
func MakeTransport(config *KubeletClientConfig) (http.RoundTripper, error) { func MakeTransport(config *KubeletClientConfig) (http.RoundTripper, error) {
@ -153,7 +152,7 @@ func NewNodeConnectionInfoGetter(nodes NodeGetter, config KubeletClientConfig) (
}, nil }, nil
} }
func (k *NodeConnectionInfoGetter) GetConnectionInfo(ctx api.Context, nodeName types.NodeName) (*ConnectionInfo, error) { func (k *NodeConnectionInfoGetter) GetConnectionInfo(nodeName types.NodeName) (*ConnectionInfo, error) {
node, err := k.nodes.Get(string(nodeName), metav1.GetOptions{}) node, err := k.nodes.Get(string(nodeName), metav1.GetOptions{})
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -117,6 +117,7 @@ go_test(
"//pkg/client/testing/core:go_default_library", "//pkg/client/testing/core:go_default_library",
"//pkg/generated/openapi:go_default_library", "//pkg/generated/openapi:go_default_library",
"//pkg/genericapiserver:go_default_library", "//pkg/genericapiserver:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/kubelet/client:go_default_library", "//pkg/kubelet/client:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/runtime/schema:go_default_library", "//pkg/runtime/schema:go_default_library",

View File

@ -46,6 +46,7 @@ import (
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
openapigen "k8s.io/kubernetes/pkg/generated/openapi" openapigen "k8s.io/kubernetes/pkg/generated/openapi"
"k8s.io/kubernetes/pkg/genericapiserver" "k8s.io/kubernetes/pkg/genericapiserver"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
kubeletclient "k8s.io/kubernetes/pkg/kubelet/client" kubeletclient "k8s.io/kubernetes/pkg/kubelet/client"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/runtime/schema" "k8s.io/kubernetes/pkg/runtime/schema"
@ -88,7 +89,7 @@ func setUp(t *testing.T) (*Master, *etcdtesting.EtcdTestServer, Config, *assert.
config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}}
config.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4") config.GenericConfig.PublicAddress = net.ParseIP("192.168.10.4")
config.GenericConfig.LegacyAPIGroupPrefixes = sets.NewString("/api") config.GenericConfig.LegacyAPIGroupPrefixes = sets.NewString("/api")
config.GenericConfig.RequestContextMapper = api.NewRequestContextMapper() config.GenericConfig.RequestContextMapper = genericapirequest.NewRequestContextMapper()
config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}} config.GenericConfig.LoopbackClientConfig = &restclient.Config{APIPath: "/api", ContentConfig: restclient.ContentConfig{NegotiatedSerializer: api.Codecs}}
config.GenericConfig.EnableMetrics = true config.GenericConfig.EnableMetrics = true
config.EnableCoreControllers = false config.EnableCoreControllers = false

View File

@ -21,6 +21,7 @@ go_library(
"//pkg/genericapiserver:go_default_library", "//pkg/genericapiserver:go_default_library",
"//pkg/genericapiserver/api:go_default_library", "//pkg/genericapiserver/api:go_default_library",
"//pkg/genericapiserver/api/handlers:go_default_library", "//pkg/genericapiserver/api/handlers:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/extensions/rest:go_default_library", "//pkg/registry/extensions/rest:go_default_library",
"//pkg/registry/extensions/thirdpartyresourcedata:go_default_library", "//pkg/registry/extensions/thirdpartyresourcedata:go_default_library",
"//pkg/registry/extensions/thirdpartyresourcedata/etcd:go_default_library", "//pkg/registry/extensions/thirdpartyresourcedata/etcd:go_default_library",

View File

@ -32,6 +32,7 @@ import (
"k8s.io/kubernetes/pkg/genericapiserver" "k8s.io/kubernetes/pkg/genericapiserver"
genericapi "k8s.io/kubernetes/pkg/genericapiserver/api" genericapi "k8s.io/kubernetes/pkg/genericapiserver/api"
genericapihandlers "k8s.io/kubernetes/pkg/genericapiserver/api/handlers" genericapihandlers "k8s.io/kubernetes/pkg/genericapiserver/api/handlers"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
extensionsrest "k8s.io/kubernetes/pkg/registry/extensions/rest" extensionsrest "k8s.io/kubernetes/pkg/registry/extensions/rest"
"k8s.io/kubernetes/pkg/registry/extensions/thirdpartyresourcedata" "k8s.io/kubernetes/pkg/registry/extensions/thirdpartyresourcedata"
thirdpartyresourcedataetcd "k8s.io/kubernetes/pkg/registry/extensions/thirdpartyresourcedata/etcd" thirdpartyresourcedataetcd "k8s.io/kubernetes/pkg/registry/extensions/thirdpartyresourcedata/etcd"
@ -163,7 +164,7 @@ func (m *ThirdPartyResourceServer) RemoveThirdPartyResource(path string) error {
} }
func (m *ThirdPartyResourceServer) removeAllThirdPartyResources(registry *thirdpartyresourcedataetcd.REST) error { func (m *ThirdPartyResourceServer) removeAllThirdPartyResources(registry *thirdpartyresourcedataetcd.REST) error {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
existingData, err := registry.List(ctx, nil) existingData, err := registry.List(ctx, nil)
if err != nil { if err != nil {
return err return err

View File

@ -20,6 +20,7 @@ go_library(
"//pkg/apis/apps:go_default_library", "//pkg/apis/apps:go_default_library",
"//pkg/apis/apps/validation:go_default_library", "//pkg/apis/apps/validation:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
@ -37,5 +38,6 @@ go_test(
"//pkg/api:go_default_library", "//pkg/api:go_default_library",
"//pkg/apis/apps:go_default_library", "//pkg/apis/apps:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
], ],
) )

View File

@ -13,10 +13,10 @@ go_library(
srcs = ["etcd.go"], srcs = ["etcd.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/rest:go_default_library", "//pkg/api/rest:go_default_library",
"//pkg/apis/apps:go_default_library", "//pkg/apis/apps:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/apps/petset:go_default_library", "//pkg/registry/apps/petset:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/registry/generic/registry:go_default_library", "//pkg/registry/generic/registry:go_default_library",
@ -35,6 +35,7 @@ go_test(
"//pkg/apis/apps:go_default_library", "//pkg/apis/apps:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/registry/registrytest:go_default_library", "//pkg/registry/registrytest:go_default_library",

View File

@ -17,10 +17,10 @@ limitations under the License.
package etcd package etcd
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
appsapi "k8s.io/kubernetes/pkg/apis/apps" appsapi "k8s.io/kubernetes/pkg/apis/apps"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/registry/apps/petset" "k8s.io/kubernetes/pkg/registry/apps/petset"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry" genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry"
@ -67,11 +67,11 @@ func (r *StatusREST) New() runtime.Object {
} }
// Get retrieves the object from the storage. It is required to support Patch. // Get retrieves the object from the storage. It is required to support Patch.
func (r *StatusREST) Get(ctx api.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { func (r *StatusREST) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
return r.store.Get(ctx, name, options) return r.store.Get(ctx, name, options)
} }
// Update alters the status subset of an object. // Update alters the status subset of an object.
func (r *StatusREST) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) {
return r.store.Update(ctx, name, objInfo) return r.store.Update(ctx, name, objInfo)
} }

View File

@ -24,6 +24,7 @@ import (
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/registry/registrytest" "k8s.io/kubernetes/pkg/registry/registrytest"
@ -39,7 +40,7 @@ func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer)
// createStatefulSet is a helper function that returns a StatefulSet with the updated resource version. // createStatefulSet is a helper function that returns a StatefulSet with the updated resource version.
func createStatefulSet(storage *REST, ps apps.StatefulSet, t *testing.T) (apps.StatefulSet, error) { func createStatefulSet(storage *REST, ps apps.StatefulSet, t *testing.T) (apps.StatefulSet, error) {
ctx := api.WithNamespace(api.NewContext(), ps.Namespace) ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), ps.Namespace)
obj, err := storage.Create(ctx, &ps) obj, err := storage.Create(ctx, &ps)
if err != nil { if err != nil {
t.Errorf("Failed to create StatefulSet, %v", err) t.Errorf("Failed to create StatefulSet, %v", err)
@ -99,7 +100,7 @@ func TestStatusUpdate(t *testing.T) {
storage, statusStorage, server := newStorage(t) storage, statusStorage, server := newStorage(t)
defer server.Terminate(t) defer server.Terminate(t)
defer storage.Store.DestroyFunc() defer storage.Store.DestroyFunc()
ctx := api.WithNamespace(api.NewContext(), api.NamespaceDefault) ctx := genericapirequest.WithNamespace(genericapirequest.NewContext(), api.NamespaceDefault)
key := "/statefulsets/" + api.NamespaceDefault + "/foo" key := "/statefulsets/" + api.NamespaceDefault + "/foo"
validStatefulSet := validNewStatefulSet() validStatefulSet := validNewStatefulSet()
if err := storage.Storage.Create(ctx, key, validStatefulSet, nil, 0); err != nil { if err := storage.Storage.Create(ctx, key, validStatefulSet, nil, 0); err != nil {

View File

@ -24,6 +24,7 @@ import (
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
"k8s.io/kubernetes/pkg/apis/apps/validation" "k8s.io/kubernetes/pkg/apis/apps/validation"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -46,7 +47,7 @@ func (statefulSetStrategy) NamespaceScoped() bool {
} }
// PrepareForCreate clears the status of an StatefulSet before creation. // PrepareForCreate clears the status of an StatefulSet before creation.
func (statefulSetStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object) { func (statefulSetStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
statefulSet := obj.(*apps.StatefulSet) statefulSet := obj.(*apps.StatefulSet)
// create cannot set status // create cannot set status
statefulSet.Status = apps.StatefulSetStatus{} statefulSet.Status = apps.StatefulSetStatus{}
@ -55,7 +56,7 @@ func (statefulSetStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object)
} }
// PrepareForUpdate clears fields that are not allowed to be set by end users on update. // PrepareForUpdate clears fields that are not allowed to be set by end users on update.
func (statefulSetStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (statefulSetStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newStatefulSet := obj.(*apps.StatefulSet) newStatefulSet := obj.(*apps.StatefulSet)
oldStatefulSet := old.(*apps.StatefulSet) oldStatefulSet := old.(*apps.StatefulSet)
// Update is not allowed to set status // Update is not allowed to set status
@ -71,7 +72,7 @@ func (statefulSetStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Ob
} }
// Validate validates a new StatefulSet. // Validate validates a new StatefulSet.
func (statefulSetStrategy) Validate(ctx api.Context, obj runtime.Object) field.ErrorList { func (statefulSetStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
statefulSet := obj.(*apps.StatefulSet) statefulSet := obj.(*apps.StatefulSet)
return validation.ValidateStatefulSet(statefulSet) return validation.ValidateStatefulSet(statefulSet)
} }
@ -86,7 +87,7 @@ func (statefulSetStrategy) AllowCreateOnUpdate() bool {
} }
// ValidateUpdate is the default update validation for an end user. // ValidateUpdate is the default update validation for an end user.
func (statefulSetStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (statefulSetStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
validationErrorList := validation.ValidateStatefulSet(obj.(*apps.StatefulSet)) validationErrorList := validation.ValidateStatefulSet(obj.(*apps.StatefulSet))
updateErrorList := validation.ValidateStatefulSetUpdate(obj.(*apps.StatefulSet), old.(*apps.StatefulSet)) updateErrorList := validation.ValidateStatefulSetUpdate(obj.(*apps.StatefulSet), old.(*apps.StatefulSet))
return append(validationErrorList, updateErrorList...) return append(validationErrorList, updateErrorList...)
@ -128,7 +129,7 @@ type statefulSetStatusStrategy struct {
var StatusStrategy = statefulSetStatusStrategy{Strategy} var StatusStrategy = statefulSetStatusStrategy{Strategy}
// PrepareForUpdate clears fields that are not allowed to be set by end users on update of status // PrepareForUpdate clears fields that are not allowed to be set by end users on update of status
func (statefulSetStatusStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (statefulSetStatusStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newStatefulSet := obj.(*apps.StatefulSet) newStatefulSet := obj.(*apps.StatefulSet)
oldStatefulSet := old.(*apps.StatefulSet) oldStatefulSet := old.(*apps.StatefulSet)
// status changes are not allowed to update spec // status changes are not allowed to update spec
@ -136,7 +137,7 @@ func (statefulSetStatusStrategy) PrepareForUpdate(ctx api.Context, obj, old runt
} }
// ValidateUpdate is the default update validation for an end user updating status // ValidateUpdate is the default update validation for an end user updating status
func (statefulSetStatusStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (statefulSetStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
// TODO: Validate status updates. // TODO: Validate status updates.
return validation.ValidateStatefulSetStatusUpdate(obj.(*apps.StatefulSet), old.(*apps.StatefulSet)) return validation.ValidateStatefulSetStatusUpdate(obj.(*apps.StatefulSet), old.(*apps.StatefulSet))
} }

View File

@ -22,10 +22,11 @@ import (
"k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/apis/apps"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
func TestStatefulSetStrategy(t *testing.T) { func TestStatefulSetStrategy(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
if !Strategy.NamespaceScoped() { if !Strategy.NamespaceScoped() {
t.Errorf("StatefulSet must be namespace scoped") t.Errorf("StatefulSet must be namespace scoped")
} }
@ -88,7 +89,7 @@ func TestStatefulSetStrategy(t *testing.T) {
} }
func TestStatefulSetStatusStrategy(t *testing.T) { func TestStatefulSetStatusStrategy(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
if !StatusStrategy.NamespaceScoped() { if !StatusStrategy.NamespaceScoped() {
t.Errorf("StatefulSet must be namespace scoped") t.Errorf("StatefulSet must be namespace scoped")
} }

View File

@ -12,10 +12,10 @@ go_library(
srcs = ["storage.go"], srcs = ["storage.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library", "//pkg/api/errors:go_default_library",
"//pkg/apis/authentication:go_default_library", "//pkg/apis/authentication:go_default_library",
"//pkg/auth/authenticator:go_default_library", "//pkg/auth/authenticator:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
], ],
) )

View File

@ -20,10 +20,10 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"k8s.io/kubernetes/pkg/api"
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/apis/authentication" "k8s.io/kubernetes/pkg/apis/authentication"
"k8s.io/kubernetes/pkg/auth/authenticator" "k8s.io/kubernetes/pkg/auth/authenticator"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -39,12 +39,12 @@ func (r *REST) New() runtime.Object {
return &authentication.TokenReview{} return &authentication.TokenReview{}
} }
func (r *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, error) { func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) {
tokenReview, ok := obj.(*authentication.TokenReview) tokenReview, ok := obj.(*authentication.TokenReview)
if !ok { if !ok {
return nil, apierrors.NewBadRequest(fmt.Sprintf("not a TokenReview: %#v", obj)) return nil, apierrors.NewBadRequest(fmt.Sprintf("not a TokenReview: %#v", obj))
} }
namespace := api.NamespaceValue(ctx) namespace := genericapirequest.NamespaceValue(ctx)
if len(namespace) != 0 { if len(namespace) != 0 {
return nil, apierrors.NewBadRequest(fmt.Sprintf("namespace is not allowed on this type: %v", namespace)) return nil, apierrors.NewBadRequest(fmt.Sprintf("namespace is not allowed on this type: %v", namespace))
} }

View File

@ -12,11 +12,11 @@ go_library(
srcs = ["rest.go"], srcs = ["rest.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library", "//pkg/api/errors:go_default_library",
"//pkg/apis/authorization:go_default_library", "//pkg/apis/authorization:go_default_library",
"//pkg/apis/authorization/validation:go_default_library", "//pkg/apis/authorization/validation:go_default_library",
"//pkg/auth/authorizer:go_default_library", "//pkg/auth/authorizer:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/authorization/util:go_default_library", "//pkg/registry/authorization/util:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
], ],

View File

@ -19,11 +19,11 @@ package localsubjectaccessreview
import ( import (
"fmt" "fmt"
kapi "k8s.io/kubernetes/pkg/api"
kapierrors "k8s.io/kubernetes/pkg/api/errors" kapierrors "k8s.io/kubernetes/pkg/api/errors"
authorizationapi "k8s.io/kubernetes/pkg/apis/authorization" authorizationapi "k8s.io/kubernetes/pkg/apis/authorization"
authorizationvalidation "k8s.io/kubernetes/pkg/apis/authorization/validation" authorizationvalidation "k8s.io/kubernetes/pkg/apis/authorization/validation"
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
authorizationutil "k8s.io/kubernetes/pkg/registry/authorization/util" authorizationutil "k8s.io/kubernetes/pkg/registry/authorization/util"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -40,7 +40,7 @@ func (r *REST) New() runtime.Object {
return &authorizationapi.LocalSubjectAccessReview{} return &authorizationapi.LocalSubjectAccessReview{}
} }
func (r *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, error) { func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) {
localSubjectAccessReview, ok := obj.(*authorizationapi.LocalSubjectAccessReview) localSubjectAccessReview, ok := obj.(*authorizationapi.LocalSubjectAccessReview)
if !ok { if !ok {
return nil, kapierrors.NewBadRequest(fmt.Sprintf("not a LocaLocalSubjectAccessReview: %#v", obj)) return nil, kapierrors.NewBadRequest(fmt.Sprintf("not a LocaLocalSubjectAccessReview: %#v", obj))
@ -48,7 +48,7 @@ func (r *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, err
if errs := authorizationvalidation.ValidateLocalSubjectAccessReview(localSubjectAccessReview); len(errs) > 0 { if errs := authorizationvalidation.ValidateLocalSubjectAccessReview(localSubjectAccessReview); len(errs) > 0 {
return nil, kapierrors.NewInvalid(authorizationapi.Kind(localSubjectAccessReview.Kind), "", errs) return nil, kapierrors.NewInvalid(authorizationapi.Kind(localSubjectAccessReview.Kind), "", errs)
} }
namespace := kapi.NamespaceValue(ctx) namespace := genericapirequest.NamespaceValue(ctx)
if len(namespace) == 0 { if len(namespace) == 0 {
return nil, kapierrors.NewBadRequest(fmt.Sprintf("namespace is required on this type: %v", namespace)) return nil, kapierrors.NewBadRequest(fmt.Sprintf("namespace is required on this type: %v", namespace))
} }

View File

@ -12,11 +12,11 @@ go_library(
srcs = ["rest.go"], srcs = ["rest.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library", "//pkg/api/errors:go_default_library",
"//pkg/apis/authorization:go_default_library", "//pkg/apis/authorization:go_default_library",
"//pkg/apis/authorization/validation:go_default_library", "//pkg/apis/authorization/validation:go_default_library",
"//pkg/auth/authorizer:go_default_library", "//pkg/auth/authorizer:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/authorization/util:go_default_library", "//pkg/registry/authorization/util:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
], ],

View File

@ -19,11 +19,11 @@ package selfsubjectaccessreview
import ( import (
"fmt" "fmt"
"k8s.io/kubernetes/pkg/api"
apierrors "k8s.io/kubernetes/pkg/api/errors" apierrors "k8s.io/kubernetes/pkg/api/errors"
authorizationapi "k8s.io/kubernetes/pkg/apis/authorization" authorizationapi "k8s.io/kubernetes/pkg/apis/authorization"
authorizationvalidation "k8s.io/kubernetes/pkg/apis/authorization/validation" authorizationvalidation "k8s.io/kubernetes/pkg/apis/authorization/validation"
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
authorizationutil "k8s.io/kubernetes/pkg/registry/authorization/util" authorizationutil "k8s.io/kubernetes/pkg/registry/authorization/util"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -40,7 +40,7 @@ func (r *REST) New() runtime.Object {
return &authorizationapi.SelfSubjectAccessReview{} return &authorizationapi.SelfSubjectAccessReview{}
} }
func (r *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, error) { func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) {
selfSAR, ok := obj.(*authorizationapi.SelfSubjectAccessReview) selfSAR, ok := obj.(*authorizationapi.SelfSubjectAccessReview)
if !ok { if !ok {
return nil, apierrors.NewBadRequest(fmt.Sprintf("not a SelfSubjectAccessReview: %#v", obj)) return nil, apierrors.NewBadRequest(fmt.Sprintf("not a SelfSubjectAccessReview: %#v", obj))
@ -48,7 +48,7 @@ func (r *REST) Create(ctx api.Context, obj runtime.Object) (runtime.Object, erro
if errs := authorizationvalidation.ValidateSelfSubjectAccessReview(selfSAR); len(errs) > 0 { if errs := authorizationvalidation.ValidateSelfSubjectAccessReview(selfSAR); len(errs) > 0 {
return nil, apierrors.NewInvalid(authorizationapi.Kind(selfSAR.Kind), "", errs) return nil, apierrors.NewInvalid(authorizationapi.Kind(selfSAR.Kind), "", errs)
} }
userToCheck, exists := api.UserFrom(ctx) userToCheck, exists := genericapirequest.UserFrom(ctx)
if !exists { if !exists {
return nil, apierrors.NewBadRequest("no user present on request") return nil, apierrors.NewBadRequest("no user present on request")
} }

View File

@ -12,11 +12,11 @@ go_library(
srcs = ["rest.go"], srcs = ["rest.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/errors:go_default_library", "//pkg/api/errors:go_default_library",
"//pkg/apis/authorization:go_default_library", "//pkg/apis/authorization:go_default_library",
"//pkg/apis/authorization/validation:go_default_library", "//pkg/apis/authorization/validation:go_default_library",
"//pkg/auth/authorizer:go_default_library", "//pkg/auth/authorizer:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/authorization/util:go_default_library", "//pkg/registry/authorization/util:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
], ],

View File

@ -19,11 +19,11 @@ package subjectaccessreview
import ( import (
"fmt" "fmt"
kapi "k8s.io/kubernetes/pkg/api"
kapierrors "k8s.io/kubernetes/pkg/api/errors" kapierrors "k8s.io/kubernetes/pkg/api/errors"
authorizationapi "k8s.io/kubernetes/pkg/apis/authorization" authorizationapi "k8s.io/kubernetes/pkg/apis/authorization"
authorizationvalidation "k8s.io/kubernetes/pkg/apis/authorization/validation" authorizationvalidation "k8s.io/kubernetes/pkg/apis/authorization/validation"
"k8s.io/kubernetes/pkg/auth/authorizer" "k8s.io/kubernetes/pkg/auth/authorizer"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
authorizationutil "k8s.io/kubernetes/pkg/registry/authorization/util" authorizationutil "k8s.io/kubernetes/pkg/registry/authorization/util"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
) )
@ -40,7 +40,7 @@ func (r *REST) New() runtime.Object {
return &authorizationapi.SubjectAccessReview{} return &authorizationapi.SubjectAccessReview{}
} }
func (r *REST) Create(ctx kapi.Context, obj runtime.Object) (runtime.Object, error) { func (r *REST) Create(ctx genericapirequest.Context, obj runtime.Object) (runtime.Object, error) {
subjectAccessReview, ok := obj.(*authorizationapi.SubjectAccessReview) subjectAccessReview, ok := obj.(*authorizationapi.SubjectAccessReview)
if !ok { if !ok {
return nil, kapierrors.NewBadRequest(fmt.Sprintf("not a SubjectAccessReview: %#v", obj)) return nil, kapierrors.NewBadRequest(fmt.Sprintf("not a SubjectAccessReview: %#v", obj))

View File

@ -20,6 +20,7 @@ go_library(
"//pkg/apis/autoscaling:go_default_library", "//pkg/apis/autoscaling:go_default_library",
"//pkg/apis/autoscaling/validation:go_default_library", "//pkg/apis/autoscaling/validation:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
"//pkg/storage:go_default_library", "//pkg/storage:go_default_library",

View File

@ -13,10 +13,10 @@ go_library(
srcs = ["etcd.go"], srcs = ["etcd.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/rest:go_default_library", "//pkg/api/rest:go_default_library",
"//pkg/apis/autoscaling:go_default_library", "//pkg/apis/autoscaling:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/autoscaling/horizontalpodautoscaler:go_default_library", "//pkg/registry/autoscaling/horizontalpodautoscaler:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/registry/generic/registry:go_default_library", "//pkg/registry/generic/registry:go_default_library",

View File

@ -17,10 +17,10 @@ limitations under the License.
package etcd package etcd
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/autoscaling"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler" "k8s.io/kubernetes/pkg/registry/autoscaling/horizontalpodautoscaler"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry" genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry"
@ -66,11 +66,11 @@ func (r *StatusREST) New() runtime.Object {
} }
// Get retrieves the object from the storage. It is required to support Patch. // Get retrieves the object from the storage. It is required to support Patch.
func (r *StatusREST) Get(ctx api.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { func (r *StatusREST) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
return r.store.Get(ctx, name, options) return r.store.Get(ctx, name, options)
} }
// Update alters the status subset of an object. // Update alters the status subset of an object.
func (r *StatusREST) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) {
return r.store.Update(ctx, name, objInfo) return r.store.Update(ctx, name, objInfo)
} }

View File

@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/apis/autoscaling"
"k8s.io/kubernetes/pkg/apis/autoscaling/validation" "k8s.io/kubernetes/pkg/apis/autoscaling/validation"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage" "k8s.io/kubernetes/pkg/storage"
@ -45,7 +46,7 @@ func (autoscalerStrategy) NamespaceScoped() bool {
} }
// PrepareForCreate clears fields that are not allowed to be set by end users on creation. // PrepareForCreate clears fields that are not allowed to be set by end users on creation.
func (autoscalerStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object) { func (autoscalerStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
newHPA := obj.(*autoscaling.HorizontalPodAutoscaler) newHPA := obj.(*autoscaling.HorizontalPodAutoscaler)
// create cannot set status // create cannot set status
@ -53,7 +54,7 @@ func (autoscalerStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object)
} }
// Validate validates a new autoscaler. // Validate validates a new autoscaler.
func (autoscalerStrategy) Validate(ctx api.Context, obj runtime.Object) field.ErrorList { func (autoscalerStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
autoscaler := obj.(*autoscaling.HorizontalPodAutoscaler) autoscaler := obj.(*autoscaling.HorizontalPodAutoscaler)
return validation.ValidateHorizontalPodAutoscaler(autoscaler) return validation.ValidateHorizontalPodAutoscaler(autoscaler)
} }
@ -68,7 +69,7 @@ func (autoscalerStrategy) AllowCreateOnUpdate() bool {
} }
// PrepareForUpdate clears fields that are not allowed to be set by end users on update. // PrepareForUpdate clears fields that are not allowed to be set by end users on update.
func (autoscalerStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (autoscalerStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newHPA := obj.(*autoscaling.HorizontalPodAutoscaler) newHPA := obj.(*autoscaling.HorizontalPodAutoscaler)
oldHPA := old.(*autoscaling.HorizontalPodAutoscaler) oldHPA := old.(*autoscaling.HorizontalPodAutoscaler)
// Update is not allowed to set status // Update is not allowed to set status
@ -76,7 +77,7 @@ func (autoscalerStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Obj
} }
// ValidateUpdate is the default update validation for an end user. // ValidateUpdate is the default update validation for an end user.
func (autoscalerStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (autoscalerStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
return validation.ValidateHorizontalPodAutoscalerUpdate(obj.(*autoscaling.HorizontalPodAutoscaler), old.(*autoscaling.HorizontalPodAutoscaler)) return validation.ValidateHorizontalPodAutoscalerUpdate(obj.(*autoscaling.HorizontalPodAutoscaler), old.(*autoscaling.HorizontalPodAutoscaler))
} }
@ -111,13 +112,13 @@ type autoscalerStatusStrategy struct {
var StatusStrategy = autoscalerStatusStrategy{Strategy} var StatusStrategy = autoscalerStatusStrategy{Strategy}
func (autoscalerStatusStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (autoscalerStatusStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newAutoscaler := obj.(*autoscaling.HorizontalPodAutoscaler) newAutoscaler := obj.(*autoscaling.HorizontalPodAutoscaler)
oldAutoscaler := old.(*autoscaling.HorizontalPodAutoscaler) oldAutoscaler := old.(*autoscaling.HorizontalPodAutoscaler)
// status changes are not allowed to update spec // status changes are not allowed to update spec
newAutoscaler.Spec = oldAutoscaler.Spec newAutoscaler.Spec = oldAutoscaler.Spec
} }
func (autoscalerStatusStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (autoscalerStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
return validation.ValidateHorizontalPodAutoscalerStatusUpdate(obj.(*autoscaling.HorizontalPodAutoscaler), old.(*autoscaling.HorizontalPodAutoscaler)) return validation.ValidateHorizontalPodAutoscalerStatusUpdate(obj.(*autoscaling.HorizontalPodAutoscaler), old.(*autoscaling.HorizontalPodAutoscaler))
} }

View File

@ -20,6 +20,7 @@ go_library(
"//pkg/apis/batch:go_default_library", "//pkg/apis/batch:go_default_library",
"//pkg/apis/batch/validation:go_default_library", "//pkg/apis/batch/validation:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
@ -38,5 +39,6 @@ go_test(
"//pkg/api/testing:go_default_library", "//pkg/api/testing:go_default_library",
"//pkg/apis/batch:go_default_library", "//pkg/apis/batch:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
], ],
) )

View File

@ -13,10 +13,10 @@ go_library(
srcs = ["etcd.go"], srcs = ["etcd.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/rest:go_default_library", "//pkg/api/rest:go_default_library",
"//pkg/apis/batch:go_default_library", "//pkg/apis/batch:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/batch/cronjob:go_default_library", "//pkg/registry/batch/cronjob:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/registry/generic/registry:go_default_library", "//pkg/registry/generic/registry:go_default_library",

View File

@ -17,10 +17,10 @@ limitations under the License.
package etcd package etcd
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/registry/batch/cronjob" "k8s.io/kubernetes/pkg/registry/batch/cronjob"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry" genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry"
@ -68,11 +68,11 @@ func (r *StatusREST) New() runtime.Object {
} }
// Get retrieves the object from the storage. It is required to support Patch. // Get retrieves the object from the storage. It is required to support Patch.
func (r *StatusREST) Get(ctx api.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { func (r *StatusREST) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
return r.store.Get(ctx, name, options) return r.store.Get(ctx, name, options)
} }
// Update alters the status subset of an object. // Update alters the status subset of an object.
func (r *StatusREST) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) {
return r.store.Update(ctx, name, objInfo) return r.store.Update(ctx, name, objInfo)
} }

View File

@ -23,6 +23,7 @@ import (
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
"k8s.io/kubernetes/pkg/apis/batch/validation" "k8s.io/kubernetes/pkg/apis/batch/validation"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -45,20 +46,20 @@ func (scheduledJobStrategy) NamespaceScoped() bool {
} }
// PrepareForCreate clears the status of a scheduled job before creation. // PrepareForCreate clears the status of a scheduled job before creation.
func (scheduledJobStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object) { func (scheduledJobStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
scheduledJob := obj.(*batch.CronJob) scheduledJob := obj.(*batch.CronJob)
scheduledJob.Status = batch.CronJobStatus{} scheduledJob.Status = batch.CronJobStatus{}
} }
// PrepareForUpdate clears fields that are not allowed to be set by end users on update. // PrepareForUpdate clears fields that are not allowed to be set by end users on update.
func (scheduledJobStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (scheduledJobStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newCronJob := obj.(*batch.CronJob) newCronJob := obj.(*batch.CronJob)
oldCronJob := old.(*batch.CronJob) oldCronJob := old.(*batch.CronJob)
newCronJob.Status = oldCronJob.Status newCronJob.Status = oldCronJob.Status
} }
// Validate validates a new scheduled job. // Validate validates a new scheduled job.
func (scheduledJobStrategy) Validate(ctx api.Context, obj runtime.Object) field.ErrorList { func (scheduledJobStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
scheduledJob := obj.(*batch.CronJob) scheduledJob := obj.(*batch.CronJob)
return validation.ValidateCronJob(scheduledJob) return validation.ValidateCronJob(scheduledJob)
} }
@ -77,7 +78,7 @@ func (scheduledJobStrategy) AllowCreateOnUpdate() bool {
} }
// ValidateUpdate is the default update validation for an end user. // ValidateUpdate is the default update validation for an end user.
func (scheduledJobStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (scheduledJobStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
return validation.ValidateCronJob(obj.(*batch.CronJob)) return validation.ValidateCronJob(obj.(*batch.CronJob))
} }
@ -87,13 +88,13 @@ type scheduledJobStatusStrategy struct {
var StatusStrategy = scheduledJobStatusStrategy{Strategy} var StatusStrategy = scheduledJobStatusStrategy{Strategy}
func (scheduledJobStatusStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (scheduledJobStatusStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newJob := obj.(*batch.CronJob) newJob := obj.(*batch.CronJob)
oldJob := old.(*batch.CronJob) oldJob := old.(*batch.CronJob)
newJob.Spec = oldJob.Spec newJob.Spec = oldJob.Spec
} }
func (scheduledJobStatusStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (scheduledJobStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
return field.ErrorList{} return field.ErrorList{}
} }

View File

@ -23,6 +23,7 @@ import (
apitesting "k8s.io/kubernetes/pkg/api/testing" apitesting "k8s.io/kubernetes/pkg/api/testing"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
) )
func newBool(a bool) *bool { func newBool(a bool) *bool {
@ -32,7 +33,7 @@ func newBool(a bool) *bool {
} }
func TestCronJobStrategy(t *testing.T) { func TestCronJobStrategy(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
if !Strategy.NamespaceScoped() { if !Strategy.NamespaceScoped() {
t.Errorf("CronJob must be namespace scoped") t.Errorf("CronJob must be namespace scoped")
} }
@ -94,7 +95,7 @@ func TestCronJobStrategy(t *testing.T) {
} }
func TestCronJobStatusStrategy(t *testing.T) { func TestCronJobStatusStrategy(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
if !StatusStrategy.NamespaceScoped() { if !StatusStrategy.NamespaceScoped() {
t.Errorf("CronJob must be namespace scoped") t.Errorf("CronJob must be namespace scoped")
} }

View File

@ -21,6 +21,7 @@ go_library(
"//pkg/apis/batch/validation:go_default_library", "//pkg/apis/batch/validation:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/fields:go_default_library", "//pkg/fields:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/labels:go_default_library", "//pkg/labels:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/runtime:go_default_library", "//pkg/runtime:go_default_library",
@ -40,6 +41,7 @@ go_test(
"//pkg/api/testing:go_default_library", "//pkg/api/testing:go_default_library",
"//pkg/apis/batch:go_default_library", "//pkg/apis/batch:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/types:go_default_library", "//pkg/types:go_default_library",
], ],
) )

View File

@ -13,10 +13,10 @@ go_library(
srcs = ["etcd.go"], srcs = ["etcd.go"],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api:go_default_library",
"//pkg/api/rest:go_default_library", "//pkg/api/rest:go_default_library",
"//pkg/apis/batch:go_default_library", "//pkg/apis/batch:go_default_library",
"//pkg/apis/meta/v1:go_default_library", "//pkg/apis/meta/v1:go_default_library",
"//pkg/genericapiserver/api/request:go_default_library",
"//pkg/registry/batch/job:go_default_library", "//pkg/registry/batch/job:go_default_library",
"//pkg/registry/generic:go_default_library", "//pkg/registry/generic:go_default_library",
"//pkg/registry/generic/registry:go_default_library", "//pkg/registry/generic/registry:go_default_library",

View File

@ -17,10 +17,10 @@ limitations under the License.
package etcd package etcd
import ( import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/registry/batch/job" "k8s.io/kubernetes/pkg/registry/batch/job"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry" genericregistry "k8s.io/kubernetes/pkg/registry/generic/registry"
@ -83,11 +83,11 @@ func (r *StatusREST) New() runtime.Object {
} }
// Get retrieves the object from the storage. It is required to support Patch. // Get retrieves the object from the storage. It is required to support Patch.
func (r *StatusREST) Get(ctx api.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { func (r *StatusREST) Get(ctx genericapirequest.Context, name string, options *metav1.GetOptions) (runtime.Object, error) {
return r.store.Get(ctx, name, options) return r.store.Get(ctx, name, options)
} }
// Update alters the status subset of an object. // Update alters the status subset of an object.
func (r *StatusREST) Update(ctx api.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) { func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo rest.UpdatedObjectInfo) (runtime.Object, bool, error) {
return r.store.Update(ctx, name, objInfo) return r.store.Update(ctx, name, objInfo)
} }

View File

@ -25,6 +25,7 @@ import (
"k8s.io/kubernetes/pkg/apis/batch/validation" "k8s.io/kubernetes/pkg/apis/batch/validation"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
"k8s.io/kubernetes/pkg/fields" "k8s.io/kubernetes/pkg/fields"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/labels" "k8s.io/kubernetes/pkg/labels"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
@ -47,20 +48,20 @@ func (jobStrategy) NamespaceScoped() bool {
} }
// PrepareForCreate clears the status of a job before creation. // PrepareForCreate clears the status of a job before creation.
func (jobStrategy) PrepareForCreate(ctx api.Context, obj runtime.Object) { func (jobStrategy) PrepareForCreate(ctx genericapirequest.Context, obj runtime.Object) {
job := obj.(*batch.Job) job := obj.(*batch.Job)
job.Status = batch.JobStatus{} job.Status = batch.JobStatus{}
} }
// PrepareForUpdate clears fields that are not allowed to be set by end users on update. // PrepareForUpdate clears fields that are not allowed to be set by end users on update.
func (jobStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (jobStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newJob := obj.(*batch.Job) newJob := obj.(*batch.Job)
oldJob := old.(*batch.Job) oldJob := old.(*batch.Job)
newJob.Status = oldJob.Status newJob.Status = oldJob.Status
} }
// Validate validates a new job. // Validate validates a new job.
func (jobStrategy) Validate(ctx api.Context, obj runtime.Object) field.ErrorList { func (jobStrategy) Validate(ctx genericapirequest.Context, obj runtime.Object) field.ErrorList {
job := obj.(*batch.Job) job := obj.(*batch.Job)
// TODO: move UID generation earlier and do this in defaulting logic? // TODO: move UID generation earlier and do this in defaulting logic?
if job.Spec.ManualSelector == nil || *job.Spec.ManualSelector == false { if job.Spec.ManualSelector == nil || *job.Spec.ManualSelector == false {
@ -133,7 +134,7 @@ func (jobStrategy) AllowCreateOnUpdate() bool {
} }
// ValidateUpdate is the default update validation for an end user. // ValidateUpdate is the default update validation for an end user.
func (jobStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (jobStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
validationErrorList := validation.ValidateJob(obj.(*batch.Job)) validationErrorList := validation.ValidateJob(obj.(*batch.Job))
updateErrorList := validation.ValidateJobUpdate(obj.(*batch.Job), old.(*batch.Job)) updateErrorList := validation.ValidateJobUpdate(obj.(*batch.Job), old.(*batch.Job))
return append(validationErrorList, updateErrorList...) return append(validationErrorList, updateErrorList...)
@ -145,13 +146,13 @@ type jobStatusStrategy struct {
var StatusStrategy = jobStatusStrategy{Strategy} var StatusStrategy = jobStatusStrategy{Strategy}
func (jobStatusStrategy) PrepareForUpdate(ctx api.Context, obj, old runtime.Object) { func (jobStatusStrategy) PrepareForUpdate(ctx genericapirequest.Context, obj, old runtime.Object) {
newJob := obj.(*batch.Job) newJob := obj.(*batch.Job)
oldJob := old.(*batch.Job) oldJob := old.(*batch.Job)
newJob.Spec = oldJob.Spec newJob.Spec = oldJob.Spec
} }
func (jobStatusStrategy) ValidateUpdate(ctx api.Context, obj, old runtime.Object) field.ErrorList { func (jobStatusStrategy) ValidateUpdate(ctx genericapirequest.Context, obj, old runtime.Object) field.ErrorList {
return validation.ValidateJobUpdateStatus(obj.(*batch.Job), old.(*batch.Job)) return validation.ValidateJobUpdateStatus(obj.(*batch.Job), old.(*batch.Job))
} }

View File

@ -25,6 +25,7 @@ import (
apitesting "k8s.io/kubernetes/pkg/api/testing" apitesting "k8s.io/kubernetes/pkg/api/testing"
"k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/apis/batch"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
genericapirequest "k8s.io/kubernetes/pkg/genericapiserver/api/request"
"k8s.io/kubernetes/pkg/types" "k8s.io/kubernetes/pkg/types"
) )
@ -35,7 +36,7 @@ func newBool(a bool) *bool {
} }
func TestJobStrategy(t *testing.T) { func TestJobStrategy(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
if !Strategy.NamespaceScoped() { if !Strategy.NamespaceScoped() {
t.Errorf("Job must be namespace scoped") t.Errorf("Job must be namespace scoped")
} }
@ -102,7 +103,7 @@ func TestJobStrategy(t *testing.T) {
} }
func TestJobStrategyWithGeneration(t *testing.T) { func TestJobStrategyWithGeneration(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
theUID := types.UID("1a2b3c4d5e6f7g8h9i0k") theUID := types.UID("1a2b3c4d5e6f7g8h9i0k")
@ -152,7 +153,7 @@ func TestJobStrategyWithGeneration(t *testing.T) {
} }
func TestJobStatusStrategy(t *testing.T) { func TestJobStatusStrategy(t *testing.T) {
ctx := api.NewDefaultContext() ctx := genericapirequest.NewDefaultContext()
if !StatusStrategy.NamespaceScoped() { if !StatusStrategy.NamespaceScoped() {
t.Errorf("Job must be namespace scoped") t.Errorf("Job must be namespace scoped")
} }

Some files were not shown because too many files have changed in this diff Show More