diff --git a/controller/state.go b/controller/state.go index a5c121d484897..82b92b899f609 100644 --- a/controller/state.go +++ b/controller/state.go @@ -502,6 +502,10 @@ func (m *appStateManager) CompareAppState(app *v1alpha1.Application, project *ap _, refreshRequested := app.IsRefreshRequested() noCache = noCache || refreshRequested || app.Status.Expired(m.statusRefreshTimeout) + for i := range reconciliation.Target { + _ = m.resourceTracking.Normalize(reconciliation.Target[i], reconciliation.Live[i], appLabelKey, string(trackingMethod)) + } + if noCache || specChanged || revisionChanged || m.cache.GetAppManagedResources(app.Name, &cachedDiff) != nil { // (rare) cache miss diffResults, err = diff.DiffArray(reconciliation.Target, reconciliation.Live, diffOpts...) diff --git a/util/argo/resource_tracking.go b/util/argo/resource_tracking.go index d55d088add2d1..08bbc65ad7c1f 100644 --- a/util/argo/resource_tracking.go +++ b/util/argo/resource_tracking.go @@ -4,6 +4,8 @@ import ( "fmt" "strings" + "github.com/argoproj/gitops-engine/pkg/utils/kube" + "github.com/argoproj/argo-cd/v2/common" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -30,6 +32,7 @@ type ResourceTracking interface { SetAppInstance(un *unstructured.Unstructured, key, val, namespace string, trackingMethod v1alpha1.TrackingMethod) error BuildAppInstanceValue(value AppInstanceValue) string ParseAppInstanceValue(value string) (*AppInstanceValue, error) + Normalize(config, live *unstructured.Unstructured, labelKey, trackingMethod string) error } //AppInstanceValue store information about resource tracking info @@ -57,6 +60,10 @@ func GetTrackingMethod(settingsMgr *settings.SettingsManager) v1alpha1.TrackingM return v1alpha1.TrackingMethod(tm) } +func IsOldTrackingMethod(trackingMethod string) bool { + return trackingMethod == "" || trackingMethod == string(TrackingMethodLabel) +} + // GetAppName retrieve application name base on tracking method func (rt *resourceTracking) GetAppName(un *unstructured.Unstructured, key string, trackingMethod v1alpha1.TrackingMethod) string { retrieveAppInstanceValue := func() string { @@ -142,3 +149,31 @@ func (rt *resourceTracking) ParseAppInstanceValue(value string) (*AppInstanceVal appInstanceValue.Name = nsParts[1] return &appInstanceValue, nil } + +func (rt *resourceTracking) Normalize(config, live *unstructured.Unstructured, labelKey, trackingMethod string) error { + if IsOldTrackingMethod(trackingMethod) { + return nil + } + + if live == nil || config == nil { + return nil + } + + label := kube.GetAppInstanceLabel(live, labelKey) + if label == "" { + return nil + } + + annotation := argokube.GetAppInstanceAnnotation(config, common.AnnotationKeyAppInstance) + err := argokube.SetAppInstanceAnnotation(live, common.AnnotationKeyAppInstance, annotation) + if err != nil { + return err + } + + err = argokube.SetAppInstanceLabel(config, labelKey, label) + if err != nil { + return err + } + + return nil +} diff --git a/util/argo/resource_tracking_test.go b/util/argo/resource_tracking_test.go index 2d12a4459c005..a0a485ffd1c55 100644 --- a/util/argo/resource_tracking_test.go +++ b/util/argo/resource_tracking_test.go @@ -4,6 +4,8 @@ import ( "io/ioutil" "testing" + "github.com/argoproj/argo-cd/v2/util/kube" + "github.com/stretchr/testify/assert" "gopkg.in/yaml.v2" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" @@ -104,3 +106,33 @@ func TestParseAppInstanceValueCorrectFormat(t *testing.T) { _, err := resourceTracking.ParseAppInstanceValue("app:group/kind:test/ns") assert.NoError(t, err) } + +func TestResourceIdNormalizer_Normalize(t *testing.T) { + yamlBytes, err := ioutil.ReadFile("testdata/svc.yaml") + assert.Nil(t, err) + var obj *unstructured.Unstructured + err = yaml.Unmarshal(yamlBytes, &obj) + assert.Nil(t, err) + + rt := NewResourceTracking() + + err = rt.SetAppInstance(obj, common.LabelKeyAppInstance, "my-app", "", TrackingMethodLabel) + assert.Nil(t, err) + + yamlBytes, err = ioutil.ReadFile("testdata/svc.yaml") + assert.Nil(t, err) + var obj2 *unstructured.Unstructured + err = yaml.Unmarshal(yamlBytes, &obj2) + assert.Nil(t, err) + + err = rt.SetAppInstance(obj2, common.AnnotationKeyAppInstance, "my-app2", "", TrackingMethodAnnotation) + assert.Nil(t, err) + + _ = rt.Normalize(obj2, obj, common.LabelKeyAppInstance, string(TrackingMethodAnnotation)) + annotation := kube.GetAppInstanceAnnotation(obj2, common.AnnotationKeyAppInstance) + assert.Equal(t, obj.GetAnnotations()[common.AnnotationKeyAppInstance], annotation) +} + +func TestIsOldTrackingMethod(t *testing.T) { + assert.Equal(t, true, IsOldTrackingMethod(string(TrackingMethodLabel))) +}