fix panic when update remedy.spec.clusteraffinity to empty

Signed-off-by: changzhen <changzhen5@huawei.com>
This commit is contained in:
changzhen 2024-02-28 11:14:03 +08:00
parent b538ab979a
commit 1edd563268
2 changed files with 65 additions and 9 deletions

View File

@ -24,6 +24,8 @@ import (
"k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/types"
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
"k8s.io/client-go/util/workqueue" "k8s.io/client-go/util/workqueue"
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/event" "sigs.k8s.io/controller-runtime/pkg/event"
"sigs.k8s.io/controller-runtime/pkg/handler" "sigs.k8s.io/controller-runtime/pkg/handler"
"sigs.k8s.io/controller-runtime/pkg/reconcile" "sigs.k8s.io/controller-runtime/pkg/reconcile"
@ -68,8 +70,9 @@ func (h *clusterEventHandler) Generic(_ context.Context, e event.GenericEvent, q
}}) }})
} }
func newRemedyEventHandler(clusterChan chan<- event.GenericEvent) handler.EventHandler { func newRemedyEventHandler(clusterChan chan<- event.GenericEvent, client client.Client) handler.EventHandler {
return &remedyEventHandler{ return &remedyEventHandler{
client: client,
clusterChan: clusterChan, clusterChan: clusterChan,
} }
} }
@ -77,22 +80,58 @@ func newRemedyEventHandler(clusterChan chan<- event.GenericEvent) handler.EventH
var _ handler.EventHandler = (*remedyEventHandler)(nil) var _ handler.EventHandler = (*remedyEventHandler)(nil)
type remedyEventHandler struct { type remedyEventHandler struct {
client client.Client
clusterChan chan<- event.GenericEvent clusterChan chan<- event.GenericEvent
} }
func (h *remedyEventHandler) Create(_ context.Context, e event.CreateEvent, _ workqueue.RateLimitingInterface) { func (h *remedyEventHandler) Create(ctx context.Context, e event.CreateEvent, _ workqueue.RateLimitingInterface) {
remedy := e.Object.(*remedyv1alpha1.Remedy) remedy := e.Object.(*remedyv1alpha1.Remedy)
if remedy.Spec.ClusterAffinity != nil {
for _, clusterName := range remedy.Spec.ClusterAffinity.ClusterNames { for _, clusterName := range remedy.Spec.ClusterAffinity.ClusterNames {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{ h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: clusterName, Name: clusterName,
}}} }}}
} }
return
} }
func (h *remedyEventHandler) Update(_ context.Context, e event.UpdateEvent, _ workqueue.RateLimitingInterface) { clusterList := &clusterv1alpha1.ClusterList{}
err := h.client.List(ctx, clusterList)
if err != nil {
klog.Errorf("Failed to list cluster: %v", err)
return
}
for _, cluster := range clusterList.Items {
h.clusterChan <- event.GenericEvent{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) oldRemedy := e.ObjectOld.(*remedyv1alpha1.Remedy)
newRemedy := e.ObjectNew.(*remedyv1alpha1.Remedy) newRemedy := e.ObjectNew.(*remedyv1alpha1.Remedy)
if oldRemedy.Spec.ClusterAffinity == nil || newRemedy.Spec.ClusterAffinity == nil {
clusterList := &clusterv1alpha1.ClusterList{}
err := h.client.List(ctx, clusterList)
if err != nil {
klog.Errorf("Failed to list cluster: %v", err)
return
}
for _, cluster := range clusterList.Items {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{
Name: cluster.Name,
}}}
}
return
}
clusters := sets.Set[string]{} clusters := sets.Set[string]{}
for _, clusterName := range oldRemedy.Spec.ClusterAffinity.ClusterNames { for _, clusterName := range oldRemedy.Spec.ClusterAffinity.ClusterNames {
clusters.Insert(clusterName) clusters.Insert(clusterName)
@ -108,14 +147,31 @@ func (h *remedyEventHandler) Update(_ context.Context, e event.UpdateEvent, _ wo
} }
} }
func (h *remedyEventHandler) Delete(_ context.Context, e event.DeleteEvent, _ workqueue.RateLimitingInterface) { func (h *remedyEventHandler) Delete(ctx context.Context, e event.DeleteEvent, _ workqueue.RateLimitingInterface) {
remedy := e.Object.(*remedyv1alpha1.Remedy) remedy := e.Object.(*remedyv1alpha1.Remedy)
if remedy.Spec.ClusterAffinity != nil {
for _, clusterName := range remedy.Spec.ClusterAffinity.ClusterNames { for _, clusterName := range remedy.Spec.ClusterAffinity.ClusterNames {
h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{ h.clusterChan <- event.GenericEvent{Object: &clusterv1alpha1.Cluster{
ObjectMeta: metav1.ObjectMeta{ ObjectMeta: metav1.ObjectMeta{
Name: clusterName, Name: clusterName,
}}} }}}
} }
return
}
clusterList := &clusterv1alpha1.ClusterList{}
err := h.client.List(ctx, clusterList)
if err != nil {
klog.Errorf("Failed to list cluster: %v", err)
return
}
for _, cluster := range clusterList.Items {
h.clusterChan <- event.GenericEvent{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.GenericEvent, _ workqueue.RateLimitingInterface) {

View File

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