Skip to content

Commit 64ee097

Browse files
committed
Address some go vet issues
1 parent f0775d5 commit 64ee097

File tree

7 files changed

+79
-89
lines changed

7 files changed

+79
-89
lines changed

pkg/client/cache.go

+60-41
Original file line numberDiff line numberDiff line change
@@ -20,98 +20,115 @@ import (
2020

2121
var log = logf.KBLog.WithName("object-cache")
2222

23-
// ObjectCache is a ReadInterface
24-
var _ ReadInterface = &ObjectCache{}
23+
// objectCache is a ReadInterface
24+
var _ ReadInterface = &objectCache{}
2525

26-
type ObjectCache struct {
27-
cachesByType map[reflect.Type]*SingleObjectCache
26+
// objectCache is a Kubernetes Object cache populated from Informers
27+
type objectCache struct {
28+
cachesByType map[reflect.Type]*singleObjectCache
2829
scheme *runtime.Scheme
2930
}
3031

31-
func ObjectCacheFromInformers(informers map[schema.GroupVersionKind]cache.SharedIndexInformer, scheme *runtime.Scheme) *ObjectCache {
32-
res := NewObjectCache(scheme)
32+
var _ Cache = &objectCache{}
33+
34+
// Cache implements ReadInterface by reading objects from a cache populated by Informers
35+
type Cache interface {
36+
ReadInterface
37+
informer.Callback
38+
}
39+
40+
// NewObjectCache returns a new objectCache populated from informers
41+
func NewObjectCache(
42+
informers map[schema.GroupVersionKind]cache.SharedIndexInformer,
43+
scheme *runtime.Scheme) Cache {
44+
res := &objectCache{
45+
cachesByType: make(map[reflect.Type]*singleObjectCache),
46+
scheme: scheme,
47+
}
3348
res.AddInformers(informers)
3449
return res
3550
}
3651

37-
func (o *ObjectCache) AddInformers(informers map[schema.GroupVersionKind]cache.SharedIndexInformer) {
52+
// AddInformers adds new informers to the objectCache
53+
func (o *objectCache) AddInformers(informers map[schema.GroupVersionKind]cache.SharedIndexInformer) {
54+
if informers == nil {
55+
return
56+
}
3857
for gvk, informer := range informers {
3958
o.AddInformer(gvk, informer)
4059
}
4160
}
4261

43-
func (o *ObjectCache) Call(gvk schema.GroupVersionKind, c cache.SharedIndexInformer) {
62+
// Call implements the informer callback
63+
func (o *objectCache) Call(gvk schema.GroupVersionKind, c cache.SharedIndexInformer) {
4464
o.AddInformer(gvk, c)
4565
}
4666

47-
func (o *ObjectCache) AddInformer(gvk schema.GroupVersionKind, c cache.SharedIndexInformer) {
67+
// AddInformer adds an informer to the objectCache
68+
func (o *objectCache) AddInformer(gvk schema.GroupVersionKind, c cache.SharedIndexInformer) {
4869
obj, err := o.scheme.New(gvk)
4970
if err != nil {
50-
log.Error(err, "could not register informer in ObjectCache for GVK", "GroupVersionKind", gvk)
71+
log.Error(err, "could not register informer in objectCache for GVK", "GroupVersionKind", gvk)
5172
return
5273
}
53-
if _, found := o.CacheFor(obj); found {
74+
if _, found := o.cacheFor(obj); found {
5475
return
5576
}
56-
o.RegisterCache(obj, gvk, c.GetIndexer())
57-
}
58-
59-
func NewObjectCache(scheme *runtime.Scheme) *ObjectCache {
60-
return &ObjectCache{
61-
cachesByType: make(map[reflect.Type]*SingleObjectCache),
62-
scheme: scheme,
63-
}
77+
o.registerCache(obj, gvk, c.GetIndexer())
6478
}
6579

66-
func (c *ObjectCache) RegisterCache(obj runtime.Object, gvk schema.GroupVersionKind, store cache.Indexer) {
80+
func (o *objectCache) registerCache(obj runtime.Object, gvk schema.GroupVersionKind, store cache.Indexer) {
6781
objType := reflect.TypeOf(obj)
68-
c.cachesByType[objType] = &SingleObjectCache{
82+
o.cachesByType[objType] = &singleObjectCache{
6983
Indexer: store,
7084
GroupVersionKind: gvk,
7185
}
7286
}
7387

74-
func (c *ObjectCache) CacheFor(obj runtime.Object) (*SingleObjectCache, bool) {
88+
func (o *objectCache) cacheFor(obj runtime.Object) (*singleObjectCache, bool) {
7589
objType := reflect.TypeOf(obj)
76-
cache, isKnown := c.cachesByType[objType]
90+
cache, isKnown := o.cachesByType[objType]
7791
return cache, isKnown
7892
}
7993

80-
func (c *ObjectCache) Get(ctx context.Context, key ObjectKey, out runtime.Object) error {
81-
cache, isKnown := c.CacheFor(out)
94+
// Get implements client.Interface
95+
func (o *objectCache) Get(ctx context.Context, key ObjectKey, out runtime.Object) error {
96+
cache, isKnown := o.cacheFor(out)
8297
if !isKnown {
8398
return fmt.Errorf("no cache for objects of type %T, must have asked for an watch/informer first", out)
8499
}
85100
return cache.Get(ctx, key, out)
86101
}
87102

88-
func (c *ObjectCache) List(ctx context.Context, opts *ListOptions, out runtime.Object) error {
103+
// List implements client.Interface
104+
func (o *objectCache) List(ctx context.Context, opts *ListOptions, out runtime.Object) error {
89105
itemsPtr, err := apimeta.GetItemsPtr(out)
90106
if err != nil {
91107
return nil
92108
}
93109
// http://knowyourmeme.com/memes/this-is-fine
94110
outType := reflect.Indirect(reflect.ValueOf(itemsPtr)).Type().Elem()
95-
cache, isKnown := c.cachesByType[outType]
111+
cache, isKnown := o.cachesByType[outType]
96112
if !isKnown {
97113
return fmt.Errorf("no cache for objects of type %T", out)
98114
}
99115
return cache.List(ctx, opts, out)
100116
}
101117

102-
// SingleObjectCache is a ReadInterface
103-
var _ ReadInterface = &SingleObjectCache{}
118+
// singleObjectCache is a ReadInterface
119+
var _ ReadInterface = &singleObjectCache{}
104120

105-
// SingleObjectCache is a ReadInterface that retrieves objects
121+
// singleObjectCache is a ReadInterface that retrieves objects
106122
// from a single local cache populated by a watch.
107-
type SingleObjectCache struct {
123+
type singleObjectCache struct {
108124
// Indexer is the underlying indexer wrapped by this cache.
109125
Indexer cache.Indexer
110126
// GroupVersionKind is the group-version-kind of the resource.
111127
GroupVersionKind schema.GroupVersionKind
112128
}
113129

114-
func (c *SingleObjectCache) Get(_ context.Context, key ObjectKey, out runtime.Object) error {
130+
// Get implements client.Interface
131+
func (c *singleObjectCache) Get(_ context.Context, key ObjectKey, out runtime.Object) error {
115132
storeKey := objectKeyToStoreKey(key)
116133
obj, exists, err := c.Indexer.GetByKey(storeKey)
117134
if err != nil {
@@ -143,7 +160,8 @@ func (c *SingleObjectCache) Get(_ context.Context, key ObjectKey, out runtime.Ob
143160
return nil
144161
}
145162

146-
func (c *SingleObjectCache) List(ctx context.Context, opts *ListOptions, out runtime.Object) error {
163+
// List implements client.Interface
164+
func (c *singleObjectCache) List(ctx context.Context, opts *ListOptions, out runtime.Object) error {
147165
var objs []interface{}
148166
var err error
149167

@@ -196,29 +214,30 @@ func (c *SingleObjectCache) List(ctx context.Context, opts *ListOptions, out run
196214
}
197215

198216
// TODO: Make an interface with this function that has an Informers as an object on the struct
199-
// that automatically calls InformerFor and passes in the Indexer into IndexByField
217+
// that automatically calls InformerFor and passes in the Indexer into indexByField
200218

201219
// noNamespaceNamespace is used as the "namespace" when we want to list across all namespaces
202220
const allNamespacesNamespace = "__all_namespaces"
203221

222+
// InformerFieldIndexer provides an in-memory index of Object fields
204223
type InformerFieldIndexer struct {
205224
Informers informer.Informers
206225
}
207226

227+
// IndexField adds an indexer to the underlying cache, using extraction function to get
228+
// value(s) from the given field. This index can then be used by passing a field selector
229+
// to List. For one-to-one compatibility with "normal" field selectors, only return one value.
230+
// The values may be anything. They will automatically be prefixed with the namespace of the
231+
// given object, if present. The objects passed are guaranteed to be objects of the correct type.
208232
func (i *InformerFieldIndexer) IndexField(obj runtime.Object, field string, extractValue IndexerFunc) error {
209233
informer, err := i.Informers.InformerFor(obj)
210234
if err != nil {
211235
return err
212236
}
213-
return IndexByField(informer.GetIndexer(), field, extractValue)
237+
return indexByField(informer.GetIndexer(), field, extractValue)
214238
}
215239

216-
// IndexByField adds an indexer to the underlying cache, using extraction function to get
217-
// value(s) from the given field. This index can then be used by passing a field selector
218-
// to List. For one-to-one compatibility with "normal" field selectors, only return one value.
219-
// The values may be anything. They will automatically be prefixed with the namespace of the
220-
// given object, if present. The objects passed are guaranteed to be objects of the correct type.
221-
func IndexByField(indexer cache.Indexer, field string, extractor IndexerFunc) error {
240+
func indexByField(indexer cache.Indexer, field string, extractor IndexerFunc) error {
222241
indexFunc := func(objRaw interface{}) ([]string, error) {
223242
// TODO(directxman12): check if this is the correct type?
224243
obj, isObj := objRaw.(runtime.Object)

pkg/client/cache_test.go

+13-10
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package client_test
1+
package client
22

33
import (
44
"context"
@@ -11,8 +11,8 @@ import (
1111
"k8s.io/apimachinery/pkg/runtime"
1212
"k8s.io/client-go/tools/cache"
1313

14-
. "github.com/kubernetes-sigs/controller-runtime/pkg/client"
1514
"k8s.io/client-go/kubernetes/scheme"
15+
"reflect"
1616
)
1717

1818
var _ = Describe("Indexers", func() {
@@ -60,33 +60,36 @@ var _ = Describe("Indexers", func() {
6060
Namespace: knownVolumeKey.Namespace,
6161
},
6262
}
63-
var multiCache *ObjectCache
63+
var multiCache *objectCache
6464

6565
BeforeEach(func() {
66-
multiCache = NewObjectCache(scheme.Scheme)
66+
multiCache = &objectCache{
67+
cachesByType: make(map[reflect.Type]*singleObjectCache),
68+
scheme: scheme.Scheme,
69+
}
6770
podIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{
6871
cache.NamespaceIndex: cache.MetaNamespaceIndexFunc,
6972
})
7073
volumeIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{
7174
cache.NamespaceIndex: cache.MetaNamespaceIndexFunc,
7275
})
73-
IndexByField(podIndexer, "spec.restartPolicy", func(obj runtime.Object) []string {
76+
indexByField(podIndexer, "spec.restartPolicy", func(obj runtime.Object) []string {
7477
return []string{string(obj.(*kapi.Pod).Spec.RestartPolicy)}
7578
})
7679
Expect(podIndexer.Add(knownPod)).NotTo(HaveOccurred())
7780
Expect(podIndexer.Add(knownPod2)).NotTo(HaveOccurred())
7881
Expect(podIndexer.Add(knownPod3)).NotTo(HaveOccurred())
7982
Expect(volumeIndexer.Add(knownVolume)).NotTo(HaveOccurred())
80-
multiCache.RegisterCache(&kapi.Pod{}, kapi.SchemeGroupVersion.WithKind("Pod"), podIndexer)
81-
multiCache.RegisterCache(&kapi.PersistentVolume{}, kapi.SchemeGroupVersion.WithKind("PersistentVolume"), volumeIndexer)
83+
multiCache.registerCache(&kapi.Pod{}, kapi.SchemeGroupVersion.WithKind("Pod"), podIndexer)
84+
multiCache.registerCache(&kapi.PersistentVolume{}, kapi.SchemeGroupVersion.WithKind("PersistentVolume"), volumeIndexer)
8285
})
8386

8487
Describe("client interface wrapper around an indexer", func() {
8588
var singleCache ReadInterface
8689

8790
BeforeEach(func() {
8891
var ok bool
89-
singleCache, ok = multiCache.CacheFor(&kapi.Pod{})
92+
singleCache, ok = multiCache.cacheFor(&kapi.Pod{})
9093
Expect(ok).To(BeTrue())
9194
})
9295

@@ -162,11 +165,11 @@ var _ = Describe("Indexers", func() {
162165
})
163166

164167
It("should be able to fetch single caches for known types", func() {
165-
indexer, ok := multiCache.CacheFor(&kapi.Pod{})
168+
indexer, ok := multiCache.cacheFor(&kapi.Pod{})
166169
Expect(ok).To(BeTrue())
167170
Expect(indexer).NotTo(BeNil())
168171

169-
_, ok2 := multiCache.CacheFor(&kapi.PersistentVolumeClaim{})
172+
_, ok2 := multiCache.cacheFor(&kapi.PersistentVolumeClaim{})
170173
Expect(ok2).To(BeFalse())
171174
})
172175
})

pkg/client/config/config.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func GetConfig() (*rest.Config, error) {
7575
return nil, fmt.Errorf("could not locate a kubeconfig")
7676
}
7777

78-
// GetConfig creates a *rest.Config for talking to a Kubernetes apiserver.
78+
// GetConfigOrDie creates a *rest.Config for talking to a Kubernetes apiserver.
7979
// If --kubeconfig is set, will use the kubeconfig file at that location. Otherwise will assume running
8080
// in cluster and use the cluster provided kubeconfig.
8181
func GetConfigOrDie() *rest.Config {
@@ -125,7 +125,7 @@ func GetKubernetesInformers() (informers.SharedInformerFactory, error) {
125125
return informers.NewSharedInformerFactory(i, time.Minute*5), nil
126126
}
127127

128-
// GetKubernetesInformers creates a informers.SharedInformerFactory for talking to a Kubernetes apiserver.
128+
// GetKubernetesInformersOrDie creates a informers.SharedInformerFactory for talking to a Kubernetes apiserver.
129129
// If --kubeconfig is set, will use the kubeconfig file at that location. Otherwise will assume running
130130
// in cluster and use the cluster provided kubeconfig.
131131
//

pkg/client/config/doc.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ See the License for the specific language governing permissions and
1414
limitations under the License.
1515
*/
1616

17-
// The config package contains libraries for initializing rest configs for talking to the Kubernetes API
17+
// Package config contains libraries for initializing rest configs for talking to the Kubernetes API
1818
package config

pkg/controller/controller_manager.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ func NewControllerManager(args ControllerManagerArgs) (ControllerManager, error)
228228

229229
// Inject a Read / Write client into all controllers
230230
// TODO(directxman12): Figure out how to allow users to request a client without requesting a watch
231-
objCache := client.ObjectCacheFromInformers(spi.KnownInformersByType(), cm.scheme)
231+
objCache := client.NewObjectCache(spi.KnownInformersByType(), cm.scheme)
232232
spi.Callbacks = append(spi.Callbacks, objCache)
233233

234234
mapper, err := apiutil.NewDiscoveryRESTMapper(cm.config)

pkg/doc.go

-32
This file was deleted.

pkg/internal/informer/cache.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ type Informers interface {
3838

3939
var _ Informers = &SelfPopulatingInformers{}
4040

41-
type InformerCallback interface {
41+
type Callback interface {
4242
Call(gvk schema.GroupVersionKind, c cache.SharedIndexInformer)
4343
}
4444

@@ -48,7 +48,7 @@ type SelfPopulatingInformers struct {
4848
Config *rest.Config
4949
Scheme *runtime.Scheme
5050
Mapper meta.RESTMapper
51-
Callbacks []InformerCallback
51+
Callbacks []Callback
5252

5353
once sync.Once
5454
mu sync.Mutex

0 commit comments

Comments
 (0)