1/*
2Copyright 2018 The Kubernetes Authors.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package metadatalister
18
19import (
20	"k8s.io/apimachinery/pkg/labels"
21	"k8s.io/apimachinery/pkg/runtime"
22	"k8s.io/client-go/tools/cache"
23)
24
25var _ cache.GenericLister = &metadataListerShim{}
26var _ cache.GenericNamespaceLister = &metadataNamespaceListerShim{}
27
28// metadataListerShim implements the cache.GenericLister interface.
29type metadataListerShim struct {
30	lister Lister
31}
32
33// NewRuntimeObjectShim returns a new shim for Lister.
34// It wraps Lister so that it implements cache.GenericLister interface
35func NewRuntimeObjectShim(lister Lister) cache.GenericLister {
36	return &metadataListerShim{lister: lister}
37}
38
39// List will return all objects across namespaces
40func (s *metadataListerShim) List(selector labels.Selector) (ret []runtime.Object, err error) {
41	objs, err := s.lister.List(selector)
42	if err != nil {
43		return nil, err
44	}
45
46	ret = make([]runtime.Object, len(objs))
47	for index, obj := range objs {
48		ret[index] = obj
49	}
50	return ret, err
51}
52
53// Get will attempt to retrieve assuming that name==key
54func (s *metadataListerShim) Get(name string) (runtime.Object, error) {
55	return s.lister.Get(name)
56}
57
58func (s *metadataListerShim) ByNamespace(namespace string) cache.GenericNamespaceLister {
59	return &metadataNamespaceListerShim{
60		namespaceLister: s.lister.Namespace(namespace),
61	}
62}
63
64// metadataNamespaceListerShim implements the NamespaceLister interface.
65// It wraps NamespaceLister so that it implements cache.GenericNamespaceLister interface
66type metadataNamespaceListerShim struct {
67	namespaceLister NamespaceLister
68}
69
70// List will return all objects in this namespace
71func (ns *metadataNamespaceListerShim) List(selector labels.Selector) (ret []runtime.Object, err error) {
72	objs, err := ns.namespaceLister.List(selector)
73	if err != nil {
74		return nil, err
75	}
76
77	ret = make([]runtime.Object, len(objs))
78	for index, obj := range objs {
79		ret[index] = obj
80	}
81	return ret, err
82}
83
84// Get will attempt to retrieve by namespace and name
85func (ns *metadataNamespaceListerShim) Get(name string) (runtime.Object, error) {
86	return ns.namespaceLister.Get(name)
87}
88