diff --git a/cmd/kube-aggregator/pkg/registry/apiservice/etcd/BUILD b/cmd/kube-aggregator/pkg/registry/apiservice/etcd/BUILD index dc88684280..f75040dd42 100644 --- a/cmd/kube-aggregator/pkg/registry/apiservice/etcd/BUILD +++ b/cmd/kube-aggregator/pkg/registry/apiservice/etcd/BUILD @@ -14,6 +14,7 @@ go_library( deps = [ "//cmd/kube-aggregator/pkg/apis/apiregistration:go_default_library", "//cmd/kube-aggregator/pkg/registry/apiservice:go_default_library", + "//pkg/api:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", "//vendor:k8s.io/apimachinery/pkg/runtime", diff --git a/cmd/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go b/cmd/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go index f50a19cd7b..63e99ffe32 100644 --- a/cmd/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go +++ b/cmd/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go @@ -20,6 +20,7 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/kubernetes/cmd/kube-aggregator/pkg/apis/apiregistration" "k8s.io/kubernetes/cmd/kube-aggregator/pkg/registry/apiservice" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" ) @@ -32,6 +33,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against API services. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &apiregistration.APIService{} }, NewListFunc: func() runtime.Object { return &apiregistration.APIServiceList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/examples/apiserver/rest/reststorage.go b/examples/apiserver/rest/reststorage.go index e13461a04c..61980efbf9 100644 --- a/examples/apiserver/rest/reststorage.go +++ b/examples/apiserver/rest/reststorage.go @@ -39,6 +39,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work with testtype. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &testgroup.TestType{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: func() runtime.Object { return &testgroup.TestTypeList{} }, diff --git a/federation/registry/cluster/etcd/BUILD b/federation/registry/cluster/etcd/BUILD index 43387d954e..ef7cb8eed6 100644 --- a/federation/registry/cluster/etcd/BUILD +++ b/federation/registry/cluster/etcd/BUILD @@ -15,6 +15,7 @@ go_library( deps = [ "//federation/apis/federation:go_default_library", "//federation/registry/cluster:go_default_library", + "//pkg/api:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", "//pkg/genericapiserver/registry/rest:go_default_library", diff --git a/federation/registry/cluster/etcd/etcd.go b/federation/registry/cluster/etcd/etcd.go index 68013b3afc..b665fefc54 100644 --- a/federation/registry/cluster/etcd/etcd.go +++ b/federation/registry/cluster/etcd/etcd.go @@ -21,6 +21,7 @@ import ( genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/kubernetes/federation/apis/federation" "k8s.io/kubernetes/federation/registry/cluster" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" "k8s.io/kubernetes/pkg/genericapiserver/registry/rest" @@ -46,6 +47,7 @@ func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo // NewREST returns a RESTStorage object that will work against clusters. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &federation.Cluster{} }, NewListFunc: func() runtime.Object { return &federation.ClusterList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/genericapiserver/registry/generic/registry/storage_factory.go b/pkg/genericapiserver/registry/generic/registry/storage_factory.go index ac3e9a6e86..bce75f5684 100644 --- a/pkg/genericapiserver/registry/generic/registry/storage_factory.go +++ b/pkg/genericapiserver/registry/generic/registry/storage_factory.go @@ -29,6 +29,7 @@ var _ generic.StorageDecorator = StorageWithCacher // Creates a cacher based given storageConfig. func StorageWithCacher( + copier runtime.ObjectCopier, storageConfig *storagebackend.Config, capacity int, objectType runtime.Object, @@ -45,6 +46,7 @@ func StorageWithCacher( CacheCapacity: capacity, Storage: s, Versioner: etcdstorage.APIObjectVersioner{}, + Copier: copier, Type: objectType, ResourcePrefix: resourcePrefix, KeyFunc: keyFunc, diff --git a/pkg/genericapiserver/registry/generic/registry/store.go b/pkg/genericapiserver/registry/generic/registry/store.go index 67a174e3d3..27047faa64 100644 --- a/pkg/genericapiserver/registry/generic/registry/store.go +++ b/pkg/genericapiserver/registry/generic/registry/store.go @@ -67,6 +67,9 @@ type ObjectFunc func(obj runtime.Object) error // // TODO: make the default exposed methods exactly match a generic RESTStorage type Store struct { + // Copier is used to make some storage caching decorators work + Copier runtime.ObjectCopier + // NewFunc returns a new instance of the type this registry returns for a // GET of a single object, e.g.: // @@ -1116,6 +1119,7 @@ func (e *Store) CompleteWithOptions(options *generic.StoreOptions) error { if e.Storage == nil { e.Storage, e.DestroyFunc = opts.Decorator( + e.Copier, opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Resource(e.QualifiedResource.Resource)), e.NewFunc(), diff --git a/pkg/genericapiserver/registry/generic/registry/store_test.go b/pkg/genericapiserver/registry/generic/registry/store_test.go index aba040c46f..d9bfae794e 100644 --- a/pkg/genericapiserver/registry/generic/registry/store_test.go +++ b/pkg/genericapiserver/registry/generic/registry/store_test.go @@ -1251,6 +1251,7 @@ func newTestGenericStoreRegistry(t *testing.T, hasCacheEnabled bool) (factory.De CacheCapacity: 10, Storage: s, Versioner: etcdstorage.APIObjectVersioner{}, + Copier: api.Scheme, Type: &api.Pod{}, ResourcePrefix: podPrefix, KeyFunc: func(obj runtime.Object) (string, error) { return storage.NoNamespaceKeyFunc(podPrefix, obj) }, @@ -1268,6 +1269,7 @@ func newTestGenericStoreRegistry(t *testing.T, hasCacheEnabled bool) (factory.De } return destroyFunc, &Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.Pod{} }, NewListFunc: func() runtime.Object { return &api.PodList{} }, QualifiedResource: api.Resource("pods"), diff --git a/pkg/genericapiserver/registry/generic/storage_decorator.go b/pkg/genericapiserver/registry/generic/storage_decorator.go index f3a3a911bd..857236b056 100644 --- a/pkg/genericapiserver/registry/generic/storage_decorator.go +++ b/pkg/genericapiserver/registry/generic/storage_decorator.go @@ -27,6 +27,7 @@ import ( // StorageDecorator is a function signature for producing a storage.Interface // and an associated DestroyFunc from given parameters. type StorageDecorator func( + copier runtime.ObjectCopier, config *storagebackend.Config, capacity int, objectType runtime.Object, @@ -39,6 +40,7 @@ type StorageDecorator func( // UndecoratedStorage returns the given a new storage from the given config // without any decoration. func UndecoratedStorage( + copier runtime.ObjectCopier, config *storagebackend.Config, capacity int, objectType runtime.Object, diff --git a/pkg/registry/apps/petset/storage/BUILD b/pkg/registry/apps/petset/storage/BUILD index 8a1d272974..d2aac55d42 100644 --- a/pkg/registry/apps/petset/storage/BUILD +++ b/pkg/registry/apps/petset/storage/BUILD @@ -32,6 +32,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/apps:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/apps/petset/storage/storage.go b/pkg/registry/apps/petset/storage/storage.go index 0c89049a93..919a976333 100644 --- a/pkg/registry/apps/petset/storage/storage.go +++ b/pkg/registry/apps/petset/storage/storage.go @@ -20,6 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" appsapi "k8s.io/kubernetes/pkg/apis/apps" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -35,6 +36,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &appsapi.StatefulSet{} }, NewListFunc: func() runtime.Object { return &appsapi.StatefulSetList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD b/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD index 4b4594ff60..2f9c165788 100644 --- a/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD +++ b/pkg/registry/autoscaling/horizontalpodautoscaler/storage/BUILD @@ -31,6 +31,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/autoscaling:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go b/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go index c5808938e3..105b1fdc91 100644 --- a/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go +++ b/pkg/registry/autoscaling/horizontalpodautoscaler/storage/storage.go @@ -20,6 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/autoscaling" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -34,6 +35,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against horizontal pod autoscalers. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &autoscaling.HorizontalPodAutoscaler{} }, NewListFunc: func() runtime.Object { return &autoscaling.HorizontalPodAutoscalerList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/batch/cronjob/storage/BUILD b/pkg/registry/batch/cronjob/storage/BUILD index 96f67b4aa0..1b272ce291 100644 --- a/pkg/registry/batch/cronjob/storage/BUILD +++ b/pkg/registry/batch/cronjob/storage/BUILD @@ -33,6 +33,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/batch/cronjob/storage/storage.go b/pkg/registry/batch/cronjob/storage/storage.go index 5a4091bcf8..2d38bd192a 100644 --- a/pkg/registry/batch/cronjob/storage/storage.go +++ b/pkg/registry/batch/cronjob/storage/storage.go @@ -20,6 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -35,6 +36,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against CronJobs. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &batch.CronJob{} }, NewListFunc: func() runtime.Object { return &batch.CronJobList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/batch/job/storage/BUILD b/pkg/registry/batch/job/storage/BUILD index 5015156282..559101a89e 100644 --- a/pkg/registry/batch/job/storage/BUILD +++ b/pkg/registry/batch/job/storage/BUILD @@ -31,6 +31,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/batch:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/batch/job/storage/storage.go b/pkg/registry/batch/job/storage/storage.go index 00a188cd7c..c349c18f56 100644 --- a/pkg/registry/batch/job/storage/storage.go +++ b/pkg/registry/batch/job/storage/storage.go @@ -20,6 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/batch" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -50,6 +51,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against Jobs. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &batch.Job{} }, NewListFunc: func() runtime.Object { return &batch.JobList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/certificates/certificates/storage/BUILD b/pkg/registry/certificates/certificates/storage/BUILD index 4730f0b210..acf7153b2a 100644 --- a/pkg/registry/certificates/certificates/storage/BUILD +++ b/pkg/registry/certificates/certificates/storage/BUILD @@ -12,6 +12,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/certificates:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/certificates/certificates/storage/storage.go b/pkg/registry/certificates/certificates/storage/storage.go index 7b2c119bac..0559be933f 100644 --- a/pkg/registry/certificates/certificates/storage/storage.go +++ b/pkg/registry/certificates/certificates/storage/storage.go @@ -19,6 +19,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/certificates" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -34,6 +35,7 @@ type REST struct { // NewREST returns a registry which will store CertificateSigningRequest in the given helper func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *ApprovalREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &certificates.CertificateSigningRequest{} }, NewListFunc: func() runtime.Object { return &certificates.CertificateSigningRequestList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/configmap/storage/storage.go b/pkg/registry/core/configmap/storage/storage.go index 7ab07af21e..869bb72efa 100644 --- a/pkg/registry/core/configmap/storage/storage.go +++ b/pkg/registry/core/configmap/storage/storage.go @@ -32,6 +32,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work with ConfigMap objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.ConfigMap{} }, NewListFunc: func() runtime.Object { return &api.ConfigMapList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/endpoint/storage/storage.go b/pkg/registry/core/endpoint/storage/storage.go index 875817d4b5..56b00c46fa 100644 --- a/pkg/registry/core/endpoint/storage/storage.go +++ b/pkg/registry/core/endpoint/storage/storage.go @@ -31,6 +31,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against endpoints. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.Endpoints{} }, NewListFunc: func() runtime.Object { return &api.EndpointsList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/event/storage/storage.go b/pkg/registry/core/event/storage/storage.go index ff5222bd8a..dcf45bc465 100644 --- a/pkg/registry/core/event/storage/storage.go +++ b/pkg/registry/core/event/storage/storage.go @@ -41,6 +41,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter, ttl uint64) *REST { opts.Decorator = generic.UndecoratedStorage // TODO use watchCacheSize=-1 to signal UndecoratedStorage store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.Event{} }, NewListFunc: func() runtime.Object { return &api.EventList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/limitrange/storage/storage.go b/pkg/registry/core/limitrange/storage/storage.go index d0ce011fe5..5545dd7f95 100644 --- a/pkg/registry/core/limitrange/storage/storage.go +++ b/pkg/registry/core/limitrange/storage/storage.go @@ -31,6 +31,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against horizontal pod autoscalers. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.LimitRange{} }, NewListFunc: func() runtime.Object { return &api.LimitRangeList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/namespace/storage/storage.go b/pkg/registry/core/namespace/storage/storage.go index 76c685d212..eff70ddbe2 100644 --- a/pkg/registry/core/namespace/storage/storage.go +++ b/pkg/registry/core/namespace/storage/storage.go @@ -51,6 +51,7 @@ type FinalizeREST struct { // NewREST returns a RESTStorage object that will work against namespaces. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *FinalizeREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.Namespace{} }, NewListFunc: func() runtime.Object { return &api.NamespaceList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/node/storage/storage.go b/pkg/registry/core/node/storage/storage.go index d76ee3df5a..2d6e8f78f5 100644 --- a/pkg/registry/core/node/storage/storage.go +++ b/pkg/registry/core/node/storage/storage.go @@ -71,6 +71,7 @@ func (r *StatusREST) Update(ctx genericapirequest.Context, name string, objInfo // NewStorage returns a NodeStorage object that will work against nodes. func NewStorage(optsGetter generic.RESTOptionsGetter, kubeletClientConfig client.KubeletClientConfig, proxyTransport http.RoundTripper) (*NodeStorage, error) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.Node{} }, NewListFunc: func() runtime.Object { return &api.NodeList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/persistentvolume/storage/storage.go b/pkg/registry/core/persistentvolume/storage/storage.go index cb22e33d6d..2727cd984e 100644 --- a/pkg/registry/core/persistentvolume/storage/storage.go +++ b/pkg/registry/core/persistentvolume/storage/storage.go @@ -34,6 +34,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against persistent volumes. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.PersistentVolume{} }, NewListFunc: func() runtime.Object { return &api.PersistentVolumeList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/persistentvolumeclaim/storage/storage.go b/pkg/registry/core/persistentvolumeclaim/storage/storage.go index 239d9775fe..c83bc370c1 100644 --- a/pkg/registry/core/persistentvolumeclaim/storage/storage.go +++ b/pkg/registry/core/persistentvolumeclaim/storage/storage.go @@ -34,6 +34,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against persistent volume claims. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.PersistentVolumeClaim{} }, NewListFunc: func() runtime.Object { return &api.PersistentVolumeClaimList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/pod/storage/storage.go b/pkg/registry/core/pod/storage/storage.go index 2af4220fb3..3e6b0f9feb 100644 --- a/pkg/registry/core/pod/storage/storage.go +++ b/pkg/registry/core/pod/storage/storage.go @@ -60,6 +60,7 @@ type REST struct { // NewStorage returns a RESTStorage object that will work against pods. func NewStorage(optsGetter generic.RESTOptionsGetter, k client.ConnectionInfoGetter, proxyTransport http.RoundTripper, podDisruptionBudgetClient policyclient.PodDisruptionBudgetsGetter) PodStorage { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.Pod{} }, NewListFunc: func() runtime.Object { return &api.PodList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/podtemplate/storage/storage.go b/pkg/registry/core/podtemplate/storage/storage.go index bb548e1202..601ed603aa 100644 --- a/pkg/registry/core/podtemplate/storage/storage.go +++ b/pkg/registry/core/podtemplate/storage/storage.go @@ -31,6 +31,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against pod templates. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.PodTemplate{} }, NewListFunc: func() runtime.Object { return &api.PodTemplateList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/replicationcontroller/storage/storage.go b/pkg/registry/core/replicationcontroller/storage/storage.go index 7a9deb4b41..e438ddb40f 100644 --- a/pkg/registry/core/replicationcontroller/storage/storage.go +++ b/pkg/registry/core/replicationcontroller/storage/storage.go @@ -60,6 +60,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.ReplicationController{} }, NewListFunc: func() runtime.Object { return &api.ReplicationControllerList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/resourcequota/storage/storage.go b/pkg/registry/core/resourcequota/storage/storage.go index c0f37c2d20..dd4ea2e9ea 100644 --- a/pkg/registry/core/resourcequota/storage/storage.go +++ b/pkg/registry/core/resourcequota/storage/storage.go @@ -34,6 +34,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against resource quotas. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.ResourceQuota{} }, NewListFunc: func() runtime.Object { return &api.ResourceQuotaList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/secret/storage/storage.go b/pkg/registry/core/secret/storage/storage.go index 1f4c7a5b76..64726fdc69 100644 --- a/pkg/registry/core/secret/storage/storage.go +++ b/pkg/registry/core/secret/storage/storage.go @@ -31,6 +31,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against secrets. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.Secret{} }, NewListFunc: func() runtime.Object { return &api.SecretList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/service/storage/storage.go b/pkg/registry/core/service/storage/storage.go index 00be8e8b1d..36affbff93 100644 --- a/pkg/registry/core/service/storage/storage.go +++ b/pkg/registry/core/service/storage/storage.go @@ -34,6 +34,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against services. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.Service{} }, NewListFunc: func() runtime.Object { return &api.ServiceList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/core/serviceaccount/storage/storage.go b/pkg/registry/core/serviceaccount/storage/storage.go index 65b671c088..184fc0b71b 100644 --- a/pkg/registry/core/serviceaccount/storage/storage.go +++ b/pkg/registry/core/serviceaccount/storage/storage.go @@ -31,6 +31,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against service accounts. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &api.ServiceAccount{} }, NewListFunc: func() runtime.Object { return &api.ServiceAccountList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/extensions/daemonset/storage/BUILD b/pkg/registry/extensions/daemonset/storage/BUILD index 9d55f2c91b..c30b7d1f33 100644 --- a/pkg/registry/extensions/daemonset/storage/BUILD +++ b/pkg/registry/extensions/daemonset/storage/BUILD @@ -31,6 +31,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/extensions/daemonset/storage/storage.go b/pkg/registry/extensions/daemonset/storage/storage.go index 468f66b3fb..64797a99d5 100644 --- a/pkg/registry/extensions/daemonset/storage/storage.go +++ b/pkg/registry/extensions/daemonset/storage/storage.go @@ -20,6 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -35,6 +36,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against DaemonSets. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &extensions.DaemonSet{} }, NewListFunc: func() runtime.Object { return &extensions.DaemonSetList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/extensions/deployment/storage/BUILD b/pkg/registry/extensions/deployment/storage/BUILD index d781be2467..ea0f3bc2db 100644 --- a/pkg/registry/extensions/deployment/storage/BUILD +++ b/pkg/registry/extensions/deployment/storage/BUILD @@ -37,6 +37,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/api/errors/storage:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/validation:go_default_library", diff --git a/pkg/registry/extensions/deployment/storage/storage.go b/pkg/registry/extensions/deployment/storage/storage.go index cb06288222..63aefb5e90 100644 --- a/pkg/registry/extensions/deployment/storage/storage.go +++ b/pkg/registry/extensions/deployment/storage/storage.go @@ -24,6 +24,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" storeerr "k8s.io/kubernetes/pkg/api/errors/storage" "k8s.io/kubernetes/pkg/apis/extensions" extvalidation "k8s.io/kubernetes/pkg/apis/extensions/validation" @@ -61,6 +62,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against deployments. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST, *RollbackREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &extensions.Deployment{} }, NewListFunc: func() runtime.Object { return &extensions.DeploymentList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/extensions/ingress/storage/BUILD b/pkg/registry/extensions/ingress/storage/BUILD index a4c6b26b3a..489e134889 100644 --- a/pkg/registry/extensions/ingress/storage/BUILD +++ b/pkg/registry/extensions/ingress/storage/BUILD @@ -32,6 +32,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/extensions/ingress/storage/storage.go b/pkg/registry/extensions/ingress/storage/storage.go index 702672f45d..5704134468 100644 --- a/pkg/registry/extensions/ingress/storage/storage.go +++ b/pkg/registry/extensions/ingress/storage/storage.go @@ -20,6 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -35,6 +36,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &extensions.Ingress{} }, NewListFunc: func() runtime.Object { return &extensions.IngressList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/extensions/networkpolicy/storage/BUILD b/pkg/registry/extensions/networkpolicy/storage/BUILD index f44f9ead75..94d1d4cde3 100644 --- a/pkg/registry/extensions/networkpolicy/storage/BUILD +++ b/pkg/registry/extensions/networkpolicy/storage/BUILD @@ -32,6 +32,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/extensions/networkpolicy/storage/storage.go b/pkg/registry/extensions/networkpolicy/storage/storage.go index aa7cc8bf7a..44518cf498 100644 --- a/pkg/registry/extensions/networkpolicy/storage/storage.go +++ b/pkg/registry/extensions/networkpolicy/storage/storage.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" extensionsapi "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -32,6 +33,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against network policies. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &extensionsapi.NetworkPolicy{} }, NewListFunc: func() runtime.Object { return &extensionsapi.NetworkPolicyList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/extensions/podsecuritypolicy/storage/BUILD b/pkg/registry/extensions/podsecuritypolicy/storage/BUILD index 5abc9c5b96..bf4b4f1f24 100644 --- a/pkg/registry/extensions/podsecuritypolicy/storage/BUILD +++ b/pkg/registry/extensions/podsecuritypolicy/storage/BUILD @@ -31,6 +31,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/extensions/podsecuritypolicy/storage/storage.go b/pkg/registry/extensions/podsecuritypolicy/storage/storage.go index 58816ae832..16e08e25c4 100644 --- a/pkg/registry/extensions/podsecuritypolicy/storage/storage.go +++ b/pkg/registry/extensions/podsecuritypolicy/storage/storage.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -32,6 +33,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against PodSecurityPolicy objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &extensions.PodSecurityPolicy{} }, NewListFunc: func() runtime.Object { return &extensions.PodSecurityPolicyList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/extensions/replicaset/storage/BUILD b/pkg/registry/extensions/replicaset/storage/BUILD index bf4576212b..cf2178d445 100644 --- a/pkg/registry/extensions/replicaset/storage/BUILD +++ b/pkg/registry/extensions/replicaset/storage/BUILD @@ -35,6 +35,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/apis/extensions/validation:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", diff --git a/pkg/registry/extensions/replicaset/storage/storage.go b/pkg/registry/extensions/replicaset/storage/storage.go index 366d0fb23f..cce09db1d5 100644 --- a/pkg/registry/extensions/replicaset/storage/storage.go +++ b/pkg/registry/extensions/replicaset/storage/storage.go @@ -25,6 +25,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" extvalidation "k8s.io/kubernetes/pkg/apis/extensions/validation" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" @@ -58,6 +59,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against ReplicaSet. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &extensions.ReplicaSet{} }, NewListFunc: func() runtime.Object { return &extensions.ReplicaSetList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/extensions/thirdpartyresource/storage/BUILD b/pkg/registry/extensions/thirdpartyresource/storage/BUILD index 5aa98ef852..261ed94033 100644 --- a/pkg/registry/extensions/thirdpartyresource/storage/BUILD +++ b/pkg/registry/extensions/thirdpartyresource/storage/BUILD @@ -31,6 +31,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/extensions/thirdpartyresource/storage/storage.go b/pkg/registry/extensions/thirdpartyresource/storage/storage.go index 93a424366c..c8cd1af4b5 100644 --- a/pkg/registry/extensions/thirdpartyresource/storage/storage.go +++ b/pkg/registry/extensions/thirdpartyresource/storage/storage.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -41,6 +42,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { opts.Decorator = generic.UndecoratedStorage // TODO use watchCacheSize=-1 to signal UndecoratedStorage store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &extensions.ThirdPartyResource{} }, NewListFunc: func() runtime.Object { return &extensions.ThirdPartyResourceList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/extensions/thirdpartyresourcedata/storage/BUILD b/pkg/registry/extensions/thirdpartyresourcedata/storage/BUILD index 9e3734298a..7782ba1200 100644 --- a/pkg/registry/extensions/thirdpartyresourcedata/storage/BUILD +++ b/pkg/registry/extensions/thirdpartyresourcedata/storage/BUILD @@ -31,6 +31,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/extensions:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/extensions/thirdpartyresourcedata/storage/storage.go b/pkg/registry/extensions/thirdpartyresourcedata/storage/storage.go index 3eb8963bd4..67e2c7c0ee 100644 --- a/pkg/registry/extensions/thirdpartyresourcedata/storage/storage.go +++ b/pkg/registry/extensions/thirdpartyresourcedata/storage/storage.go @@ -20,6 +20,7 @@ import ( "strings" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/extensions" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -45,6 +46,7 @@ func NewREST(optsGetter generic.RESTOptionsGetter, group, kind string) *REST { opts.ResourcePrefix = "/ThirdPartyResourceData/" + group + "/" + strings.ToLower(kind) + "s" store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &extensions.ThirdPartyResourceData{} }, NewListFunc: func() runtime.Object { return &extensions.ThirdPartyResourceDataList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/policy/poddisruptionbudget/storage/BUILD b/pkg/registry/policy/poddisruptionbudget/storage/BUILD index 46e8803233..9622095249 100644 --- a/pkg/registry/policy/poddisruptionbudget/storage/BUILD +++ b/pkg/registry/policy/poddisruptionbudget/storage/BUILD @@ -33,6 +33,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/policy:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/policy/poddisruptionbudget/storage/storage.go b/pkg/registry/policy/poddisruptionbudget/storage/storage.go index a8877143ad..e7137b6ece 100644 --- a/pkg/registry/policy/poddisruptionbudget/storage/storage.go +++ b/pkg/registry/policy/poddisruptionbudget/storage/storage.go @@ -20,6 +20,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/kubernetes/pkg/api" policyapi "k8s.io/kubernetes/pkg/apis/policy" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -35,6 +36,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against pod disruption budgets. func NewREST(optsGetter generic.RESTOptionsGetter) (*REST, *StatusREST) { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &policyapi.PodDisruptionBudget{} }, NewListFunc: func() runtime.Object { return &policyapi.PodDisruptionBudgetList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/rbac/clusterrole/storage/BUILD b/pkg/registry/rbac/clusterrole/storage/BUILD index 10f0227198..866563ac61 100644 --- a/pkg/registry/rbac/clusterrole/storage/BUILD +++ b/pkg/registry/rbac/clusterrole/storage/BUILD @@ -12,6 +12,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/rbac/clusterrole/storage/storage.go b/pkg/registry/rbac/clusterrole/storage/storage.go index 5139775a75..e1cf357991 100644 --- a/pkg/registry/rbac/clusterrole/storage/storage.go +++ b/pkg/registry/rbac/clusterrole/storage/storage.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -32,6 +33,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against ClusterRole objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &rbac.ClusterRole{} }, NewListFunc: func() runtime.Object { return &rbac.ClusterRoleList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/rbac/clusterrolebinding/storage/BUILD b/pkg/registry/rbac/clusterrolebinding/storage/BUILD index 443dbde95c..f3d436aaae 100644 --- a/pkg/registry/rbac/clusterrolebinding/storage/BUILD +++ b/pkg/registry/rbac/clusterrolebinding/storage/BUILD @@ -12,6 +12,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/rbac/clusterrolebinding/storage/storage.go b/pkg/registry/rbac/clusterrolebinding/storage/storage.go index 6ecee2d60c..b134339bfc 100644 --- a/pkg/registry/rbac/clusterrolebinding/storage/storage.go +++ b/pkg/registry/rbac/clusterrolebinding/storage/storage.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -32,6 +33,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against ClusterRoleBinding objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &rbac.ClusterRoleBinding{} }, NewListFunc: func() runtime.Object { return &rbac.ClusterRoleBindingList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/rbac/role/storage/BUILD b/pkg/registry/rbac/role/storage/BUILD index ac83440dbe..9a10a4edbf 100644 --- a/pkg/registry/rbac/role/storage/BUILD +++ b/pkg/registry/rbac/role/storage/BUILD @@ -12,6 +12,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/rbac/role/storage/storage.go b/pkg/registry/rbac/role/storage/storage.go index 44f53eba03..4c54fc489c 100644 --- a/pkg/registry/rbac/role/storage/storage.go +++ b/pkg/registry/rbac/role/storage/storage.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -32,6 +33,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against Role objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &rbac.Role{} }, NewListFunc: func() runtime.Object { return &rbac.RoleList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/rbac/rolebinding/storage/BUILD b/pkg/registry/rbac/rolebinding/storage/BUILD index 02b5f84f77..ccac1a8077 100644 --- a/pkg/registry/rbac/rolebinding/storage/BUILD +++ b/pkg/registry/rbac/rolebinding/storage/BUILD @@ -12,6 +12,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/rbac:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/rbac/rolebinding/storage/storage.go b/pkg/registry/rbac/rolebinding/storage/storage.go index dbc8814ff8..c68fbaf8c3 100644 --- a/pkg/registry/rbac/rolebinding/storage/storage.go +++ b/pkg/registry/rbac/rolebinding/storage/storage.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/apis/rbac" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -32,6 +33,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against RoleBinding objects. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &rbac.RoleBinding{} }, NewListFunc: func() runtime.Object { return &rbac.RoleBindingList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/registry/storage/storageclass/storage/BUILD b/pkg/registry/storage/storageclass/storage/BUILD index 07534d86b8..f61192518c 100644 --- a/pkg/registry/storage/storageclass/storage/BUILD +++ b/pkg/registry/storage/storageclass/storage/BUILD @@ -30,6 +30,7 @@ go_library( srcs = ["storage.go"], tags = ["automanaged"], deps = [ + "//pkg/api:go_default_library", "//pkg/apis/storage:go_default_library", "//pkg/genericapiserver/registry/generic:go_default_library", "//pkg/genericapiserver/registry/generic/registry:go_default_library", diff --git a/pkg/registry/storage/storageclass/storage/storage.go b/pkg/registry/storage/storageclass/storage/storage.go index fe9d0f75a3..9c96dd7362 100644 --- a/pkg/registry/storage/storageclass/storage/storage.go +++ b/pkg/registry/storage/storageclass/storage/storage.go @@ -18,6 +18,7 @@ package storage import ( "k8s.io/apimachinery/pkg/runtime" + "k8s.io/kubernetes/pkg/api" storageapi "k8s.io/kubernetes/pkg/apis/storage" "k8s.io/kubernetes/pkg/genericapiserver/registry/generic" genericregistry "k8s.io/kubernetes/pkg/genericapiserver/registry/generic/registry" @@ -31,6 +32,7 @@ type REST struct { // NewREST returns a RESTStorage object that will work against persistent volumes. func NewREST(optsGetter generic.RESTOptionsGetter) *REST { store := &genericregistry.Store{ + Copier: api.Scheme, NewFunc: func() runtime.Object { return &storageapi.StorageClass{} }, NewListFunc: func() runtime.Object { return &storageapi.StorageClassList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { diff --git a/pkg/storage/BUILD b/pkg/storage/BUILD index 8d8567ed17..cf6cfe668c 100644 --- a/pkg/storage/BUILD +++ b/pkg/storage/BUILD @@ -22,7 +22,6 @@ go_library( ], tags = ["automanaged"], deps = [ - "//pkg/api:go_default_library", "//pkg/util:go_default_library", "//vendor:github.com/golang/glog", "//vendor:golang.org/x/net/context", @@ -56,7 +55,6 @@ go_test( library = ":go_default_library", tags = ["automanaged"], deps = [ - "//pkg/api:go_default_library", "//vendor:k8s.io/apimachinery/pkg/api/errors", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/fields", @@ -66,6 +64,7 @@ go_test( "//vendor:k8s.io/apimachinery/pkg/util/sets", "//vendor:k8s.io/apimachinery/pkg/util/wait", "//vendor:k8s.io/apimachinery/pkg/watch", + "//vendor:k8s.io/client-go/pkg/api", "//vendor:k8s.io/client-go/tools/cache", "//vendor:k8s.io/client-go/util/clock", ], @@ -76,10 +75,6 @@ go_test( srcs = ["cacher_test.go"], tags = ["automanaged"], deps = [ - "//pkg/api:go_default_library", - "//pkg/api/testapi:go_default_library", - "//pkg/api/testing:go_default_library", - "//pkg/registry/core/pod:go_default_library", "//pkg/storage:go_default_library", "//pkg/storage/etcd:go_default_library", "//pkg/storage/etcd/etcdtest:go_default_library", @@ -95,6 +90,9 @@ go_test( "//vendor:k8s.io/apimachinery/pkg/util/sets", "//vendor:k8s.io/apimachinery/pkg/util/wait", "//vendor:k8s.io/apimachinery/pkg/watch", + "//vendor:k8s.io/client-go/pkg/api", + "//vendor:k8s.io/client-go/pkg/api/install", + "//vendor:k8s.io/client-go/pkg/api/v1", ], ) diff --git a/pkg/storage/cacher.go b/pkg/storage/cacher.go index 7e3ffdb9f0..e031073aa5 100644 --- a/pkg/storage/cacher.go +++ b/pkg/storage/cacher.go @@ -35,7 +35,6 @@ import ( "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" "k8s.io/client-go/tools/cache" - "k8s.io/kubernetes/pkg/api" "k8s.io/kubernetes/pkg/util" "github.com/golang/glog" @@ -53,6 +52,8 @@ type CacherConfig struct { // An underlying storage.Versioner. Versioner Versioner + Copier runtime.ObjectCopier + // The Cache will be caching objects of a given Type and assumes that they // are all stored under ResourcePrefix directory in the underlying database. Type interface{} @@ -158,6 +159,8 @@ type Cacher struct { // Underlying storage.Interface. storage Interface + copier runtime.ObjectCopier + // Expected type of objects in the underlying cache. objectType reflect.Type @@ -206,6 +209,7 @@ func NewCacherFromConfig(config CacherConfig) *Cacher { cacher := &Cacher{ ready: newReady(), storage: config.Storage, + copier: config.Copier, objectType: reflect.TypeOf(config.Type), watchCache: watchCache, reflector: cache.NewReflector(listerWatcher, config.Type, watchCache, 0), @@ -336,7 +340,7 @@ func (c *Cacher) Watch(ctx context.Context, key string, resourceVersion string, c.Lock() defer c.Unlock() forget := forgetWatcher(c, c.watcherIdx, triggerValue, triggerSupported) - watcher := newCacheWatcher(watchRV, chanSize, initEvents, watchFilterFunction(key, pred), forget) + watcher := newCacheWatcher(c.copier, watchRV, chanSize, initEvents, watchFilterFunction(key, pred), forget) c.watchers.addWatcher(watcher, c.watcherIdx, triggerValue, triggerSupported) c.watcherIdx++ @@ -520,7 +524,7 @@ func (c *Cacher) GuaranteedUpdate( if elem, exists, err := c.watchCache.GetByKey(key); err != nil { glog.Errorf("GetByKey returned error: %v", err) } else if exists { - currObj, copyErr := api.Scheme.Copy(elem.(*storeElement).Object) + currObj, copyErr := c.copier.Copy(elem.(*storeElement).Object) if copyErr == nil { return c.storage.GuaranteedUpdate(ctx, key, ptrToType, ignoreNotFound, preconditions, tryUpdate, currObj) } @@ -747,6 +751,7 @@ func (c *errWatcher) Stop() { // cacherWatch implements watch.Interface type cacheWatcher struct { sync.Mutex + copier runtime.ObjectCopier input chan watchCacheEvent result chan watch.Event done chan struct{} @@ -755,8 +760,9 @@ type cacheWatcher struct { forget func(bool) } -func newCacheWatcher(resourceVersion uint64, chanSize int, initEvents []*watchCacheEvent, filter watchFilterFunc, forget func(bool)) *cacheWatcher { +func newCacheWatcher(copier runtime.ObjectCopier, resourceVersion uint64, chanSize int, initEvents []*watchCacheEvent, filter watchFilterFunc, forget func(bool)) *cacheWatcher { watcher := &cacheWatcher{ + copier: copier, input: make(chan watchCacheEvent, chanSize), result: make(chan watch.Event, chanSize), done: make(chan struct{}), @@ -844,7 +850,7 @@ func (c *cacheWatcher) sendWatchCacheEvent(event *watchCacheEvent) { return } - object, err := api.Scheme.Copy(event.Object) + object, err := c.copier.Copy(event.Object) if err != nil { glog.Errorf("unexpected copy error: %v", err) return diff --git a/pkg/storage/cacher_test.go b/pkg/storage/cacher_test.go index 12bce78d35..dac10d5d15 100644 --- a/pkg/storage/cacher_test.go +++ b/pkg/storage/cacher_test.go @@ -33,10 +33,8 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" - "k8s.io/kubernetes/pkg/api" - "k8s.io/kubernetes/pkg/api/testapi" - apitesting "k8s.io/kubernetes/pkg/api/testing" - corepod "k8s.io/kubernetes/pkg/registry/core/pod" + "k8s.io/client-go/pkg/api" + "k8s.io/client-go/pkg/api/v1" "k8s.io/kubernetes/pkg/storage" etcdstorage "k8s.io/kubernetes/pkg/storage/etcd" "k8s.io/kubernetes/pkg/storage/etcd/etcdtest" @@ -44,8 +42,52 @@ import ( "k8s.io/kubernetes/pkg/storage/etcd3" "golang.org/x/net/context" + + _ "k8s.io/client-go/pkg/api/install" ) +func DeepEqualSafePodSpec() api.PodSpec { + grace := int64(30) + return api.PodSpec{ + RestartPolicy: api.RestartPolicyAlways, + DNSPolicy: api.DNSClusterFirst, + TerminationGracePeriodSeconds: &grace, + SecurityContext: &api.PodSecurityContext{}, + SchedulerName: api.DefaultSchedulerName, + } +} + +// GetAttrs returns labels and fields of a given object for filtering purposes. +func GetAttrs(obj runtime.Object) (labels.Set, fields.Set, error) { + pod, ok := obj.(*api.Pod) + if !ok { + return nil, nil, fmt.Errorf("not a pod") + } + return labels.Set(pod.ObjectMeta.Labels), PodToSelectableFields(pod), nil +} + +// PodToSelectableFields returns a field set that represents the object +// TODO: fields are not labels, and the validation rules for them do not apply. +func PodToSelectableFields(pod *api.Pod) fields.Set { + // The purpose of allocation with a given number of elements is to reduce + // amount of allocations needed to create the fields.Set. If you add any + // field here or the number of object-meta related fields changes, this should + // be adjusted. + podSpecificFieldsSet := make(fields.Set, 5) + podSpecificFieldsSet["spec.nodeName"] = pod.Spec.NodeName + podSpecificFieldsSet["spec.restartPolicy"] = string(pod.Spec.RestartPolicy) + podSpecificFieldsSet["status.phase"] = string(pod.Status.Phase) + return AddObjectMetaFieldsSet(podSpecificFieldsSet, &pod.ObjectMeta, true) +} + +func AddObjectMetaFieldsSet(source fields.Set, objectMeta *metav1.ObjectMeta, hasNamespaceField bool) fields.Set { + source["metadata.name"] = objectMeta.Name + if hasNamespaceField { + source["metadata.namespace"] = objectMeta.Namespace + } + return source +} + func newEtcdTestStorage(t *testing.T, codec runtime.Codec, prefix string) (*etcdtesting.EtcdTestServer, storage.Interface) { server, _ := etcdtesting.NewUnsecuredEtcd3TestClientServer(t) storage := etcd3.New(server.V3Client, codec, prefix) @@ -58,12 +100,13 @@ func newTestCacher(s storage.Interface, cap int) *storage.Cacher { CacheCapacity: cap, Storage: s, Versioner: etcdstorage.APIObjectVersioner{}, + Copier: api.Scheme, Type: &api.Pod{}, ResourcePrefix: prefix, KeyFunc: func(obj runtime.Object) (string, error) { return storage.NamespaceKeyFunc(prefix, obj) }, - GetAttrsFunc: corepod.GetAttrs, + GetAttrsFunc: GetAttrs, NewListFunc: func() runtime.Object { return &api.PodList{} }, - Codec: testapi.Default.Codec(), + Codec: api.Codecs.LegacyCodec(v1.SchemeGroupVersion), } return storage.NewCacherFromConfig(config) } @@ -71,7 +114,7 @@ func newTestCacher(s storage.Interface, cap int) *storage.Cacher { func makeTestPod(name string) *api.Pod { return &api.Pod{ ObjectMeta: metav1.ObjectMeta{Namespace: "ns", Name: name}, - Spec: apitesting.DeepEqualSafePodSpec(), + Spec: DeepEqualSafePodSpec(), } } @@ -97,7 +140,7 @@ func updatePod(t *testing.T, s storage.Interface, obj, old *api.Pod) *api.Pod { } func TestGet(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) + server, etcdStorage := newEtcdTestStorage(t, api.Codecs.LegacyCodec(v1.SchemeGroupVersion), etcdtest.PathPrefix()) defer server.Terminate(t) cacher := newTestCacher(etcdStorage, 10) defer cacher.Stop() @@ -128,7 +171,7 @@ func TestGet(t *testing.T) { } func TestList(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) + server, etcdStorage := newEtcdTestStorage(t, api.Codecs.LegacyCodec(v1.SchemeGroupVersion), etcdtest.PathPrefix()) defer server.Terminate(t) cacher := newTestCacher(etcdStorage, 10) defer cacher.Stop() @@ -209,7 +252,7 @@ func TestList(t *testing.T) { } func TestInfiniteList(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) + server, etcdStorage := newEtcdTestStorage(t, api.Codecs.LegacyCodec(v1.SchemeGroupVersion), etcdtest.PathPrefix()) defer server.Terminate(t) cacher := newTestCacher(etcdStorage, 10) defer cacher.Stop() @@ -263,7 +306,7 @@ func (self *injectListError) List(ctx context.Context, key string, resourceVersi } func TestWatch(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) + server, etcdStorage := newEtcdTestStorage(t, api.Codecs.LegacyCodec(v1.SchemeGroupVersion), etcdtest.PathPrefix()) // Inject one list error to make sure we test the relist case. etcdStorage = &injectListError{errors: 1, Interface: etcdStorage} defer server.Terminate(t) @@ -340,7 +383,7 @@ func TestWatch(t *testing.T) { } func TestWatcherTimeout(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) + server, etcdStorage := newEtcdTestStorage(t, api.Codecs.LegacyCodec(v1.SchemeGroupVersion), etcdtest.PathPrefix()) defer server.Terminate(t) cacher := newTestCacher(etcdStorage, 10) defer cacher.Stop() @@ -382,7 +425,7 @@ func TestWatcherTimeout(t *testing.T) { } func TestFiltering(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) + server, etcdStorage := newEtcdTestStorage(t, api.Codecs.LegacyCodec(v1.SchemeGroupVersion), etcdtest.PathPrefix()) defer server.Terminate(t) cacher := newTestCacher(etcdStorage, 10) defer cacher.Stop() @@ -444,7 +487,7 @@ func TestFiltering(t *testing.T) { } func TestStartingResourceVersion(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) + server, etcdStorage := newEtcdTestStorage(t, api.Codecs.LegacyCodec(v1.SchemeGroupVersion), etcdtest.PathPrefix()) defer server.Terminate(t) cacher := newTestCacher(etcdStorage, 10) defer cacher.Stop() @@ -492,7 +535,7 @@ func TestStartingResourceVersion(t *testing.T) { } func TestRandomWatchDeliver(t *testing.T) { - server, etcdStorage := newEtcdTestStorage(t, testapi.Default.Codec(), etcdtest.PathPrefix()) + server, etcdStorage := newEtcdTestStorage(t, api.Codecs.LegacyCodec(v1.SchemeGroupVersion), etcdtest.PathPrefix()) defer server.Terminate(t) cacher := newTestCacher(etcdStorage, 10) defer cacher.Stop() diff --git a/pkg/storage/cacher_whitebox_test.go b/pkg/storage/cacher_whitebox_test.go index 48f9f20efb..33fe54255a 100644 --- a/pkg/storage/cacher_whitebox_test.go +++ b/pkg/storage/cacher_whitebox_test.go @@ -24,7 +24,7 @@ import ( "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/util/wait" - "k8s.io/kubernetes/pkg/api" + "k8s.io/client-go/pkg/api" ) // verifies the cacheWatcher.process goroutine is properly cleaned up even if @@ -44,7 +44,7 @@ func TestCacheWatcherCleanupNotBlockedByResult(t *testing.T) { } // set the size of the buffer of w.result to 0, so that the writes to // w.result is blocked. - w := newCacheWatcher(0, 0, initEvents, filter, forget) + w := newCacheWatcher(api.Scheme, 0, 0, initEvents, filter, forget) w.Stop() if err := wait.PollImmediate(1*time.Second, 5*time.Second, func() (bool, error) { lock.RLock() diff --git a/pkg/storage/watch_cache_test.go b/pkg/storage/watch_cache_test.go index ded6c3c300..18fd0ade9a 100644 --- a/pkg/storage/watch_cache_test.go +++ b/pkg/storage/watch_cache_test.go @@ -29,9 +29,9 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/pkg/api" "k8s.io/client-go/tools/cache" "k8s.io/client-go/util/clock" - "k8s.io/kubernetes/pkg/api" ) func makeTestPod(name string, resourceVersion uint64) *api.Pod {