Skip to content

Commit be1010f

Browse files
committed
Add non-panicing versions of ListerFor, IndexerFor and prefix
the panicing versions with Must*
1 parent 0091c10 commit be1010f

File tree

6 files changed

+180
-15
lines changed

6 files changed

+180
-15
lines changed

adopt/adopt_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func TestSecretAdopterHandler(t *testing.T) {
4646
err error
4747
}
4848

49-
secretNotFound := func(name string) error {
49+
secretNotFound := func(_ string) error {
5050
return apierrors.NewNotFound(
5151
corev1.SchemeGroupVersion.WithResource("secrets").GroupResource(),
5252
"test")

component/ensure_component_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func TestEnsureServiceHandler(t *testing.T) {
122122
client := clientfake.NewSimpleDynamicClient(scheme, tt.existingServices...)
123123
informerFactory := dynamicinformer.NewDynamicSharedInformerFactory(client, 0)
124124
require.NoError(t, informerFactory.ForResource(serviceGVR).Informer().AddIndexers(map[string]cache.IndexFunc{
125-
ownerIndex: func(obj interface{}) ([]string, error) {
125+
ownerIndex: func(_ interface{}) ([]string, error) {
126126
return []string{types.NamespacedName{Namespace: "test", Name: "owner"}.String()}, nil
127127
},
128128
}))

handler/handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ func (f Builder) Handler(id Key) Handler {
127127
}
128128

129129
// NoopHandler is a handler that does nothing
130-
var NoopHandler = NewHandler(ContextHandlerFunc(func(ctx context.Context) {}), NextKey)
130+
var NoopHandler = NewHandler(ContextHandlerFunc(func(_ context.Context) {}), NextKey)
131131

132132
// Key is used to identify a given Handler in a set of Handlers
133133
type Key string

queue/controls_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func ExampleNewOperations() {
2828
}, cancel)
2929

3030
// typically called from a handler
31-
handler.NewHandlerFromFunc(func(ctx context.Context) {
31+
handler.NewHandlerFromFunc(func(_ context.Context) {
3232
// do some work
3333
operations.Done()
3434
}, "example").Handle(ctx)
@@ -60,7 +60,7 @@ func ExampleNewQueueOperationsCtx() {
6060
}, cancel))
6161

6262
// queue controls are passed via context
63-
handler.NewHandlerFromFunc(func(ctx context.Context) {
63+
handler.NewHandlerFromFunc(func(_ context.Context) {
6464
// do some work
6565
CtxQueue.Done()
6666
}, "example").Handle(ctx)

typed/registry.go

Lines changed: 105 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,43 @@ func (r *Registry) NewFilteredDynamicSharedInformerFactory(key FactoryKey, clien
9494
}
9595

9696
// ListerFor returns a typed Lister from a Registry
97+
// Deprecated: Use MustListerForKey instead
9798
func ListerFor[K runtime.Object](r *Registry, key RegistryKey) *Lister[K] {
98-
return NewLister[K](r.ListerFor(key))
99+
return MustListerForKey[K](r, key)
100+
}
101+
102+
// MustListerForKey returns a typed Lister from a Registry, or panics if the key is not found
103+
func MustListerForKey[K runtime.Object](r *Registry, key RegistryKey) *Lister[K] {
104+
return NewLister[K](r.MustListerForKey(key))
105+
}
106+
107+
// ListerForKey returns a typed Lister from a Registry, or an error if the key is not found
108+
func ListerForKey[K runtime.Object](r *Registry, key RegistryKey) (*Lister[K], error) {
109+
lister, err := r.ListerForKey(key)
110+
if err != nil {
111+
return nil, err
112+
}
113+
return NewLister[K](lister), nil
99114
}
100115

101116
// IndexerFor returns a typed Indexer from a Registry
117+
// Deprecated: Use MustIndexerForKey instead
102118
func IndexerFor[K runtime.Object](r *Registry, key RegistryKey) *Indexer[K] {
103-
return NewIndexer[K](r.InformerFor(key).GetIndexer())
119+
return MustIndexerForKey[K](r, key)
120+
}
121+
122+
// MustIndexerForKey returns a typed Indexer from a Registry, or panics if the key is not found
123+
func MustIndexerForKey[K runtime.Object](r *Registry, key RegistryKey) *Indexer[K] {
124+
return NewIndexer[K](r.MustIndexerForKey(key))
125+
}
126+
127+
// IndexerForKey returns a typed Indexer from a Registry, or an error if the key is not found
128+
func IndexerForKey[K runtime.Object](r *Registry, key RegistryKey) (*Indexer[K], error) {
129+
indexer, err := r.IndexerForKey(key)
130+
if err != nil {
131+
return nil, err
132+
}
133+
return NewIndexer[K](indexer), nil
104134
}
105135

106136
// Add adds a factory to the registry under the given FactoryKey
@@ -124,27 +154,95 @@ func (r *Registry) Remove(key FactoryKey) {
124154
}
125155

126156
// InformerFactoryFor returns GVR-specific InformerFactory from the Registry.
157+
// Deprecated: use MustInformerFactoryForKey instead.
127158
func (r *Registry) InformerFactoryFor(key RegistryKey) informers.GenericInformer {
159+
return r.MustInformerFactoryForKey(key)
160+
}
161+
162+
// MustInformerFactoryForKey returns GVR-specific InformerFactory from the Registry
163+
// or panics if the key is not found.
164+
func (r *Registry) MustInformerFactoryForKey(key RegistryKey) informers.GenericInformer {
165+
informer, err := r.InformerFactoryForKey(key)
166+
if err != nil {
167+
panic(err)
168+
}
169+
return informer
170+
}
171+
172+
// InformerFactoryForKey returns GVR-specific InformerFactory from the Registry
173+
// or returns an error if the key is not found.
174+
func (r *Registry) InformerFactoryForKey(key RegistryKey) (informers.GenericInformer, error) {
128175
r.RLock()
129176
defer r.RUnlock()
130177
factory, ok := r.factories[key.FactoryKey]
131178
if !ok {
132-
panic(fmt.Errorf("InformerFactoryFor called with unknown key %s", key))
179+
return nil, fmt.Errorf("InformerFactoryFor called with unknown key %s", key)
133180
}
134-
return factory.ForResource(key.GroupVersionResource)
181+
return factory.ForResource(key.GroupVersionResource), nil
135182
}
136183

137184
// ListerFor returns the GVR-specific Lister from the Registry
185+
// Deprecated: use MustListerForKey instead.
138186
func (r *Registry) ListerFor(key RegistryKey) cache.GenericLister {
139-
return r.InformerFactoryFor(key).Lister()
187+
return r.MustInformerFactoryForKey(key).Lister()
188+
}
189+
190+
// MustListerForKey returns the GVR-specific Lister from the Registry, or panics
191+
// if the key is not found.
192+
func (r *Registry) MustListerForKey(key RegistryKey) cache.GenericLister {
193+
return r.MustInformerFactoryForKey(key).Lister()
194+
}
195+
196+
// ListerForKey returns the GVR-specific Lister from the Registry, or an error
197+
// if the key is not found.
198+
func (r *Registry) ListerForKey(key RegistryKey) (cache.GenericLister, error) {
199+
factory, err := r.InformerFactoryForKey(key)
200+
if err != nil {
201+
return nil, err
202+
}
203+
return factory.Lister(), nil
140204
}
141205

142206
// InformerFor returns the GVR-specific Informer from the Registry
207+
// Deprecated: use MustInformerForKey instead.
143208
func (r *Registry) InformerFor(key RegistryKey) cache.SharedIndexInformer {
144-
return r.InformerFactoryFor(key).Informer()
209+
return r.MustInformerFactoryForKey(key).Informer()
210+
}
211+
212+
// MustInformerForKey returns the GVR-specific Informer from the Registry, or panics
213+
// if the key is not found.
214+
func (r *Registry) MustInformerForKey(key RegistryKey) cache.SharedIndexInformer {
215+
return r.MustInformerFactoryForKey(key).Informer()
216+
}
217+
218+
// InformerForKey returns the GVR-specific Informer from the Registry, or an error
219+
// if the key is not found.
220+
func (r *Registry) InformerForKey(key RegistryKey) (cache.SharedIndexInformer, error) {
221+
factory, err := r.InformerFactoryForKey(key)
222+
if err != nil {
223+
return nil, err
224+
}
225+
return factory.Informer(), nil
145226
}
146227

147228
// IndexerFor returns the GVR-specific Indexer from the Registry
229+
// Deprecated: use MustIndexerForKey instead.
148230
func (r *Registry) IndexerFor(key RegistryKey) cache.Indexer {
149-
return r.InformerFactoryFor(key).Informer().GetIndexer()
231+
return r.MustInformerForKey(key).GetIndexer()
232+
}
233+
234+
// MustIndexerForKey returns the GVR-specific Indexer from the Registry, or panics
235+
// if the key is not found.
236+
func (r *Registry) MustIndexerForKey(key RegistryKey) cache.Indexer {
237+
return r.MustInformerForKey(key).GetIndexer()
238+
}
239+
240+
// IndexerForKey returns the GVR-specific Indexer from the Registry, or an error
241+
// if the key is not found.
242+
func (r *Registry) IndexerForKey(key RegistryKey) (cache.Indexer, error) {
243+
informer, err := r.InformerForKey(key)
244+
if err != nil {
245+
return nil, err
246+
}
247+
return informer.GetIndexer(), nil
150248
}

typed/registry_test.go

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"testing"
77

8+
"github.com/stretchr/testify/require"
89
corev1 "k8s.io/api/core/v1"
910
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1011
"k8s.io/apimachinery/pkg/runtime"
@@ -92,7 +93,7 @@ func ExampleListerFor() {
9293

9394
dependentSecretKey := NewRegistryKey(dependentObjectKey, secretGVR)
9495

95-
cachedSecret, _ := ListerFor[*corev1.Secret](registry, dependentSecretKey).ByNamespace("example").Get("mysecret")
96+
cachedSecret, _ := MustListerForKey[*corev1.Secret](registry, dependentSecretKey).ByNamespace("example").Get("mysecret")
9697
fmt.Printf("%T %s/%s", cachedSecret, cachedSecret.GetNamespace(), cachedSecret.GetName())
9798
// Output: *v1.Secret example/mysecret
9899
}
@@ -131,7 +132,7 @@ func ExampleIndexerFor() {
131132
const indexName = "ExampleIndex"
132133
const constantIndexValue = "indexVal"
133134
if err := informerFactory.ForResource(secretGVR).Informer().AddIndexers(map[string]cache.IndexFunc{
134-
indexName: func(obj interface{}) ([]string, error) {
135+
indexName: func(_ interface{}) ([]string, error) {
135136
return []string{constantIndexValue}, nil
136137
},
137138
}); err != nil {
@@ -143,7 +144,7 @@ func ExampleIndexerFor() {
143144

144145
dependentSecretKey := NewRegistryKey(dependentObjectKey, secretGVR)
145146

146-
matchingCachedSecrets, _ := IndexerFor[*corev1.Secret](registry, dependentSecretKey).ByIndex(indexName, constantIndexValue)
147+
matchingCachedSecrets, _ := MustIndexerForKey[*corev1.Secret](registry, dependentSecretKey).ByIndex(indexName, constantIndexValue)
147148
fmt.Printf("%T %s/%s", matchingCachedSecrets, matchingCachedSecrets[0].GetNamespace(), matchingCachedSecrets[0].GetName())
148149
// Output: []*v1.Secret example/mysecret
149150
}
@@ -176,3 +177,69 @@ func TestRemove(_ *testing.T) {
176177

177178
registry.Remove(dependentObjectKey)
178179
}
180+
181+
func TestForKey(t *testing.T) {
182+
ctx, cancel := context.WithCancel(context.Background())
183+
defer cancel()
184+
registry := NewRegistry()
185+
186+
secretGVR := corev1.SchemeGroupVersion.WithResource("secrets")
187+
scheme := runtime.NewScheme()
188+
if err := corev1.AddToScheme(scheme); err != nil {
189+
panic(err)
190+
}
191+
client := fake.NewSimpleDynamicClient(scheme)
192+
dependentObjectKey := NewFactoryKey("my-controller", "localCluster", "dependentObjects")
193+
informerFactory := registry.MustNewFilteredDynamicSharedInformerFactory(
194+
dependentObjectKey,
195+
client,
196+
0,
197+
metav1.NamespaceAll,
198+
func(options *metav1.ListOptions) {
199+
options.LabelSelector = "my-controller.com/related-to=myobjecttype"
200+
},
201+
)
202+
informerFactory.ForResource(secretGVR)
203+
informerFactory.Start(ctx.Done())
204+
informerFactory.WaitForCacheSync(ctx.Done())
205+
206+
// good key works
207+
dependentSecretKey := NewRegistryKey(dependentObjectKey, secretGVR)
208+
require.NotPanics(t, func() {
209+
registry.MustInformerFactoryForKey(dependentSecretKey)
210+
registry.MustListerForKey(dependentSecretKey)
211+
registry.MustIndexerForKey(dependentSecretKey)
212+
MustListerForKey[*corev1.Secret](registry, dependentSecretKey)
213+
MustIndexerForKey[*corev1.Secret](registry, dependentSecretKey)
214+
})
215+
216+
// bad key panics Must*ForKey
217+
badKey := NewRegistryKey(NewFactoryKey("other-controller", "othercluster", "dependentObjects"), corev1.SchemeGroupVersion.WithResource("pods"))
218+
require.Panics(t, func() {
219+
registry.MustInformerFactoryForKey(badKey)
220+
})
221+
require.Panics(t, func() {
222+
registry.MustListerForKey(badKey)
223+
})
224+
require.Panics(t, func() {
225+
registry.MustIndexerForKey(badKey)
226+
})
227+
require.Panics(t, func() {
228+
MustListerForKey[*corev1.Pod](registry, badKey)
229+
})
230+
require.Panics(t, func() {
231+
MustIndexerForKey[*corev1.Pod](registry, badKey)
232+
})
233+
234+
// bad key returns error for *ForKey
235+
_, err := registry.InformerFactoryForKey(badKey)
236+
require.Error(t, err)
237+
_, err = registry.ListerForKey(badKey)
238+
require.Error(t, err)
239+
_, err = registry.IndexerForKey(badKey)
240+
require.Error(t, err)
241+
_, err = ListerForKey[*corev1.Pod](registry, badKey)
242+
require.Error(t, err)
243+
_, err = IndexerForKey[*corev1.Pod](registry, badKey)
244+
require.Error(t, err)
245+
}

0 commit comments

Comments
 (0)