diff --git a/pkg/resourceinterpreter/defaultinterpreter/retain.go b/pkg/resourceinterpreter/defaultinterpreter/retain.go index ae7a6855d..52573f60e 100644 --- a/pkg/resourceinterpreter/defaultinterpreter/retain.go +++ b/pkg/resourceinterpreter/defaultinterpreter/retain.go @@ -22,6 +22,7 @@ func getAllDefaultRetentionInterpreter() map[schema.GroupVersionKind]retentionIn s[corev1.SchemeGroupVersion.WithKind(util.ServiceKind)] = lifted.RetainServiceFields s[corev1.SchemeGroupVersion.WithKind(util.ServiceAccountKind)] = lifted.RetainServiceAccountFields s[corev1.SchemeGroupVersion.WithKind(util.PersistentVolumeClaimKind)] = retainPersistentVolumeClaimFields + s[corev1.SchemeGroupVersion.WithKind(util.PersistentVolumeKind)] = retainPersistentVolumeFields s[batchv1.SchemeGroupVersion.WithKind(util.JobKind)] = retainJobSelectorFields return s } @@ -74,6 +75,20 @@ func retainPersistentVolumeClaimFields(desired, observed *unstructured.Unstructu return desired, nil } +func retainPersistentVolumeFields(desired, observed *unstructured.Unstructured) (*unstructured.Unstructured, error) { + // claimRef is updated by kube-controller-manager. + claimRef, ok, err := unstructured.NestedFieldNoCopy(observed.Object, "spec", "claimRef") + if err != nil { + return nil, fmt.Errorf("failed to retrieve claimRef from pv: %v", err) + } + if ok { + if err = unstructured.SetNestedField(desired.Object, claimRef, "spec", "claimRef"); err != nil { + return nil, fmt.Errorf("failed to set claimRef for pv: %v", err) + } + } + return desired, nil +} + func retainJobSelectorFields(desired, observed *unstructured.Unstructured) (*unstructured.Unstructured, error) { matchLabels, exist, err := unstructured.NestedStringMap(observed.Object, "spec", "selector", "matchLabels") if err != nil {