Skip to content

Commit 531b7e0

Browse files
author
Shawn Hurley
committed
adding APIReader to the manager and injection.
1 parent 6649bdb commit 531b7e0

File tree

5 files changed

+91
-12
lines changed

5 files changed

+91
-12
lines changed

pkg/manager/internal.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ type controllerManager struct {
5858
// client is the client injected into Controllers (and EventHandlers, Sources and Predicates).
5959
client client.Client
6060

61+
// apiReader is the reader that will make requests to the api server and not the cache.
62+
apiReader client.Reader
63+
6164
// fieldIndexes knows how to add field indexes over the Cache used by this controller,
6265
// which can later be consumed via field selectors from the injected client.
6366
fieldIndexes client.FieldIndexer
@@ -121,6 +124,9 @@ func (cm *controllerManager) SetFields(i interface{}) error {
121124
if _, err := inject.ClientInto(cm.client, i); err != nil {
122125
return err
123126
}
127+
if _, err := inject.APIReaderInto(cm.apiReader, i); err != nil {
128+
return err
129+
}
124130
if _, err := inject.SchemeInto(cm.scheme, i); err != nil {
125131
return err
126132
}
@@ -167,6 +173,10 @@ func (cm *controllerManager) GetRESTMapper() meta.RESTMapper {
167173
return cm.mapper
168174
}
169175

176+
func (cm *controllerManager) GetAPIReader() client.Reader {
177+
return cm.apiReader
178+
}
179+
170180
func (cm *controllerManager) serveMetrics(stop <-chan struct{}) {
171181
handler := promhttp.HandlerFor(metrics.Registry, promhttp.HandlerOpts{
172182
ErrorHandling: promhttp.HTTPErrorOnError,

pkg/manager/manager.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ type Manager interface {
7474

7575
// GetRESTMapper returns a RESTMapper
7676
GetRESTMapper() meta.RESTMapper
77+
78+
// GetAPIReader returns a reader that will be configured to use the API server.
79+
// This should be used sparingly and only when the client does not fit your
80+
// use case.
81+
GetAPIReader() client.Reader
7782
}
7883

7984
// Options are the arguments for creating a new Manager
@@ -179,6 +184,11 @@ func New(config *rest.Config, options Options) (Manager, error) {
179184
return nil, err
180185
}
181186

187+
apiReader, err := client.New(config, client.Options{Scheme: options.Scheme, Mapper: mapper})
188+
if err != nil {
189+
return nil, err
190+
}
191+
182192
writeObj, err := options.NewClient(cache, config, client.Options{Scheme: options.Scheme, Mapper: mapper})
183193
if err != nil {
184194
return nil, err
@@ -217,6 +227,7 @@ func New(config *rest.Config, options Options) (Manager, error) {
217227
cache: cache,
218228
fieldIndexes: cache,
219229
client: writeObj,
230+
apiReader: apiReader,
220231
recorderProvider: recorderProvider,
221232
resourceLock: resourceLock,
222233
mapper: mapper,

pkg/manager/manager_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,11 @@ var _ = Describe("manger.Manager", func() {
606606
Expect(err).NotTo(HaveOccurred())
607607
Expect(m.GetEventRecorderFor("test")).NotTo(BeNil())
608608
})
609+
It("should provide a function to get the APIReader", func() {
610+
m, err := New(cfg, Options{})
611+
Expect(err).NotTo(HaveOccurred())
612+
Expect(m.GetAPIReader()).NotTo(BeNil())
613+
})
609614
})
610615

611616
var _ reconcile.Reconciler = &failRec{}

pkg/runtime/inject/inject.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,20 @@ func CacheInto(c cache.Cache, i interface{}) (bool, error) {
4141
return false, nil
4242
}
4343

44+
// APIReader is used by the Manager to inject the APIReader into necessary types.
45+
type APIReader interface {
46+
InjectAPIReader(client.Reader) error
47+
}
48+
49+
// APIReaderInto will set APIReader on i and return the result if it implements APIReaderInto.
50+
// Returns false if i does not implement APIReader
51+
func APIReaderInto(reader client.Reader, i interface{}) (bool, error) {
52+
if s, ok := i.(APIReader); ok {
53+
return true, s.InjectAPIReader(reader)
54+
}
55+
return false, nil
56+
}
57+
4458
// Config is used by the ControllerManager to inject Config into Sources, EventHandlers, Predicates, and
4559
// Reconciles
4660
type Config interface {

pkg/runtime/inject/inject_test.go

Lines changed: 51 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,27 @@ var _ = Describe("runtime inject", func() {
150150
Expect(res).To(Equal(true))
151151
})
152152

153+
It("should set api reader", func() {
154+
apiReader := &client.DelegatingReader{}
155+
156+
By("Validating injecting client")
157+
res, err := APIReaderInto(apiReader, instance)
158+
Expect(err).NotTo(HaveOccurred())
159+
Expect(res).To(Equal(true))
160+
Expect(apiReader).To(Equal(instance.GetAPIReader()))
161+
162+
By("Returning false if the type does not implement inject.Client")
163+
res, err = APIReaderInto(apiReader, uninjectable)
164+
Expect(err).NotTo(HaveOccurred())
165+
Expect(res).To(Equal(false))
166+
Expect(uninjectable.GetAPIReader()).To(BeNil())
167+
168+
By("Returning an error if client injection fails")
169+
res, err = APIReaderInto(nil, instance)
170+
Expect(err).To(Equal(errInjectFail))
171+
Expect(res).To(Equal(true))
172+
})
173+
153174
It("should set dependencies", func() {
154175

155176
f := func(interface{}) error { return nil }
@@ -175,12 +196,13 @@ var _ = Describe("runtime inject", func() {
175196
})
176197

177198
type testSource struct {
178-
scheme *runtime.Scheme
179-
cache cache.Cache
180-
config *rest.Config
181-
client client.Client
182-
f Func
183-
stop <-chan struct{}
199+
scheme *runtime.Scheme
200+
cache cache.Cache
201+
config *rest.Config
202+
client client.Client
203+
apiReader client.Reader
204+
f Func
205+
stop <-chan struct{}
184206
}
185207

186208
func (s *testSource) InjectCache(c cache.Cache) error {
@@ -223,6 +245,14 @@ func (s *testSource) InjectStopChannel(stop <-chan struct{}) error {
223245
return fmt.Errorf("injection fails")
224246
}
225247

248+
func (s *testSource) InjectAPIReader(reader client.Reader) error {
249+
if reader != nil {
250+
s.apiReader = reader
251+
return nil
252+
}
253+
return fmt.Errorf("injection fails")
254+
}
255+
226256
func (s *testSource) InjectFunc(f Func) error {
227257
if f != nil {
228258
s.f = f
@@ -247,6 +277,10 @@ func (s *testSource) GetClient() client.Client {
247277
return s.client
248278
}
249279

280+
func (s *testSource) GetAPIReader() client.Reader {
281+
return s.apiReader
282+
}
283+
250284
func (s *testSource) GetFunc() Func {
251285
return s.f
252286
}
@@ -256,12 +290,13 @@ func (s *testSource) GetStop() <-chan struct{} {
256290
}
257291

258292
type failSource struct {
259-
scheme *runtime.Scheme
260-
cache cache.Cache
261-
config *rest.Config
262-
client client.Client
263-
f Func
264-
stop <-chan struct{}
293+
scheme *runtime.Scheme
294+
cache cache.Cache
295+
config *rest.Config
296+
client client.Client
297+
apiReader client.Reader
298+
f Func
299+
stop <-chan struct{}
265300
}
266301

267302
func (s *failSource) GetCache() cache.Cache {
@@ -280,6 +315,10 @@ func (s *failSource) GetClient() client.Client {
280315
return s.client
281316
}
282317

318+
func (s *failSource) GetAPIReader() client.Reader {
319+
return s.apiReader
320+
}
321+
283322
func (s *failSource) GetFunc() Func {
284323
return s.f
285324
}

0 commit comments

Comments
 (0)