Skip to content

Commit df1c5ea

Browse files
committed
Implement ReaderClient
1 parent ea56766 commit df1c5ea

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

clientutils/clientutils.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,37 @@ import (
2525
"github.com/onmetal/controller-utils/unstructuredutils"
2626
"k8s.io/apimachinery/pkg/api/equality"
2727
apierrors "k8s.io/apimachinery/pkg/api/errors"
28+
"k8s.io/apimachinery/pkg/api/meta"
2829
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2930
"k8s.io/apimachinery/pkg/conversion"
31+
"k8s.io/apimachinery/pkg/runtime"
3032
"k8s.io/apimachinery/pkg/runtime/schema"
3133
"sigs.k8s.io/controller-runtime/pkg/client"
3234
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
3335
)
3436

37+
type clientMeta interface {
38+
Scheme() *runtime.Scheme
39+
RESTMapper() meta.RESTMapper
40+
}
41+
42+
type nonReaderClient interface {
43+
client.Writer
44+
client.StatusClient
45+
clientMeta
46+
}
47+
48+
type readerClient struct {
49+
client.Reader
50+
nonReaderClient
51+
}
52+
53+
// ReaderClient returns a client.Client that uses the given client.Reader for all read operations and the
54+
// client.Client for the remaining operations.
55+
func ReaderClient(r client.Reader, c client.Client) client.Client {
56+
return readerClient{r, c}
57+
}
58+
3559
// IgnoreAlreadyExists returns nil if the given error matches apierrors.IsAlreadyExists.
3660
func IgnoreAlreadyExists(err error) error {
3761
if apierrors.IsAlreadyExists(err) {

clientutils/clientutils_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ var _ = Describe("Clientutils", func() {
5959
cm *corev1.ConfigMap
6060
cmKey client.ObjectKey
6161

62+
cmList *corev1.ConfigMapList
63+
6264
uPod *unstructured.Unstructured
6365

6466
secret *corev1.Secret
@@ -84,6 +86,10 @@ var _ = Describe("Clientutils", func() {
8486
}
8587
cmKey = client.ObjectKeyFromObject(cm)
8688

89+
cmList = &corev1.ConfigMapList{
90+
Items: []corev1.ConfigMap{*cm},
91+
}
92+
8793
uPod = &unstructured.Unstructured{
8894
Object: map[string]interface{}{
8995
"apiVersion": "v1",
@@ -106,6 +112,23 @@ var _ = Describe("Clientutils", func() {
106112
patchProvider = mockclientutils.NewMockPatchProvider(ctrl)
107113
})
108114

115+
Describe("ReaderClient", func() {
116+
It("should return a client that dispatches methods correctly", func() {
117+
r := mockclient.NewMockClient(ctrl)
118+
gomock.InOrder(
119+
r.EXPECT().Get(ctx, cmKey, cm),
120+
r.EXPECT().List(ctx, cmList),
121+
c.EXPECT().Delete(ctx, cm),
122+
)
123+
124+
rc := ReaderClient(r, c)
125+
126+
Expect(rc.Get(ctx, cmKey, cm)).To(Succeed())
127+
Expect(rc.List(ctx, cmList)).To(Succeed())
128+
Expect(rc.Delete(ctx, cm)).To(Succeed())
129+
})
130+
})
131+
109132
Describe("IgnoreAlreadyExists", func() {
110133
It("should ignore already exists errors", func() {
111134
alreadyExistsErr := IgnoreAlreadyExists(apierrors.NewAlreadyExists(cmGR, ""))

0 commit comments

Comments
 (0)