From ebcff4b5e44afbc40453316322b17f1e983881c6 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Thu, 21 Jan 2016 16:59:30 -0800 Subject: [PATCH] fix the namespaceScoped of cachers --- examples/apiserver/rest/reststorage.go | 11 ++++++++++- pkg/api/rest/create.go | 6 ++++++ pkg/registry/configmap/etcd/etcd.go | 2 +- pkg/registry/controller/etcd/etcd.go | 2 +- pkg/registry/daemonset/etcd/etcd.go | 2 +- pkg/registry/deployment/etcd/etcd.go | 2 +- pkg/registry/endpoint/etcd/etcd.go | 2 +- pkg/registry/generic/etcd/storage_factory.go | 5 +++-- pkg/registry/generic/storage_decorator.go | 5 +++-- pkg/registry/horizontalpodautoscaler/etcd/etcd.go | 2 +- pkg/registry/ingress/etcd/etcd.go | 2 +- pkg/registry/job/etcd/etcd.go | 2 +- pkg/registry/limitrange/etcd/etcd.go | 2 +- pkg/registry/namespace/etcd/etcd.go | 2 +- pkg/registry/node/etcd/etcd.go | 2 +- pkg/registry/persistentvolume/etcd/etcd.go | 2 +- pkg/registry/persistentvolumeclaim/etcd/etcd.go | 2 +- pkg/registry/pod/etcd/etcd.go | 2 +- pkg/registry/podtemplate/etcd/etcd.go | 2 +- pkg/registry/resourcequota/etcd/etcd.go | 2 +- pkg/registry/secret/etcd/etcd.go | 2 +- pkg/registry/service/etcd/etcd.go | 2 +- pkg/registry/serviceaccount/etcd/etcd.go | 2 +- pkg/storage/cacher.go | 5 +++-- 24 files changed, 44 insertions(+), 26 deletions(-) diff --git a/examples/apiserver/rest/reststorage.go b/examples/apiserver/rest/reststorage.go index 8b9a714787..5f2c575a73 100644 --- a/examples/apiserver/rest/reststorage.go +++ b/examples/apiserver/rest/reststorage.go @@ -35,8 +35,10 @@ type REST struct { func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { prefix := "/testtype" newListFunc := func() runtime.Object { return &testgroup.TestTypeList{} } + // Usually you should reuse your RESTCreateStrategy. + strategy := &NotNamespaceScoped{} storageInterface := storageDecorator( - s, 100, &testgroup.TestType{}, prefix, false, newListFunc) + s, 100, &testgroup.TestType{}, prefix, strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &testgroup.TestType{} }, // NewListFunc returns an object capable of storing results of an etcd list. @@ -63,3 +65,10 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *RE } return &REST{store} } + +type NotNamespaceScoped struct { +} + +func (*NotNamespaceScoped) NamespaceScoped() bool { + return false +} diff --git a/pkg/api/rest/create.go b/pkg/api/rest/create.go index 6c39e81247..4e3a8938b0 100644 --- a/pkg/api/rest/create.go +++ b/pkg/api/rest/create.go @@ -118,3 +118,9 @@ func objectMetaAndKind(typer runtime.ObjectTyper, obj runtime.Object) (*api.Obje } return objectMeta, kind, nil } + +// NamespaceScopedStrategy has a method to tell if the object must be in a namespace. +type NamespaceScopedStrategy interface { + // NamespaceScoped returns if the object must be in a namespace. + NamespaceScoped() bool +} diff --git a/pkg/registry/configmap/etcd/etcd.go b/pkg/registry/configmap/etcd/etcd.go index ce77d1368c..edfe2c4674 100644 --- a/pkg/registry/configmap/etcd/etcd.go +++ b/pkg/registry/configmap/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *RE newListFunc := func() runtime.Object { return &api.ConfigMapList{} } storageInterface := storageDecorator( - s, 100, &api.ConfigMap{}, prefix, false, newListFunc) + s, 100, &api.ConfigMap{}, prefix, configmap.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { diff --git a/pkg/registry/controller/etcd/etcd.go b/pkg/registry/controller/etcd/etcd.go index ee0739d24a..f3d2864207 100644 --- a/pkg/registry/controller/etcd/etcd.go +++ b/pkg/registry/controller/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &api.ReplicationControllerList{} } storageInterface := storageDecorator( - s, 100, &api.ReplicationController{}, prefix, true, newListFunc) + s, 100, &api.ReplicationController{}, prefix, controller.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.ReplicationController{} }, diff --git a/pkg/registry/daemonset/etcd/etcd.go b/pkg/registry/daemonset/etcd/etcd.go index 92936d59ea..0c8ea96385 100644 --- a/pkg/registry/daemonset/etcd/etcd.go +++ b/pkg/registry/daemonset/etcd/etcd.go @@ -39,7 +39,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &extensions.DaemonSetList{} } storageInterface := storageDecorator( - s, 100, &extensions.DaemonSet{}, prefix, false, newListFunc) + s, 100, &extensions.DaemonSet{}, prefix, daemonset.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &extensions.DaemonSet{} }, diff --git a/pkg/registry/deployment/etcd/etcd.go b/pkg/registry/deployment/etcd/etcd.go index 5c3370f72e..0759215666 100644 --- a/pkg/registry/deployment/etcd/etcd.go +++ b/pkg/registry/deployment/etcd/etcd.go @@ -62,7 +62,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &extensions.DeploymentList{} } storageInterface := storageDecorator( - s, 100, &extensions.Deployment{}, prefix, false, newListFunc) + s, 100, &extensions.Deployment{}, prefix, deployment.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &extensions.Deployment{} }, diff --git a/pkg/registry/endpoint/etcd/etcd.go b/pkg/registry/endpoint/etcd/etcd.go index dff62ac091..4dc899225c 100644 --- a/pkg/registry/endpoint/etcd/etcd.go +++ b/pkg/registry/endpoint/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *RE newListFunc := func() runtime.Object { return &api.EndpointsList{} } storageInterface := storageDecorator( - s, 1000, &api.Endpoints{}, prefix, true, newListFunc) + s, 1000, &api.Endpoints{}, prefix, endpoint.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Endpoints{} }, diff --git a/pkg/registry/generic/etcd/storage_factory.go b/pkg/registry/generic/etcd/storage_factory.go index a7d0de66e8..9aff3e8c3e 100644 --- a/pkg/registry/generic/etcd/storage_factory.go +++ b/pkg/registry/generic/etcd/storage_factory.go @@ -17,6 +17,7 @@ limitations under the License. package etcd import ( + "k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/storage" etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" @@ -28,9 +29,9 @@ func StorageWithCacher( capacity int, objectType runtime.Object, resourcePrefix string, - namespaceScoped bool, + scopeStrategy rest.NamespaceScopedStrategy, newListFunc func() runtime.Object) storage.Interface { return storage.NewCacher( storageInterface, capacity, etcdstorage.APIObjectVersioner{}, - objectType, resourcePrefix, namespaceScoped, newListFunc) + objectType, resourcePrefix, scopeStrategy, newListFunc) } diff --git a/pkg/registry/generic/storage_decorator.go b/pkg/registry/generic/storage_decorator.go index 96efbb2ffb..70109efe33 100644 --- a/pkg/registry/generic/storage_decorator.go +++ b/pkg/registry/generic/storage_decorator.go @@ -17,6 +17,7 @@ limitations under the License. package generic import ( + "k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/storage" ) @@ -28,7 +29,7 @@ type StorageDecorator func( capacity int, objectType runtime.Object, resourcePrefix string, - namespaceScoped bool, + scopeStrategy rest.NamespaceScopedStrategy, newListFunc func() runtime.Object) storage.Interface // Returns given 'storageInterface' without any decoration. @@ -37,7 +38,7 @@ func UndecoratedStorage( capacity int, objectType runtime.Object, resourcePrefix string, - namespaceScoped bool, + scopeStrategy rest.NamespaceScopedStrategy, newListFunc func() runtime.Object) storage.Interface { return storageInterface } diff --git a/pkg/registry/horizontalpodautoscaler/etcd/etcd.go b/pkg/registry/horizontalpodautoscaler/etcd/etcd.go index d0147bbb26..cb0873438c 100644 --- a/pkg/registry/horizontalpodautoscaler/etcd/etcd.go +++ b/pkg/registry/horizontalpodautoscaler/etcd/etcd.go @@ -38,7 +38,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &extensions.HorizontalPodAutoscalerList{} } storageInterface := storageDecorator( - s, 100, &extensions.HorizontalPodAutoscaler{}, prefix, false, newListFunc) + s, 100, &extensions.HorizontalPodAutoscaler{}, prefix, horizontalpodautoscaler.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &extensions.HorizontalPodAutoscaler{} }, diff --git a/pkg/registry/ingress/etcd/etcd.go b/pkg/registry/ingress/etcd/etcd.go index 25bc86a752..d01d35e53f 100644 --- a/pkg/registry/ingress/etcd/etcd.go +++ b/pkg/registry/ingress/etcd/etcd.go @@ -39,7 +39,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &extensions.IngressList{} } storageInterface := storageDecorator( - s, 100, &extensions.Ingress{}, prefix, false, newListFunc) + s, 100, &extensions.Ingress{}, prefix, ingress.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &extensions.Ingress{} }, diff --git a/pkg/registry/job/etcd/etcd.go b/pkg/registry/job/etcd/etcd.go index adf2f717f7..bc15425fb1 100644 --- a/pkg/registry/job/etcd/etcd.go +++ b/pkg/registry/job/etcd/etcd.go @@ -39,7 +39,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &extensions.JobList{} } storageInterface := storageDecorator( - s, 100, &extensions.Job{}, prefix, false, newListFunc) + s, 100, &extensions.Job{}, prefix, job.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &extensions.Job{} }, diff --git a/pkg/registry/limitrange/etcd/etcd.go b/pkg/registry/limitrange/etcd/etcd.go index b8ac3c479e..f422c0037a 100644 --- a/pkg/registry/limitrange/etcd/etcd.go +++ b/pkg/registry/limitrange/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *RE newListFunc := func() runtime.Object { return &api.LimitRangeList{} } storageInterface := storageDecorator( - s, 100, &api.LimitRange{}, prefix, true, newListFunc) + s, 100, &api.LimitRange{}, prefix, limitrange.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.LimitRange{} }, diff --git a/pkg/registry/namespace/etcd/etcd.go b/pkg/registry/namespace/etcd/etcd.go index a6ae0a34c3..231520d5df 100644 --- a/pkg/registry/namespace/etcd/etcd.go +++ b/pkg/registry/namespace/etcd/etcd.go @@ -53,7 +53,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &api.NamespaceList{} } storageInterface := storageDecorator( - s, 100, &api.Namespace{}, prefix, true, newListFunc) + s, 100, &api.Namespace{}, prefix, namespace.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Namespace{} }, diff --git a/pkg/registry/node/etcd/etcd.go b/pkg/registry/node/etcd/etcd.go index 1972a37774..bfa10bc3bd 100644 --- a/pkg/registry/node/etcd/etcd.go +++ b/pkg/registry/node/etcd/etcd.go @@ -57,7 +57,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator, con newListFunc := func() runtime.Object { return &api.NodeList{} } storageInterface := storageDecorator( - s, 1000, &api.Node{}, prefix, false, newListFunc) + s, 1000, &api.Node{}, prefix, node.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Node{} }, diff --git a/pkg/registry/persistentvolume/etcd/etcd.go b/pkg/registry/persistentvolume/etcd/etcd.go index b41abb4119..0a8e9dccd9 100644 --- a/pkg/registry/persistentvolume/etcd/etcd.go +++ b/pkg/registry/persistentvolume/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &api.PersistentVolumeList{} } storageInterface := storageDecorator( - s, 100, &api.PersistentVolume{}, prefix, true, newListFunc) + s, 100, &api.PersistentVolume{}, prefix, persistentvolume.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.PersistentVolume{} }, diff --git a/pkg/registry/persistentvolumeclaim/etcd/etcd.go b/pkg/registry/persistentvolumeclaim/etcd/etcd.go index 3233a9c128..80b8c67289 100644 --- a/pkg/registry/persistentvolumeclaim/etcd/etcd.go +++ b/pkg/registry/persistentvolumeclaim/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &api.PersistentVolumeClaimList{} } storageInterface := storageDecorator( - s, 100, &api.PersistentVolumeClaim{}, prefix, true, newListFunc) + s, 100, &api.PersistentVolumeClaim{}, prefix, persistentvolumeclaim.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.PersistentVolumeClaim{} }, diff --git a/pkg/registry/pod/etcd/etcd.go b/pkg/registry/pod/etcd/etcd.go index a2bb1d8b93..f4cabe9cde 100644 --- a/pkg/registry/pod/etcd/etcd.go +++ b/pkg/registry/pod/etcd/etcd.go @@ -67,7 +67,7 @@ func NewStorage( newListFunc := func() runtime.Object { return &api.PodList{} } storageInterface := storageDecorator( - s, 1000, &api.Pod{}, prefix, true, newListFunc) + s, 1000, &api.Pod{}, prefix, pod.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Pod{} }, diff --git a/pkg/registry/podtemplate/etcd/etcd.go b/pkg/registry/podtemplate/etcd/etcd.go index 50b9d91a8e..110a27f31d 100644 --- a/pkg/registry/podtemplate/etcd/etcd.go +++ b/pkg/registry/podtemplate/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *RE newListFunc := func() runtime.Object { return &api.PodTemplateList{} } storageInterface := storageDecorator( - s, 100, &api.PodTemplate{}, prefix, false, newListFunc) + s, 100, &api.PodTemplate{}, prefix, podtemplate.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.PodTemplate{} }, diff --git a/pkg/registry/resourcequota/etcd/etcd.go b/pkg/registry/resourcequota/etcd/etcd.go index 629860012b..4eff474b42 100644 --- a/pkg/registry/resourcequota/etcd/etcd.go +++ b/pkg/registry/resourcequota/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*R newListFunc := func() runtime.Object { return &api.ResourceQuotaList{} } storageInterface := storageDecorator( - s, 100, &api.ResourceQuota{}, prefix, true, newListFunc) + s, 100, &api.ResourceQuota{}, prefix, resourcequota.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.ResourceQuota{} }, diff --git a/pkg/registry/secret/etcd/etcd.go b/pkg/registry/secret/etcd/etcd.go index 89739446f3..352e1fe4c1 100644 --- a/pkg/registry/secret/etcd/etcd.go +++ b/pkg/registry/secret/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *RE newListFunc := func() runtime.Object { return &api.SecretList{} } storageInterface := storageDecorator( - s, 100, &api.Secret{}, prefix, true, newListFunc) + s, 100, &api.Secret{}, prefix, secret.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Secret{} }, diff --git a/pkg/registry/service/etcd/etcd.go b/pkg/registry/service/etcd/etcd.go index de905ab296..040582b36a 100644 --- a/pkg/registry/service/etcd/etcd.go +++ b/pkg/registry/service/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *RE newListFunc := func() runtime.Object { return &api.ServiceList{} } storageInterface := storageDecorator( - s, 100, &api.Service{}, prefix, false, newListFunc) + s, 100, &api.Service{}, prefix, service.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Service{} }, diff --git a/pkg/registry/serviceaccount/etcd/etcd.go b/pkg/registry/serviceaccount/etcd/etcd.go index 906dacca4b..4453464538 100644 --- a/pkg/registry/serviceaccount/etcd/etcd.go +++ b/pkg/registry/serviceaccount/etcd/etcd.go @@ -37,7 +37,7 @@ func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *RE newListFunc := func() runtime.Object { return &api.ServiceAccountList{} } storageInterface := storageDecorator( - s, 100, &api.ServiceAccount{}, prefix, true, newListFunc) + s, 100, &api.ServiceAccount{}, prefix, serviceaccount.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.ServiceAccount{} }, diff --git a/pkg/storage/cacher.go b/pkg/storage/cacher.go index 13eabb2b8c..635a1b5dfa 100644 --- a/pkg/storage/cacher.go +++ b/pkg/storage/cacher.go @@ -26,6 +26,7 @@ import ( "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/api/meta" + "k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/conversion" "k8s.io/kubernetes/pkg/runtime" @@ -115,7 +116,7 @@ func NewCacher( versioner Versioner, objectType runtime.Object, resourcePrefix string, - namespaceScoped bool, + scopeStrategy rest.NamespaceScopedStrategy, newListFunc func() runtime.Object) Interface { config := CacherConfig{ CacheCapacity: capacity, @@ -125,7 +126,7 @@ func NewCacher( ResourcePrefix: resourcePrefix, NewListFunc: newListFunc, } - if namespaceScoped { + if scopeStrategy.NamespaceScoped() { config.KeyFunc = func(obj runtime.Object) (string, error) { return NamespaceKeyFunc(resourcePrefix, obj) }