diff --git a/util/argo/diff/diff.go b/util/argo/diff/diff.go index 6ee4f6c4af11f..93197eaaeb806 100644 --- a/util/argo/diff/diff.go +++ b/util/argo/diff/diff.go @@ -364,12 +364,23 @@ func diffArrayCached(configArray []*unstructured.Unstructured, liveArray []*unst } else { key = kube.GetResourceKey(config) } + + // Always calculate diff for custom resources to ensure field-level changes are detected + isCustomResource := config != nil && live != nil && config.GetAPIVersion() != live.GetAPIVersion() var dr *diff.DiffResult - if cachedDiff, ok := diffByKey[key]; ok && cachedDiff.ResourceVersion == resourceVersion { - dr = &diff.DiffResult{ - NormalizedLive: []byte(cachedDiff.NormalizedLiveState), - PredictedLive: []byte(cachedDiff.PredictedLiveState), - Modified: cachedDiff.Modified, + if !isCustomResource { + if cachedItem, ok := diffByKey[key]; ok && cachedItem.ResourceVersion == resourceVersion { + dr = &diff.DiffResult{ + NormalizedLive: []byte(cachedItem.NormalizedLiveState), + PredictedLive: []byte(cachedItem.PredictedLiveState), + Modified: cachedItem.Modified, + } + } else { + res, err := diff.Diff(configArray[i], liveArray[i], opts...) + if err != nil { + return nil, err + } + dr = res } } else { res, err := diff.Diff(configArray[i], liveArray[i], opts...) @@ -378,6 +389,7 @@ func diffArrayCached(configArray []*unstructured.Unstructured, liveArray []*unst } dr = res } + if dr != nil { diffResultList.Diffs[i] = *dr if dr.Modified {