...
1
2
3
4 package clusterreader
5
6 import (
7 "context"
8 "fmt"
9
10 "k8s.io/apimachinery/pkg/api/meta"
11 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
12 "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
13 "k8s.io/apimachinery/pkg/labels"
14 "k8s.io/client-go/dynamic"
15 "sigs.k8s.io/controller-runtime/pkg/client"
16 )
17
18
19
20 type DynamicClusterReader struct {
21 DynamicClient dynamic.Interface
22 Mapper meta.RESTMapper
23 }
24
25 func (n *DynamicClusterReader) Get(ctx context.Context, key client.ObjectKey, obj *unstructured.Unstructured) error {
26 mapping, err := n.Mapper.RESTMapping(obj.GroupVersionKind().GroupKind())
27 if err != nil {
28 return fmt.Errorf("failed to map object: %w", err)
29 }
30
31 serverObj, err := n.DynamicClient.Resource(mapping.Resource).
32 Namespace(key.Namespace).
33 Get(ctx, key.Name, metav1.GetOptions{})
34 if err != nil {
35 return err
36 }
37
38 serverObj.DeepCopyInto(obj)
39 return nil
40 }
41
42 func (n *DynamicClusterReader) ListNamespaceScoped(ctx context.Context, list *unstructured.UnstructuredList, namespace string, selector labels.Selector) error {
43 mapping, err := n.Mapper.RESTMapping(list.GroupVersionKind().GroupKind())
44 if err != nil {
45 return fmt.Errorf("failed to map object: %w", err)
46 }
47
48 serverObj, err := n.DynamicClient.Resource(mapping.Resource).
49 Namespace(namespace).
50 List(ctx, metav1.ListOptions{
51 LabelSelector: selector.String(),
52 })
53 if err != nil {
54 return err
55 }
56
57 serverObj.DeepCopyInto(list)
58 return nil
59 }
60
61 func (n *DynamicClusterReader) ListClusterScoped(ctx context.Context, list *unstructured.UnstructuredList, selector labels.Selector) error {
62 mapping, err := n.Mapper.RESTMapping(list.GroupVersionKind().GroupKind())
63 if err != nil {
64 return fmt.Errorf("failed to map object: %w", err)
65 }
66
67 serverObj, err := n.DynamicClient.Resource(mapping.Resource).
68 List(ctx, metav1.ListOptions{
69 LabelSelector: selector.String(),
70 })
71 if err != nil {
72 return err
73 }
74
75 serverObj.DeepCopyInto(list)
76 return nil
77 }
78
79 func (n *DynamicClusterReader) Sync(_ context.Context) error {
80 return nil
81 }
82
View as plain text