From 9731f6c48e698af888a75f9d32c58a0ffbde1296 Mon Sep 17 00:00:00 2001 From: Julian Lawrence Date: Wed, 18 Sep 2024 14:41:40 -0700 Subject: [PATCH] fix sts pvc logic Co-authored-by: yelshall Signed-off-by: Julian Lawrence --- .../default/native/dependencies.go | 32 +++++++++++++++++- .../default/native/dependencies_test.go | 33 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/pkg/resourceinterpreter/default/native/dependencies.go b/pkg/resourceinterpreter/default/native/dependencies.go index 94aaf2ba22fb..0e6095059672 100644 --- a/pkg/resourceinterpreter/default/native/dependencies.go +++ b/pkg/resourceinterpreter/default/native/dependencies.go @@ -27,6 +27,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/sets" mcsv1alpha1 "sigs.k8s.io/mcs-api/pkg/apis/v1alpha1" configv1alpha1 "github.com/karmada-io/karmada/pkg/apis/config/v1alpha1" @@ -132,7 +133,36 @@ func getStatefulSetDependencies(object *unstructured.Unstructured) ([]configv1al return nil, err } - return helper.GetDependenciesFromPodTemplate(podObj) + deps, err := helper.GetDependenciesFromPodTemplate(podObj) + if err != nil { + return nil, err + } + + if len(statefulSetObj.Spec.VolumeClaimTemplates) == 0 { + return deps, nil + } + + // ignore the PersistentVolumeClaim dependency if it was created by the StatefulSet VolumeClaimTemplates + // the PVC dependency is not needed because the StatefulSet will manage the pvcs in the member cluster, + // if it exists here it was just a placeholder not a real PVC + var validDeps []configv1alpha1.DependentObjectReference + volumeClaimTemplateNames := sets.Set[string]{} + for i := range statefulSetObj.Spec.VolumeClaimTemplates { + volumeClaimTemplateNames.Insert(statefulSetObj.Spec.VolumeClaimTemplates[i].Name) + } + + for i := range deps { + if deps[i].Kind != util.PersistentVolumeClaimKind { + validDeps = append(validDeps, deps[i]) + continue + } + if volumeClaimTemplateNames.Has(deps[i].Name) { + continue + } + validDeps = append(validDeps, deps[i]) + } + + return validDeps, nil } func getIngressDependencies(object *unstructured.Unstructured) ([]configv1alpha1.DependentObjectReference, error) { diff --git a/pkg/resourceinterpreter/default/native/dependencies_test.go b/pkg/resourceinterpreter/default/native/dependencies_test.go index f1635bf15615..4a37cec6dfd4 100644 --- a/pkg/resourceinterpreter/default/native/dependencies_test.go +++ b/pkg/resourceinterpreter/default/native/dependencies_test.go @@ -860,6 +860,39 @@ func Test_getStatefulSetDependencies(t *testing.T) { want: testPairs[2].dependentObjectReference, wantErr: false, }, + { + name: "statefulset with partial dependencies 4", + object: &unstructured.Unstructured{ + Object: map[string]interface{}{ + "apiVersion": "apps/v1", + "kind": "StatefulSet", + "metadata": map[string]interface{}{ + "name": "fake-statefulset", + "namespace": namespace, + }, + "spec": map[string]interface{}{ + "serviceName": "fake-service", + "selector": map[string]interface{}{ + "matchLabels": map[string]interface{}{ + "app": "fake", + }, + }, + "template": map[string]interface{}{ + "spec": testPairs[0].podSpecsWithDependencies.Object, + }, + "volumeClaimTemplates": []interface{}{ + map[string]interface{}{ + "metadata": map[string]interface{}{ + "name": "test-pvc", + }, + }, + }, + }, + }, + }, + want: testPairs[0].dependentObjectReference[:3], // remove the pvc dependency because it was found in the volumeClaimTemplates + wantErr: false, + }, } for i := range tests {