// NewREST returns a RESTStorage object that will work against endpoints. func NewREST(opts generic.RESTOptions) *REST { prefix := "/services/endpoints" newListFunc := func() runtime.Object { return &api.EndpointsList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Endpoints), &api.Endpoints{}, prefix, endpoint.Strategy, newListFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.Endpoints{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Endpoints).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return endpoint.MatchEndpoints(label, field) }, QualifiedResource: api.Resource("endpoints"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: endpoint.Strategy, UpdateStrategy: endpoint.Strategy, DeleteStrategy: endpoint.Strategy, Storage: storageInterface, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against secrets. func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) *REST { prefix := "/secrets" newListFunc := func() runtime.Object { return &api.SecretList{} } storageInterface := storageDecorator( s, cachesize.GetWatchCacheSizeByResource(cachesize.Secrets), &api.Secret{}, prefix, secret.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Secret{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return etcdgeneric.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, id string) (string, error) { return etcdgeneric.NamespaceKeyFunc(ctx, prefix, id) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Secret).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return secret.Matcher(label, field) }, QualifiedResource: api.Resource("secrets"), CreateStrategy: secret.Strategy, UpdateStrategy: secret.Strategy, Storage: storageInterface, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against pod templates. func NewREST(opts generic.RESTOptions) *REST { prefix := "/podtemplates" newListFunc := func() runtime.Object { return &api.PodTemplateList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.PodTemplates), &api.PodTemplate{}, prefix, podtemplate.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.PodTemplate{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return etcdgeneric.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return etcdgeneric.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.PodTemplate).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return podtemplate.MatchPodTemplate(label, field) }, QualifiedResource: api.Resource("podtemplates"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: podtemplate.Strategy, UpdateStrategy: podtemplate.Strategy, ExportStrategy: podtemplate.Strategy, ReturnDeletedObject: true, Storage: storageInterface, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against services. func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { prefix := "/services/specs" newListFunc := func() runtime.Object { return &api.ServiceList{} } storageInterface := storageDecorator( s, cachesize.GetWatchCacheSizeByResource(cachesize.Services), &api.Service{}, prefix, service.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Service{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return etcdgeneric.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return etcdgeneric.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Service).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return service.MatchServices(label, field) }, QualifiedResource: api.Resource("services"), CreateStrategy: service.Strategy, UpdateStrategy: service.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = service.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewStorage returns a RESTStorage object that will work against security context constraints objects. func NewStorage(opts generic.RESTOptions) *REST { newListFunc := func() runtime.Object { return &api.SecurityContextConstraintsList{} } storageInterface := opts.Decorator(opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.SecurityContextConstraints), &api.SecurityContextConstraints{}, Prefix, securitycontextconstraints.Strategy, newListFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.SecurityContextConstraints{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return Prefix }, KeyFunc: func(ctx api.Context, name string) (string, error) { return path.Join(Prefix, name), nil }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.SecurityContextConstraints).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return securitycontextconstraints.Matcher(label, field) }, QualifiedResource: api.Resource("securitycontextconstraints"), CreateStrategy: securitycontextconstraints.Strategy, UpdateStrategy: securitycontextconstraints.Strategy, ReturnDeletedObject: true, Storage: storageInterface, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against nodes. func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator, connection client.ConnectionInfoGetter, proxyTransport http.RoundTripper) (*REST, *StatusREST) { prefix := "/minions" newListFunc := func() runtime.Object { return &api.NodeList{} } storageInterface := storageDecorator( s, cachesize.GetWatchCacheSizeByResource(cachesize.Nodes), &api.Node{}, prefix, node.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Node{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return prefix }, KeyFunc: func(ctx api.Context, name string) (string, error) { return etcdgeneric.NoNamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Node).Name, nil }, PredicateFunc: node.MatchNode, QualifiedResource: api.Resource("nodes"), CreateStrategy: node.Strategy, UpdateStrategy: node.Strategy, ExportStrategy: node.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = node.StatusStrategy return &REST{store, connection, proxyTransport}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work against services. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/services/specs" newListFunc := func() runtime.Object { return &api.ServiceList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Services), &api.Service{}, prefix, service.Strategy, newListFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.Service{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Service).Name, nil }, PredicateFunc: service.MatchServices, QualifiedResource: api.Resource("services"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: service.Strategy, UpdateStrategy: service.Strategy, DeleteStrategy: service.Strategy, ExportStrategy: service.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = service.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work against horizontal pod autoscalers. func NewREST(opts generic.RESTOptions) *REST { prefix := "/limitranges" newListFunc := func() runtime.Object { return &api.LimitRangeList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.LimitRanges), &api.LimitRange{}, prefix, limitrange.Strategy, newListFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.LimitRange{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, id string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, id) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.LimitRange).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return limitrange.MatchLimitRange(label, field) }, QualifiedResource: api.Resource("limitranges"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: limitrange.Strategy, UpdateStrategy: limitrange.Strategy, DeleteStrategy: limitrange.Strategy, ExportStrategy: limitrange.Strategy, Storage: storageInterface, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against service accounts. func NewREST(opts generic.RESTOptions) *REST { prefix := "/serviceaccounts" newListFunc := func() runtime.Object { return &api.ServiceAccountList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.ServiceAccounts), &api.ServiceAccount{}, prefix, serviceaccount.Strategy, newListFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.ServiceAccount{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.ServiceAccount).Name, nil }, PredicateFunc: serviceaccount.Matcher, QualifiedResource: api.Resource("serviceaccounts"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: serviceaccount.Strategy, UpdateStrategy: serviceaccount.Strategy, DeleteStrategy: serviceaccount.Strategy, ReturnDeletedObject: true, Storage: storageInterface, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ReplicationControllerList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Controllers), &api.ReplicationController{}, prefix, controller.Strategy, newListFunc, controller.GetAttrs, storage.NoTriggerPublisher, ) store := &genericregistry.Store{ NewFunc: func() runtime.Object { return &api.ReplicationController{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix KeyRootFunc: func(ctx api.Context) string { return genericregistry.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return genericregistry.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a replication controller ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.ReplicationController).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: controller.MatchController, QualifiedResource: api.Resource("replicationcontrollers"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, // Used to validate controller creation CreateStrategy: controller.Strategy, // Used to validate controller updates UpdateStrategy: controller.Strategy, DeleteStrategy: controller.Strategy, Storage: storageInterface, DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = controller.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work with ConfigMap objects. func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.ConfigMapList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ConfigMaps), &api.ConfigMap{}, prefix, configmap.Strategy, newListFunc, configmap.GetAttrs, storage.NoTriggerPublisher) store := &genericregistry.Store{ NewFunc: func() runtime.Object { return &api.ConfigMap{} }, // NewListFunc returns an object to store results of an etcd list. NewListFunc: newListFunc, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix. KeyRootFunc: func(ctx api.Context) string { return genericregistry.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return genericregistry.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieves the name field of a ConfigMap object. ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.ConfigMap).Name, nil }, // Matches objects based on labels/fields for list and watch PredicateFunc: configmap.MatchConfigMap, QualifiedResource: api.Resource("configmaps"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: configmap.Strategy, UpdateStrategy: configmap.Strategy, DeleteStrategy: configmap.Strategy, Storage: storageInterface, DestroyFunc: dFunc, } return &REST{store} }
// NewStorage returns a RESTStorage object that will work against pods. func NewStorage(opts generic.RESTOptions, k client.ConnectionInfoGetter, proxyTransport http.RoundTripper, podDisruptionBudgetClient policyclient.PodDisruptionBudgetsGetter) PodStorage { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PodList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Pods), &api.Pod{}, prefix, pod.Strategy, newListFunc, pod.GetAttrs, pod.NodeNameTriggerFunc, ) store := &genericregistry.Store{ NewFunc: func() runtime.Object { return &api.Pod{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return genericregistry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return genericregistry.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Pod).Name, nil }, PredicateFunc: pod.MatchPod, QualifiedResource: api.Resource("pods"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: pod.Strategy, UpdateStrategy: pod.Strategy, DeleteStrategy: pod.Strategy, ReturnDeletedObject: true, Storage: storageInterface, DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = pod.StatusStrategy return PodStorage{ Pod: &REST{store, proxyTransport}, Binding: &BindingREST{store: store}, Eviction: newEvictionStorage(store, podDisruptionBudgetClient), Status: &StatusREST{store: &statusStore}, Log: &podrest.LogREST{Store: store, KubeletConn: k}, Proxy: &podrest.ProxyREST{Store: store, ProxyTransport: proxyTransport}, Exec: &podrest.ExecREST{Store: store, KubeletConn: k}, Attach: &podrest.AttachREST{Store: store, KubeletConn: k}, PortForward: &podrest.PortForwardREST{Store: store, KubeletConn: k}, } }
// NewREST returns a RESTStorage object that will work against ScheduledJobs. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &batch.ScheduledJobList{} } storageInterface := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.ScheduledJobs), &batch.ScheduledJob{}, prefix, scheduledjob.Strategy, newListFunc, storage.NoTriggerPublisher, ) store := ®istry.Store{ NewFunc: func() runtime.Object { return &batch.ScheduledJob{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a scheduled job ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*batch.ScheduledJob).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: scheduledjob.MatchScheduledJob, QualifiedResource: batch.Resource("scheduledjobs"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, // Used to validate scheduled job creation CreateStrategy: scheduledjob.Strategy, // Used to validate scheduled job updates UpdateStrategy: scheduledjob.Strategy, DeleteStrategy: scheduledjob.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = scheduledjob.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a registry which will store CertificateSigningRequest in the given helper func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *ApprovalREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &certificates.CertificateSigningRequestList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.CertificateSigningRequests), &certificates.CertificateSigningRequest{}, prefix, csrregistry.Strategy, newListFunc, storage.NoTriggerPublisher, ) store := ®istry.Store{ NewFunc: func() runtime.Object { return &certificates.CertificateSigningRequest{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return prefix }, KeyFunc: func(ctx api.Context, id string) (string, error) { return registry.NoNamespaceKeyFunc(ctx, prefix, id) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*certificates.CertificateSigningRequest).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) storage.SelectionPredicate { return csrregistry.Matcher(label, field) }, QualifiedResource: certificates.Resource("certificatesigningrequests"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: csrregistry.Strategy, UpdateStrategy: csrregistry.Strategy, DeleteStrategy: csrregistry.Strategy, Storage: storageInterface, DestroyFunc: dFunc, } // Subresources use the same store and creation strategy, which only // allows empty subs. Updates to an existing subresource are handled by // dedicated strategies. statusStore := *store statusStore.UpdateStrategy = csrregistry.StatusStrategy approvalStore := *store approvalStore.UpdateStrategy = csrregistry.ApprovalStrategy return &REST{store}, &StatusREST{store: &statusStore}, &ApprovalREST{store: &approvalStore} }
// NewREST returns a RESTStorage object that will work against network policies. func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensionsapi.NetworkPolicyList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.NetworkPolicys), &extensionsapi.NetworkPolicy{}, prefix, networkpolicy.Strategy, newListFunc, storage.NoTriggerPublisher, ) store := ®istry.Store{ NewFunc: func() runtime.Object { return &extensionsapi.NetworkPolicy{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a NetworkPolicy that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a NetworkPolicy that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a network policy ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*extensionsapi.NetworkPolicy).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: networkpolicy.MatchNetworkPolicy, QualifiedResource: extensionsapi.Resource("networkpolicies"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, // Used to validate controller creation CreateStrategy: networkpolicy.Strategy, // Used to validate controller updates UpdateStrategy: networkpolicy.Strategy, DeleteStrategy: networkpolicy.Strategy, Storage: storageInterface, DestroyFunc: dFunc, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against deployments. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *RollbackREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &extensions.DeploymentList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Deployments), &extensions.Deployment{}, prefix, deployment.Strategy, newListFunc, storage.NoTriggerPublisher, ) store := ®istry.Store{ NewFunc: func() runtime.Object { return &extensions.Deployment{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix. KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix. KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a deployment. ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*extensions.Deployment).Name, nil }, // Used to match objects based on labels/fields for list. PredicateFunc: deployment.MatchDeployment, QualifiedResource: extensions.Resource("deployments"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, // Used to validate deployment creation. CreateStrategy: deployment.Strategy, // Used to validate deployment updates. UpdateStrategy: deployment.Strategy, DeleteStrategy: deployment.Strategy, Storage: storageInterface, DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = deployment.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, &RollbackREST{store: store} }
// NewStorage returns a RESTStorage object that will work against pods. func NewStorage( s storage.Interface, storageDecorator generic.StorageDecorator, k client.ConnectionInfoGetter, proxyTransport http.RoundTripper, ) PodStorage { prefix := "/pods" newListFunc := func() runtime.Object { return &api.PodList{} } storageInterface := storageDecorator( s, cachesize.GetWatchCacheSizeByResource(cachesize.Pods), &api.Pod{}, prefix, pod.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.Pod{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return etcdgeneric.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return etcdgeneric.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Pod).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return pod.MatchPod(label, field) }, QualifiedResource: api.Resource("pods"), CreateStrategy: pod.Strategy, UpdateStrategy: pod.Strategy, DeleteStrategy: pod.Strategy, ReturnDeletedObject: true, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = pod.StatusStrategy return PodStorage{ Pod: &REST{store, proxyTransport}, Binding: &BindingREST{store: store}, Status: &StatusREST{store: &statusStore}, Log: &podrest.LogREST{Store: store, KubeletConn: k}, Proxy: &podrest.ProxyREST{Store: store, ProxyTransport: proxyTransport}, Exec: &podrest.ExecREST{Store: store, KubeletConn: k}, Attach: &podrest.AttachREST{Store: store, KubeletConn: k}, PortForward: &podrest.PortForwardREST{Store: store, KubeletConn: k}, } }
// NewREST returns a RESTStorage object that will work against pod disruption budgets. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/poddisruptionbudgets" newListFunc := func() runtime.Object { return &policyapi.PodDisruptionBudgetList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.PodDisruptionBudget), &policyapi.PodDisruptionBudget{}, prefix, poddisruptionbudget.Strategy, newListFunc, storage.NoTriggerPublisher, ) store := ®istry.Store{ NewFunc: func() runtime.Object { return &policyapi.PodDisruptionBudget{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a podDisruptionBudget that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a podDisruptionBudget that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a pod disruption budget ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*policyapi.PodDisruptionBudget).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: poddisruptionbudget.MatchPodDisruptionBudget, QualifiedResource: policyapi.Resource("poddisruptionbudgets"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, // Used to validate controller creation CreateStrategy: poddisruptionbudget.Strategy, // Used to validate controller updates UpdateStrategy: poddisruptionbudget.Strategy, DeleteStrategy: poddisruptionbudget.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = poddisruptionbudget.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewStorage returns a NodeStorage object that will work against nodes. func NewStorage(opts generic.RESTOptions, connection client.KubeletClient, proxyTransport http.RoundTripper) NodeStorage { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.NodeList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Nodes), &api.Node{}, prefix, node.Strategy, newListFunc, node.NodeNameTriggerFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.Node{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return prefix }, KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NoNamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Node).Name, nil }, PredicateFunc: node.MatchNode, QualifiedResource: api.Resource("nodes"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: node.Strategy, UpdateStrategy: node.Strategy, DeleteStrategy: node.Strategy, ExportStrategy: node.Strategy, Storage: storageInterface, DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = node.StatusStrategy nodeREST := &REST{store, connection, proxyTransport} return NodeStorage{ Node: nodeREST, Status: &StatusREST{store: &statusStore}, Proxy: &noderest.ProxyREST{Store: store, Connection: client.ConnectionInfoGetter(nodeREST), ProxyTransport: proxyTransport}, } }
// NewREST returns a RESTStorage object that will work against namespaces. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *FinalizeREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.NamespaceList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.Namespaces), &api.Namespace{}, prefix, namespace.Strategy, newListFunc, namespace.GetAttrs, storage.NoTriggerPublisher, ) store := &genericregistry.Store{ NewFunc: func() runtime.Object { return &api.Namespace{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return prefix }, KeyFunc: func(ctx api.Context, name string) (string, error) { return genericregistry.NoNamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Namespace).Name, nil }, PredicateFunc: namespace.MatchNamespace, QualifiedResource: api.Resource("namespaces"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: namespace.Strategy, UpdateStrategy: namespace.Strategy, DeleteStrategy: namespace.Strategy, ReturnDeletedObject: true, Storage: storageInterface, DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = namespace.StatusStrategy finalizeStore := *store finalizeStore.UpdateStrategy = namespace.FinalizeStrategy return &REST{Store: store, status: &statusStore}, &StatusREST{store: &statusStore}, &FinalizeREST{store: &finalizeStore} }
// NewREST returns a RESTStorage object that will work against Jobs. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/jobs" newListFunc := func() runtime.Object { return &extensions.JobList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Jobs), &extensions.Job{}, prefix, job.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &extensions.Job{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix KeyRootFunc: func(ctx api.Context) string { return etcdgeneric.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return etcdgeneric.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a job ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*extensions.Job).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return job.MatchJob(label, field) }, QualifiedResource: extensions.Resource("jobs"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, // Used to validate job creation CreateStrategy: job.Strategy, // Used to validate job updates UpdateStrategy: job.Strategy, DeleteStrategy: job.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = job.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work against persistent volume claims. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PersistentVolumeClaimList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PersistentVolumeClaims), &api.PersistentVolumeClaim{}, prefix, persistentvolumeclaim.Strategy, newListFunc, storage.NoTriggerPublisher, ) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.PersistentVolumeClaim{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.PersistentVolumeClaim).Name, nil }, PredicateFunc: persistentvolumeclaim.MatchPersistentVolumeClaim, QualifiedResource: api.Resource("persistentvolumeclaims"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: persistentvolumeclaim.Strategy, UpdateStrategy: persistentvolumeclaim.Strategy, DeleteStrategy: persistentvolumeclaim.Strategy, ReturnDeletedObject: true, Storage: storageInterface, DestroyFunc: dFunc, } statusStore := *store statusStore.UpdateStrategy = persistentvolumeclaim.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work against horizontal pod autoscalers. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/horizontalpodautoscalers" newListFunc := func() runtime.Object { return &autoscaling.HorizontalPodAutoscalerList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.HorizontalPodAutoscalers), &autoscaling.HorizontalPodAutoscaler{}, prefix, horizontalpodautoscaler.Strategy, newListFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &autoscaling.HorizontalPodAutoscaler{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of an autoscaler ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*autoscaling.HorizontalPodAutoscaler).Name, nil }, // Used to match objects based on labels/fields for list PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return horizontalpodautoscaler.MatchAutoscaler(label, field) }, QualifiedResource: autoscaling.Resource("horizontalpodautoscalers"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, // Used to validate autoscaler creation CreateStrategy: horizontalpodautoscaler.Strategy, // Used to validate autoscaler updates UpdateStrategy: horizontalpodautoscaler.Strategy, DeleteStrategy: horizontalpodautoscaler.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = horizontalpodautoscaler.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST) { prefix := "/controllers" newListFunc := func() runtime.Object { return &api.ReplicationControllerList{} } storageInterface := storageDecorator( s, cachesize.GetWatchCacheSizeByResource(cachesize.Controllers), &api.ReplicationController{}, prefix, controller.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &api.ReplicationController{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix KeyRootFunc: func(ctx api.Context) string { return etcdgeneric.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return etcdgeneric.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a replication controller ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.ReplicationController).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return controller.MatchController(label, field) }, QualifiedResource: api.Resource("replicationcontrollers"), // Used to validate controller creation CreateStrategy: controller.Strategy, // Used to validate controller updates UpdateStrategy: controller.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = controller.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work against replication controllers. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/ingress" newListFunc := func() runtime.Object { return &extensions.IngressList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Ingress), &extensions.Ingress{}, prefix, ingress.Strategy, newListFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &extensions.Ingress{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a ingress that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a ingress that etcd understands, to the resource by combining // the namespace in the context with the given prefix KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a replication controller ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*extensions.Ingress).Name, nil }, // Used to match objects based on labels/fields for list and watch PredicateFunc: ingress.MatchIngress, QualifiedResource: extensions.Resource("ingresses"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, // Used to validate controller creation CreateStrategy: ingress.Strategy, // Used to validate controller updates UpdateStrategy: ingress.Strategy, DeleteStrategy: ingress.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = ingress.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work against pod templates. func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &api.PodTemplateList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.PodTemplates), &api.PodTemplate{}, prefix, podtemplate.Strategy, newListFunc, podtemplate.GetAttrs, storage.NoTriggerPublisher, ) store := &genericregistry.Store{ NewFunc: func() runtime.Object { return &api.PodTemplate{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return genericregistry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return genericregistry.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.PodTemplate).Name, nil }, PredicateFunc: podtemplate.MatchPodTemplate, QualifiedResource: api.Resource("podtemplates"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: podtemplate.Strategy, UpdateStrategy: podtemplate.Strategy, DeleteStrategy: podtemplate.Strategy, ExportStrategy: podtemplate.Strategy, ReturnDeletedObject: true, Storage: storageInterface, DestroyFunc: dFunc, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against resource quotas. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST) { prefix := "/resourcequotas" newListFunc := func() runtime.Object { return &api.ResourceQuotaList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.ResourceQuotas), &api.ResourceQuota{}, prefix, resourcequota.Strategy, newListFunc, storage.NoTriggerPublisher, ) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.ResourceQuota{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return registry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.ResourceQuota).Name, nil }, PredicateFunc: resourcequota.MatchResourceQuota, QualifiedResource: api.Resource("resourcequotas"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: resourcequota.Strategy, UpdateStrategy: resourcequota.Strategy, DeleteStrategy: resourcequota.Strategy, ReturnDeletedObject: true, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = resourcequota.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore} }
// NewREST returns a RESTStorage object that will work against deployments. func NewREST(s storage.Interface, storageDecorator generic.StorageDecorator) (*REST, *StatusREST, *RollbackREST) { prefix := "/deployments" newListFunc := func() runtime.Object { return &extensions.DeploymentList{} } storageInterface := storageDecorator( s, cachesize.GetWatchCacheSizeByResource(cachesize.Deployments), &extensions.Deployment{}, prefix, deployment.Strategy, newListFunc) store := &etcdgeneric.Etcd{ NewFunc: func() runtime.Object { return &extensions.Deployment{} }, // NewListFunc returns an object capable of storing results of an etcd list. NewListFunc: newListFunc, // Produces a path that etcd understands, to the root of the resource // by combining the namespace in the context with the given prefix. KeyRootFunc: func(ctx api.Context) string { return etcdgeneric.NamespaceKeyRootFunc(ctx, prefix) }, // Produces a path that etcd understands, to the resource by combining // the namespace in the context with the given prefix. KeyFunc: func(ctx api.Context, name string) (string, error) { return etcdgeneric.NamespaceKeyFunc(ctx, prefix, name) }, // Retrieve the name field of a deployment. ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*extensions.Deployment).Name, nil }, // Used to match objects based on labels/fields for list. PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return deployment.MatchDeployment(label, field) }, QualifiedResource: extensions.Resource("deployments"), // Used to validate deployment creation. CreateStrategy: deployment.Strategy, // Used to validate deployment updates. UpdateStrategy: deployment.Strategy, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = deployment.StatusStrategy return &REST{store}, &StatusREST{store: &statusStore}, &RollbackREST{store: store} }
// NewREST returns a RESTStorage object that will work against RoleBinding objects. func NewREST(opts generic.RESTOptions) *REST { prefix := "/" + opts.ResourcePrefix newListFunc := func() runtime.Object { return &rbac.RoleBindingList{} } storageInterface, dFunc := opts.Decorator( opts.StorageConfig, cachesize.GetWatchCacheSizeByResource(cachesize.RoleBindings), &rbac.RoleBinding{}, prefix, rolebinding.Strategy, newListFunc, rolebinding.GetAttrs, storage.NoTriggerPublisher, ) store := &genericregistry.Store{ NewFunc: func() runtime.Object { return &rbac.RoleBinding{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return genericregistry.NamespaceKeyRootFunc(ctx, prefix) }, KeyFunc: func(ctx api.Context, id string) (string, error) { return genericregistry.NamespaceKeyFunc(ctx, prefix, id) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*rbac.RoleBinding).Name, nil }, PredicateFunc: rolebinding.Matcher, QualifiedResource: rbac.Resource("rolebindings"), EnableGarbageCollection: opts.EnableGarbageCollection, DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: rolebinding.Strategy, UpdateStrategy: rolebinding.Strategy, DeleteStrategy: rolebinding.Strategy, Storage: storageInterface, DestroyFunc: dFunc, } return &REST{store} }
// NewREST returns a RESTStorage object that will work against namespaces. func NewREST(opts generic.RESTOptions) (*REST, *StatusREST, *FinalizeREST) { prefix := "/namespaces" newListFunc := func() runtime.Object { return &api.NamespaceList{} } storageInterface := opts.Decorator( opts.Storage, cachesize.GetWatchCacheSizeByResource(cachesize.Namespaces), &api.Namespace{}, prefix, namespace.Strategy, newListFunc) store := ®istry.Store{ NewFunc: func() runtime.Object { return &api.Namespace{} }, NewListFunc: newListFunc, KeyRootFunc: func(ctx api.Context) string { return prefix }, KeyFunc: func(ctx api.Context, name string) (string, error) { return registry.NoNamespaceKeyFunc(ctx, prefix, name) }, ObjectNameFunc: func(obj runtime.Object) (string, error) { return obj.(*api.Namespace).Name, nil }, PredicateFunc: func(label labels.Selector, field fields.Selector) generic.Matcher { return namespace.MatchNamespace(label, field) }, QualifiedResource: api.Resource("namespaces"), DeleteCollectionWorkers: opts.DeleteCollectionWorkers, CreateStrategy: namespace.Strategy, UpdateStrategy: namespace.Strategy, DeleteStrategy: namespace.Strategy, ReturnDeletedObject: true, Storage: storageInterface, } statusStore := *store statusStore.UpdateStrategy = namespace.StatusStrategy finalizeStore := *store finalizeStore.UpdateStrategy = namespace.FinalizeStrategy return &REST{Store: store, status: &statusStore}, &StatusREST{store: &statusStore}, &FinalizeREST{store: &finalizeStore} }