Introduce RESTOptions to configure per-resource storage

pull/6/head
Wojciech Tyczynski 2016-02-22 10:15:22 +01:00
parent c533ae4dd0
commit 4eadc5e97b
53 changed files with 201 additions and 166 deletions

View File

@ -71,7 +71,7 @@ func (r *registryGetter) GetSecret(namespace, name string) (*api.Secret, error)
// uses the specified storage to retrieve service accounts and secrets. // uses the specified storage to retrieve service accounts and secrets.
func NewGetterFromStorageInterface(s storage.Interface) serviceaccount.ServiceAccountTokenGetter { func NewGetterFromStorageInterface(s storage.Interface) serviceaccount.ServiceAccountTokenGetter {
return NewGetterFromRegistries( return NewGetterFromRegistries(
serviceaccountregistry.NewRegistry(serviceaccountetcd.NewREST(s, generic.UndecoratedStorage)), serviceaccountregistry.NewRegistry(serviceaccountetcd.NewREST(generic.RESTOptions{s, generic.UndecoratedStorage})),
secret.NewRegistry(secretetcd.NewREST(s, generic.UndecoratedStorage)), secret.NewRegistry(secretetcd.NewREST(generic.RESTOptions{s, generic.UndecoratedStorage})),
) )
} }

View File

@ -324,38 +324,42 @@ func (m *Master) InstallAPIs(c *Config) {
} }
func (m *Master) initV1ResourcesStorage(c *Config) { func (m *Master) initV1ResourcesStorage(c *Config) {
storageDecorator := m.StorageDecorator()
dbClient := func(resource string) storage.Interface { return c.StorageDestinations.Get("", resource) } dbClient := func(resource string) storage.Interface { return c.StorageDestinations.Get("", resource) }
restOptions := func(resource string) generic.RESTOptions {
return generic.RESTOptions{
Storage: dbClient(resource),
Decorator: m.StorageDecorator(),
}
}
podTemplateStorage := podtemplateetcd.NewREST(dbClient("podTemplates"), storageDecorator) podTemplateStorage := podtemplateetcd.NewREST(restOptions("podTemplates"))
eventStorage := eventetcd.NewREST(dbClient("events"), storageDecorator, uint64(c.EventTTL.Seconds())) eventStorage := eventetcd.NewREST(restOptions("events"), uint64(c.EventTTL.Seconds()))
limitRangeStorage := limitrangeetcd.NewREST(dbClient("limitRanges"), storageDecorator) limitRangeStorage := limitrangeetcd.NewREST(restOptions("limitRanges"))
resourceQuotaStorage, resourceQuotaStatusStorage := resourcequotaetcd.NewREST(dbClient("resourceQuotas"), storageDecorator) resourceQuotaStorage, resourceQuotaStatusStorage := resourcequotaetcd.NewREST(restOptions("resourceQuotas"))
secretStorage := secretetcd.NewREST(dbClient("secrets"), storageDecorator) secretStorage := secretetcd.NewREST(restOptions("secrets"))
serviceAccountStorage := serviceaccountetcd.NewREST(dbClient("serviceAccounts"), storageDecorator) serviceAccountStorage := serviceaccountetcd.NewREST(restOptions("serviceAccounts"))
persistentVolumeStorage, persistentVolumeStatusStorage := pvetcd.NewREST(dbClient("persistentVolumes"), storageDecorator) persistentVolumeStorage, persistentVolumeStatusStorage := pvetcd.NewREST(restOptions("persistentVolumes"))
persistentVolumeClaimStorage, persistentVolumeClaimStatusStorage := pvcetcd.NewREST(dbClient("persistentVolumeClaims"), storageDecorator) persistentVolumeClaimStorage, persistentVolumeClaimStatusStorage := pvcetcd.NewREST(restOptions("persistentVolumeClaims"))
configMapStorage := configmapetcd.NewREST(dbClient("configMaps"), storageDecorator) configMapStorage := configmapetcd.NewREST(restOptions("configMaps"))
namespaceStorage, namespaceStatusStorage, namespaceFinalizeStorage := namespaceetcd.NewREST(dbClient("namespaces"), storageDecorator) namespaceStorage, namespaceStatusStorage, namespaceFinalizeStorage := namespaceetcd.NewREST(restOptions("namespaces"))
m.namespaceRegistry = namespace.NewRegistry(namespaceStorage) m.namespaceRegistry = namespace.NewRegistry(namespaceStorage)
endpointsStorage := endpointsetcd.NewREST(dbClient("endpoints"), storageDecorator) endpointsStorage := endpointsetcd.NewREST(restOptions("endpoints"))
m.endpointRegistry = endpoint.NewRegistry(endpointsStorage) m.endpointRegistry = endpoint.NewRegistry(endpointsStorage)
nodeStorage := nodeetcd.NewStorage(dbClient("nodes"), storageDecorator, c.KubeletClient, m.ProxyTransport) nodeStorage := nodeetcd.NewStorage(restOptions("nodes"), c.KubeletClient, m.ProxyTransport)
m.nodeRegistry = node.NewRegistry(nodeStorage.Node) m.nodeRegistry = node.NewRegistry(nodeStorage.Node)
podStorage := podetcd.NewStorage( podStorage := podetcd.NewStorage(
dbClient("pods"), restOptions("pods"),
storageDecorator,
kubeletclient.ConnectionInfoGetter(nodeStorage.Node), kubeletclient.ConnectionInfoGetter(nodeStorage.Node),
m.ProxyTransport, m.ProxyTransport,
) )
serviceStorage, serviceStatusStorage := serviceetcd.NewREST(dbClient("services"), storageDecorator) serviceStorage, serviceStatusStorage := serviceetcd.NewREST(restOptions("services"))
m.serviceRegistry = service.NewRegistry(serviceStorage) m.serviceRegistry = service.NewRegistry(serviceStorage)
var serviceClusterIPRegistry service.RangeRegistry var serviceClusterIPRegistry service.RangeRegistry
@ -381,7 +385,7 @@ func (m *Master) initV1ResourcesStorage(c *Config) {
}) })
m.serviceNodePortAllocator = serviceNodePortRegistry m.serviceNodePortAllocator = serviceNodePortRegistry
controllerStorage, controllerStatusStorage := controlleretcd.NewREST(dbClient("replicationControllers"), storageDecorator) controllerStorage, controllerStatusStorage := controlleretcd.NewREST(restOptions("replicationControllers"))
serviceRest := service.NewStorage(m.serviceRegistry, m.endpointRegistry, serviceClusterIPAllocator, serviceNodePortAllocator, m.ProxyTransport) serviceRest := service.NewStorage(m.serviceRegistry, m.endpointRegistry, serviceClusterIPAllocator, serviceNodePortAllocator, m.ProxyTransport)
@ -608,7 +612,7 @@ func (m *Master) InstallThirdPartyResource(rsrc *extensions.ThirdPartyResource)
} }
func (m *Master) thirdpartyapi(group, kind, version string) *apiserver.APIGroupVersion { func (m *Master) thirdpartyapi(group, kind, version string) *apiserver.APIGroupVersion {
resourceStorage := thirdpartyresourcedataetcd.NewREST(m.thirdPartyStorage, generic.UndecoratedStorage, group, kind) resourceStorage := thirdpartyresourcedataetcd.NewREST(generic.RESTOptions{m.thirdPartyStorage, generic.UndecoratedStorage}, group, kind)
apiRoot := makeThirdPartyPath("") apiRoot := makeThirdPartyPath("")
@ -656,20 +660,23 @@ func (m *Master) getExtensionResources(c *Config) map[string]rest.Storage {
} }
return enabled return enabled
} }
storageDecorator := m.StorageDecorator() restOptions := func(resource string) generic.RESTOptions {
dbClient := func(resource string) storage.Interface { return generic.RESTOptions{
return c.StorageDestinations.Get(extensions.GroupName, resource) Storage: c.StorageDestinations.Get(extensions.GroupName, resource),
Decorator: m.StorageDecorator(),
}
} }
storage := map[string]rest.Storage{} storage := map[string]rest.Storage{}
if isEnabled("horizontalpodautoscalers") { if isEnabled("horizontalpodautoscalers") {
m.constructHPAResources(c, storage) m.constructHPAResources(c, storage)
controllerStorage := expcontrolleretcd.NewStorage(c.StorageDestinations.Get("", "replicationControllers"), storageDecorator) controllerStorage := expcontrolleretcd.NewStorage(
generic.RESTOptions{c.StorageDestinations.Get("", "replicationControllers"), m.StorageDecorator()})
storage["replicationcontrollers"] = controllerStorage.ReplicationController storage["replicationcontrollers"] = controllerStorage.ReplicationController
storage["replicationcontrollers/scale"] = controllerStorage.Scale storage["replicationcontrollers/scale"] = controllerStorage.Scale
} }
if isEnabled("thirdpartyresources") { if isEnabled("thirdpartyresources") {
thirdPartyResourceStorage := thirdpartyresourceetcd.NewREST(dbClient("thirdpartyresources"), storageDecorator) thirdPartyResourceStorage := thirdpartyresourceetcd.NewREST(restOptions("thirdpartyresources"))
thirdPartyControl := ThirdPartyController{ thirdPartyControl := ThirdPartyController{
master: m, master: m,
thirdPartyResourceRegistry: thirdPartyResourceStorage, thirdPartyResourceRegistry: thirdPartyResourceStorage,
@ -686,12 +693,12 @@ func (m *Master) getExtensionResources(c *Config) map[string]rest.Storage {
} }
if isEnabled("daemonsets") { if isEnabled("daemonsets") {
daemonSetStorage, daemonSetStatusStorage := daemonetcd.NewREST(dbClient("daemonsets"), storageDecorator) daemonSetStorage, daemonSetStatusStorage := daemonetcd.NewREST(restOptions("daemonsets"))
storage["daemonsets"] = daemonSetStorage storage["daemonsets"] = daemonSetStorage
storage["daemonsets/status"] = daemonSetStatusStorage storage["daemonsets/status"] = daemonSetStatusStorage
} }
if isEnabled("deployments") { if isEnabled("deployments") {
deploymentStorage := deploymentetcd.NewStorage(dbClient("deployments"), storageDecorator) deploymentStorage := deploymentetcd.NewStorage(restOptions("deployments"))
storage["deployments"] = deploymentStorage.Deployment storage["deployments"] = deploymentStorage.Deployment
storage["deployments/status"] = deploymentStorage.Status storage["deployments/status"] = deploymentStorage.Status
// TODO(madhusudancs): Install scale when Scale group issues are fixed (see issue #18528). // TODO(madhusudancs): Install scale when Scale group issues are fixed (see issue #18528).
@ -702,16 +709,16 @@ func (m *Master) getExtensionResources(c *Config) map[string]rest.Storage {
m.constructJobResources(c, storage) m.constructJobResources(c, storage)
} }
if isEnabled("ingresses") { if isEnabled("ingresses") {
ingressStorage, ingressStatusStorage := ingressetcd.NewREST(dbClient("ingresses"), storageDecorator) ingressStorage, ingressStatusStorage := ingressetcd.NewREST(restOptions("ingresses"))
storage["ingresses"] = ingressStorage storage["ingresses"] = ingressStorage
storage["ingresses/status"] = ingressStatusStorage storage["ingresses/status"] = ingressStatusStorage
} }
if isEnabled("podsecuritypolicy") { if isEnabled("podsecuritypolicy") {
podSecurityPolicyStorage := pspetcd.NewREST(dbClient("podsecuritypolicy"), storageDecorator) podSecurityPolicyStorage := pspetcd.NewREST(restOptions("podsecuritypolicy"))
storage["podSecurityPolicies"] = podSecurityPolicyStorage storage["podSecurityPolicies"] = podSecurityPolicyStorage
} }
if isEnabled("replicasets") { if isEnabled("replicasets") {
replicaSetStorage := replicasetetcd.NewStorage(dbClient("replicasets"), storageDecorator) replicaSetStorage := replicasetetcd.NewStorage(restOptions("replicasets"))
storage["replicasets"] = replicaSetStorage.ReplicaSet storage["replicasets"] = replicaSetStorage.ReplicaSet
storage["replicasets/status"] = replicaSetStorage.Status storage["replicasets/status"] = replicaSetStorage.Status
} }
@ -726,11 +733,13 @@ func (m *Master) constructHPAResources(c *Config, restStorage map[string]rest.St
// Note that hpa's storage settings are changed by changing the autoscaling // Note that hpa's storage settings are changed by changing the autoscaling
// group. Clearly we want all hpas to be stored in the same place no // group. Clearly we want all hpas to be stored in the same place no
// matter where they're accessed from. // matter where they're accessed from.
storageDecorator := m.StorageDecorator() restOptions := func(resource string) generic.RESTOptions {
dbClient := func(resource string) storage.Interface { return generic.RESTOptions{
return c.StorageDestinations.Search([]string{autoscaling.GroupName, extensions.GroupName}, resource) Storage: c.StorageDestinations.Search([]string{autoscaling.GroupName, extensions.GroupName}, resource),
Decorator: m.StorageDecorator(),
}
} }
autoscalerStorage, autoscalerStatusStorage := horizontalpodautoscaleretcd.NewREST(dbClient("horizontalpodautoscalers"), storageDecorator) autoscalerStorage, autoscalerStatusStorage := horizontalpodautoscaleretcd.NewREST(restOptions("horizontalpodautoscalers"))
restStorage["horizontalpodautoscalers"] = autoscalerStorage restStorage["horizontalpodautoscalers"] = autoscalerStorage
restStorage["horizontalpodautoscalers/status"] = autoscalerStatusStorage restStorage["horizontalpodautoscalers/status"] = autoscalerStatusStorage
} }
@ -760,11 +769,13 @@ func (m *Master) constructJobResources(c *Config, restStorage map[string]rest.St
// Note that job's storage settings are changed by changing the batch // Note that job's storage settings are changed by changing the batch
// group. Clearly we want all jobs to be stored in the same place no // group. Clearly we want all jobs to be stored in the same place no
// matter where they're accessed from. // matter where they're accessed from.
storageDecorator := m.StorageDecorator() restOptions := func(resource string) generic.RESTOptions {
dbClient := func(resource string) storage.Interface { return generic.RESTOptions{
return c.StorageDestinations.Search([]string{batch.GroupName, extensions.GroupName}, resource) Storage: c.StorageDestinations.Search([]string{batch.GroupName, extensions.GroupName}, resource),
Decorator: m.StorageDecorator(),
}
} }
jobStorage, jobStatusStorage := jobetcd.NewREST(dbClient("jobs"), storageDecorator) jobStorage, jobStatusStorage := jobetcd.NewREST(restOptions("jobs"))
restStorage["jobs"] = jobStorage restStorage["jobs"] = jobStorage
restStorage["jobs/status"] = jobStatusStorage restStorage["jobs/status"] = jobStatusStorage
} }

View File

@ -21,7 +21,6 @@ import (
"k8s.io/kubernetes/pkg/registry/configmap" "k8s.io/kubernetes/pkg/registry/configmap"
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
) )
@ -32,12 +31,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work with ConfigMap objects. // NewREST returns a RESTStorage object that will work with ConfigMap objects.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { func NewREST(opts generic.RESTOptions) *REST {
prefix := "/configmaps" prefix := "/configmaps"
newListFunc := func() runtime.Object { return &api.ConfigMapList{} } newListFunc := func() runtime.Object { return &api.ConfigMapList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, 100, &api.ConfigMap{}, prefix, configmap.Strategy, newListFunc) opts.Storage, 100, &api.ConfigMap{}, prefix, configmap.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { NewFunc: func() runtime.Object {

View File

@ -30,7 +30,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions), server
} }
func validNewConfigMap() *api.ConfigMap { func validNewConfigMap() *api.ConfigMap {

View File

@ -27,7 +27,6 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -35,12 +34,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against replication controllers. // NewREST returns a RESTStorage object that will work against replication controllers.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/controllers" prefix := "/controllers"
newListFunc := func() runtime.Object { return &api.ReplicationControllerList{} } newListFunc := func() runtime.Object { return &api.ReplicationControllerList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Controllers), &api.ReplicationController{}, prefix, controller.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Controllers), &api.ReplicationController{}, prefix, controller.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.ReplicationController{} }, NewFunc: func() runtime.Object { return &api.ReplicationController{} },

View File

@ -30,7 +30,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
controllerStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
controllerStorage, statusStorage := NewREST(restOptions)
return controllerStorage, statusStorage, server return controllerStorage, statusStorage, server
} }

View File

@ -26,7 +26,6 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// rest implements a RESTStorage for DaemonSets against etcd // rest implements a RESTStorage for DaemonSets against etcd
@ -35,12 +34,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against DaemonSets. // NewREST returns a RESTStorage object that will work against DaemonSets.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/daemonsets" prefix := "/daemonsets"
newListFunc := func() runtime.Object { return &extensions.DaemonSetList{} } newListFunc := func() runtime.Object { return &extensions.DaemonSetList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Daemonsets), &extensions.DaemonSet{}, prefix, daemonset.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Daemonsets), &extensions.DaemonSet{}, prefix, daemonset.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.DaemonSet{} }, NewFunc: func() runtime.Object { return &extensions.DaemonSet{} },

View File

@ -32,7 +32,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName) etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName)
daemonSetStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
daemonSetStorage, statusStorage := NewREST(restOptions)
return daemonSetStorage, statusStorage, server return daemonSetStorage, statusStorage, server
} }

View File

@ -43,8 +43,8 @@ type DeploymentStorage struct {
Rollback *RollbackREST Rollback *RollbackREST
} }
func NewStorage(s storage.Interface, storageDecorator generic.StorageDecorator) DeploymentStorage { func NewStorage(opts generic.RESTOptions) DeploymentStorage {
deploymentRest, deploymentStatusRest, deploymentRollbackRest := NewREST(s, storageDecorator) deploymentRest, deploymentStatusRest, deploymentRollbackRest := NewREST(opts)
deploymentRegistry := deployment.NewRegistry(deploymentRest) deploymentRegistry := deployment.NewRegistry(deploymentRest)
return DeploymentStorage{ return DeploymentStorage{
@ -60,12 +60,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against deployments. // NewREST returns a RESTStorage object that will work against deployments.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST, *RollbackREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *RollbackREST) {
prefix := "/deployments" prefix := "/deployments"
newListFunc := func() runtime.Object { return &extensions.DeploymentList{} } newListFunc := func() runtime.Object { return &extensions.DeploymentList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Deployments), &extensions.Deployment{}, prefix, deployment.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Deployments), &extensions.Deployment{}, prefix, deployment.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.Deployment{} }, NewFunc: func() runtime.Object { return &extensions.Deployment{} },

View File

@ -36,7 +36,8 @@ import (
func newStorage(t *testing.T) (*DeploymentStorage, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*DeploymentStorage, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName) etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName)
deploymentStorage := NewStorage(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
deploymentStorage := NewStorage(restOptions)
return &deploymentStorage, server return &deploymentStorage, server
} }

View File

@ -25,7 +25,6 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against endpoints. // NewREST returns a RESTStorage object that will work against endpoints.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { func NewREST(opts generic.RESTOptions) *REST {
prefix := "/services/endpoints" prefix := "/services/endpoints"
newListFunc := func() runtime.Object { return &api.EndpointsList{} } newListFunc := func() runtime.Object { return &api.EndpointsList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Endpoints), &api.Endpoints{}, prefix, endpoint.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Endpoints), &api.Endpoints{}, prefix, endpoint.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.Endpoints{} }, NewFunc: func() runtime.Object { return &api.Endpoints{} },

View File

@ -30,7 +30,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions), server
} }
func validNewEndpoints() *api.Endpoints { func validNewEndpoints() *api.Endpoints {

View File

@ -24,7 +24,6 @@ import (
"k8s.io/kubernetes/pkg/registry/generic" "k8s.io/kubernetes/pkg/registry/generic"
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -32,12 +31,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against events. // NewREST returns a RESTStorage object that will work against events.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator, ttl uint64) *REST { func NewREST(opts generic.RESTOptions, ttl uint64) *REST {
prefix := "/events" prefix := "/events"
// We explicitly do NOT do any decoration here - switching on Cacher // We explicitly do NOT do any decoration here - switching on Cacher
// for events will lead to too high memory consumption. // for events will lead to too high memory consumption.
storageInterface := s storageInterface := opts.Storage
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.Event{} }, NewFunc: func() runtime.Object { return &api.Event{} },

View File

@ -30,7 +30,8 @@ var testTTL uint64 = 60
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage, testTTL), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions, testTTL), server
} }
func validNewEvent(namespace string) *api.Event { func validNewEvent(namespace string) *api.Event {

View File

@ -23,7 +23,6 @@ import (
"k8s.io/kubernetes/pkg/api/errors" "k8s.io/kubernetes/pkg/api/errors"
"k8s.io/kubernetes/pkg/api/rest" "k8s.io/kubernetes/pkg/api/rest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
"k8s.io/kubernetes/pkg/registry/controller" "k8s.io/kubernetes/pkg/registry/controller"
"k8s.io/kubernetes/pkg/registry/controller/etcd" "k8s.io/kubernetes/pkg/registry/controller/etcd"
@ -40,9 +39,9 @@ type ContainerStorage struct {
Scale *ScaleREST Scale *ScaleREST
} }
func NewStorage(s storage.Interface, storageDecorator generic.StorageDecorator) ContainerStorage { func NewStorage(opts generic.RESTOptions) ContainerStorage {
// scale does not set status, only updates spec so we ignore the status // scale does not set status, only updates spec so we ignore the status
controllerREST, _ := etcd.NewREST(s, storageDecorator) controllerREST, _ := etcd.NewREST(opts)
rcRegistry := controller.NewRegistry(controllerREST) rcRegistry := controller.NewRegistry(controllerREST)
return ContainerStorage{ return ContainerStorage{

View File

@ -30,7 +30,8 @@ import (
func newStorage(t *testing.T) (*ScaleREST, *etcdtesting.EtcdTestServer, storage.Interface) { func newStorage(t *testing.T) (*ScaleREST, *etcdtesting.EtcdTestServer, storage.Interface) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewStorage(etcdStorage, generic.UndecoratedStorage).Scale, server, etcdStorage restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewStorage(restOptions).Scale, server, etcdStorage
} }
var validPodTemplate = api.PodTemplate{ var validPodTemplate = api.PodTemplate{

View File

@ -0,0 +1,27 @@
/*
Copyright 2016 The Kubernetes Authors All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package generic
import (
pkgstorage "k8s.io/kubernetes/pkg/storage"
)
// RESTOptions is set of configuration options to generic registries.
type RESTOptions struct {
Storage pkgstorage.Interface
Decorator StorageDecorator
}

View File

@ -26,7 +26,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler" "k8s.io/kubernetes/pkg/registry/horizontalpodautoscaler"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -34,12 +33,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against horizontal pod autoscalers. // NewREST returns a RESTStorage object that will work against horizontal pod autoscalers.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/horizontalpodautoscalers" prefix := "/horizontalpodautoscalers"
newListFunc := func() runtime.Object { return &extensions.HorizontalPodAutoscalerList{} } newListFunc := func() runtime.Object { return &extensions.HorizontalPodAutoscalerList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.HorizontalPodAutoscalers), &extensions.HorizontalPodAutoscaler{}, prefix, horizontalpodautoscaler.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.HorizontalPodAutoscalers), &extensions.HorizontalPodAutoscaler{}, prefix, horizontalpodautoscaler.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.HorizontalPodAutoscaler{} }, NewFunc: func() runtime.Object { return &extensions.HorizontalPodAutoscaler{} },

View File

@ -33,7 +33,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName) etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName)
horizontalPodAutoscalerStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
horizontalPodAutoscalerStorage, statusStorage := NewREST(restOptions)
return horizontalPodAutoscalerStorage, statusStorage, server return horizontalPodAutoscalerStorage, statusStorage, server
} }

View File

@ -26,7 +26,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
ingress "k8s.io/kubernetes/pkg/registry/ingress" ingress "k8s.io/kubernetes/pkg/registry/ingress"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// rest implements a RESTStorage for replication controllers against etcd // rest implements a RESTStorage for replication controllers against etcd
@ -35,12 +34,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against replication controllers. // NewREST returns a RESTStorage object that will work against replication controllers.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/ingress" prefix := "/ingress"
newListFunc := func() runtime.Object { return &extensions.IngressList{} } newListFunc := func() runtime.Object { return &extensions.IngressList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Ingress), &extensions.Ingress{}, prefix, ingress.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Ingress), &extensions.Ingress{}, prefix, ingress.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.Ingress{} }, NewFunc: func() runtime.Object { return &extensions.Ingress{} },

View File

@ -32,7 +32,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName) etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName)
ingressStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
ingressStorage, statusStorage := NewREST(restOptions)
return ingressStorage, statusStorage, server return ingressStorage, statusStorage, server
} }

View File

@ -26,7 +26,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/job" "k8s.io/kubernetes/pkg/registry/job"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// REST implements a RESTStorage for jobs against etcd // REST implements a RESTStorage for jobs against etcd
@ -35,12 +34,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against Jobs. // NewREST returns a RESTStorage object that will work against Jobs.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/jobs" prefix := "/jobs"
newListFunc := func() runtime.Object { return &extensions.JobList{} } newListFunc := func() runtime.Object { return &extensions.JobList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Jobs), &extensions.Job{}, prefix, job.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Jobs), &extensions.Job{}, prefix, job.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.Job{} }, NewFunc: func() runtime.Object { return &extensions.Job{} },

View File

@ -34,7 +34,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName) etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName)
jobStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
jobStorage, statusStorage := NewREST(restOptions)
return jobStorage, statusStorage, server return jobStorage, statusStorage, server
} }

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/limitrange" "k8s.io/kubernetes/pkg/registry/limitrange"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against horizontal pod autoscalers. // NewREST returns a RESTStorage object that will work against horizontal pod autoscalers.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { func NewREST(opts generic.RESTOptions) *REST {
prefix := "/limitranges" prefix := "/limitranges"
newListFunc := func() runtime.Object { return &api.LimitRangeList{} } newListFunc := func() runtime.Object { return &api.LimitRangeList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.LimitRanges), &api.LimitRange{}, prefix, limitrange.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.LimitRanges), &api.LimitRange{}, prefix, limitrange.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.LimitRange{} }, NewFunc: func() runtime.Object { return &api.LimitRange{} },

View File

@ -31,7 +31,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions), server
} }
func validNewLimitRange() *api.LimitRange { func validNewLimitRange() *api.LimitRange {

View File

@ -29,7 +29,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/namespace" "k8s.io/kubernetes/pkg/registry/namespace"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// rest implements a RESTStorage for namespaces against etcd // rest implements a RESTStorage for namespaces against etcd
@ -49,12 +48,12 @@ type FinalizeREST struct {
} }
// NewREST returns a RESTStorage object that will work against namespaces. // NewREST returns a RESTStorage object that will work against namespaces.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST, *FinalizeREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *FinalizeREST) {
prefix := "/namespaces" prefix := "/namespaces"
newListFunc := func() runtime.Object { return &api.NamespaceList{} } newListFunc := func() runtime.Object { return &api.NamespaceList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Namespaces), &api.Namespace{}, prefix, namespace.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Namespaces), &api.Namespace{}, prefix, namespace.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.Namespace{} }, NewFunc: func() runtime.Object { return &api.Namespace{} },

View File

@ -31,7 +31,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
namespaceStorage, _, _ := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
namespaceStorage, _, _ := NewREST(restOptions)
return namespaceStorage, server return namespaceStorage, server
} }

View File

@ -30,7 +30,6 @@ import (
"k8s.io/kubernetes/pkg/registry/node" "k8s.io/kubernetes/pkg/registry/node"
noderest "k8s.io/kubernetes/pkg/registry/node/rest" noderest "k8s.io/kubernetes/pkg/registry/node/rest"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// NodeStorage includes storage for nodes and all sub resources // NodeStorage includes storage for nodes and all sub resources
@ -61,12 +60,12 @@ func (r *StatusREST) Update(ctx api.Context, obj runtime.Object) (runtime.Object
} }
// NewREST returns a RESTStorage object that will work against nodes. // NewREST returns a RESTStorage object that will work against nodes.
func NewStorage(s storage.Interface, storageDecorator generic.StorageDecorator, connection client.ConnectionInfoGetter, proxyTransport http.RoundTripper) NodeStorage { func NewStorage(opts generic.RESTOptions, connection client.ConnectionInfoGetter, proxyTransport http.RoundTripper) NodeStorage {
prefix := "/minions" prefix := "/minions"
newListFunc := func() runtime.Object { return &api.NodeList{} } newListFunc := func() runtime.Object { return &api.NodeList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Nodes), &api.Node{}, prefix, node.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Nodes), &api.Node{}, prefix, node.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.Node{} }, NewFunc: func() runtime.Object { return &api.Node{} },

View File

@ -39,7 +39,8 @@ func (fakeConnectionInfoGetter) GetConnectionInfo(ctx api.Context, nodeName stri
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
storage := NewStorage(etcdStorage, generic.UndecoratedStorage, fakeConnectionInfoGetter{}, nil) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
storage := NewStorage(restOptions, fakeConnectionInfoGetter{}, nil)
return storage.Node, server return storage.Node, server
} }

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/persistentvolume" "k8s.io/kubernetes/pkg/registry/persistentvolume"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against persistent volumes. // NewREST returns a RESTStorage object that will work against persistent volumes.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/persistentvolumes" prefix := "/persistentvolumes"
newListFunc := func() runtime.Object { return &api.PersistentVolumeList{} } newListFunc := func() runtime.Object { return &api.PersistentVolumeList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumes), &api.PersistentVolume{}, prefix, persistentvolume.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumes), &api.PersistentVolume{}, prefix, persistentvolume.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.PersistentVolume{} }, NewFunc: func() runtime.Object { return &api.PersistentVolume{} },

View File

@ -33,7 +33,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
persistentVolumeStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
persistentVolumeStorage, statusStorage := NewREST(restOptions)
return persistentVolumeStorage, statusStorage, server return persistentVolumeStorage, statusStorage, server
} }

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/persistentvolumeclaim" "k8s.io/kubernetes/pkg/registry/persistentvolumeclaim"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against persistent volume claims. // NewREST returns a RESTStorage object that will work against persistent volume claims.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/persistentvolumeclaims" prefix := "/persistentvolumeclaims"
newListFunc := func() runtime.Object { return &api.PersistentVolumeClaimList{} } newListFunc := func() runtime.Object { return &api.PersistentVolumeClaimList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumeClaims), &api.PersistentVolumeClaim{}, prefix, persistentvolumeclaim.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumeClaims), &api.PersistentVolumeClaim{}, prefix, persistentvolumeclaim.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.PersistentVolumeClaim{} }, NewFunc: func() runtime.Object { return &api.PersistentVolumeClaim{} },

View File

@ -33,7 +33,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
persistentVolumeClaimStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
persistentVolumeClaimStorage, statusStorage := NewREST(restOptions)
return persistentVolumeClaimStorage, statusStorage, server return persistentVolumeClaimStorage, statusStorage, server
} }

View File

@ -58,17 +58,12 @@ type REST struct {
} }
// NewStorage returns a RESTStorage object that will work against pods. // NewStorage returns a RESTStorage object that will work against pods.
func NewStorage( func NewStorage(opts generic.RESTOptions, k client.ConnectionInfoGetter, proxyTransport http.RoundTripper) PodStorage {
s storage.Interface,
storageDecorator generic.StorageDecorator,
k client.ConnectionInfoGetter,
proxyTransport http.RoundTripper,
) PodStorage {
prefix := "/pods" prefix := "/pods"
newListFunc := func() runtime.Object { return &api.PodList{} } newListFunc := func() runtime.Object { return &api.PodList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Pods), &api.Pod{}, prefix, pod.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Pods), &api.Pod{}, prefix, pod.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.Pod{} }, NewFunc: func() runtime.Object { return &api.Pod{} },

View File

@ -37,7 +37,8 @@ import (
func newStorage(t *testing.T) (*REST, *BindingREST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *BindingREST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
storage := NewStorage(etcdStorage, generic.UndecoratedStorage, nil, nil) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
storage := NewStorage(restOptions, nil, nil)
return storage.Pod, storage.Binding, storage.Status, server return storage.Pod, storage.Binding, storage.Status, server
} }

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/podsecuritypolicy" "k8s.io/kubernetes/pkg/registry/podsecuritypolicy"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// REST implements a RESTStorage for PodSecurityPolicies against etcd. // REST implements a RESTStorage for PodSecurityPolicies against etcd.
@ -36,10 +35,10 @@ type REST struct {
const Prefix = "/podsecuritypolicies" const Prefix = "/podsecuritypolicies"
// NewREST returns a RESTStorage object that will work against PodSecurityPolicy objects. // NewREST returns a RESTStorage object that will work against PodSecurityPolicy objects.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { func NewREST(opts generic.RESTOptions) *REST {
newListFunc := func() runtime.Object { return &extensions.PodSecurityPolicyList{} } newListFunc := func() runtime.Object { return &extensions.PodSecurityPolicyList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, 100, &extensions.PodSecurityPolicy{}, Prefix, podsecuritypolicy.Strategy, newListFunc) opts.Storage, 100, &extensions.PodSecurityPolicy{}, Prefix, podsecuritypolicy.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.PodSecurityPolicy{} }, NewFunc: func() runtime.Object { return &extensions.PodSecurityPolicy{} },

View File

@ -33,7 +33,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
return NewREST(etcdStorage, generic.UndecoratedStorage), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions), server
} }
func validNewPodSecurityPolicy() *extensions.PodSecurityPolicy { func validNewPodSecurityPolicy() *extensions.PodSecurityPolicy {

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/podtemplate" "k8s.io/kubernetes/pkg/registry/podtemplate"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against pod templates. // NewREST returns a RESTStorage object that will work against pod templates.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { func NewREST(opts generic.RESTOptions) *REST {
prefix := "/podtemplates" prefix := "/podtemplates"
newListFunc := func() runtime.Object { return &api.PodTemplateList{} } newListFunc := func() runtime.Object { return &api.PodTemplateList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.PodTemplates), &api.PodTemplate{}, prefix, podtemplate.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.PodTemplates), &api.PodTemplate{}, prefix, podtemplate.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.PodTemplate{} }, NewFunc: func() runtime.Object { return &api.PodTemplate{} },

View File

@ -30,7 +30,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions), server
} }
func validNewPodTemplate(name string) *api.PodTemplate { func validNewPodTemplate(name string) *api.PodTemplate {

View File

@ -28,7 +28,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/replicaset" "k8s.io/kubernetes/pkg/registry/replicaset"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// ReplicaSetStorage includes dummy storage for ReplicaSets and for Scale subresource. // ReplicaSetStorage includes dummy storage for ReplicaSets and for Scale subresource.
@ -37,8 +36,8 @@ type ReplicaSetStorage struct {
Status *StatusREST Status *StatusREST
} }
func NewStorage(s storage.Interface, storageDecorator generic.StorageDecorator) ReplicaSetStorage { func NewStorage(opts generic.RESTOptions) ReplicaSetStorage {
replicaSetRest, replicaSetStatusRest := NewREST(s, storageDecorator) replicaSetRest, replicaSetStatusRest := NewREST(opts)
return ReplicaSetStorage{ return ReplicaSetStorage{
ReplicaSet: replicaSetRest, ReplicaSet: replicaSetRest,
@ -51,12 +50,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against ReplicaSet. // NewREST returns a RESTStorage object that will work against ReplicaSet.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/replicasets" prefix := "/replicasets"
newListFunc := func() runtime.Object { return &extensions.ReplicaSetList{} } newListFunc := func() runtime.Object { return &extensions.ReplicaSetList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Replicasets), &extensions.ReplicaSet{}, prefix, replicaset.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Replicasets), &extensions.ReplicaSet{}, prefix, replicaset.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.ReplicaSet{} }, NewFunc: func() runtime.Object { return &extensions.ReplicaSet{} },

View File

@ -32,7 +32,8 @@ import (
func newStorage(t *testing.T) (*ReplicaSetStorage, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*ReplicaSetStorage, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions") etcdStorage, server := registrytest.NewEtcdStorage(t, "extensions")
replicaSetStorage := NewStorage(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
replicaSetStorage := NewStorage(restOptions)
return &replicaSetStorage, server return &replicaSetStorage, server
} }

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/resourcequota" "k8s.io/kubernetes/pkg/registry/resourcequota"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against resource quotas. // NewREST returns a RESTStorage object that will work against resource quotas.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/resourcequotas" prefix := "/resourcequotas"
newListFunc := func() runtime.Object { return &api.ResourceQuotaList{} } newListFunc := func() runtime.Object { return &api.ResourceQuotaList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.ResourceQuotas), &api.ResourceQuota{}, prefix, resourcequota.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.ResourceQuotas), &api.ResourceQuota{}, prefix, resourcequota.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.ResourceQuota{} }, NewFunc: func() runtime.Object { return &api.ResourceQuota{} },

View File

@ -32,7 +32,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
resourceQuotaStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
resourceQuotaStorage, statusStorage := NewREST(restOptions)
return resourceQuotaStorage, statusStorage, server return resourceQuotaStorage, statusStorage, server
} }

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/secret" "k8s.io/kubernetes/pkg/registry/secret"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against secrets. // NewREST returns a RESTStorage object that will work against secrets.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { func NewREST(opts generic.RESTOptions) *REST {
prefix := "/secrets" prefix := "/secrets"
newListFunc := func() runtime.Object { return &api.SecretList{} } newListFunc := func() runtime.Object { return &api.SecretList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Secrets), &api.Secret{}, prefix, secret.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Secrets), &api.Secret{}, prefix, secret.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.Secret{} }, NewFunc: func() runtime.Object { return &api.Secret{} },

View File

@ -30,7 +30,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions), server
} }
func validNewSecret(name string) *api.Secret { func validNewSecret(name string) *api.Secret {

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/service" "k8s.io/kubernetes/pkg/registry/service"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against services. // NewREST returns a RESTStorage object that will work against services.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) {
prefix := "/services/specs" prefix := "/services/specs"
newListFunc := func() runtime.Object { return &api.ServiceList{} } newListFunc := func() runtime.Object { return &api.ServiceList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.Services), &api.Service{}, prefix, service.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Services), &api.Service{}, prefix, service.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.Service{} }, NewFunc: func() runtime.Object { return &api.Service{} },

View File

@ -31,7 +31,8 @@ import (
func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *StatusREST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
serviceStorage, statusStorage := NewREST(etcdStorage, generic.UndecoratedStorage) restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
serviceStorage, statusStorage := NewREST(restOptions)
return serviceStorage, statusStorage, server return serviceStorage, statusStorage, server
} }

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/serviceaccount" "k8s.io/kubernetes/pkg/registry/serviceaccount"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
type REST struct { type REST struct {
@ -33,12 +32,12 @@ type REST struct {
} }
// NewREST returns a RESTStorage object that will work against service accounts. // NewREST returns a RESTStorage object that will work against service accounts.
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { func NewREST(opts generic.RESTOptions) *REST {
prefix := "/serviceaccounts" prefix := "/serviceaccounts"
newListFunc := func() runtime.Object { return &api.ServiceAccountList{} } newListFunc := func() runtime.Object { return &api.ServiceAccountList{} }
storageInterface := storageDecorator( storageInterface := opts.Decorator(
s, cachesize.GetWatchCacheSizeByResource(cachesize.ServiceAccounts), &api.ServiceAccount{}, prefix, serviceaccount.Strategy, newListFunc) opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.ServiceAccounts), &api.ServiceAccount{}, prefix, serviceaccount.Strategy, newListFunc)
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &api.ServiceAccount{} }, NewFunc: func() runtime.Object { return &api.ServiceAccount{} },

View File

@ -30,7 +30,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, "") etcdStorage, server := registrytest.NewEtcdStorage(t, "")
return NewREST(etcdStorage, generic.UndecoratedStorage), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions), server
} }
func validNewServiceAccount(name string) *api.ServiceAccount { func validNewServiceAccount(name string) *api.ServiceAccount {

View File

@ -25,7 +25,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/thirdpartyresource" "k8s.io/kubernetes/pkg/registry/thirdpartyresource"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// REST implements a RESTStorage for ThirdPartyResources against etcd // REST implements a RESTStorage for ThirdPartyResources against etcd
@ -34,11 +33,11 @@ type REST struct {
} }
// NewREST returns a registry which will store ThirdPartyResource in the given helper // NewREST returns a registry which will store ThirdPartyResource in the given helper
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { func NewREST(opts generic.RESTOptions) *REST {
prefix := "/thirdpartyresources" prefix := "/thirdpartyresources"
// We explicitly do NOT do any decoration here yet. // We explicitly do NOT do any decoration here yet.
storageInterface := s storageInterface := opts.Storage
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.ThirdPartyResource{} }, NewFunc: func() runtime.Object { return &extensions.ThirdPartyResource{} },

View File

@ -33,7 +33,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName) etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName)
return NewREST(etcdStorage, generic.UndecoratedStorage), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions), server
} }
func validNewThirdPartyResource(name string) *extensions.ThirdPartyResource { func validNewThirdPartyResource(name string) *extensions.ThirdPartyResource {

View File

@ -27,7 +27,6 @@ import (
etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd" etcdgeneric "k8s.io/kubernetes/pkg/registry/generic/etcd"
"k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata" "k8s.io/kubernetes/pkg/registry/thirdpartyresourcedata"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/storage"
) )
// REST implements a RESTStorage for ThirdPartyResourceDatas against etcd // REST implements a RESTStorage for ThirdPartyResourceDatas against etcd
@ -37,11 +36,11 @@ type REST struct {
} }
// NewREST returns a registry which will store ThirdPartyResourceData in the given helper // NewREST returns a registry which will store ThirdPartyResourceData in the given helper
func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator, group, kind string) *REST { func NewREST(opts generic.RESTOptions, group, kind string) *REST {
prefix := "/ThirdPartyResourceData/" + group + "/" + strings.ToLower(kind) + "s" prefix := "/ThirdPartyResourceData/" + group + "/" + strings.ToLower(kind) + "s"
// We explicitly do NOT do any decoration here yet. // We explicitly do NOT do any decoration here yet.
storageInterface := s storageInterface := opts.Storage
store := &etcdgeneric.Etcd{ store := &etcdgeneric.Etcd{
NewFunc: func() runtime.Object { return &extensions.ThirdPartyResourceData{} }, NewFunc: func() runtime.Object { return &extensions.ThirdPartyResourceData{} },

View File

@ -33,7 +33,8 @@ import (
func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) { func newStorage(t *testing.T) (*REST, *etcdtesting.EtcdTestServer) {
etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName) etcdStorage, server := registrytest.NewEtcdStorage(t, extensions.GroupName)
return NewREST(etcdStorage, generic.UndecoratedStorage, "foo", "bar"), server restOptions := generic.RESTOptions{etcdStorage, generic.UndecoratedStorage}
return NewREST(restOptions, "foo", "bar"), server
} }
func validNewThirdPartyResourceData(name string) *extensions.ThirdPartyResourceData { func validNewThirdPartyResourceData(name string) *extensions.ThirdPartyResourceData {