Skip to content

Commit 72dfdeb

Browse files
authored
Update cloudevent client with addon v1beta1 api (#176)
Signed-off-by: Jian Qiu <jqiu@redhat.com>
1 parent 62521c9 commit 72dfdeb

31 files changed

Lines changed: 4060 additions & 71 deletions

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ require (
3737
k8s.io/component-base v0.34.1
3838
k8s.io/klog/v2 v2.130.1
3939
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397
40-
open-cluster-management.io/api v1.1.1-0.20251124092621-2337d27c3b7f
40+
open-cluster-management.io/api v1.1.1-0.20251215032811-ee922fbb996c
4141
sigs.k8s.io/controller-runtime v0.22.3
4242
sigs.k8s.io/yaml v1.6.0
4343
)

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,8 @@ k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOP
416416
k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts=
417417
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y=
418418
k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
419-
open-cluster-management.io/api v1.1.1-0.20251124092621-2337d27c3b7f h1:aOEXqgXvWSykMvzw9drHsLGUNP3xhsk1PcdRzfOVXoM=
420-
open-cluster-management.io/api v1.1.1-0.20251124092621-2337d27c3b7f/go.mod h1:Hk/3c114t6Ba5qhpqw+RoA93yEbE2CosG+JzzBZ6aCo=
419+
open-cluster-management.io/api v1.1.1-0.20251215032811-ee922fbb996c h1:LWZ+5dwVSNVM84eMBiQkygyYIlAudXSwQ6IM5LXr7QY=
420+
open-cluster-management.io/api v1.1.1-0.20251215032811-ee922fbb996c/go.mod h1:Hk/3c114t6Ba5qhpqw+RoA93yEbE2CosG+JzzBZ6aCo=
421421
sigs.k8s.io/controller-runtime v0.22.3 h1:I7mfqz/a/WdmDCEnXmSPm8/b/yRTy6JsKKENTijTq8Y=
422422
sigs.k8s.io/controller-runtime v0.22.3/go.mod h1:+QX1XUpTXN4mLoblf4tqr5CQcyHPAki2HLXqQMY6vh8=
423423
sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=

pkg/cloudevents/clients/addon/client.go renamed to pkg/cloudevents/clients/addon/v1alpha1/client.go

Lines changed: 46 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
package addon
1+
package v1alpha1
22

33
import (
44
"context"
5+
"k8s.io/client-go/rest"
56
"net/http"
67

78
addonapiv1alpha1 "open-cluster-management.io/api/addon/v1alpha1"
@@ -41,8 +42,11 @@ func NewManagedClusterAddOnClient(
4142
}
4243

4344
func (c *ManagedClusterAddOnClient) Namespace(namespace string) *ManagedClusterAddOnClient {
44-
c.namespace = namespace
45-
return c
45+
return &ManagedClusterAddOnClient{
46+
cloudEventsClient: c.cloudEventsClient,
47+
watcherStore: c.watcherStore,
48+
namespace: namespace,
49+
}
4650
}
4751

4852
func (c *ManagedClusterAddOnClient) Create(
@@ -67,7 +71,8 @@ func (c *ManagedClusterAddOnClient) DeleteCollection(ctx context.Context, opts m
6771
}
6872

6973
func (c *ManagedClusterAddOnClient) Get(ctx context.Context, name string, opts metav1.GetOptions) (*addonapiv1alpha1.ManagedClusterAddOn, error) {
70-
klog.V(4).Infof("getting ManagedClusterAddOn %s/%s", c.namespace, name)
74+
logger := klog.FromContext(ctx)
75+
logger.V(4).Info("getting ManagedClusterAddOn", "namespace", c.namespace, "name", name)
7176
addon, exists, err := c.watcherStore.Get(c.namespace, name)
7277
if err != nil {
7378
return nil, errors.NewInternalError(err)
@@ -80,7 +85,8 @@ func (c *ManagedClusterAddOnClient) Get(ctx context.Context, name string, opts m
8085
}
8186

8287
func (c *ManagedClusterAddOnClient) List(ctx context.Context, opts metav1.ListOptions) (*addonapiv1alpha1.ManagedClusterAddOnList, error) {
83-
klog.V(4).Info("list ManagedClusterAddon")
88+
logger := klog.FromContext(ctx)
89+
logger.V(4).Info("list ManagedClusterAddon")
8490
addonList, err := c.watcherStore.List(c.namespace, opts)
8591
if err != nil {
8692
return nil, errors.NewInternalError(err)
@@ -95,7 +101,8 @@ func (c *ManagedClusterAddOnClient) List(ctx context.Context, opts metav1.ListOp
95101
}
96102

97103
func (c *ManagedClusterAddOnClient) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
98-
klog.V(4).Info("watch ManagedClusterAddOn")
104+
logger := klog.FromContext(ctx)
105+
logger.V(4).Info("watch ManagedClusterAddOn")
99106
watcher, err := c.watcherStore.GetWatcher(c.namespace, opts)
100107
if err != nil {
101108
return nil, errors.NewInternalError(err)
@@ -106,7 +113,8 @@ func (c *ManagedClusterAddOnClient) Watch(ctx context.Context, opts metav1.ListO
106113

107114
func (c *ManagedClusterAddOnClient) Patch(
108115
ctx context.Context, name string, pt kubetypes.PatchType, data []byte, opts metav1.PatchOptions, subresources ...string) (*addonapiv1alpha1.ManagedClusterAddOn, error) {
109-
klog.V(4).Infof("patching ManagedClusterAddon %s/%s", c.namespace, name)
116+
logger := klog.FromContext(ctx)
117+
logger.V(4).Info("patching ManagedClusterAddon", "namespace", c.namespace, "name", name)
110118
last, exists, err := c.watcherStore.Get(c.namespace, name)
111119
if err != nil {
112120
return nil, errors.NewInternalError(err)
@@ -141,3 +149,34 @@ func (c *ManagedClusterAddOnClient) Patch(
141149

142150
return newAddon, nil
143151
}
152+
153+
// AddonClientWrapper wraps ManagedClusterAddOnClient to AddonV1alpha1Interface
154+
type AddonClientWrapper struct {
155+
client *ManagedClusterAddOnClient
156+
}
157+
158+
var _ addonv1alpha1client.AddonV1alpha1Interface = &AddonClientWrapper{}
159+
160+
func NewAddonClientWrapper(client *ManagedClusterAddOnClient) *AddonClientWrapper {
161+
return &AddonClientWrapper{client: client}
162+
}
163+
164+
func (c *AddonClientWrapper) AddOnDeploymentConfigs(namespace string) addonv1alpha1client.AddOnDeploymentConfigInterface {
165+
panic("AddOnDeploymentConfigs is unsupported")
166+
}
167+
168+
func (c *AddonClientWrapper) AddOnTemplates() addonv1alpha1client.AddOnTemplateInterface {
169+
panic("AddOnTemplates is unsupported")
170+
}
171+
172+
func (c *AddonClientWrapper) ClusterManagementAddOns() addonv1alpha1client.ClusterManagementAddOnInterface {
173+
panic("ClusterManagementAddOns is unsupported")
174+
}
175+
176+
func (c *AddonClientWrapper) RESTClient() rest.Interface {
177+
panic("RESTClient is unsupported")
178+
}
179+
180+
func (c *AddonClientWrapper) ManagedClusterAddOns(namespace string) addonv1alpha1client.ManagedClusterAddOnInterface {
181+
return c.client.Namespace(namespace)
182+
}

pkg/cloudevents/clients/addon/client_test.go renamed to pkg/cloudevents/clients/addon/v1alpha1/client_test.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package addon
1+
package v1alpha1
22

33
import (
44
"context"
@@ -74,15 +74,12 @@ func TestPatch(t *testing.T) {
7474
if err != nil {
7575
t.Error(err)
7676
}
77-
addonClientSet := &AddonClientSetWrapper{&AddonV1Alpha1ClientWrapper{
78-
NewManagedClusterAddOnClient(ceClient, watcherStore),
79-
}}
80-
77+
addonClient := NewAddonClientWrapper(NewManagedClusterAddOnClient(ceClient, watcherStore))
8178
if err := watcherStore.Store.Add(c.addon); err != nil {
8279
t.Error(err)
8380
}
8481

85-
if _, err = addonClientSet.AddonV1alpha1().ManagedClusterAddOns(c.clusterName).Patch(
82+
if _, err = addonClient.ManagedClusterAddOns(c.clusterName).Patch(
8683
ctx,
8784
c.addon.Name,
8885
types.MergePatchType,

pkg/cloudevents/clients/addon/codec.go renamed to pkg/cloudevents/clients/addon/v1alpha1/codec.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package addon
1+
package v1alpha1
22

33
import (
44
"fmt"
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
package v1beta1
2+
3+
import (
4+
"context"
5+
"k8s.io/apimachinery/pkg/api/errors"
6+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
7+
kubetypes "k8s.io/apimachinery/pkg/types"
8+
"k8s.io/apimachinery/pkg/watch"
9+
"k8s.io/client-go/rest"
10+
"k8s.io/klog/v2"
11+
"net/http"
12+
addonapiv1beta1 "open-cluster-management.io/api/addon/v1beta1"
13+
14+
addonv1beta1client "open-cluster-management.io/api/client/addon/clientset/versioned/typed/addon/v1beta1"
15+
"open-cluster-management.io/sdk-go/pkg/cloudevents/clients/common"
16+
cloudeventserrors "open-cluster-management.io/sdk-go/pkg/cloudevents/clients/errors"
17+
"open-cluster-management.io/sdk-go/pkg/cloudevents/clients/store"
18+
"open-cluster-management.io/sdk-go/pkg/cloudevents/clients/utils"
19+
"open-cluster-management.io/sdk-go/pkg/cloudevents/generic"
20+
"open-cluster-management.io/sdk-go/pkg/cloudevents/generic/types"
21+
)
22+
23+
// ManagedClusterAddOnClient implements the ManagedClusterAddonInterface.
24+
type ManagedClusterAddOnClient struct {
25+
cloudEventsClient generic.CloudEventsClient[*addonapiv1beta1.ManagedClusterAddOn]
26+
watcherStore store.ClientWatcherStore[*addonapiv1beta1.ManagedClusterAddOn]
27+
namespace string
28+
}
29+
30+
var _ addonv1beta1client.ManagedClusterAddOnInterface = &ManagedClusterAddOnClient{}
31+
32+
func NewManagedClusterAddOnClient(
33+
cloudEventsClient generic.CloudEventsClient[*addonapiv1beta1.ManagedClusterAddOn],
34+
watcherStore store.ClientWatcherStore[*addonapiv1beta1.ManagedClusterAddOn],
35+
) *ManagedClusterAddOnClient {
36+
return &ManagedClusterAddOnClient{
37+
cloudEventsClient: cloudEventsClient,
38+
watcherStore: watcherStore,
39+
}
40+
}
41+
42+
func (c *ManagedClusterAddOnClient) Namespace(namespace string) *ManagedClusterAddOnClient {
43+
return &ManagedClusterAddOnClient{
44+
cloudEventsClient: c.cloudEventsClient,
45+
watcherStore: c.watcherStore,
46+
namespace: namespace,
47+
}
48+
}
49+
50+
func (c *ManagedClusterAddOnClient) Create(
51+
_ context.Context, _ *addonapiv1beta1.ManagedClusterAddOn, _ metav1.CreateOptions) (*addonapiv1beta1.ManagedClusterAddOn, error) {
52+
return nil, errors.NewMethodNotSupported(common.ManagedClusterAddOnGR, "create")
53+
}
54+
55+
func (c *ManagedClusterAddOnClient) Update(_ context.Context, _ *addonapiv1beta1.ManagedClusterAddOn, _ metav1.UpdateOptions) (*addonapiv1beta1.ManagedClusterAddOn, error) {
56+
return nil, errors.NewMethodNotSupported(common.ManagedClusterAddOnGR, "update")
57+
}
58+
59+
func (c *ManagedClusterAddOnClient) UpdateStatus(_ context.Context, _ *addonapiv1beta1.ManagedClusterAddOn, _ metav1.UpdateOptions) (*addonapiv1beta1.ManagedClusterAddOn, error) {
60+
return nil, errors.NewMethodNotSupported(common.ManagedClusterAddOnGR, "updatestatus")
61+
}
62+
63+
func (c *ManagedClusterAddOnClient) Delete(_ context.Context, _ string, _ metav1.DeleteOptions) error {
64+
return errors.NewMethodNotSupported(common.ManagedClusterAddOnGR, "delete")
65+
}
66+
67+
func (c *ManagedClusterAddOnClient) DeleteCollection(_ context.Context, _ metav1.DeleteOptions, _ metav1.ListOptions) error {
68+
return errors.NewMethodNotSupported(common.ManagedClusterAddOnGR, "deletecollection")
69+
}
70+
71+
func (c *ManagedClusterAddOnClient) Get(ctx context.Context, name string, _ metav1.GetOptions) (*addonapiv1beta1.ManagedClusterAddOn, error) {
72+
logger := klog.FromContext(ctx)
73+
logger.V(4).Info("getting ManagedClusterAddOn", "namespace", c.namespace, "name", name)
74+
addon, exists, err := c.watcherStore.Get(c.namespace, name)
75+
if err != nil {
76+
return nil, errors.NewInternalError(err)
77+
}
78+
if !exists {
79+
return nil, errors.NewNotFound(common.ManagedClusterAddOnGR, c.namespace+"/"+name)
80+
}
81+
82+
return addon, nil
83+
}
84+
85+
func (c *ManagedClusterAddOnClient) List(ctx context.Context, opts metav1.ListOptions) (*addonapiv1beta1.ManagedClusterAddOnList, error) {
86+
logger := klog.FromContext(ctx)
87+
logger.V(4).Info("list ManagedClusterAddon")
88+
addonList, err := c.watcherStore.List(c.namespace, opts)
89+
if err != nil {
90+
return nil, errors.NewInternalError(err)
91+
}
92+
93+
items := []addonapiv1beta1.ManagedClusterAddOn{}
94+
for _, cluster := range addonList.Items {
95+
items = append(items, *cluster)
96+
}
97+
98+
return &addonapiv1beta1.ManagedClusterAddOnList{ListMeta: addonList.ListMeta, Items: items}, nil
99+
}
100+
101+
func (c *ManagedClusterAddOnClient) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) {
102+
logger := klog.FromContext(ctx)
103+
logger.V(4).Info("watch ManagedClusterAddOn")
104+
watcher, err := c.watcherStore.GetWatcher(c.namespace, opts)
105+
if err != nil {
106+
return nil, errors.NewInternalError(err)
107+
}
108+
109+
return watcher, nil
110+
}
111+
112+
func (c *ManagedClusterAddOnClient) Patch(
113+
ctx context.Context, name string, pt kubetypes.PatchType, data []byte, _ metav1.PatchOptions, subresources ...string) (*addonapiv1beta1.ManagedClusterAddOn, error) {
114+
logger := klog.FromContext(ctx)
115+
logger.V(4).Info("patching ManagedClusterAddon", "namespace", c.namespace, "name", name)
116+
last, exists, err := c.watcherStore.Get(c.namespace, name)
117+
if err != nil {
118+
return nil, errors.NewInternalError(err)
119+
}
120+
if !exists {
121+
return nil, errors.NewNotFound(common.ManagedClusterAddOnGR, c.namespace+"/"+name)
122+
}
123+
124+
patchedAddon, err := utils.Patch(pt, last, data)
125+
if err != nil {
126+
return nil, errors.NewInternalError(err)
127+
}
128+
129+
eventType := types.CloudEventsType{
130+
CloudEventsDataType: ManagedClusterAddOnEventDataType,
131+
SubResource: types.SubResourceStatus,
132+
}
133+
134+
newAddon := patchedAddon.DeepCopy()
135+
136+
if !utils.IsStatusPatch(subresources) {
137+
msg := "subresources \"status\" is required"
138+
return nil, errors.NewGenericServerResponse(http.StatusMethodNotAllowed, "patch", common.ManagedClusterAddOnGR, name, msg, 0, false)
139+
}
140+
141+
// publish the status update event to source, source will check the resource version
142+
// and reject the update if it's status update is outdated.
143+
eventType.Action = types.UpdateRequestAction
144+
if err := c.cloudEventsClient.Publish(ctx, eventType, newAddon); err != nil {
145+
return nil, cloudeventserrors.ToStatusError(common.ManagedClusterAddOnGR, name, err)
146+
}
147+
148+
return newAddon, nil
149+
}
150+
151+
// AddonClientWrapper wraps ManagedClusterAddOnClient to AddonV1beta1Interface
152+
type AddonClientWrapper struct {
153+
client *ManagedClusterAddOnClient
154+
}
155+
156+
var _ addonv1beta1client.AddonV1beta1Interface = &AddonClientWrapper{}
157+
158+
func NewAddonClientWrapper(client *ManagedClusterAddOnClient) *AddonClientWrapper {
159+
return &AddonClientWrapper{client: client}
160+
}
161+
162+
func (c *AddonClientWrapper) ClusterManagementAddOns() addonv1beta1client.ClusterManagementAddOnInterface {
163+
panic("ClusterManagementAddOns is unsupported")
164+
}
165+
166+
func (c *AddonClientWrapper) RESTClient() rest.Interface {
167+
panic("RESTClient is unsupported")
168+
}
169+
170+
func (c *AddonClientWrapper) ManagedClusterAddOns(namespace string) addonv1beta1client.ManagedClusterAddOnInterface {
171+
return c.client.Namespace(namespace)
172+
}

0 commit comments

Comments
 (0)