2 Copyright 2014 The Kubernetes Authors.
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.apache.org/licenses/LICENSE-2.0
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
22 "k8s.io/apimachinery/pkg/api/errors"
23 "k8s.io/apimachinery/pkg/api/meta"
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 "k8s.io/apimachinery/pkg/labels"
26 "k8s.io/apimachinery/pkg/runtime"
27 "k8s.io/apimachinery/pkg/runtime/schema"
30 // AppendFunc is used to add a matching item to whatever list the caller is using
31 type AppendFunc func(interface{})
33 func ListAll(store Store, selector labels.Selector, appendFn AppendFunc) error {
34 for _, m := range store.List() {
35 metadata, err := meta.Accessor(m)
39 if selector.Matches(labels.Set(metadata.GetLabels())) {
46 func ListAllByNamespace(indexer Indexer, namespace string, selector labels.Selector, appendFn AppendFunc) error {
47 if namespace == metav1.NamespaceAll {
48 for _, m := range indexer.List() {
49 metadata, err := meta.Accessor(m)
53 if selector.Matches(labels.Set(metadata.GetLabels())) {
60 items, err := indexer.Index(NamespaceIndex, &metav1.ObjectMeta{Namespace: namespace})
62 // Ignore error; do slow search without index.
63 klog.Warningf("can not retrieve list of objects using index : %v", err)
64 for _, m := range indexer.List() {
65 metadata, err := meta.Accessor(m)
69 if metadata.GetNamespace() == namespace && selector.Matches(labels.Set(metadata.GetLabels())) {
76 for _, m := range items {
77 metadata, err := meta.Accessor(m)
81 if selector.Matches(labels.Set(metadata.GetLabels())) {
89 // GenericLister is a lister skin on a generic Indexer
90 type GenericLister interface {
91 // List will return all objects across namespaces
92 List(selector labels.Selector) (ret []runtime.Object, err error)
93 // Get will attempt to retrieve assuming that name==key
94 Get(name string) (runtime.Object, error)
95 // ByNamespace will give you a GenericNamespaceLister for one namespace
96 ByNamespace(namespace string) GenericNamespaceLister
99 // GenericNamespaceLister is a lister skin on a generic Indexer
100 type GenericNamespaceLister interface {
101 // List will return all objects in this namespace
102 List(selector labels.Selector) (ret []runtime.Object, err error)
103 // Get will attempt to retrieve by namespace and name
104 Get(name string) (runtime.Object, error)
107 func NewGenericLister(indexer Indexer, resource schema.GroupResource) GenericLister {
108 return &genericLister{indexer: indexer, resource: resource}
111 type genericLister struct {
113 resource schema.GroupResource
116 func (s *genericLister) List(selector labels.Selector) (ret []runtime.Object, err error) {
117 err = ListAll(s.indexer, selector, func(m interface{}) {
118 ret = append(ret, m.(runtime.Object))
123 func (s *genericLister) ByNamespace(namespace string) GenericNamespaceLister {
124 return &genericNamespaceLister{indexer: s.indexer, namespace: namespace, resource: s.resource}
127 func (s *genericLister) Get(name string) (runtime.Object, error) {
128 obj, exists, err := s.indexer.GetByKey(name)
133 return nil, errors.NewNotFound(s.resource, name)
135 return obj.(runtime.Object), nil
138 type genericNamespaceLister struct {
141 resource schema.GroupResource
144 func (s *genericNamespaceLister) List(selector labels.Selector) (ret []runtime.Object, err error) {
145 err = ListAllByNamespace(s.indexer, s.namespace, selector, func(m interface{}) {
146 ret = append(ret, m.(runtime.Object))
151 func (s *genericNamespaceLister) Get(name string) (runtime.Object, error) {
152 obj, exists, err := s.indexer.GetByKey(s.namespace + "/" + name)
157 return nil, errors.NewNotFound(s.resource, name)
159 return obj.(runtime.Object), nil