@@ -16,6 +16,13 @@ limitations under the License.
16
16
17
17
package client
18
18
19
+ import (
20
+ "context"
21
+
22
+ "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
23
+ "k8s.io/apimachinery/pkg/runtime"
24
+ )
25
+
19
26
// DelegatingClient forms an interface Client by composing separate
20
27
// reader, writer and statusclient interfaces. This way, you can have an Client that
21
28
// reads from a cache and writes to the API server.
@@ -24,3 +31,29 @@ type DelegatingClient struct {
24
31
Writer
25
32
StatusClient
26
33
}
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
+ }
0 commit comments