Adopt controller-runtime braking changes: generics support PR2783

Adopt controller-runtime breaking changes: make decoder as interface. PR2736

Signed-off-by: RainbowMango <qdurenhongcai@gmail.com>
This commit is contained in:
RainbowMango 2024-07-11 11:09:35 +08:00
parent 448b967421
commit e8164eeebd
24 changed files with 105 additions and 91 deletions

View File

@ -34,64 +34,63 @@ import (
remedyv1alpha1 "github.com/karmada-io/karmada/pkg/apis/remedy/v1alpha1"
)
func newClusterEventHandler() handler.EventHandler {
func newClusterEventHandler() handler.TypedEventHandler[*clusterv1alpha1.Cluster] {
return &clusterEventHandler{}
}
var _ handler.EventHandler = (*clusterEventHandler)(nil)
var _ handler.TypedEventHandler[*clusterv1alpha1.Cluster] = &clusterEventHandler{}
type clusterEventHandler struct {
}
type clusterEventHandler struct{}
func (h *clusterEventHandler) Create(_ context.Context, _ event.CreateEvent, _ workqueue.RateLimitingInterface) {
func (h *clusterEventHandler) Create(context.Context, event.TypedCreateEvent[*clusterv1alpha1.Cluster], workqueue.RateLimitingInterface) {
// Don't care about cluster creation events
}
func (h *clusterEventHandler) Update(_ context.Context, e event.UpdateEvent, queue workqueue.RateLimitingInterface) {
oldCluster := e.ObjectOld.(*clusterv1alpha1.Cluster)
newCluster := e.ObjectNew.(*clusterv1alpha1.Cluster)
if reflect.DeepEqual(oldCluster.Status.Conditions, newCluster.Status.Conditions) {
func (h *clusterEventHandler) Update(_ context.Context, e event.TypedUpdateEvent[*clusterv1alpha1.Cluster], queue workqueue.RateLimitingInterface) {
if reflect.DeepEqual(e.ObjectOld.Status.Conditions, e.ObjectNew.Status.Conditions) {
return
}
queue.Add(reconcile.Request{NamespacedName: types.NamespacedName{
Name: newCluster.Name,
Name: e.ObjectNew.Name,
}})
}
func (h *clusterEventHandler) Delete(_ context.Context, _ event.DeleteEvent, _ workqueue.RateLimitingInterface) {
func (h *clusterEventHandler) Delete(_ context.Context, _ event.TypedDeleteEvent[*clusterv1alpha1.Cluster], _ workqueue.RateLimitingInterface) {
// Don't care about cluster deletion events
}
func (h *clusterEventHandler) Generic(_ context.Context, e event.GenericEvent, queue workqueue.RateLimitingInterface) {
func (h *clusterEventHandler) Generic(_ context.Context, e event.TypedGenericEvent[*clusterv1alpha1.Cluster], queue workqueue.RateLimitingInterface) {
queue.Add(reconcile.Request{NamespacedName: types.NamespacedName{
Name: e.Object.GetName(),
}})
}
func newRemedyEventHandler(clusterChan chan<- event.GenericEvent, client client.Client) handler.EventHandler {
func newRemedyEventHandler(clusterChan chan<- event.TypedGenericEvent[*clusterv1alpha1.Cluster], client client.Client) handler.TypedEventHandler[*remedyv1alpha1.Remedy] {
return &remedyEventHandler{
client: client,
clusterChan: clusterChan,
}
}
var _ handler.EventHandler = (*remedyEventHandler)(nil)
var _ handler.TypedEventHandler[*remedyv1alpha1.Remedy] = &remedyEventHandler{}
type remedyEventHandler struct {
client client.Client
clusterChan chan<- event.GenericEvent
clusterChan chan<- event.TypedGenericEvent[*clusterv1alpha1.Cluster]
}
func (h *remedyEventHandler) Create(ctx context.Context, e event.CreateEvent, _ workqueue.RateLimitingInterface) {
remedy := e.Object.(*remedyv1alpha1.Remedy)
func (h *remedyEventHandler) Create(ctx context.Context, e event.TypedCreateEvent[*remedyv1alpha1.Remedy], _ workqueue.RateLimitingInterface) {
remedy := e.Object
if remedy.Spec.ClusterAffinity != nil {
for _, clusterName := range remedy.Spec.ClusterAffinity.ClusterNames {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: clusterName,
}}}
h.clusterChan <- event.TypedGenericEvent[*clusterv1alpha1.Cluster]{
Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: clusterName,
},
},
}
}
return
}
@ -104,16 +103,19 @@ func (h *remedyEventHandler) Create(ctx context.Context, e event.CreateEvent, _
}
for _, cluster := range clusterList.Items {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: cluster.Name,
}}}
h.clusterChan <- event.TypedGenericEvent[*clusterv1alpha1.Cluster]{
Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: cluster.Name,
},
},
}
}
}
func (h *remedyEventHandler) Update(ctx context.Context, e event.UpdateEvent, _ workqueue.RateLimitingInterface) {
oldRemedy := e.ObjectOld.(*remedyv1alpha1.Remedy)
newRemedy := e.ObjectNew.(*remedyv1alpha1.Remedy)
func (h *remedyEventHandler) Update(ctx context.Context, e event.TypedUpdateEvent[*remedyv1alpha1.Remedy], _ workqueue.RateLimitingInterface) {
oldRemedy := e.ObjectOld
newRemedy := e.ObjectNew
if oldRemedy.Spec.ClusterAffinity == nil || newRemedy.Spec.ClusterAffinity == nil {
clusterList := &clusterv1alpha1.ClusterList{}
@ -124,10 +126,13 @@ func (h *remedyEventHandler) Update(ctx context.Context, e event.UpdateEvent, _
}
for _, cluster := range clusterList.Items {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: cluster.Name,
}}}
h.clusterChan <- event.TypedGenericEvent[*clusterv1alpha1.Cluster]{
Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: cluster.Name,
},
},
}
}
return
}
@ -140,21 +145,27 @@ func (h *remedyEventHandler) Update(ctx context.Context, e event.UpdateEvent, _
clusters.Insert(clusterName)
}
for clusterName := range clusters {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: clusterName,
}}}
h.clusterChan <- event.TypedGenericEvent[*clusterv1alpha1.Cluster]{
Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: clusterName,
},
},
}
}
}
func (h *remedyEventHandler) Delete(ctx context.Context, e event.DeleteEvent, _ workqueue.RateLimitingInterface) {
remedy := e.Object.(*remedyv1alpha1.Remedy)
func (h *remedyEventHandler) Delete(ctx context.Context, e event.TypedDeleteEvent[*remedyv1alpha1.Remedy], _ workqueue.RateLimitingInterface) {
remedy := e.Object
if remedy.Spec.ClusterAffinity != nil {
for _, clusterName := range remedy.Spec.ClusterAffinity.ClusterNames {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: clusterName,
}}}
h.clusterChan <- event.TypedGenericEvent[*clusterv1alpha1.Cluster]{
Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: clusterName,
},
},
}
}
return
}
@ -167,12 +178,15 @@ func (h *remedyEventHandler) Delete(ctx context.Context, e event.DeleteEvent, _
}
for _, cluster := range clusterList.Items {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: cluster.Name,
}}}
h.clusterChan <- event.TypedGenericEvent[*clusterv1alpha1.Cluster]{
Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: cluster.Name,
},
},
}
}
}
func (h *remedyEventHandler) Generic(_ context.Context, _ event.GenericEvent, _ workqueue.RateLimitingInterface) {
func (h *remedyEventHandler) Generic(_ context.Context, _ event.TypedGenericEvent[*remedyv1alpha1.Remedy], _ workqueue.RateLimitingInterface) {
}

View File

@ -36,8 +36,8 @@ func Test_clusterEventHandler(t *testing.T) {
type args struct {
operation string
q workqueue.RateLimitingInterface
obj client.Object
oldObj client.Object
obj *clusterv1alpha1.Cluster
oldObj *clusterv1alpha1.Cluster
}
tests := []struct {
name string
@ -144,16 +144,16 @@ func Test_clusterEventHandler(t *testing.T) {
h := newClusterEventHandler()
switch tt.args.operation {
case "Create":
createEvent := event.CreateEvent{Object: tt.args.obj}
createEvent := event.TypedCreateEvent[*clusterv1alpha1.Cluster]{Object: tt.args.obj}
h.Create(context.TODO(), createEvent, queue)
case "Delete":
deleteEvent := event.DeleteEvent{Object: tt.args.obj}
deleteEvent := event.TypedDeleteEvent[*clusterv1alpha1.Cluster]{Object: tt.args.obj}
h.Delete(context.TODO(), deleteEvent, queue)
case "Update":
updateEvent := event.UpdateEvent{ObjectNew: tt.args.obj, ObjectOld: tt.args.oldObj}
updateEvent := event.TypedUpdateEvent[*clusterv1alpha1.Cluster]{ObjectNew: tt.args.obj, ObjectOld: tt.args.oldObj}
h.Update(context.TODO(), updateEvent, queue)
case "Generic":
genericEvent := event.GenericEvent{Object: tt.args.obj}
genericEvent := event.TypedGenericEvent[*clusterv1alpha1.Cluster]{Object: tt.args.obj}
h.Generic(context.TODO(), genericEvent, queue)
default:
t.Errorf("no support operation %v", tt.args.operation)
@ -170,8 +170,8 @@ func Test_clusterEventHandler(t *testing.T) {
func Test_remedyEventHandler(t *testing.T) {
type args struct {
operation string
obj client.Object
oldObj client.Object
obj *remedyv1alpha1.Remedy
oldObj *remedyv1alpha1.Remedy
client client.Client
}
tests := []struct {
@ -328,30 +328,30 @@ func Test_remedyEventHandler(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
clusterChan := make(chan event.GenericEvent)
clusterChan := make(chan event.TypedGenericEvent[*clusterv1alpha1.Cluster])
h := newRemedyEventHandler(clusterChan, tt.args.client)
switch tt.args.operation {
case "Create":
go func() {
createEvent := event.CreateEvent{Object: tt.args.obj}
createEvent := event.TypedCreateEvent[*remedyv1alpha1.Remedy]{Object: tt.args.obj}
h.Create(context.TODO(), createEvent, nil)
close(clusterChan)
}()
case "Delete":
go func() {
deleteEvent := event.DeleteEvent{Object: tt.args.obj}
deleteEvent := event.TypedDeleteEvent[*remedyv1alpha1.Remedy]{Object: tt.args.obj}
h.Delete(context.TODO(), deleteEvent, nil)
close(clusterChan)
}()
case "Update":
go func() {
updateEvent := event.UpdateEvent{ObjectNew: tt.args.obj, ObjectOld: tt.args.oldObj}
updateEvent := event.TypedUpdateEvent[*remedyv1alpha1.Remedy]{ObjectNew: tt.args.obj, ObjectOld: tt.args.oldObj}
h.Update(context.TODO(), updateEvent, nil)
close(clusterChan)
}()
case "Generic":
go func() {
genericEvent := event.GenericEvent{Object: tt.args.obj}
genericEvent := event.TypedGenericEvent[*remedyv1alpha1.Remedy]{Object: tt.args.obj}
h.Generic(context.TODO(), genericEvent, nil)
close(clusterChan)
}()

View File

@ -101,17 +101,17 @@ func (c *RemedyController) SetupWithManager(mgr controllerruntime.Manager) error
}
func (c *RemedyController) setupWatches(remedyController controller.Controller, mgr controllerruntime.Manager) error {
clusterChan := make(chan event.GenericEvent)
clusterChan := make(chan event.TypedGenericEvent[*clusterv1alpha1.Cluster])
clusterHandler := newClusterEventHandler()
remedyHandler := newRemedyEventHandler(clusterChan, c.Client)
if err := remedyController.Watch(source.Kind(mgr.GetCache(), &clusterv1alpha1.Cluster{}), clusterHandler); err != nil {
if err := remedyController.Watch(source.Kind[*clusterv1alpha1.Cluster](mgr.GetCache(), &clusterv1alpha1.Cluster{}, clusterHandler)); err != nil {
return err
}
if err := remedyController.Watch(&source.Channel{Source: clusterChan}, clusterHandler); err != nil {
if err := remedyController.Watch(source.Channel(clusterChan, clusterHandler)); err != nil {
return err
}
if err := remedyController.Watch(source.Kind(mgr.GetCache(), &remedyv1alpha1.Remedy{}), remedyHandler); err != nil {
if err := remedyController.Watch(source.Kind(mgr.GetCache(), &remedyv1alpha1.Remedy{}, remedyHandler)); err != nil {
return err
}
return nil

View File

@ -103,7 +103,7 @@ type DependenciesDistributor struct {
eventHandler cache.ResourceEventHandler
resourceProcessor util.AsyncWorker
genericEvent chan event.GenericEvent
genericEvent chan event.TypedGenericEvent[*workv1alpha2.ResourceBinding]
stopCh <-chan struct{}
}
@ -184,7 +184,7 @@ func (d *DependenciesDistributor) reconcileResourceTemplate(key util.QueueKey) e
}
klog.V(4).Infof("ResourceBinding(%s/%s) is matched for resource(%s/%s)", binding.Namespace, binding.Name, resourceTemplateKey.Namespace, resourceTemplateKey.Name)
d.genericEvent <- event.GenericEvent{Object: binding}
d.genericEvent <- event.TypedGenericEvent[*workv1alpha2.ResourceBinding]{Object: binding}
}
return nil
@ -610,7 +610,7 @@ func (d *DependenciesDistributor) Start(ctx context.Context) error {
// SetupWithManager creates a controller and register to controller manager.
func (d *DependenciesDistributor) SetupWithManager(mgr controllerruntime.Manager) error {
d.genericEvent = make(chan event.GenericEvent)
d.genericEvent = make(chan event.TypedGenericEvent[*workv1alpha2.ResourceBinding])
return utilerrors.NewAggregate([]error{
mgr.Add(d),
controllerruntime.NewControllerManagedBy(mgr).For(&workv1alpha2.ResourceBinding{}).
@ -650,7 +650,7 @@ func (d *DependenciesDistributor) SetupWithManager(mgr controllerruntime.Manager
RateLimiter: ratelimiterflag.DefaultControllerRateLimiter(d.RateLimiterOptions),
MaxConcurrentReconciles: 2,
}).
WatchesRawSource(&source.Channel{Source: d.genericEvent}, &handler.EnqueueRequestForObject{}).
WatchesRawSource(source.Channel(d.genericEvent, &handler.TypedEnqueueRequestForObject[*workv1alpha2.ResourceBinding]{})).
Complete(d),
})
}

View File

@ -29,7 +29,7 @@ import (
// ValidatingAdmission validates ClusterOverridePolicy object when creating/updating/deleting.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -35,7 +35,7 @@ import (
// MutatingAdmission mutates API request if necessary.
type MutatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
DefaultNotReadyTolerationSeconds int64
DefaultUnreachableTolerationSeconds int64
@ -45,7 +45,7 @@ type MutatingAdmission struct {
var _ admission.Handler = &MutatingAdmission{}
// NewMutatingHandler builds a new admission.Handler.
func NewMutatingHandler(notReadyTolerationSeconds, unreachableTolerationSeconds int64, decoder *admission.Decoder) admission.Handler {
func NewMutatingHandler(notReadyTolerationSeconds, unreachableTolerationSeconds int64, decoder admission.Decoder) admission.Handler {
return &MutatingAdmission{
DefaultNotReadyTolerationSeconds: notReadyTolerationSeconds,
DefaultUnreachableTolerationSeconds: unreachableTolerationSeconds,

View File

@ -31,7 +31,7 @@ import (
// ValidatingAdmission validates ClusterPropagationPolicy object when creating/updating/deleting.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -31,7 +31,7 @@ import (
// MutatingAdmission mutates API request if necessary.
type MutatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our MutatingAdmission implements necessary interface

View File

@ -34,7 +34,7 @@ import (
// ValidatingAdmission validates ResourceInterpreterWebhookConfiguration object when creating/updating.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -38,7 +38,7 @@ import (
// ValidatingAdmission validates CronFederatedHPA object when creating/updating.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -30,7 +30,7 @@ import (
// MutatingAdmission mutates API request if necessary.
type MutatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our MutatingAdmission implements necessary interface

View File

@ -29,7 +29,7 @@ import (
// ValidatingAdmission validates FederatedHPA object when creating/updating.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -34,7 +34,7 @@ import (
// ValidatingAdmission validates FederatedResourceQuota object when creating/updating.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -32,7 +32,7 @@ import (
// ValidatingAdmission validates MultiClusterIngress object when creating/updating.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -30,7 +30,7 @@ import (
// MutatingAdmission mutates API request if necessary.
type MutatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our MutatingAdmission implements necessary interface

View File

@ -37,7 +37,7 @@ import (
// ValidatingAdmission validates MultiClusterService object when creating/updating.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -29,7 +29,7 @@ import (
// MutatingAdmission mutates API request if necessary.
type MutatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our MutatingAdmission implements necessary interface

View File

@ -29,7 +29,7 @@ import (
// ValidatingAdmission validates OverridePolicy object when creating/updating/deleting.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -36,7 +36,7 @@ import (
// MutatingAdmission mutates API request if necessary.
type MutatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
DefaultNotReadyTolerationSeconds int64
DefaultUnreachableTolerationSeconds int64
@ -46,7 +46,7 @@ type MutatingAdmission struct {
var _ admission.Handler = &MutatingAdmission{}
// NewMutatingHandler builds a new admission.Handler.
func NewMutatingHandler(notReadyTolerationSeconds, unreachableTolerationSeconds int64, decoder *admission.Decoder) admission.Handler {
func NewMutatingHandler(notReadyTolerationSeconds, unreachableTolerationSeconds int64, decoder admission.Decoder) admission.Handler {
return &MutatingAdmission{
DefaultNotReadyTolerationSeconds: notReadyTolerationSeconds,
DefaultUnreachableTolerationSeconds: unreachableTolerationSeconds,

View File

@ -31,7 +31,7 @@ import (
// ValidatingAdmission validates PropagationPolicy object when creating/updating/deleting.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -31,7 +31,7 @@ import (
// MutatingAdmission mutates API request if necessary.
type MutatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our MutatingAdmission implements necessary interface

View File

@ -31,7 +31,7 @@ import (
// ValidatingAdmission validates resource templates to ensure those protected resources are not delectable.
type ValidatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -30,7 +30,7 @@ import (
// ValidatingAdmission validates ResourceInterpreterCustomization object when creating/updating.
type ValidatingAdmission struct {
client.Client
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our ValidatingAdmission implements necessary interface

View File

@ -35,7 +35,7 @@ import (
// MutatingAdmission mutates API request if necessary.
type MutatingAdmission struct {
Decoder *admission.Decoder
Decoder admission.Decoder
}
// Check if our MutatingAdmission implements necessary interface