fix: fix dependent resources being created and deleted repeatedly when the dependent resource has a status field.

Signed-off-by: chaunceyjiang <chaunceyjiang@gmail.com>
This commit is contained in:
chaunceyjiang 2023-07-31 22:06:04 +08:00
parent a2dc2e8bbb
commit 1f3bf9e423
4 changed files with 30 additions and 11 deletions

View File

@ -36,6 +36,7 @@ import (
"github.com/karmada-io/karmada/pkg/resourceinterpreter" "github.com/karmada-io/karmada/pkg/resourceinterpreter"
"github.com/karmada-io/karmada/pkg/sharedcli/ratelimiterflag" "github.com/karmada-io/karmada/pkg/sharedcli/ratelimiterflag"
"github.com/karmada-io/karmada/pkg/util" "github.com/karmada-io/karmada/pkg/util"
"github.com/karmada-io/karmada/pkg/util/eventfilter"
"github.com/karmada-io/karmada/pkg/util/fedinformer" "github.com/karmada-io/karmada/pkg/util/fedinformer"
"github.com/karmada-io/karmada/pkg/util/fedinformer/genericmanager" "github.com/karmada-io/karmada/pkg/util/fedinformer/genericmanager"
"github.com/karmada-io/karmada/pkg/util/fedinformer/keys" "github.com/karmada-io/karmada/pkg/util/fedinformer/keys"
@ -93,7 +94,24 @@ func (d *DependenciesDistributor) OnAdd(obj interface{}) {
} }
// OnUpdate handles object update event and push the object to queue. // OnUpdate handles object update event and push the object to queue.
func (d *DependenciesDistributor) OnUpdate(_, newObj interface{}) { func (d *DependenciesDistributor) OnUpdate(oldObj, newObj interface{}) {
unstructuredOldObj, err := helper.ToUnstructured(oldObj)
if err != nil {
klog.Errorf("Failed to transform oldObj, error: %v", err)
return
}
unstructuredNewObj, err := helper.ToUnstructured(newObj)
if err != nil {
klog.Errorf("Failed to transform newObj, error: %v", err)
return
}
if !eventfilter.SpecificationChanged(unstructuredOldObj, unstructuredNewObj) {
klog.V(4).Infof("Ignore update event of object (%s, kind=%s, %s) as specification no change", unstructuredOldObj.GetAPIVersion(), unstructuredOldObj.GetKind(), names.NamespacedKey(unstructuredOldObj.GetNamespace(), unstructuredOldObj.GetName()))
return
}
d.OnAdd(newObj) d.OnAdd(newObj)
} }

View File

@ -35,6 +35,7 @@ import (
"github.com/karmada-io/karmada/pkg/resourceinterpreter" "github.com/karmada-io/karmada/pkg/resourceinterpreter"
"github.com/karmada-io/karmada/pkg/sharedcli/ratelimiterflag" "github.com/karmada-io/karmada/pkg/sharedcli/ratelimiterflag"
"github.com/karmada-io/karmada/pkg/util" "github.com/karmada-io/karmada/pkg/util"
"github.com/karmada-io/karmada/pkg/util/eventfilter"
"github.com/karmada-io/karmada/pkg/util/fedinformer" "github.com/karmada-io/karmada/pkg/util/fedinformer"
"github.com/karmada-io/karmada/pkg/util/fedinformer/genericmanager" "github.com/karmada-io/karmada/pkg/util/fedinformer/genericmanager"
"github.com/karmada-io/karmada/pkg/util/fedinformer/keys" "github.com/karmada-io/karmada/pkg/util/fedinformer/keys"
@ -303,7 +304,7 @@ func (d *ResourceDetector) OnUpdate(oldObj, newObj interface{}) {
return return
} }
if !SpecificationChanged(unstructuredOldObj, unstructuredNewObj) { if !eventfilter.SpecificationChanged(unstructuredOldObj, unstructuredNewObj) {
klog.V(4).Infof("Ignore update event of object (kind=%s, %s/%s) as specification no change", unstructuredOldObj.GetKind(), unstructuredOldObj.GetNamespace(), unstructuredOldObj.GetName()) klog.V(4).Infof("Ignore update event of object (kind=%s, %s/%s) as specification no change", unstructuredOldObj.GetKind(), unstructuredOldObj.GetNamespace(), unstructuredOldObj.GetName())
return return
} }

View File

@ -1,4 +1,4 @@
package detector package eventfilter
import ( import (
"reflect" "reflect"

View File

@ -1,10 +1,10 @@
package detector package eventfilter
import ( import (
"testing" "testing"
appsv1 "k8s.io/api/apps/v1" appsv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1" corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/klog/v2" "k8s.io/klog/v2"
"k8s.io/utils/pointer" "k8s.io/utils/pointer"
@ -105,7 +105,7 @@ func TestSpecificationChanged(t *testing.T) {
}, },
Spec: workloadv1alpha1.WorkloadSpec{ Spec: workloadv1alpha1.WorkloadSpec{
Replicas: pointer.Int32(3), Replicas: pointer.Int32(3),
Template: v1.PodTemplateSpec{}, Template: corev1.PodTemplateSpec{},
Paused: false, Paused: false,
}, },
Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 3}, Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 3},
@ -117,7 +117,7 @@ func TestSpecificationChanged(t *testing.T) {
}, },
Spec: workloadv1alpha1.WorkloadSpec{ Spec: workloadv1alpha1.WorkloadSpec{
Replicas: pointer.Int32(5), Replicas: pointer.Int32(5),
Template: v1.PodTemplateSpec{}, Template: corev1.PodTemplateSpec{},
Paused: false, Paused: false,
}, },
Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 3}, Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 3},
@ -133,7 +133,7 @@ func TestSpecificationChanged(t *testing.T) {
}, },
Spec: workloadv1alpha1.WorkloadSpec{ Spec: workloadv1alpha1.WorkloadSpec{
Replicas: pointer.Int32(3), Replicas: pointer.Int32(3),
Template: v1.PodTemplateSpec{}, Template: corev1.PodTemplateSpec{},
Paused: false, Paused: false,
}, },
Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 1}, Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 1},
@ -145,7 +145,7 @@ func TestSpecificationChanged(t *testing.T) {
}, },
Spec: workloadv1alpha1.WorkloadSpec{ Spec: workloadv1alpha1.WorkloadSpec{
Replicas: pointer.Int32(3), Replicas: pointer.Int32(3),
Template: v1.PodTemplateSpec{}, Template: corev1.PodTemplateSpec{},
Paused: false, Paused: false,
}, },
Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 3}, Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 3},
@ -161,7 +161,7 @@ func TestSpecificationChanged(t *testing.T) {
}, },
Spec: workloadv1alpha1.WorkloadSpec{ Spec: workloadv1alpha1.WorkloadSpec{
Replicas: pointer.Int32(3), Replicas: pointer.Int32(3),
Template: v1.PodTemplateSpec{}, Template: corev1.PodTemplateSpec{},
Paused: false, Paused: false,
}, },
Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 1}, Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 1},
@ -173,7 +173,7 @@ func TestSpecificationChanged(t *testing.T) {
}, },
Spec: workloadv1alpha1.WorkloadSpec{ Spec: workloadv1alpha1.WorkloadSpec{
Replicas: pointer.Int32(5), Replicas: pointer.Int32(5),
Template: v1.PodTemplateSpec{}, Template: corev1.PodTemplateSpec{},
Paused: false, Paused: false,
}, },
Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 3}, Status: workloadv1alpha1.WorkloadStatus{ReadyReplicas: 3},