Skip to content

Commit 06ff857

Browse files
author
Shawn Hurley
committed
Adding delegating reader for get and list requests for unstructured objs
* By default the client should not create informers for get and list requsts of unstructured types.
1 parent 2cbaff5 commit 06ff857

File tree

2 files changed

+46
-6
lines changed

2 files changed

+46
-6
lines changed

pkg/client/split.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ limitations under the License.
1616

1717
package client
1818

19+
import (
20+
"context"
21+
22+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
23+
"k8s.io/apimachinery/pkg/runtime"
24+
)
25+
1926
// DelegatingClient forms an interface Client by composing separate
2027
// reader, writer and statusclient interfaces. This way, you can have an Client that
2128
// reads from a cache and writes to the API server.
@@ -24,3 +31,29 @@ type DelegatingClient struct {
2431
Writer
2532
StatusClient
2633
}
34+
35+
// DelegatingReader forms a interface Reader that will cause Get and List
36+
// requests for unstructured types to use the ClientReader while
37+
// requests for any other type of object with use the CacheReader.
38+
type DelegatingReader struct {
39+
CacheReader Reader
40+
ClientReader Reader
41+
}
42+
43+
// Get retrieves an obj for a given object key from the Kubernetes Cluster.
44+
func (d *DelegatingReader) Get(ctx context.Context, key ObjectKey, obj runtime.Object) error {
45+
_, isUnstructured := obj.(*unstructured.Unstructured)
46+
if isUnstructured {
47+
return d.ClientReader.Get(ctx, key, obj)
48+
}
49+
return d.CacheReader.Get(ctx, key, obj)
50+
}
51+
52+
// List retrieves list of objects for a given namespace and list options.
53+
func (d *DelegatingReader) List(ctx context.Context, opts *ListOptions, list runtime.Object) error {
54+
_, isUnstructured := list.(*unstructured.UnstructuredList)
55+
if isUnstructured {
56+
return d.ClientReader.List(ctx, opts, list)
57+
}
58+
return d.CacheReader.List(ctx, opts, list)
59+
}

pkg/manager/manager.go

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,19 @@ func New(config *rest.Config, options Options) (Manager, error) {
138138
}
139139

140140
return &controllerManager{
141-
config: config,
142-
scheme: options.Scheme,
143-
errChan: make(chan error),
144-
cache: cache,
145-
fieldIndexes: cache,
146-
client: client.DelegatingClient{Reader: cache, Writer: writeObj, StatusClient: writeObj},
141+
config: config,
142+
scheme: options.Scheme,
143+
errChan: make(chan error),
144+
cache: cache,
145+
fieldIndexes: cache,
146+
client: client.DelegatingClient{
147+
Reader: &client.DelegatingReader{
148+
CacheReader: cache,
149+
ClientReader: writeObj,
150+
},
151+
Writer: writeObj,
152+
StatusClient: writeObj,
153+
},
147154
recorderProvider: recorderProvider,
148155
}, nil
149156
}

0 commit comments

Comments
 (0)