From c81c7bdc7aa86566186fca35fb55a8beb528d5c7 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Wed, 8 Jan 2025 17:14:58 -0500 Subject: [PATCH 01/11] support multiple ArgoCD instances with ApplicationTrackingAnnotations Signed-off-by: Atif Ali resolve diff in bundle Signed-off-by: Atif Ali --- api/v1alpha1/argocd_types.go | 10 ++ api/v1alpha1/zz_generated.deepcopy.go | 7 ++ api/v1beta1/argocd_types.go | 10 ++ api/v1beta1/zz_generated.deepcopy.go | 7 ++ config/crd/bases/argoproj.io_argocds.yaml | 22 +++++ controllers/argocd/configmap.go | 7 ++ controllers/argocd/configmap_test.go | 112 ++++++++++++++++++++++ 7 files changed, 175 insertions(+) diff --git a/api/v1alpha1/argocd_types.go b/api/v1alpha1/argocd_types.go index e4c9efa15..c9329d261 100644 --- a/api/v1alpha1/argocd_types.go +++ b/api/v1alpha1/argocd_types.go @@ -682,6 +682,16 @@ type ArgoCDSpec struct { //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Instance Label Key'",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ApplicationInstanceLabelKey string `json:"applicationInstanceLabelKey,omitempty"` + // ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple + // ArgoCD instances managing the same cluster resources. For example: + // applicationTrackingAnnotations: + // installationID: "my-unique-id" + // otherAnnotation: "value" + // These annotations will be added to the argocd-cm ConfigMap. + // +optional + // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Tracking Annotations",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} + ApplicationTrackingAnnotations map[string]string `json:"applicationTrackingAnnotations,omitempty"` + // ConfigManagementPlugins is used to specify additional config management plugins. //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Config Management Plugins'",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ConfigManagementPlugins string `json:"configManagementPlugins,omitempty"` diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index b2c9c5ab2..2c279f4dd 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -893,6 +893,13 @@ func (in *ArgoCDSpec) DeepCopyInto(out *ArgoCDSpec) { *out = new(ArgoCDApplicationSet) (*in).DeepCopyInto(*out) } + if in.ApplicationTrackingAnnotations != nil { + in, out := &in.ApplicationTrackingAnnotations, &out.ApplicationTrackingAnnotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } in.Controller.DeepCopyInto(&out.Controller) if in.ExtraConfig != nil { in, out := &in.ExtraConfig, &out.ExtraConfig diff --git a/api/v1beta1/argocd_types.go b/api/v1beta1/argocd_types.go index 0821ffed0..3bdd284d7 100644 --- a/api/v1beta1/argocd_types.go +++ b/api/v1beta1/argocd_types.go @@ -792,6 +792,16 @@ type ArgoCDSpec struct { //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Instance Label Key'",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ApplicationInstanceLabelKey string `json:"applicationInstanceLabelKey,omitempty"` + // ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple + // ArgoCD instances managing the same cluster resources. For example: + // applicationTrackingAnnotations: + // installationID: "my-unique-id" + // otherAnnotation: "value" + // These annotations will be added to the argocd-cm ConfigMap. + // +optional + // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Tracking Annotations",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} + ApplicationTrackingAnnotations map[string]string `json:"applicationTrackingAnnotations,omitempty"` + // ConfigManagementPlugins is used to specify additional config management plugins. //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Config Management Plugins'",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ConfigManagementPlugins string `json:"configManagementPlugins,omitempty"` diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go index 567bca3c7..cf6f244ae 100644 --- a/api/v1beta1/zz_generated.deepcopy.go +++ b/api/v1beta1/zz_generated.deepcopy.go @@ -947,6 +947,13 @@ func (in *ArgoCDSpec) DeepCopyInto(out *ArgoCDSpec) { *out = new(ArgoCDApplicationSet) (*in).DeepCopyInto(*out) } + if in.ApplicationTrackingAnnotations != nil { + in, out := &in.ApplicationTrackingAnnotations, &out.ApplicationTrackingAnnotations + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } in.Controller.DeepCopyInto(&out.Controller) if in.ExtraConfig != nil { in, out := &in.ExtraConfig, &out.ExtraConfig diff --git a/config/crd/bases/argoproj.io_argocds.yaml b/config/crd/bases/argoproj.io_argocds.yaml index 68d5605a2..a6c4c3cd8 100644 --- a/config/crd/bases/argoproj.io_argocds.yaml +++ b/config/crd/bases/argoproj.io_argocds.yaml @@ -420,6 +420,17 @@ spec: type: object type: object type: object + applicationTrackingAnnotations: + additionalProperties: + type: string + description: |- + ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple + ArgoCD instances managing the same cluster resources. For example: + applicationTrackingAnnotations: + installationID: "my-unique-id" + otherAnnotation: "value" + These annotations will be added to the argocd-cm ConfigMap. + type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI @@ -9385,6 +9396,17 @@ spec: type: object type: object type: object + applicationTrackingAnnotations: + additionalProperties: + type: string + description: |- + ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple + ArgoCD instances managing the same cluster resources. For example: + applicationTrackingAnnotations: + installationID: "my-unique-id" + otherAnnotation: "value" + These annotations will be added to the argocd-cm ConfigMap. + type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI diff --git a/controllers/argocd/configmap.go b/controllers/argocd/configmap.go index 86e737acb..30240f3c1 100644 --- a/controllers/argocd/configmap.go +++ b/controllers/argocd/configmap.go @@ -383,6 +383,13 @@ func (r *ReconcileArgoCD) reconcileArgoConfigMap(cr *argoproj.ArgoCD) error { cm.Data = make(map[string]string) cm.Data = setRespectRBAC(cr, cm.Data) cm.Data[common.ArgoCDKeyApplicationInstanceLabelKey] = getApplicationInstanceLabelKey(cr) + + if cr.Spec.ApplicationTrackingAnnotations != nil { + for k, v := range cr.Spec.ApplicationTrackingAnnotations { + cm.Data[k] = v + } + } + cm.Data[common.ArgoCDKeyConfigManagementPlugins] = getConfigManagementPlugins(cr) cm.Data[common.ArgoCDKeyAdminEnabled] = fmt.Sprintf("%t", !cr.Spec.DisableAdmin) cm.Data[common.ArgoCDKeyGATrackingID] = getGATrackingID(cr) diff --git a/controllers/argocd/configmap_test.go b/controllers/argocd/configmap_test.go index 373d8afb2..aa17bd921 100644 --- a/controllers/argocd/configmap_test.go +++ b/controllers/argocd/configmap_test.go @@ -1154,3 +1154,115 @@ func Test_validateOwnerReferences(t *testing.T) { assert.Equal(t, cm.OwnerReferences[0].Name, "argocd") assert.Equal(t, cm.OwnerReferences[0].UID, uid) } + +func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotations(t *testing.T) { + logf.SetLogger(ZapLogger(true)) + + initialAnnotations := map[string]string{ + "installationID": "test-id", + } + updatedAnnotations := map[string]string{ + "installationID": "updated-test-id", + } + + a := makeTestArgoCD(func(a *argoproj.ArgoCD) { + a.Spec.ApplicationTrackingAnnotations = initialAnnotations + }) + + resObjs := []client.Object{a} + subresObjs := []client.Object{a} + runtimeObjs := []runtime.Object{} + sch := makeTestReconcilerScheme(argoproj.AddToScheme) + cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) + r := makeTestReconciler(cl, sch) + + err := r.reconcileArgoConfigMap(a) + assert.NoError(t, err) + + cm := &corev1.ConfigMap{} + err = r.Client.Get(context.TODO(), types.NamespacedName{ + Name: common.ArgoCDConfigMapName, + Namespace: testNamespace, + }, cm) + assert.NoError(t, err) + + // Check initial annotations + for k, v := range initialAnnotations { + if c := cm.Data[k]; c != v { + t.Fatalf("reconcileArgoConfigMap failed got %q, want %q", c, v) + } + } + + // Test updating annotations + a.Spec.ApplicationTrackingAnnotations = updatedAnnotations + err = r.reconcileArgoConfigMap(a) + assert.NoError(t, err) + + err = r.Client.Get(context.TODO(), types.NamespacedName{ + Name: common.ArgoCDConfigMapName, + Namespace: testNamespace, + }, cm) + assert.NoError(t, err) + + // Check updated annotations + for k, v := range updatedAnnotations { + if c := cm.Data[k]; c != v { + t.Fatalf("reconcileArgoConfigMap failed got %q, want %q", c, v) + } + } +} + +func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing.T) { + logf.SetLogger(ZapLogger(true)) + + // Create first ArgoCD instance + argocd1 := makeTestArgoCD(func(a *argoproj.ArgoCD) { + a.Name = "argocd-1" + a.Namespace = testNamespace + a.Spec.ApplicationTrackingAnnotations = map[string]string{ + "installationID": "instance-1", + } + }) + + // Create second ArgoCD instance + argocd2 := makeTestArgoCD(func(a *argoproj.ArgoCD) { + a.Name = "argocd-2" + a.Namespace = testNamespace + a.Spec.ApplicationTrackingAnnotations = map[string]string{ + "installationID": "instance-2", + } + }) + + resObjs := []client.Object{argocd1, argocd2} + subresObjs := []client.Object{argocd1, argocd2} + runtimeObjs := []runtime.Object{} + sch := makeTestReconcilerScheme(argoproj.AddToScheme) + cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) + r := makeTestReconciler(cl, sch) + + // Test first instance + err := r.reconcileArgoConfigMap(argocd1) + assert.NoError(t, err) + + cm1 := &corev1.ConfigMap{} + err = r.Client.Get(context.TODO(), types.NamespacedName{ + Name: common.ArgoCDConfigMapName, + Namespace: testNamespace, + }, cm1) + assert.NoError(t, err) + assert.Equal(t, "instance-1", cm1.Data["installationID"]) + + // Test second instance + err = r.reconcileArgoConfigMap(argocd2) + assert.NoError(t, err) + + cm2 := &corev1.ConfigMap{} + err = r.Client.Get(context.TODO(), types.NamespacedName{ + Name: common.ArgoCDConfigMapName, + Namespace: testNamespace, + }, cm2) + assert.NoError(t, err) + assert.Equal(t, "instance-2", cm2.Data["installationID"]) + + assert.NotEqual(t, cm1.Data["installationID"], cm2.Data["installationID"]) +} From fb1449c8ef1e7707e6d4b5330084ec5049e7d440 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Mon, 13 Jan 2025 17:36:57 -0500 Subject: [PATCH 02/11] resolve diff in bundle Signed-off-by: Atif Ali --- ...argocd-operator.clusterserviceversion.yaml | 22 ++++++++++++++++++- bundle/manifests/argoproj.io_argocds.yaml | 22 +++++++++++++++++++ ...argocd-operator.clusterserviceversion.yaml | 20 +++++++++++++++++ ...perator.v0.14.0.clusterserviceversion.yaml | 22 ++++++++++++++++++- .../0.14.0/argoproj.io_argocds.yaml | 22 +++++++++++++++++++ 5 files changed, 106 insertions(+), 2 deletions(-) diff --git a/bundle/manifests/argocd-operator.clusterserviceversion.yaml b/bundle/manifests/argocd-operator.clusterserviceversion.yaml index a914d905d..c82bf3b1f 100644 --- a/bundle/manifests/argocd-operator.clusterserviceversion.yaml +++ b/bundle/manifests/argocd-operator.clusterserviceversion.yaml @@ -247,7 +247,7 @@ metadata: capabilities: Deep Insights categories: Integration & Delivery certified: "false" - createdAt: "2024-12-20T09:48:39Z" + createdAt: "2025-01-13T22:32:02Z" description: Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. operators.operatorframework.io/builder: operator-sdk-v1.35.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 @@ -441,6 +441,16 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + - description: 'ApplicationTrackingAnnotations defines a map of annotations + that will be used to support multiple ArgoCD instances managing the same + cluster resources. For example: applicationTrackingAnnotations: installationID: + "my-unique-id" otherAnnotation: "value" These annotations will be added + to the argocd-cm ConfigMap.' + displayName: Application Tracking Annotations + path: applicationTrackingAnnotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' @@ -1051,6 +1061,16 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + - description: 'ApplicationTrackingAnnotations defines a map of annotations + that will be used to support multiple ArgoCD instances managing the same + cluster resources. For example: applicationTrackingAnnotations: installationID: + "my-unique-id" otherAnnotation: "value" These annotations will be added + to the argocd-cm ConfigMap.' + displayName: Application Tracking Annotations + path: applicationTrackingAnnotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' diff --git a/bundle/manifests/argoproj.io_argocds.yaml b/bundle/manifests/argoproj.io_argocds.yaml index cf66d2e72..42cd37aa2 100644 --- a/bundle/manifests/argoproj.io_argocds.yaml +++ b/bundle/manifests/argoproj.io_argocds.yaml @@ -431,6 +431,17 @@ spec: type: object type: object type: object + applicationTrackingAnnotations: + additionalProperties: + type: string + description: |- + ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple + ArgoCD instances managing the same cluster resources. For example: + applicationTrackingAnnotations: + installationID: "my-unique-id" + otherAnnotation: "value" + These annotations will be added to the argocd-cm ConfigMap. + type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI @@ -9396,6 +9407,17 @@ spec: type: object type: object type: object + applicationTrackingAnnotations: + additionalProperties: + type: string + description: |- + ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple + ArgoCD instances managing the same cluster resources. For example: + applicationTrackingAnnotations: + installationID: "my-unique-id" + otherAnnotation: "value" + These annotations will be added to the argocd-cm ConfigMap. + type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI diff --git a/config/manifests/bases/argocd-operator.clusterserviceversion.yaml b/config/manifests/bases/argocd-operator.clusterserviceversion.yaml index 455734308..b9b4c02c2 100644 --- a/config/manifests/bases/argocd-operator.clusterserviceversion.yaml +++ b/config/manifests/bases/argocd-operator.clusterserviceversion.yaml @@ -289,6 +289,16 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + - description: 'ApplicationTrackingAnnotations defines a map of annotations + that will be used to support multiple ArgoCD instances managing the same + cluster resources. For example: applicationTrackingAnnotations: installationID: + "my-unique-id" otherAnnotation: "value" These annotations will be added + to the argocd-cm ConfigMap.' + displayName: Application Tracking Annotations + path: applicationTrackingAnnotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' @@ -858,6 +868,16 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + - description: 'ApplicationTrackingAnnotations defines a map of annotations + that will be used to support multiple ArgoCD instances managing the same + cluster resources. For example: applicationTrackingAnnotations: installationID: + "my-unique-id" otherAnnotation: "value" These annotations will be added + to the argocd-cm ConfigMap.' + displayName: Application Tracking Annotations + path: applicationTrackingAnnotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' diff --git a/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml b/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml index a914d905d..c82bf3b1f 100644 --- a/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml +++ b/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml @@ -247,7 +247,7 @@ metadata: capabilities: Deep Insights categories: Integration & Delivery certified: "false" - createdAt: "2024-12-20T09:48:39Z" + createdAt: "2025-01-13T22:32:02Z" description: Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. operators.operatorframework.io/builder: operator-sdk-v1.35.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 @@ -441,6 +441,16 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + - description: 'ApplicationTrackingAnnotations defines a map of annotations + that will be used to support multiple ArgoCD instances managing the same + cluster resources. For example: applicationTrackingAnnotations: installationID: + "my-unique-id" otherAnnotation: "value" These annotations will be added + to the argocd-cm ConfigMap.' + displayName: Application Tracking Annotations + path: applicationTrackingAnnotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' @@ -1051,6 +1061,16 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch + - description: 'ApplicationTrackingAnnotations defines a map of annotations + that will be used to support multiple ArgoCD instances managing the same + cluster resources. For example: applicationTrackingAnnotations: installationID: + "my-unique-id" otherAnnotation: "value" These annotations will be added + to the argocd-cm ConfigMap.' + displayName: Application Tracking Annotations + path: applicationTrackingAnnotations + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' diff --git a/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml b/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml index cf66d2e72..42cd37aa2 100644 --- a/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml +++ b/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml @@ -431,6 +431,17 @@ spec: type: object type: object type: object + applicationTrackingAnnotations: + additionalProperties: + type: string + description: |- + ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple + ArgoCD instances managing the same cluster resources. For example: + applicationTrackingAnnotations: + installationID: "my-unique-id" + otherAnnotation: "value" + These annotations will be added to the argocd-cm ConfigMap. + type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI @@ -9396,6 +9407,17 @@ spec: type: object type: object type: object + applicationTrackingAnnotations: + additionalProperties: + type: string + description: |- + ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple + ArgoCD instances managing the same cluster resources. For example: + applicationTrackingAnnotations: + installationID: "my-unique-id" + otherAnnotation: "value" + These annotations will be added to the argocd-cm ConfigMap. + type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI From 4474df368c111dc099cf02ca844dc587d5982e77 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Tue, 14 Jan 2025 22:36:49 -0500 Subject: [PATCH 03/11] more tests and e2e tests Signed-off-by: Atif Ali new approach for e2e tests Signed-off-by: Atif Ali new added annotation tracking Signed-off-by: Atif Ali create apps Signed-off-by: Atif Ali linter fix Signed-off-by: Atif Ali marshals the annotations into JSON for the ConfigMap Signed-off-by: Atif Ali create apps Signed-off-by: Atif Ali --- controllers/argocd/configmap.go | 14 +- controllers/argocd/configmap_test.go | 153 ++++++++++++++++-- controllers/argocd/deployment.go | 25 +++ .../01-assert.yaml | 4 +- .../01-assert.yaml | 39 +++++ .../01-install.yaml | 39 +++++ .../02-assert.yaml | 19 +++ .../02-create-apps.yaml | 34 ++++ 8 files changed, 307 insertions(+), 20 deletions(-) create mode 100644 tests/k8s/1-046_validate_application_tracking/01-assert.yaml create mode 100644 tests/k8s/1-046_validate_application_tracking/01-install.yaml create mode 100644 tests/k8s/1-046_validate_application_tracking/02-assert.yaml create mode 100644 tests/k8s/1-046_validate_application_tracking/02-create-apps.yaml diff --git a/controllers/argocd/configmap.go b/controllers/argocd/configmap.go index 30240f3c1..d3ade1ba1 100644 --- a/controllers/argocd/configmap.go +++ b/controllers/argocd/configmap.go @@ -16,6 +16,7 @@ package argocd import ( "context" + "encoding/json" "fmt" "reflect" @@ -379,15 +380,22 @@ func (r *ReconcileArgoCD) reconcileCAConfigMap(cr *argoproj.ArgoCD) error { // reconcileConfiguration will ensure that the main ConfigMap for ArgoCD is present. func (r *ReconcileArgoCD) reconcileArgoConfigMap(cr *argoproj.ArgoCD) error { cm := newConfigMapWithName(common.ArgoCDConfigMapName, cr) - cm.Data = make(map[string]string) cm.Data = setRespectRBAC(cr, cm.Data) cm.Data[common.ArgoCDKeyApplicationInstanceLabelKey] = getApplicationInstanceLabelKey(cr) + // Set tracking method if specified + if cr.Spec.ResourceTrackingMethod != "" { + cm.Data["resource.tracking.method"] = cr.Spec.ResourceTrackingMethod + } + + // Set tracking annotations and handle installationID if cr.Spec.ApplicationTrackingAnnotations != nil { - for k, v := range cr.Spec.ApplicationTrackingAnnotations { - cm.Data[k] = v + trackingAnnotations, err := json.Marshal(cr.Spec.ApplicationTrackingAnnotations) + if err != nil { + return err } + cm.Data["resource.tracking.annotations"] = string(trackingAnnotations) } cm.Data[common.ArgoCDKeyConfigManagementPlugins] = getConfigManagementPlugins(cr) diff --git a/controllers/argocd/configmap_test.go b/controllers/argocd/configmap_test.go index aa17bd921..818009f86 100644 --- a/controllers/argocd/configmap_test.go +++ b/controllers/argocd/configmap_test.go @@ -16,6 +16,7 @@ package argocd import ( "context" + "encoding/json" "fmt" "reflect" "testing" @@ -687,7 +688,6 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withResourceTrackingMethod(t *te assert.NoError(t, err) cm := &corev1.ConfigMap{} - t.Run("Check default tracking method", func(t *testing.T) { err = r.Client.Get(context.TODO(), types.NamespacedName{ Name: common.ArgoCDConfigMapName, @@ -1029,7 +1029,6 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withRespectRBAC(t *testing.T) { assert.NoError(t, err) cm := &corev1.ConfigMap{} - assert.NoError(t, r.Client.Get(context.TODO(), types.NamespacedName{Name: common.ArgoCDConfigMapName, Namespace: testNamespace}, cm)) if c := cm.Data["resource.respectRBAC"]; c != "normal" { @@ -1187,11 +1186,10 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotatio assert.NoError(t, err) // Check initial annotations - for k, v := range initialAnnotations { - if c := cm.Data[k]; c != v { - t.Fatalf("reconcileArgoConfigMap failed got %q, want %q", c, v) - } - } + var actualAnnotations map[string]string + err = json.Unmarshal([]byte(cm.Data["resource.tracking.annotations"]), &actualAnnotations) + assert.NoError(t, err) + assert.Equal(t, initialAnnotations, actualAnnotations) // Test updating annotations a.Spec.ApplicationTrackingAnnotations = updatedAnnotations @@ -1205,11 +1203,9 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotatio assert.NoError(t, err) // Check updated annotations - for k, v := range updatedAnnotations { - if c := cm.Data[k]; c != v { - t.Fatalf("reconcileArgoConfigMap failed got %q, want %q", c, v) - } - } + err = json.Unmarshal([]byte(cm.Data["resource.tracking.annotations"]), &actualAnnotations) + assert.NoError(t, err) + assert.Equal(t, updatedAnnotations, actualAnnotations) } func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing.T) { @@ -1250,7 +1246,11 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing Namespace: testNamespace, }, cm1) assert.NoError(t, err) - assert.Equal(t, "instance-1", cm1.Data["installationID"]) + + var actualAnnotations1 map[string]string + err = json.Unmarshal([]byte(cm1.Data["resource.tracking.annotations"]), &actualAnnotations1) + assert.NoError(t, err) + assert.Equal(t, "instance-1", actualAnnotations1["installationID"]) // Test second instance err = r.reconcileArgoConfigMap(argocd2) @@ -1262,7 +1262,130 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing Namespace: testNamespace, }, cm2) assert.NoError(t, err) - assert.Equal(t, "instance-2", cm2.Data["installationID"]) - assert.NotEqual(t, cm1.Data["installationID"], cm2.Data["installationID"]) + var actualAnnotations2 map[string]string + err = json.Unmarshal([]byte(cm2.Data["resource.tracking.annotations"]), &actualAnnotations2) + assert.NoError(t, err) + assert.Equal(t, "instance-2", actualAnnotations2["installationID"]) +} + +func TestReconcileArgoCD_reconcileArgoConfigMap_emptyAnnotations(t *testing.T) { + logf.SetLogger(ZapLogger(true)) + + // Test with nil annotations + a := makeTestArgoCD(func(a *argoproj.ArgoCD) { + a.Spec.ApplicationTrackingAnnotations = nil + }) + + resObjs := []client.Object{a} + subresObjs := []client.Object{a} + runtimeObjs := []runtime.Object{} + sch := makeTestReconcilerScheme(argoproj.AddToScheme) + cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) + r := makeTestReconciler(cl, sch) + + err := r.reconcileArgoConfigMap(a) + assert.NoError(t, err) + + cm := &corev1.ConfigMap{} + err = r.Client.Get(context.TODO(), types.NamespacedName{ + Name: common.ArgoCDConfigMapName, + Namespace: testNamespace, + }, cm) + assert.NoError(t, err) + + // Verify default behavior without annotations + assert.NotContains(t, cm.Data, "resource.tracking.annotations") +} + +func TestReconcileArgoCD_reconcileArgoConfigMap_removeAnnotations(t *testing.T) { + logf.SetLogger(ZapLogger(true)) + + // Start with annotations + initialAnnotations := map[string]string{ + "installationID": "test-id", + "customKey": "value", + } + + a := makeTestArgoCD(func(a *argoproj.ArgoCD) { + a.Spec.ApplicationTrackingAnnotations = initialAnnotations + }) + + resObjs := []client.Object{a} + subresObjs := []client.Object{a} + runtimeObjs := []runtime.Object{} + sch := makeTestReconcilerScheme(argoproj.AddToScheme) + cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) + r := makeTestReconciler(cl, sch) + + // First create with annotations + err := r.reconcileArgoConfigMap(a) + assert.NoError(t, err) + + // Remove annotations + a.Spec.ApplicationTrackingAnnotations = nil + err = r.reconcileArgoConfigMap(a) + assert.NoError(t, err) + + cm := &corev1.ConfigMap{} + err = r.Client.Get(context.TODO(), types.NamespacedName{ + Name: common.ArgoCDConfigMapName, + Namespace: testNamespace, + }, cm) + assert.NoError(t, err) + + // Verify annotations were removed + assert.NotContains(t, cm.Data, "resource.tracking.annotations") +} + +func TestReconcileArgoCD_reconcileArgoConfigMap_multipleAnnotations(t *testing.T) { + logf.SetLogger(ZapLogger(true)) + + // Test multiple annotation types + annotations := map[string]string{ + "installationID": "test-id", + "environment": "production", + "team": "platform", + "empty": "", // Test empty value + } + + // Create single ArgoCD instance + a := makeTestArgoCD(func(a *argoproj.ArgoCD) { + a.Name = "argocd" + a.Namespace = testNamespace + a.Spec.ApplicationTrackingAnnotations = annotations + a.Spec.ResourceTrackingMethod = "annotation" + }) + + resObjs := []client.Object{a} + subresObjs := []client.Object{a} + runtimeObjs := []runtime.Object{} + sch := makeTestReconcilerScheme(argoproj.AddToScheme) + cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) + r := makeTestReconciler(cl, sch) + + // When + err := r.reconcileArgoConfigMap(a) + assert.NoError(t, err) + + // Then + cm := &corev1.ConfigMap{} + err = r.Client.Get(context.TODO(), types.NamespacedName{ + Name: common.ArgoCDConfigMapName, + Namespace: testNamespace, + }, cm) + assert.NoError(t, err) + + // Verify annotations are set correctly in the ConfigMap + var actualAnnotations map[string]string + err = json.Unmarshal([]byte(cm.Data["resource.tracking.annotations"]), &actualAnnotations) + assert.NoError(t, err) + assert.Equal(t, annotations, actualAnnotations) + assert.Equal(t, "annotation", cm.Data["resource.tracking.method"]) + + // Verify each annotation individually + for key, expectedValue := range annotations { + assert.Equal(t, expectedValue, actualAnnotations[key], + "Annotation %s should have value %s", key, expectedValue) + } } diff --git a/controllers/argocd/deployment.go b/controllers/argocd/deployment.go index ebc84ec8a..3329f6eeb 100644 --- a/controllers/argocd/deployment.go +++ b/controllers/argocd/deployment.go @@ -16,6 +16,7 @@ package argocd import ( "context" + "encoding/json" "errors" "fmt" "os" @@ -1361,6 +1362,30 @@ func (r *ReconcileArgoCD) reconcileRepoDeployment(cr *argoproj.ArgoCD, useTLSFor func (r *ReconcileArgoCD) reconcileServerDeployment(cr *argoproj.ArgoCD, useTLSForRedis bool) error { deploy := newDeploymentWithSuffix("server", "server", cr) serverEnv := cr.Spec.Server.Env + + // Add tracking method if specified + if cr.Spec.ResourceTrackingMethod != "" { + trackingMethod := argoproj.ParseResourceTrackingMethod(cr.Spec.ResourceTrackingMethod) + if trackingMethod != argoproj.ResourceTrackingMethodInvalid { + serverEnv = append(serverEnv, corev1.EnvVar{ + Name: "ARGOCD_RESOURCE_TRACKING_METHOD", + Value: trackingMethod.String(), + }) + } + } + + // Add tracking annotations if specified + if len(cr.Spec.ApplicationTrackingAnnotations) > 0 { + trackingAnnotations, err := json.Marshal(cr.Spec.ApplicationTrackingAnnotations) + if err != nil { + return fmt.Errorf("failed to marshal tracking annotations: %w", err) + } + serverEnv = append(serverEnv, corev1.EnvVar{ + Name: "ARGOCD_RESOURCE_TRACKING_ANNOTATIONS", + Value: string(trackingAnnotations), + }) + } + serverEnv = append(serverEnv, corev1.EnvVar{ Name: "REDIS_PASSWORD", ValueFrom: &corev1.EnvVarSource{ diff --git a/tests/k8s/1-006_validate-managed-by-chain/01-assert.yaml b/tests/k8s/1-006_validate-managed-by-chain/01-assert.yaml index 18d3a4076..c3dc00b3d 100644 --- a/tests/k8s/1-006_validate-managed-by-chain/01-assert.yaml +++ b/tests/k8s/1-006_validate-managed-by-chain/01-assert.yaml @@ -3,9 +3,9 @@ kind: TestAssert timeout: 720 --- # Wait for the Operator to become available -apiVersion: argoproj.io/v1alpha1 +apiVersion: argoproj.io/v1beta1 kind: ArgoCD metadata: name: argocd status: - phase: Available \ No newline at end of file + phase: Available diff --git a/tests/k8s/1-046_validate_application_tracking/01-assert.yaml b/tests/k8s/1-046_validate_application_tracking/01-assert.yaml new file mode 100644 index 000000000..a6154f099 --- /dev/null +++ b/tests/k8s/1-046_validate_application_tracking/01-assert.yaml @@ -0,0 +1,39 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 720 +--- +# Check first ArgoCD instance is available +apiVersion: argoproj.io/v1beta1 +kind: ArgoCD +metadata: + name: argocd-1 + namespace: test-1-046-argocd-1 +status: + phase: Available +--- +# Check second ArgoCD instance is available +apiVersion: argoproj.io/v1beta1 +kind: ArgoCD +metadata: + name: argocd-2 + namespace: test-1-046-argocd-2 +status: + phase: Available +--- +# Check first ArgoCD ConfigMap +apiVersion: v1 +kind: ConfigMap +metadata: + name: argocd-cm + namespace: test-1-046-argocd-1 +data: + resource.tracking.annotations: '{"installationID":"instance-1"}' +--- +# Check second ArgoCD ConfigMap +apiVersion: v1 +kind: ConfigMap +metadata: + name: argocd-cm + namespace: test-1-046-argocd-2 +data: + resource.tracking.annotations: '{"installationID":"instance-2"}' diff --git a/tests/k8s/1-046_validate_application_tracking/01-install.yaml b/tests/k8s/1-046_validate_application_tracking/01-install.yaml new file mode 100644 index 000000000..a47459898 --- /dev/null +++ b/tests/k8s/1-046_validate_application_tracking/01-install.yaml @@ -0,0 +1,39 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: test-1-046-argocd-1 +--- +apiVersion: v1 +kind: Namespace +metadata: + name: test-1-046-argocd-2 +--- +apiVersion: v1 +kind: Namespace +metadata: + name: source-ns-1 +--- +apiVersion: v1 +kind: Namespace +metadata: + name: source-ns-2 +--- +# First ArgoCD instance +apiVersion: argoproj.io/v1beta1 +kind: ArgoCD +metadata: + name: argocd-1 + namespace: test-1-046-argocd-1 +spec: + applicationTrackingAnnotations: + installationID: instance-1 +--- +# Second ArgoCD instance +apiVersion: argoproj.io/v1beta1 +kind: ArgoCD +metadata: + name: argocd-2 + namespace: test-1-046-argocd-2 +spec: + applicationTrackingAnnotations: + installationID: instance-2 diff --git a/tests/k8s/1-046_validate_application_tracking/02-assert.yaml b/tests/k8s/1-046_validate_application_tracking/02-assert.yaml new file mode 100644 index 000000000..efbb99a06 --- /dev/null +++ b/tests/k8s/1-046_validate_application_tracking/02-assert.yaml @@ -0,0 +1,19 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: assert-apps +timeout: 300 +--- +# Check first Application exists +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: test-app + namespace: test-1-046-argocd-1 +--- +# Check second Application exists +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: test-app + namespace: test-1-046-argocd-2 diff --git a/tests/k8s/1-046_validate_application_tracking/02-create-apps.yaml b/tests/k8s/1-046_validate_application_tracking/02-create-apps.yaml new file mode 100644 index 000000000..c955f1d9d --- /dev/null +++ b/tests/k8s/1-046_validate_application_tracking/02-create-apps.yaml @@ -0,0 +1,34 @@ +# This creates an application with a destination in the other managed namespace +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: test-app + namespace: test-1-046-argocd-1 +spec: + project: default + source: + repoURL: https://github.com/redhat-developer/gitops-operator + path: test/examples/nginx + targetRevision: "HEAD" + destination: + server: "https://kubernetes.default.svc" + namespace: source-ns-1 + syncPolicy: + automated: {} +--- +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: test-app + namespace: test-1-046-argocd-2 +spec: + project: default + source: + repoURL: https://github.com/redhat-developer/gitops-operator + path: test/examples/nginx + targetRevision: "HEAD" + destination: + server: "https://kubernetes.default.svc" + namespace: source-ns-2 + syncPolicy: + automated: {} From c269f2779e7f57a8d2bb6a13297eb33b10013675 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Wed, 29 Jan 2025 11:46:18 -0500 Subject: [PATCH 04/11] create apps and assert pass Signed-off-by: Atif Ali --- .../02-assert.yaml | 40 +++++++++++++------ .../02-label-namespaces.yaml | 13 ++++++ .../03-assert.yaml | 27 +++++++++++++ ...2-create-apps.yaml => 03-create-apps.yaml} | 11 ++--- 4 files changed, 74 insertions(+), 17 deletions(-) create mode 100644 tests/k8s/1-046_validate_application_tracking/02-label-namespaces.yaml create mode 100644 tests/k8s/1-046_validate_application_tracking/03-assert.yaml rename tests/k8s/1-046_validate_application_tracking/{02-create-apps.yaml => 03-create-apps.yaml} (73%) diff --git a/tests/k8s/1-046_validate_application_tracking/02-assert.yaml b/tests/k8s/1-046_validate_application_tracking/02-assert.yaml index efbb99a06..b9c1dcc4c 100644 --- a/tests/k8s/1-046_validate_application_tracking/02-assert.yaml +++ b/tests/k8s/1-046_validate_application_tracking/02-assert.yaml @@ -1,19 +1,35 @@ apiVersion: kuttl.dev/v1beta1 kind: TestAssert -metadata: - name: assert-apps timeout: 300 --- -# Check first Application exists -apiVersion: argoproj.io/v1alpha1 -kind: Application +# Check first namespace labels +apiVersion: v1 +kind: Namespace +metadata: + name: source-ns-1 + labels: + argocd.argoproj.io/managed-by: test-1-046-argocd-1 + argocd.argoproj.io/tracking-id: instance-1 +--- +# Check second namespace labels +apiVersion: v1 +kind: Namespace +metadata: + name: source-ns-2 + labels: + argocd.argoproj.io/managed-by: test-1-046-argocd-2 + argocd.argoproj.io/tracking-id: instance-2 +--- +# Verify RBAC is set up for first namespace +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role metadata: - name: test-app - namespace: test-1-046-argocd-1 + name: argocd-1-argocd-application-controller + namespace: source-ns-1 --- -# Check second Application exists -apiVersion: argoproj.io/v1alpha1 -kind: Application +# Verify RBAC is set up for second namespace +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role metadata: - name: test-app - namespace: test-1-046-argocd-2 + name: argocd-2-argocd-application-controller + namespace: source-ns-2 diff --git a/tests/k8s/1-046_validate_application_tracking/02-label-namespaces.yaml b/tests/k8s/1-046_validate_application_tracking/02-label-namespaces.yaml new file mode 100644 index 000000000..6cdef9aec --- /dev/null +++ b/tests/k8s/1-046_validate_application_tracking/02-label-namespaces.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: +# Set managed-by labels +- script: | + kubectl label ns source-ns-1 argocd.argoproj.io/managed-by=test-1-046-argocd-1 + kubectl label ns source-ns-2 argocd.argoproj.io/managed-by=test-1-046-argocd-2 + sleep 30 +# Set tracking-id labels +- script: | + kubectl label ns source-ns-1 argocd.argoproj.io/tracking-id=instance-1 + kubectl label ns source-ns-2 argocd.argoproj.io/tracking-id=instance-2 + sleep 30 diff --git a/tests/k8s/1-046_validate_application_tracking/03-assert.yaml b/tests/k8s/1-046_validate_application_tracking/03-assert.yaml new file mode 100644 index 000000000..cd9092e55 --- /dev/null +++ b/tests/k8s/1-046_validate_application_tracking/03-assert.yaml @@ -0,0 +1,27 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 300 +--- +# Check first Application is healthy +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: test-app + namespace: test-1-046-argocd-1 +status: + health: + status: Healthy + sync: + status: Synced +--- +# Check second Application is healthy +apiVersion: argoproj.io/v1alpha1 +kind: Application +metadata: + name: test-app + namespace: test-1-046-argocd-2 +status: + health: + status: Healthy + sync: + status: Synced diff --git a/tests/k8s/1-046_validate_application_tracking/02-create-apps.yaml b/tests/k8s/1-046_validate_application_tracking/03-create-apps.yaml similarity index 73% rename from tests/k8s/1-046_validate_application_tracking/02-create-apps.yaml rename to tests/k8s/1-046_validate_application_tracking/03-create-apps.yaml index c955f1d9d..8d565b1e1 100644 --- a/tests/k8s/1-046_validate_application_tracking/02-create-apps.yaml +++ b/tests/k8s/1-046_validate_application_tracking/03-create-apps.yaml @@ -1,4 +1,4 @@ -# This creates an application with a destination in the other managed namespace +# Application in first ArgoCD instance apiVersion: argoproj.io/v1alpha1 kind: Application metadata: @@ -9,13 +9,14 @@ spec: source: repoURL: https://github.com/redhat-developer/gitops-operator path: test/examples/nginx - targetRevision: "HEAD" + targetRevision: HEAD destination: - server: "https://kubernetes.default.svc" + server: https://kubernetes.default.svc namespace: source-ns-1 syncPolicy: automated: {} --- +# Application in second ArgoCD instance apiVersion: argoproj.io/v1alpha1 kind: Application metadata: @@ -26,9 +27,9 @@ spec: source: repoURL: https://github.com/redhat-developer/gitops-operator path: test/examples/nginx - targetRevision: "HEAD" + targetRevision: HEAD destination: - server: "https://kubernetes.default.svc" + server: https://kubernetes.default.svc namespace: source-ns-2 syncPolicy: automated: {} From 7055644565c9a45b3b7037832035bff0047cc2d5 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Fri, 31 Jan 2025 17:23:32 -0500 Subject: [PATCH 05/11] Set tracking annotations directly in the ConfigMap && revert deployment.go Signed-off-by: Atif Ali --- controllers/argocd/configmap.go | 9 +++---- controllers/argocd/deployment.go | 25 ------------------- .../01-assert.yaml | 24 ++++++++++++++++-- .../01-install.yaml | 2 ++ .../03-assert.yaml | 18 +++++++++++++ 5 files changed, 45 insertions(+), 33 deletions(-) diff --git a/controllers/argocd/configmap.go b/controllers/argocd/configmap.go index d3ade1ba1..d083b91b1 100644 --- a/controllers/argocd/configmap.go +++ b/controllers/argocd/configmap.go @@ -16,7 +16,6 @@ package argocd import ( "context" - "encoding/json" "fmt" "reflect" @@ -389,13 +388,11 @@ func (r *ReconcileArgoCD) reconcileArgoConfigMap(cr *argoproj.ArgoCD) error { cm.Data["resource.tracking.method"] = cr.Spec.ResourceTrackingMethod } - // Set tracking annotations and handle installationID + // Set tracking annotations directly in the ConfigMap if cr.Spec.ApplicationTrackingAnnotations != nil { - trackingAnnotations, err := json.Marshal(cr.Spec.ApplicationTrackingAnnotations) - if err != nil { - return err + for key, value := range cr.Spec.ApplicationTrackingAnnotations { + cm.Data[key] = value } - cm.Data["resource.tracking.annotations"] = string(trackingAnnotations) } cm.Data[common.ArgoCDKeyConfigManagementPlugins] = getConfigManagementPlugins(cr) diff --git a/controllers/argocd/deployment.go b/controllers/argocd/deployment.go index 3329f6eeb..ebc84ec8a 100644 --- a/controllers/argocd/deployment.go +++ b/controllers/argocd/deployment.go @@ -16,7 +16,6 @@ package argocd import ( "context" - "encoding/json" "errors" "fmt" "os" @@ -1362,30 +1361,6 @@ func (r *ReconcileArgoCD) reconcileRepoDeployment(cr *argoproj.ArgoCD, useTLSFor func (r *ReconcileArgoCD) reconcileServerDeployment(cr *argoproj.ArgoCD, useTLSForRedis bool) error { deploy := newDeploymentWithSuffix("server", "server", cr) serverEnv := cr.Spec.Server.Env - - // Add tracking method if specified - if cr.Spec.ResourceTrackingMethod != "" { - trackingMethod := argoproj.ParseResourceTrackingMethod(cr.Spec.ResourceTrackingMethod) - if trackingMethod != argoproj.ResourceTrackingMethodInvalid { - serverEnv = append(serverEnv, corev1.EnvVar{ - Name: "ARGOCD_RESOURCE_TRACKING_METHOD", - Value: trackingMethod.String(), - }) - } - } - - // Add tracking annotations if specified - if len(cr.Spec.ApplicationTrackingAnnotations) > 0 { - trackingAnnotations, err := json.Marshal(cr.Spec.ApplicationTrackingAnnotations) - if err != nil { - return fmt.Errorf("failed to marshal tracking annotations: %w", err) - } - serverEnv = append(serverEnv, corev1.EnvVar{ - Name: "ARGOCD_RESOURCE_TRACKING_ANNOTATIONS", - Value: string(trackingAnnotations), - }) - } - serverEnv = append(serverEnv, corev1.EnvVar{ Name: "REDIS_PASSWORD", ValueFrom: &corev1.EnvVarSource{ diff --git a/tests/k8s/1-046_validate_application_tracking/01-assert.yaml b/tests/k8s/1-046_validate_application_tracking/01-assert.yaml index a6154f099..df3da48a9 100644 --- a/tests/k8s/1-046_validate_application_tracking/01-assert.yaml +++ b/tests/k8s/1-046_validate_application_tracking/01-assert.yaml @@ -27,7 +27,8 @@ metadata: name: argocd-cm namespace: test-1-046-argocd-1 data: - resource.tracking.annotations: '{"installationID":"instance-1"}' + installationID: "instance-1" + resource.tracking.method: "annotation" --- # Check second ArgoCD ConfigMap apiVersion: v1 @@ -36,4 +37,23 @@ metadata: name: argocd-cm namespace: test-1-046-argocd-2 data: - resource.tracking.annotations: '{"installationID":"instance-2"}' + installationID: "instance-2" + resource.tracking.method: "annotation" +--- +# Check first namespace labels +apiVersion: v1 +kind: Namespace +metadata: + name: source-ns-1 + labels: + argocd.argoproj.io/managed-by: test-1-046-argocd-1 + argocd.argoproj.io/tracking-id: instance-1 +--- +# Check second namespace labels +apiVersion: v1 +kind: Namespace +metadata: + name: source-ns-2 + labels: + argocd.argoproj.io/managed-by: test-1-046-argocd-2 + argocd.argoproj.io/tracking-id: instance-2 diff --git a/tests/k8s/1-046_validate_application_tracking/01-install.yaml b/tests/k8s/1-046_validate_application_tracking/01-install.yaml index a47459898..ca77d1ba3 100644 --- a/tests/k8s/1-046_validate_application_tracking/01-install.yaml +++ b/tests/k8s/1-046_validate_application_tracking/01-install.yaml @@ -27,6 +27,7 @@ metadata: spec: applicationTrackingAnnotations: installationID: instance-1 + resourceTrackingMethod: "annotation" --- # Second ArgoCD instance apiVersion: argoproj.io/v1beta1 @@ -37,3 +38,4 @@ metadata: spec: applicationTrackingAnnotations: installationID: instance-2 + resourceTrackingMethod: "annotation" diff --git a/tests/k8s/1-046_validate_application_tracking/03-assert.yaml b/tests/k8s/1-046_validate_application_tracking/03-assert.yaml index cd9092e55..9bbe0f8c1 100644 --- a/tests/k8s/1-046_validate_application_tracking/03-assert.yaml +++ b/tests/k8s/1-046_validate_application_tracking/03-assert.yaml @@ -25,3 +25,21 @@ status: status: Healthy sync: status: Synced +--- +# Check resources in first namespace have correct annotation +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + namespace: source-ns-1 + annotations: + argocd.argoproj.io/tracking-id: test-app:apps/Deployment:source-ns-1/nginx-deployment +--- +# Check resources in second namespace have correct annotation +apiVersion: apps/v1 +kind: Deployment +metadata: + name: nginx-deployment + namespace: source-ns-2 + annotations: + argocd.argoproj.io/tracking-id: test-app:apps/Deployment:source-ns-2/nginx-deployment From 43e3678e7708ccd96c169a9d5167bc95bbc8523e Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Fri, 31 Jan 2025 17:31:11 -0500 Subject: [PATCH 06/11] fix configmap_test.go to use direct key-value pairs Signed-off-by: Atif Ali --- controllers/argocd/configmap_test.go | 68 ++++++++++++++++++---------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/controllers/argocd/configmap_test.go b/controllers/argocd/configmap_test.go index 818009f86..58d3d6999 100644 --- a/controllers/argocd/configmap_test.go +++ b/controllers/argocd/configmap_test.go @@ -16,7 +16,6 @@ package argocd import ( "context" - "encoding/json" "fmt" "reflect" "testing" @@ -1166,6 +1165,7 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotatio a := makeTestArgoCD(func(a *argoproj.ArgoCD) { a.Spec.ApplicationTrackingAnnotations = initialAnnotations + a.Spec.ResourceTrackingMethod = "annotation" }) resObjs := []client.Object{a} @@ -1175,6 +1175,7 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotatio cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) r := makeTestReconciler(cl, sch) + // Test initial annotations err := r.reconcileArgoConfigMap(a) assert.NoError(t, err) @@ -1185,11 +1186,14 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotatio }, cm) assert.NoError(t, err) - // Check initial annotations - var actualAnnotations map[string]string - err = json.Unmarshal([]byte(cm.Data["resource.tracking.annotations"]), &actualAnnotations) - assert.NoError(t, err) - assert.Equal(t, initialAnnotations, actualAnnotations) + // Verify initial state + assert.Equal(t, "annotation", cm.Data["application.resourceTrackingMethod"]) + assert.Equal(t, "annotation", cm.Data["resource.tracking.method"]) + assert.Equal(t, initialAnnotations["installationID"], cm.Data["installationID"]) + + // Verify resource.tracking.annotations doesn't exist + _, hasTrackingAnnotations := cm.Data["resource.tracking.annotations"] + assert.False(t, hasTrackingAnnotations) // Test updating annotations a.Spec.ApplicationTrackingAnnotations = updatedAnnotations @@ -1202,10 +1206,14 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotatio }, cm) assert.NoError(t, err) - // Check updated annotations - err = json.Unmarshal([]byte(cm.Data["resource.tracking.annotations"]), &actualAnnotations) - assert.NoError(t, err) - assert.Equal(t, updatedAnnotations, actualAnnotations) + // Verify updated state + assert.Equal(t, "annotation", cm.Data["application.resourceTrackingMethod"]) + assert.Equal(t, "annotation", cm.Data["resource.tracking.method"]) + assert.Equal(t, updatedAnnotations["installationID"], cm.Data["installationID"]) + + // Verify resource.tracking.annotations still doesn't exist + _, hasTrackingAnnotations = cm.Data["resource.tracking.annotations"] + assert.False(t, hasTrackingAnnotations) } func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing.T) { @@ -1215,6 +1223,7 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing argocd1 := makeTestArgoCD(func(a *argoproj.ArgoCD) { a.Name = "argocd-1" a.Namespace = testNamespace + a.Spec.ResourceTrackingMethod = "annotation" a.Spec.ApplicationTrackingAnnotations = map[string]string{ "installationID": "instance-1", } @@ -1224,6 +1233,7 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing argocd2 := makeTestArgoCD(func(a *argoproj.ArgoCD) { a.Name = "argocd-2" a.Namespace = testNamespace + a.Spec.ResourceTrackingMethod = "annotation" a.Spec.ApplicationTrackingAnnotations = map[string]string{ "installationID": "instance-2", } @@ -1247,10 +1257,10 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing }, cm1) assert.NoError(t, err) - var actualAnnotations1 map[string]string - err = json.Unmarshal([]byte(cm1.Data["resource.tracking.annotations"]), &actualAnnotations1) - assert.NoError(t, err) - assert.Equal(t, "instance-1", actualAnnotations1["installationID"]) + // Verify first instance's tracking method and annotations + assert.Equal(t, "annotation", cm1.Data["application.resourceTrackingMethod"]) + assert.Equal(t, "annotation", cm1.Data["resource.tracking.method"]) + assert.Equal(t, "instance-1", cm1.Data["installationID"]) // Test second instance err = r.reconcileArgoConfigMap(argocd2) @@ -1263,10 +1273,16 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing }, cm2) assert.NoError(t, err) - var actualAnnotations2 map[string]string - err = json.Unmarshal([]byte(cm2.Data["resource.tracking.annotations"]), &actualAnnotations2) - assert.NoError(t, err) - assert.Equal(t, "instance-2", actualAnnotations2["installationID"]) + // Verify second instance's tracking method and annotations + assert.Equal(t, "annotation", cm2.Data["application.resourceTrackingMethod"]) + assert.Equal(t, "annotation", cm2.Data["resource.tracking.method"]) + assert.Equal(t, "instance-2", cm2.Data["installationID"]) + + // Verify resource.tracking.annotations doesn't exist in either ConfigMap + _, hasTrackingAnnotations1 := cm1.Data["resource.tracking.annotations"] + assert.False(t, hasTrackingAnnotations1) + _, hasTrackingAnnotations2 := cm2.Data["resource.tracking.annotations"] + assert.False(t, hasTrackingAnnotations2) } func TestReconcileArgoCD_reconcileArgoConfigMap_emptyAnnotations(t *testing.T) { @@ -1376,16 +1392,18 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_multipleAnnotations(t *testing.T }, cm) assert.NoError(t, err) - // Verify annotations are set correctly in the ConfigMap - var actualAnnotations map[string]string - err = json.Unmarshal([]byte(cm.Data["resource.tracking.annotations"]), &actualAnnotations) - assert.NoError(t, err) - assert.Equal(t, annotations, actualAnnotations) + // Verify tracking method is set correctly + assert.Equal(t, "annotation", cm.Data["application.resourceTrackingMethod"]) assert.Equal(t, "annotation", cm.Data["resource.tracking.method"]) - // Verify each annotation individually + // Verify annotations are set directly as key-value pairs for key, expectedValue := range annotations { - assert.Equal(t, expectedValue, actualAnnotations[key], + assert.Equal(t, expectedValue, cm.Data[key], "Annotation %s should have value %s", key, expectedValue) } + + // Verify resource.tracking.annotations doesn't exist + _, hasTrackingAnnotations := cm.Data["resource.tracking.annotations"] + assert.False(t, hasTrackingAnnotations, + "resource.tracking.annotations should not exist in ConfigMap") } From 68cd0759187993bf5ba473628443419db0e539da Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Fri, 31 Jan 2025 23:06:13 -0500 Subject: [PATCH 07/11] clean up test resources && fix failing test Signed-off-by: Atif Ali --- .../01-assert.yaml | 10 ++---- .../04-cleanup.yaml | 35 +++++++++++++++++++ 2 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 tests/k8s/1-046_validate_application_tracking/04-cleanup.yaml diff --git a/tests/k8s/1-046_validate_application_tracking/01-assert.yaml b/tests/k8s/1-046_validate_application_tracking/01-assert.yaml index df3da48a9..e46a70aa6 100644 --- a/tests/k8s/1-046_validate_application_tracking/01-assert.yaml +++ b/tests/k8s/1-046_validate_application_tracking/01-assert.yaml @@ -40,20 +40,14 @@ data: installationID: "instance-2" resource.tracking.method: "annotation" --- -# Check first namespace labels +# Check first namespace apiVersion: v1 kind: Namespace metadata: name: source-ns-1 - labels: - argocd.argoproj.io/managed-by: test-1-046-argocd-1 - argocd.argoproj.io/tracking-id: instance-1 --- -# Check second namespace labels +# Check second namespace apiVersion: v1 kind: Namespace metadata: name: source-ns-2 - labels: - argocd.argoproj.io/managed-by: test-1-046-argocd-2 - argocd.argoproj.io/tracking-id: instance-2 diff --git a/tests/k8s/1-046_validate_application_tracking/04-cleanup.yaml b/tests/k8s/1-046_validate_application_tracking/04-cleanup.yaml new file mode 100644 index 000000000..24c31b9b7 --- /dev/null +++ b/tests/k8s/1-046_validate_application_tracking/04-cleanup.yaml @@ -0,0 +1,35 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +# Delete test namespaces +- apiVersion: v1 + kind: Namespace + name: test-1-046-argocd-1 +- apiVersion: v1 + kind: Namespace + name: test-1-046-argocd-2 +- apiVersion: v1 + kind: Namespace + name: source-ns-1 +- apiVersion: v1 + kind: Namespace + name: source-ns-2 +# Delete ArgoCD instances +- apiVersion: argoproj.io/v1beta1 + kind: ArgoCD + name: argocd-1 + namespace: test-1-046-argocd-1 +- apiVersion: argoproj.io/v1beta1 + kind: ArgoCD + name: argocd-2 + namespace: test-1-046-argocd-2 +# Delete Applications +- apiVersion: argoproj.io/v1alpha1 + kind: Application + name: test-app + namespace: test-1-046-argocd-1 +- apiVersion: argoproj.io/v1alpha1 + kind: Application + name: test-app + namespace: test-1-046-argocd-2 +timeout: 120 # Give enough time for cascade deletion From 2b6da9867530af1a95c67c3f93244501c61b49bd Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Mon, 3 Feb 2025 23:18:04 -0500 Subject: [PATCH 08/11] handle installationID as top-level ConfigMap key && update test files Signed-off-by: Atif Ali --- api/v1alpha1/argocd_types.go | 14 +- api/v1beta1/argocd_types.go | 14 +- common/keys.go | 3 + config/crd/bases/argoproj.io_argocds.yaml | 28 ++- controllers/argocd/configmap.go | 32 +-- controllers/argocd/configmap_test.go | 201 +++--------------- .../01-assert.yaml | 4 +- .../01-install.yaml | 6 +- 8 files changed, 91 insertions(+), 211 deletions(-) diff --git a/api/v1alpha1/argocd_types.go b/api/v1alpha1/argocd_types.go index c9329d261..3a610473d 100644 --- a/api/v1alpha1/argocd_types.go +++ b/api/v1alpha1/argocd_types.go @@ -682,12 +682,16 @@ type ArgoCDSpec struct { //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Instance Label Key'",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ApplicationInstanceLabelKey string `json:"applicationInstanceLabelKey,omitempty"` - // ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple - // ArgoCD instances managing the same cluster resources. For example: + // InstallationID uniquely identifies an Argo CD instance in multi-instance clusters. + //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Installation ID",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} + InstallationID string `json:"installationID,omitempty"` + + // ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support + // advanced resource tracking scenarios, such as custom tracking formats. For example: // applicationTrackingAnnotations: - // installationID: "my-unique-id" - // otherAnnotation: "value" - // These annotations will be added to the argocd-cm ConfigMap. + // resource.tracking.format: "custom-format" + // otherKey: "value" + // These keys will be added to the argocd-cm ConfigMap. // +optional // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Tracking Annotations",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ApplicationTrackingAnnotations map[string]string `json:"applicationTrackingAnnotations,omitempty"` diff --git a/api/v1beta1/argocd_types.go b/api/v1beta1/argocd_types.go index 3bdd284d7..09a8fc988 100644 --- a/api/v1beta1/argocd_types.go +++ b/api/v1beta1/argocd_types.go @@ -792,12 +792,16 @@ type ArgoCDSpec struct { //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Instance Label Key'",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ApplicationInstanceLabelKey string `json:"applicationInstanceLabelKey,omitempty"` - // ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple - // ArgoCD instances managing the same cluster resources. For example: + // InstallationID uniquely identifies an Argo CD instance in multi-instance clusters. + //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Installation ID",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} + InstallationID string `json:"installationID,omitempty"` + + // ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support + // advanced resource tracking scenarios, such as custom tracking formats. For example: // applicationTrackingAnnotations: - // installationID: "my-unique-id" - // otherAnnotation: "value" - // These annotations will be added to the argocd-cm ConfigMap. + // resource.tracking.format: "custom-format" + // otherKey: "value" + // These keys will be added to the argocd-cm ConfigMap. // +optional // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Tracking Annotations",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ApplicationTrackingAnnotations map[string]string `json:"applicationTrackingAnnotations,omitempty"` diff --git a/common/keys.go b/common/keys.go index 76aed700c..129cd9283 100644 --- a/common/keys.go +++ b/common/keys.go @@ -231,4 +231,7 @@ const ( // Label Selector is an env variable for ArgoCD instance reconcilliation. ArgoCDLabelSelectorKey = "ARGOCD_LABEL_SELECTOR" + + // ArgoCDKeyInstallationID is the configuration key for the installation ID. + ArgoCDKeyInstallationID = "installationID" ) diff --git a/config/crd/bases/argoproj.io_argocds.yaml b/config/crd/bases/argoproj.io_argocds.yaml index a6c4c3cd8..765ea8c4d 100644 --- a/config/crd/bases/argoproj.io_argocds.yaml +++ b/config/crd/bases/argoproj.io_argocds.yaml @@ -424,12 +424,12 @@ spec: additionalProperties: type: string description: |- - ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple - ArgoCD instances managing the same cluster resources. For example: + ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support + advanced resource tracking scenarios, such as custom tracking formats. For example: applicationTrackingAnnotations: - installationID: "my-unique-id" - otherAnnotation: "value" - These annotations will be added to the argocd-cm ConfigMap. + resource.tracking.format: "custom-format" + otherKey: "value" + These keys will be added to the argocd-cm ConfigMap. type: object banner: description: Banner defines an additional banner to be displayed in @@ -1166,6 +1166,10 @@ spec: have included in your ArgoCD server. type: string type: object + installationID: + description: InstallationID uniquely identifies an Argo CD instance + in multi-instance clusters. + type: string kustomizeBuildOptions: description: KustomizeBuildOptions is used to specify build options/parameters to use with `kustomize build`. @@ -9400,12 +9404,12 @@ spec: additionalProperties: type: string description: |- - ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple - ArgoCD instances managing the same cluster resources. For example: + ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support + advanced resource tracking scenarios, such as custom tracking formats. For example: applicationTrackingAnnotations: - installationID: "my-unique-id" - otherAnnotation: "value" - These annotations will be added to the argocd-cm ConfigMap. + resource.tracking.format: "custom-format" + otherKey: "value" + These keys will be added to the argocd-cm ConfigMap. type: object banner: description: Banner defines an additional banner to be displayed in @@ -14382,6 +14386,10 @@ spec: have included in your ArgoCD server. type: string type: object + installationID: + description: InstallationID uniquely identifies an Argo CD instance + in multi-instance clusters. + type: string kustomizeBuildOptions: description: KustomizeBuildOptions is used to specify build options/parameters to use with `kustomize build`. diff --git a/controllers/argocd/configmap.go b/controllers/argocd/configmap.go index d083b91b1..f347ea400 100644 --- a/controllers/argocd/configmap.go +++ b/controllers/argocd/configmap.go @@ -382,27 +382,26 @@ func (r *ReconcileArgoCD) reconcileArgoConfigMap(cr *argoproj.ArgoCD) error { cm.Data = make(map[string]string) cm.Data = setRespectRBAC(cr, cm.Data) cm.Data[common.ArgoCDKeyApplicationInstanceLabelKey] = getApplicationInstanceLabelKey(cr) + cm.Data[common.ArgoCDKeyConfigManagementPlugins] = getConfigManagementPlugins(cr) + cm.Data[common.ArgoCDKeyAdminEnabled] = fmt.Sprintf("%t", !cr.Spec.DisableAdmin) + cm.Data[common.ArgoCDKeyGATrackingID] = getGATrackingID(cr) + cm.Data[common.ArgoCDKeyGAAnonymizeUsers] = fmt.Sprint(cr.Spec.GAAnonymizeUsers) + cm.Data[common.ArgoCDKeyHelpChatURL] = getHelpChatURL(cr) + cm.Data[common.ArgoCDKeyHelpChatText] = getHelpChatText(cr) + cm.Data[common.ArgoCDKeyKustomizeBuildOptions] = getKustomizeBuildOptions(cr) - // Set tracking method if specified - if cr.Spec.ResourceTrackingMethod != "" { - cm.Data["resource.tracking.method"] = cr.Spec.ResourceTrackingMethod + // Set installationID as a top-level key + if cr.Spec.InstallationID != "" { + cm.Data[common.ArgoCDKeyInstallationID] = cr.Spec.InstallationID } - // Set tracking annotations directly in the ConfigMap + // Set annotations from the map (for future use, e.g., resource.tracking.format) if cr.Spec.ApplicationTrackingAnnotations != nil { for key, value := range cr.Spec.ApplicationTrackingAnnotations { cm.Data[key] = value } } - cm.Data[common.ArgoCDKeyConfigManagementPlugins] = getConfigManagementPlugins(cr) - cm.Data[common.ArgoCDKeyAdminEnabled] = fmt.Sprintf("%t", !cr.Spec.DisableAdmin) - cm.Data[common.ArgoCDKeyGATrackingID] = getGATrackingID(cr) - cm.Data[common.ArgoCDKeyGAAnonymizeUsers] = fmt.Sprint(cr.Spec.GAAnonymizeUsers) - cm.Data[common.ArgoCDKeyHelpChatURL] = getHelpChatURL(cr) - cm.Data[common.ArgoCDKeyHelpChatText] = getHelpChatText(cr) - cm.Data[common.ArgoCDKeyKustomizeBuildOptions] = getKustomizeBuildOptions(cr) - if len(cr.Spec.KustomizeVersions) > 0 { for _, kv := range cr.Spec.KustomizeVersions { cm.Data["kustomize.version."+kv.Version] = kv.Path @@ -788,3 +787,12 @@ func (r *ReconcileArgoCD) reconcileGPGKeysConfigMap(cr *argoproj.ArgoCD) error { argoutil.LogResourceCreation(log, cm) return r.Client.Create(context.TODO(), cm) } + +func validateApplicationTrackingAnnotations(annotations map[string]string) error { + if id, exists := annotations["installationID"]; exists { + if id == "" { + return fmt.Errorf("installationID cannot be empty") + } + } + return nil +} diff --git a/controllers/argocd/configmap_test.go b/controllers/argocd/configmap_test.go index 58d3d6999..e5e08bbd7 100644 --- a/controllers/argocd/configmap_test.go +++ b/controllers/argocd/configmap_test.go @@ -1153,19 +1153,11 @@ func Test_validateOwnerReferences(t *testing.T) { assert.Equal(t, cm.OwnerReferences[0].UID, uid) } -func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotations(t *testing.T) { +func TestReconcileArgoCD_reconcileArgoConfigMap_withInstallationID(t *testing.T) { logf.SetLogger(ZapLogger(true)) - initialAnnotations := map[string]string{ - "installationID": "test-id", - } - updatedAnnotations := map[string]string{ - "installationID": "updated-test-id", - } - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.ApplicationTrackingAnnotations = initialAnnotations - a.Spec.ResourceTrackingMethod = "annotation" + a.Spec.InstallationID = "test-id" }) resObjs := []client.Object{a} @@ -1175,7 +1167,7 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotatio cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) r := makeTestReconciler(cl, sch) - // Test initial annotations + // Test initial installationID err := r.reconcileArgoConfigMap(a) assert.NoError(t, err) @@ -1186,34 +1178,36 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withApplicationTrackingAnnotatio }, cm) assert.NoError(t, err) - // Verify initial state - assert.Equal(t, "annotation", cm.Data["application.resourceTrackingMethod"]) - assert.Equal(t, "annotation", cm.Data["resource.tracking.method"]) - assert.Equal(t, initialAnnotations["installationID"], cm.Data["installationID"]) - - // Verify resource.tracking.annotations doesn't exist - _, hasTrackingAnnotations := cm.Data["resource.tracking.annotations"] - assert.False(t, hasTrackingAnnotations) + // Verify installationID is set as a top-level key + assert.Equal(t, "test-id", cm.Data[common.ArgoCDKeyInstallationID]) - // Test updating annotations - a.Spec.ApplicationTrackingAnnotations = updatedAnnotations + //Test updating installationID + a.Spec.InstallationID = "test-id-2" err = r.reconcileArgoConfigMap(a) assert.NoError(t, err) + cm = &corev1.ConfigMap{} err = r.Client.Get(context.TODO(), types.NamespacedName{ Name: common.ArgoCDConfigMapName, Namespace: testNamespace, }, cm) assert.NoError(t, err) - // Verify updated state - assert.Equal(t, "annotation", cm.Data["application.resourceTrackingMethod"]) - assert.Equal(t, "annotation", cm.Data["resource.tracking.method"]) - assert.Equal(t, updatedAnnotations["installationID"], cm.Data["installationID"]) + assert.Equal(t, "test-id-2", cm.Data[common.ArgoCDKeyInstallationID]) + + // Test removing installationID + a.Spec.InstallationID = "" + err = r.reconcileArgoConfigMap(a) + assert.NoError(t, err) + + err = r.Client.Get(context.TODO(), types.NamespacedName{ + Name: common.ArgoCDConfigMapName, + Namespace: testNamespace, + }, cm) + assert.NoError(t, err) - // Verify resource.tracking.annotations still doesn't exist - _, hasTrackingAnnotations = cm.Data["resource.tracking.annotations"] - assert.False(t, hasTrackingAnnotations) + // Verify installationID was removed + assert.NotContains(t, cm.Data, common.ArgoCDKeyInstallationID) } func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing.T) { @@ -1223,20 +1217,14 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing argocd1 := makeTestArgoCD(func(a *argoproj.ArgoCD) { a.Name = "argocd-1" a.Namespace = testNamespace - a.Spec.ResourceTrackingMethod = "annotation" - a.Spec.ApplicationTrackingAnnotations = map[string]string{ - "installationID": "instance-1", - } + a.Spec.InstallationID = "instance-1" }) // Create second ArgoCD instance argocd2 := makeTestArgoCD(func(a *argoproj.ArgoCD) { a.Name = "argocd-2" a.Namespace = testNamespace - a.Spec.ResourceTrackingMethod = "annotation" - a.Spec.ApplicationTrackingAnnotations = map[string]string{ - "installationID": "instance-2", - } + a.Spec.InstallationID = "instance-2" }) resObjs := []client.Object{argocd1, argocd2} @@ -1257,10 +1245,8 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing }, cm1) assert.NoError(t, err) - // Verify first instance's tracking method and annotations - assert.Equal(t, "annotation", cm1.Data["application.resourceTrackingMethod"]) - assert.Equal(t, "annotation", cm1.Data["resource.tracking.method"]) - assert.Equal(t, "instance-1", cm1.Data["installationID"]) + // Verify first instance's installationID + assert.Equal(t, "instance-1", cm1.Data[common.ArgoCDKeyInstallationID]) // Test second instance err = r.reconcileArgoConfigMap(argocd2) @@ -1273,137 +1259,6 @@ func TestReconcileArgoCD_reconcileArgoConfigMap_withMultipleInstances(t *testing }, cm2) assert.NoError(t, err) - // Verify second instance's tracking method and annotations - assert.Equal(t, "annotation", cm2.Data["application.resourceTrackingMethod"]) - assert.Equal(t, "annotation", cm2.Data["resource.tracking.method"]) - assert.Equal(t, "instance-2", cm2.Data["installationID"]) - - // Verify resource.tracking.annotations doesn't exist in either ConfigMap - _, hasTrackingAnnotations1 := cm1.Data["resource.tracking.annotations"] - assert.False(t, hasTrackingAnnotations1) - _, hasTrackingAnnotations2 := cm2.Data["resource.tracking.annotations"] - assert.False(t, hasTrackingAnnotations2) -} - -func TestReconcileArgoCD_reconcileArgoConfigMap_emptyAnnotations(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - - // Test with nil annotations - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.ApplicationTrackingAnnotations = nil - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - err := r.reconcileArgoConfigMap(a) - assert.NoError(t, err) - - cm := &corev1.ConfigMap{} - err = r.Client.Get(context.TODO(), types.NamespacedName{ - Name: common.ArgoCDConfigMapName, - Namespace: testNamespace, - }, cm) - assert.NoError(t, err) - - // Verify default behavior without annotations - assert.NotContains(t, cm.Data, "resource.tracking.annotations") -} - -func TestReconcileArgoCD_reconcileArgoConfigMap_removeAnnotations(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - - // Start with annotations - initialAnnotations := map[string]string{ - "installationID": "test-id", - "customKey": "value", - } - - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Spec.ApplicationTrackingAnnotations = initialAnnotations - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - // First create with annotations - err := r.reconcileArgoConfigMap(a) - assert.NoError(t, err) - - // Remove annotations - a.Spec.ApplicationTrackingAnnotations = nil - err = r.reconcileArgoConfigMap(a) - assert.NoError(t, err) - - cm := &corev1.ConfigMap{} - err = r.Client.Get(context.TODO(), types.NamespacedName{ - Name: common.ArgoCDConfigMapName, - Namespace: testNamespace, - }, cm) - assert.NoError(t, err) - - // Verify annotations were removed - assert.NotContains(t, cm.Data, "resource.tracking.annotations") -} - -func TestReconcileArgoCD_reconcileArgoConfigMap_multipleAnnotations(t *testing.T) { - logf.SetLogger(ZapLogger(true)) - - // Test multiple annotation types - annotations := map[string]string{ - "installationID": "test-id", - "environment": "production", - "team": "platform", - "empty": "", // Test empty value - } - - // Create single ArgoCD instance - a := makeTestArgoCD(func(a *argoproj.ArgoCD) { - a.Name = "argocd" - a.Namespace = testNamespace - a.Spec.ApplicationTrackingAnnotations = annotations - a.Spec.ResourceTrackingMethod = "annotation" - }) - - resObjs := []client.Object{a} - subresObjs := []client.Object{a} - runtimeObjs := []runtime.Object{} - sch := makeTestReconcilerScheme(argoproj.AddToScheme) - cl := makeTestReconcilerClient(sch, resObjs, subresObjs, runtimeObjs) - r := makeTestReconciler(cl, sch) - - // When - err := r.reconcileArgoConfigMap(a) - assert.NoError(t, err) - - // Then - cm := &corev1.ConfigMap{} - err = r.Client.Get(context.TODO(), types.NamespacedName{ - Name: common.ArgoCDConfigMapName, - Namespace: testNamespace, - }, cm) - assert.NoError(t, err) - - // Verify tracking method is set correctly - assert.Equal(t, "annotation", cm.Data["application.resourceTrackingMethod"]) - assert.Equal(t, "annotation", cm.Data["resource.tracking.method"]) - - // Verify annotations are set directly as key-value pairs - for key, expectedValue := range annotations { - assert.Equal(t, expectedValue, cm.Data[key], - "Annotation %s should have value %s", key, expectedValue) - } - - // Verify resource.tracking.annotations doesn't exist - _, hasTrackingAnnotations := cm.Data["resource.tracking.annotations"] - assert.False(t, hasTrackingAnnotations, - "resource.tracking.annotations should not exist in ConfigMap") + // Verify second instance's installationID + assert.Equal(t, "instance-2", cm2.Data[common.ArgoCDKeyInstallationID]) } diff --git a/tests/k8s/1-046_validate_application_tracking/01-assert.yaml b/tests/k8s/1-046_validate_application_tracking/01-assert.yaml index e46a70aa6..6f8138949 100644 --- a/tests/k8s/1-046_validate_application_tracking/01-assert.yaml +++ b/tests/k8s/1-046_validate_application_tracking/01-assert.yaml @@ -28,7 +28,7 @@ metadata: namespace: test-1-046-argocd-1 data: installationID: "instance-1" - resource.tracking.method: "annotation" + application.resourceTrackingMethod: "annotation" --- # Check second ArgoCD ConfigMap apiVersion: v1 @@ -38,7 +38,7 @@ metadata: namespace: test-1-046-argocd-2 data: installationID: "instance-2" - resource.tracking.method: "annotation" + application.resourceTrackingMethod: "annotation" --- # Check first namespace apiVersion: v1 diff --git a/tests/k8s/1-046_validate_application_tracking/01-install.yaml b/tests/k8s/1-046_validate_application_tracking/01-install.yaml index ca77d1ba3..14c861665 100644 --- a/tests/k8s/1-046_validate_application_tracking/01-install.yaml +++ b/tests/k8s/1-046_validate_application_tracking/01-install.yaml @@ -25,8 +25,7 @@ metadata: name: argocd-1 namespace: test-1-046-argocd-1 spec: - applicationTrackingAnnotations: - installationID: instance-1 + installationID: "instance-1" resourceTrackingMethod: "annotation" --- # Second ArgoCD instance @@ -36,6 +35,5 @@ metadata: name: argocd-2 namespace: test-1-046-argocd-2 spec: - applicationTrackingAnnotations: - installationID: instance-2 + installationID: "instance-2" resourceTrackingMethod: "annotation" From 4f3eaf25207803ef3ed40b3fbde908c6d175519f Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Mon, 3 Feb 2025 23:58:41 -0500 Subject: [PATCH 09/11] Fix bundle generation and update manifests for ApplicationTrackingAnnotations Signed-off-by: Atif Ali --- ...argocd-operator.clusterserviceversion.yaml | 36 +++++++++++++------ bundle/manifests/argoproj.io_argocds.yaml | 28 +++++++++------ ...argocd-operator.clusterserviceversion.yaml | 34 ++++++++++++------ ...perator.v0.14.0.clusterserviceversion.yaml | 36 +++++++++++++------ .../0.14.0/argoproj.io_argocds.yaml | 28 +++++++++------ 5 files changed, 110 insertions(+), 52 deletions(-) diff --git a/bundle/manifests/argocd-operator.clusterserviceversion.yaml b/bundle/manifests/argocd-operator.clusterserviceversion.yaml index c82bf3b1f..18a900ef3 100644 --- a/bundle/manifests/argocd-operator.clusterserviceversion.yaml +++ b/bundle/manifests/argocd-operator.clusterserviceversion.yaml @@ -247,7 +247,7 @@ metadata: capabilities: Deep Insights categories: Integration & Delivery certified: "false" - createdAt: "2025-01-13T22:32:02Z" + createdAt: "2025-02-04T04:54:25Z" description: Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. operators.operatorframework.io/builder: operator-sdk-v1.35.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 @@ -441,11 +441,11 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of annotations - that will be used to support multiple ArgoCD instances managing the same - cluster resources. For example: applicationTrackingAnnotations: installationID: - "my-unique-id" otherAnnotation: "value" These annotations will be added - to the argocd-cm ConfigMap.' + - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap + keys that will be used to support advanced resource tracking scenarios, + such as custom tracking formats. For example: applicationTrackingAnnotations: + resource.tracking.format: "custom-format" otherKey: "value" These keys will + be added to the argocd-cm ConfigMap.' displayName: Application Tracking Annotations path: applicationTrackingAnnotations x-descriptors: @@ -621,6 +621,13 @@ spec: x-descriptors: - urn:alm:descriptor:com.tectonic.ui:text - urn:alm:descriptor:com.tectonic.ui:advanced + - description: InstallationID uniquely identifies an Argo CD instance in multi-instance + clusters. + displayName: Installation ID + path: installationID + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: KustomizeVersions is a listing of configured versions of Kustomize to be made available within ArgoCD. displayName: Kustomize Build Options' @@ -1061,11 +1068,11 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of annotations - that will be used to support multiple ArgoCD instances managing the same - cluster resources. For example: applicationTrackingAnnotations: installationID: - "my-unique-id" otherAnnotation: "value" These annotations will be added - to the argocd-cm ConfigMap.' + - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap + keys that will be used to support advanced resource tracking scenarios, + such as custom tracking formats. For example: applicationTrackingAnnotations: + resource.tracking.format: "custom-format" otherKey: "value" These keys will + be added to the argocd-cm ConfigMap.' displayName: Application Tracking Annotations path: applicationTrackingAnnotations x-descriptors: @@ -1209,6 +1216,13 @@ spec: x-descriptors: - urn:alm:descriptor:com.tectonic.ui:text - urn:alm:descriptor:com.tectonic.ui:advanced + - description: InstallationID uniquely identifies an Argo CD instance in multi-instance + clusters. + displayName: Installation ID + path: installationID + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: KustomizeVersions is a listing of configured versions of Kustomize to be made available within ArgoCD. displayName: Kustomize Build Options' diff --git a/bundle/manifests/argoproj.io_argocds.yaml b/bundle/manifests/argoproj.io_argocds.yaml index 42cd37aa2..2f8a3777e 100644 --- a/bundle/manifests/argoproj.io_argocds.yaml +++ b/bundle/manifests/argoproj.io_argocds.yaml @@ -435,12 +435,12 @@ spec: additionalProperties: type: string description: |- - ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple - ArgoCD instances managing the same cluster resources. For example: + ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support + advanced resource tracking scenarios, such as custom tracking formats. For example: applicationTrackingAnnotations: - installationID: "my-unique-id" - otherAnnotation: "value" - These annotations will be added to the argocd-cm ConfigMap. + resource.tracking.format: "custom-format" + otherKey: "value" + These keys will be added to the argocd-cm ConfigMap. type: object banner: description: Banner defines an additional banner to be displayed in @@ -1177,6 +1177,10 @@ spec: have included in your ArgoCD server. type: string type: object + installationID: + description: InstallationID uniquely identifies an Argo CD instance + in multi-instance clusters. + type: string kustomizeBuildOptions: description: KustomizeBuildOptions is used to specify build options/parameters to use with `kustomize build`. @@ -9411,12 +9415,12 @@ spec: additionalProperties: type: string description: |- - ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple - ArgoCD instances managing the same cluster resources. For example: + ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support + advanced resource tracking scenarios, such as custom tracking formats. For example: applicationTrackingAnnotations: - installationID: "my-unique-id" - otherAnnotation: "value" - These annotations will be added to the argocd-cm ConfigMap. + resource.tracking.format: "custom-format" + otherKey: "value" + These keys will be added to the argocd-cm ConfigMap. type: object banner: description: Banner defines an additional banner to be displayed in @@ -14393,6 +14397,10 @@ spec: have included in your ArgoCD server. type: string type: object + installationID: + description: InstallationID uniquely identifies an Argo CD instance + in multi-instance clusters. + type: string kustomizeBuildOptions: description: KustomizeBuildOptions is used to specify build options/parameters to use with `kustomize build`. diff --git a/config/manifests/bases/argocd-operator.clusterserviceversion.yaml b/config/manifests/bases/argocd-operator.clusterserviceversion.yaml index b9b4c02c2..3a93eae59 100644 --- a/config/manifests/bases/argocd-operator.clusterserviceversion.yaml +++ b/config/manifests/bases/argocd-operator.clusterserviceversion.yaml @@ -289,11 +289,11 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of annotations - that will be used to support multiple ArgoCD instances managing the same - cluster resources. For example: applicationTrackingAnnotations: installationID: - "my-unique-id" otherAnnotation: "value" These annotations will be added - to the argocd-cm ConfigMap.' + - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap + keys that will be used to support advanced resource tracking scenarios, + such as custom tracking formats. For example: applicationTrackingAnnotations: + resource.tracking.format: "custom-format" otherKey: "value" These keys will + be added to the argocd-cm ConfigMap.' displayName: Application Tracking Annotations path: applicationTrackingAnnotations x-descriptors: @@ -437,6 +437,13 @@ spec: x-descriptors: - urn:alm:descriptor:com.tectonic.ui:text - urn:alm:descriptor:com.tectonic.ui:advanced + - description: InstallationID uniquely identifies an Argo CD instance in multi-instance + clusters. + displayName: Installation ID + path: installationID + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: KustomizeVersions is a listing of configured versions of Kustomize to be made available within ArgoCD. displayName: Kustomize Build Options' @@ -868,11 +875,11 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of annotations - that will be used to support multiple ArgoCD instances managing the same - cluster resources. For example: applicationTrackingAnnotations: installationID: - "my-unique-id" otherAnnotation: "value" These annotations will be added - to the argocd-cm ConfigMap.' + - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap + keys that will be used to support advanced resource tracking scenarios, + such as custom tracking formats. For example: applicationTrackingAnnotations: + resource.tracking.format: "custom-format" otherKey: "value" These keys will + be added to the argocd-cm ConfigMap.' displayName: Application Tracking Annotations path: applicationTrackingAnnotations x-descriptors: @@ -1048,6 +1055,13 @@ spec: x-descriptors: - urn:alm:descriptor:com.tectonic.ui:text - urn:alm:descriptor:com.tectonic.ui:advanced + - description: InstallationID uniquely identifies an Argo CD instance in multi-instance + clusters. + displayName: Installation ID + path: installationID + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: KustomizeVersions is a listing of configured versions of Kustomize to be made available within ArgoCD. displayName: Kustomize Build Options' diff --git a/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml b/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml index c82bf3b1f..18a900ef3 100644 --- a/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml +++ b/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml @@ -247,7 +247,7 @@ metadata: capabilities: Deep Insights categories: Integration & Delivery certified: "false" - createdAt: "2025-01-13T22:32:02Z" + createdAt: "2025-02-04T04:54:25Z" description: Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. operators.operatorframework.io/builder: operator-sdk-v1.35.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 @@ -441,11 +441,11 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of annotations - that will be used to support multiple ArgoCD instances managing the same - cluster resources. For example: applicationTrackingAnnotations: installationID: - "my-unique-id" otherAnnotation: "value" These annotations will be added - to the argocd-cm ConfigMap.' + - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap + keys that will be used to support advanced resource tracking scenarios, + such as custom tracking formats. For example: applicationTrackingAnnotations: + resource.tracking.format: "custom-format" otherKey: "value" These keys will + be added to the argocd-cm ConfigMap.' displayName: Application Tracking Annotations path: applicationTrackingAnnotations x-descriptors: @@ -621,6 +621,13 @@ spec: x-descriptors: - urn:alm:descriptor:com.tectonic.ui:text - urn:alm:descriptor:com.tectonic.ui:advanced + - description: InstallationID uniquely identifies an Argo CD instance in multi-instance + clusters. + displayName: Installation ID + path: installationID + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: KustomizeVersions is a listing of configured versions of Kustomize to be made available within ArgoCD. displayName: Kustomize Build Options' @@ -1061,11 +1068,11 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of annotations - that will be used to support multiple ArgoCD instances managing the same - cluster resources. For example: applicationTrackingAnnotations: installationID: - "my-unique-id" otherAnnotation: "value" These annotations will be added - to the argocd-cm ConfigMap.' + - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap + keys that will be used to support advanced resource tracking scenarios, + such as custom tracking formats. For example: applicationTrackingAnnotations: + resource.tracking.format: "custom-format" otherKey: "value" These keys will + be added to the argocd-cm ConfigMap.' displayName: Application Tracking Annotations path: applicationTrackingAnnotations x-descriptors: @@ -1209,6 +1216,13 @@ spec: x-descriptors: - urn:alm:descriptor:com.tectonic.ui:text - urn:alm:descriptor:com.tectonic.ui:advanced + - description: InstallationID uniquely identifies an Argo CD instance in multi-instance + clusters. + displayName: Installation ID + path: installationID + x-descriptors: + - urn:alm:descriptor:com.tectonic.ui:text + - urn:alm:descriptor:com.tectonic.ui:advanced - description: KustomizeVersions is a listing of configured versions of Kustomize to be made available within ArgoCD. displayName: Kustomize Build Options' diff --git a/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml b/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml index 42cd37aa2..2f8a3777e 100644 --- a/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml +++ b/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml @@ -435,12 +435,12 @@ spec: additionalProperties: type: string description: |- - ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple - ArgoCD instances managing the same cluster resources. For example: + ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support + advanced resource tracking scenarios, such as custom tracking formats. For example: applicationTrackingAnnotations: - installationID: "my-unique-id" - otherAnnotation: "value" - These annotations will be added to the argocd-cm ConfigMap. + resource.tracking.format: "custom-format" + otherKey: "value" + These keys will be added to the argocd-cm ConfigMap. type: object banner: description: Banner defines an additional banner to be displayed in @@ -1177,6 +1177,10 @@ spec: have included in your ArgoCD server. type: string type: object + installationID: + description: InstallationID uniquely identifies an Argo CD instance + in multi-instance clusters. + type: string kustomizeBuildOptions: description: KustomizeBuildOptions is used to specify build options/parameters to use with `kustomize build`. @@ -9411,12 +9415,12 @@ spec: additionalProperties: type: string description: |- - ApplicationTrackingAnnotations defines a map of annotations that will be used to support multiple - ArgoCD instances managing the same cluster resources. For example: + ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support + advanced resource tracking scenarios, such as custom tracking formats. For example: applicationTrackingAnnotations: - installationID: "my-unique-id" - otherAnnotation: "value" - These annotations will be added to the argocd-cm ConfigMap. + resource.tracking.format: "custom-format" + otherKey: "value" + These keys will be added to the argocd-cm ConfigMap. type: object banner: description: Banner defines an additional banner to be displayed in @@ -14393,6 +14397,10 @@ spec: have included in your ArgoCD server. type: string type: object + installationID: + description: InstallationID uniquely identifies an Argo CD instance + in multi-instance clusters. + type: string kustomizeBuildOptions: description: KustomizeBuildOptions is used to specify build options/parameters to use with `kustomize build`. From 7b6d9b4302549b5549ebfe3da9348485bfb41527 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Tue, 4 Feb 2025 15:20:57 -0500 Subject: [PATCH 10/11] remove arbitrary keys in the argocd-cm configmap && Fix bundle generation Signed-off-by: Atif Ali --- api/v1alpha1/argocd_types.go | 10 --------- api/v1alpha1/zz_generated.deepcopy.go | 7 ------ api/v1beta1/argocd_types.go | 10 --------- api/v1beta1/zz_generated.deepcopy.go | 7 ------ ...argocd-operator.clusterserviceversion.yaml | 22 +------------------ bundle/manifests/argoproj.io_argocds.yaml | 22 ------------------- config/crd/bases/argoproj.io_argocds.yaml | 22 ------------------- ...argocd-operator.clusterserviceversion.yaml | 20 ----------------- controllers/argocd/configmap.go | 7 ------ ...perator.v0.14.0.clusterserviceversion.yaml | 22 +------------------ .../0.14.0/argoproj.io_argocds.yaml | 22 ------------------- 11 files changed, 2 insertions(+), 169 deletions(-) diff --git a/api/v1alpha1/argocd_types.go b/api/v1alpha1/argocd_types.go index 3a610473d..db94486b8 100644 --- a/api/v1alpha1/argocd_types.go +++ b/api/v1alpha1/argocd_types.go @@ -686,16 +686,6 @@ type ArgoCDSpec struct { //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Installation ID",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} InstallationID string `json:"installationID,omitempty"` - // ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support - // advanced resource tracking scenarios, such as custom tracking formats. For example: - // applicationTrackingAnnotations: - // resource.tracking.format: "custom-format" - // otherKey: "value" - // These keys will be added to the argocd-cm ConfigMap. - // +optional - // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Tracking Annotations",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} - ApplicationTrackingAnnotations map[string]string `json:"applicationTrackingAnnotations,omitempty"` - // ConfigManagementPlugins is used to specify additional config management plugins. //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Config Management Plugins'",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ConfigManagementPlugins string `json:"configManagementPlugins,omitempty"` diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index 2c279f4dd..b2c9c5ab2 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -893,13 +893,6 @@ func (in *ArgoCDSpec) DeepCopyInto(out *ArgoCDSpec) { *out = new(ArgoCDApplicationSet) (*in).DeepCopyInto(*out) } - if in.ApplicationTrackingAnnotations != nil { - in, out := &in.ApplicationTrackingAnnotations, &out.ApplicationTrackingAnnotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } in.Controller.DeepCopyInto(&out.Controller) if in.ExtraConfig != nil { in, out := &in.ExtraConfig, &out.ExtraConfig diff --git a/api/v1beta1/argocd_types.go b/api/v1beta1/argocd_types.go index 09a8fc988..ca0beb026 100644 --- a/api/v1beta1/argocd_types.go +++ b/api/v1beta1/argocd_types.go @@ -796,16 +796,6 @@ type ArgoCDSpec struct { //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Installation ID",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} InstallationID string `json:"installationID,omitempty"` - // ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support - // advanced resource tracking scenarios, such as custom tracking formats. For example: - // applicationTrackingAnnotations: - // resource.tracking.format: "custom-format" - // otherKey: "value" - // These keys will be added to the argocd-cm ConfigMap. - // +optional - // +operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Application Tracking Annotations",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} - ApplicationTrackingAnnotations map[string]string `json:"applicationTrackingAnnotations,omitempty"` - // ConfigManagementPlugins is used to specify additional config management plugins. //+operator-sdk:csv:customresourcedefinitions:type=spec,displayName="Config Management Plugins'",xDescriptors={"urn:alm:descriptor:com.tectonic.ui:text","urn:alm:descriptor:com.tectonic.ui:advanced"} ConfigManagementPlugins string `json:"configManagementPlugins,omitempty"` diff --git a/api/v1beta1/zz_generated.deepcopy.go b/api/v1beta1/zz_generated.deepcopy.go index cf6f244ae..567bca3c7 100644 --- a/api/v1beta1/zz_generated.deepcopy.go +++ b/api/v1beta1/zz_generated.deepcopy.go @@ -947,13 +947,6 @@ func (in *ArgoCDSpec) DeepCopyInto(out *ArgoCDSpec) { *out = new(ArgoCDApplicationSet) (*in).DeepCopyInto(*out) } - if in.ApplicationTrackingAnnotations != nil { - in, out := &in.ApplicationTrackingAnnotations, &out.ApplicationTrackingAnnotations - *out = make(map[string]string, len(*in)) - for key, val := range *in { - (*out)[key] = val - } - } in.Controller.DeepCopyInto(&out.Controller) if in.ExtraConfig != nil { in, out := &in.ExtraConfig, &out.ExtraConfig diff --git a/bundle/manifests/argocd-operator.clusterserviceversion.yaml b/bundle/manifests/argocd-operator.clusterserviceversion.yaml index 18a900ef3..4219ef241 100644 --- a/bundle/manifests/argocd-operator.clusterserviceversion.yaml +++ b/bundle/manifests/argocd-operator.clusterserviceversion.yaml @@ -247,7 +247,7 @@ metadata: capabilities: Deep Insights categories: Integration & Delivery certified: "false" - createdAt: "2025-02-04T04:54:25Z" + createdAt: "2025-02-04T20:13:23Z" description: Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. operators.operatorframework.io/builder: operator-sdk-v1.35.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 @@ -441,16 +441,6 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap - keys that will be used to support advanced resource tracking scenarios, - such as custom tracking formats. For example: applicationTrackingAnnotations: - resource.tracking.format: "custom-format" otherKey: "value" These keys will - be added to the argocd-cm ConfigMap.' - displayName: Application Tracking Annotations - path: applicationTrackingAnnotations - x-descriptors: - - urn:alm:descriptor:com.tectonic.ui:text - - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' @@ -1068,16 +1058,6 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap - keys that will be used to support advanced resource tracking scenarios, - such as custom tracking formats. For example: applicationTrackingAnnotations: - resource.tracking.format: "custom-format" otherKey: "value" These keys will - be added to the argocd-cm ConfigMap.' - displayName: Application Tracking Annotations - path: applicationTrackingAnnotations - x-descriptors: - - urn:alm:descriptor:com.tectonic.ui:text - - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' diff --git a/bundle/manifests/argoproj.io_argocds.yaml b/bundle/manifests/argoproj.io_argocds.yaml index 2f8a3777e..0f50fae94 100644 --- a/bundle/manifests/argoproj.io_argocds.yaml +++ b/bundle/manifests/argoproj.io_argocds.yaml @@ -431,17 +431,6 @@ spec: type: object type: object type: object - applicationTrackingAnnotations: - additionalProperties: - type: string - description: |- - ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support - advanced resource tracking scenarios, such as custom tracking formats. For example: - applicationTrackingAnnotations: - resource.tracking.format: "custom-format" - otherKey: "value" - These keys will be added to the argocd-cm ConfigMap. - type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI @@ -9411,17 +9400,6 @@ spec: type: object type: object type: object - applicationTrackingAnnotations: - additionalProperties: - type: string - description: |- - ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support - advanced resource tracking scenarios, such as custom tracking formats. For example: - applicationTrackingAnnotations: - resource.tracking.format: "custom-format" - otherKey: "value" - These keys will be added to the argocd-cm ConfigMap. - type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI diff --git a/config/crd/bases/argoproj.io_argocds.yaml b/config/crd/bases/argoproj.io_argocds.yaml index 765ea8c4d..930b394ed 100644 --- a/config/crd/bases/argoproj.io_argocds.yaml +++ b/config/crd/bases/argoproj.io_argocds.yaml @@ -420,17 +420,6 @@ spec: type: object type: object type: object - applicationTrackingAnnotations: - additionalProperties: - type: string - description: |- - ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support - advanced resource tracking scenarios, such as custom tracking formats. For example: - applicationTrackingAnnotations: - resource.tracking.format: "custom-format" - otherKey: "value" - These keys will be added to the argocd-cm ConfigMap. - type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI @@ -9400,17 +9389,6 @@ spec: type: object type: object type: object - applicationTrackingAnnotations: - additionalProperties: - type: string - description: |- - ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support - advanced resource tracking scenarios, such as custom tracking formats. For example: - applicationTrackingAnnotations: - resource.tracking.format: "custom-format" - otherKey: "value" - These keys will be added to the argocd-cm ConfigMap. - type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI diff --git a/config/manifests/bases/argocd-operator.clusterserviceversion.yaml b/config/manifests/bases/argocd-operator.clusterserviceversion.yaml index 3a93eae59..30885dd13 100644 --- a/config/manifests/bases/argocd-operator.clusterserviceversion.yaml +++ b/config/manifests/bases/argocd-operator.clusterserviceversion.yaml @@ -289,16 +289,6 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap - keys that will be used to support advanced resource tracking scenarios, - such as custom tracking formats. For example: applicationTrackingAnnotations: - resource.tracking.format: "custom-format" otherKey: "value" These keys will - be added to the argocd-cm ConfigMap.' - displayName: Application Tracking Annotations - path: applicationTrackingAnnotations - x-descriptors: - - urn:alm:descriptor:com.tectonic.ui:text - - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' @@ -875,16 +865,6 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap - keys that will be used to support advanced resource tracking scenarios, - such as custom tracking formats. For example: applicationTrackingAnnotations: - resource.tracking.format: "custom-format" otherKey: "value" These keys will - be added to the argocd-cm ConfigMap.' - displayName: Application Tracking Annotations - path: applicationTrackingAnnotations - x-descriptors: - - urn:alm:descriptor:com.tectonic.ui:text - - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' diff --git a/controllers/argocd/configmap.go b/controllers/argocd/configmap.go index f347ea400..960be3dbc 100644 --- a/controllers/argocd/configmap.go +++ b/controllers/argocd/configmap.go @@ -395,13 +395,6 @@ func (r *ReconcileArgoCD) reconcileArgoConfigMap(cr *argoproj.ArgoCD) error { cm.Data[common.ArgoCDKeyInstallationID] = cr.Spec.InstallationID } - // Set annotations from the map (for future use, e.g., resource.tracking.format) - if cr.Spec.ApplicationTrackingAnnotations != nil { - for key, value := range cr.Spec.ApplicationTrackingAnnotations { - cm.Data[key] = value - } - } - if len(cr.Spec.KustomizeVersions) > 0 { for _, kv := range cr.Spec.KustomizeVersions { cm.Data["kustomize.version."+kv.Version] = kv.Path diff --git a/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml b/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml index 18a900ef3..4219ef241 100644 --- a/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml +++ b/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml @@ -247,7 +247,7 @@ metadata: capabilities: Deep Insights categories: Integration & Delivery certified: "false" - createdAt: "2025-02-04T04:54:25Z" + createdAt: "2025-02-04T20:13:23Z" description: Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. operators.operatorframework.io/builder: operator-sdk-v1.35.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 @@ -441,16 +441,6 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap - keys that will be used to support advanced resource tracking scenarios, - such as custom tracking formats. For example: applicationTrackingAnnotations: - resource.tracking.format: "custom-format" otherKey: "value" These keys will - be added to the argocd-cm ConfigMap.' - displayName: Application Tracking Annotations - path: applicationTrackingAnnotations - x-descriptors: - - urn:alm:descriptor:com.tectonic.ui:text - - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' @@ -1068,16 +1058,6 @@ spec: - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Prometheus - urn:alm:descriptor:com.tectonic.ui:fieldGroup:Server - urn:alm:descriptor:com.tectonic.ui:booleanSwitch - - description: 'ApplicationTrackingAnnotations defines a map of additional ConfigMap - keys that will be used to support advanced resource tracking scenarios, - such as custom tracking formats. For example: applicationTrackingAnnotations: - resource.tracking.format: "custom-format" otherKey: "value" These keys will - be added to the argocd-cm ConfigMap.' - displayName: Application Tracking Annotations - path: applicationTrackingAnnotations - x-descriptors: - - urn:alm:descriptor:com.tectonic.ui:text - - urn:alm:descriptor:com.tectonic.ui:advanced - description: ConfigManagementPlugins is used to specify additional config management plugins. displayName: Config Management Plugins' diff --git a/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml b/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml index 2f8a3777e..0f50fae94 100644 --- a/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml +++ b/deploy/olm-catalog/argocd-operator/0.14.0/argoproj.io_argocds.yaml @@ -431,17 +431,6 @@ spec: type: object type: object type: object - applicationTrackingAnnotations: - additionalProperties: - type: string - description: |- - ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support - advanced resource tracking scenarios, such as custom tracking formats. For example: - applicationTrackingAnnotations: - resource.tracking.format: "custom-format" - otherKey: "value" - These keys will be added to the argocd-cm ConfigMap. - type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI @@ -9411,17 +9400,6 @@ spec: type: object type: object type: object - applicationTrackingAnnotations: - additionalProperties: - type: string - description: |- - ApplicationTrackingAnnotations defines a map of additional ConfigMap keys that will be used to support - advanced resource tracking scenarios, such as custom tracking formats. For example: - applicationTrackingAnnotations: - resource.tracking.format: "custom-format" - otherKey: "value" - These keys will be added to the argocd-cm ConfigMap. - type: object banner: description: Banner defines an additional banner to be displayed in Argo CD UI From 2f7fe299abe1d48f35887a062c834424d9f7a420 Mon Sep 17 00:00:00 2001 From: Atif Ali Date: Tue, 4 Feb 2025 16:19:39 -0500 Subject: [PATCH 11/11] cleanup Signed-off-by: Atif Ali --- .../manifests/argocd-operator.clusterserviceversion.yaml | 2 +- controllers/argocd/configmap.go | 9 --------- .../argocd-operator.v0.14.0.clusterserviceversion.yaml | 2 +- 3 files changed, 2 insertions(+), 11 deletions(-) diff --git a/bundle/manifests/argocd-operator.clusterserviceversion.yaml b/bundle/manifests/argocd-operator.clusterserviceversion.yaml index 4219ef241..a842c2502 100644 --- a/bundle/manifests/argocd-operator.clusterserviceversion.yaml +++ b/bundle/manifests/argocd-operator.clusterserviceversion.yaml @@ -247,7 +247,7 @@ metadata: capabilities: Deep Insights categories: Integration & Delivery certified: "false" - createdAt: "2025-02-04T20:13:23Z" + createdAt: "2025-02-04T21:18:01Z" description: Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. operators.operatorframework.io/builder: operator-sdk-v1.35.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4 diff --git a/controllers/argocd/configmap.go b/controllers/argocd/configmap.go index 960be3dbc..3fa867c36 100644 --- a/controllers/argocd/configmap.go +++ b/controllers/argocd/configmap.go @@ -780,12 +780,3 @@ func (r *ReconcileArgoCD) reconcileGPGKeysConfigMap(cr *argoproj.ArgoCD) error { argoutil.LogResourceCreation(log, cm) return r.Client.Create(context.TODO(), cm) } - -func validateApplicationTrackingAnnotations(annotations map[string]string) error { - if id, exists := annotations["installationID"]; exists { - if id == "" { - return fmt.Errorf("installationID cannot be empty") - } - } - return nil -} diff --git a/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml b/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml index 4219ef241..a842c2502 100644 --- a/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml +++ b/deploy/olm-catalog/argocd-operator/0.14.0/argocd-operator.v0.14.0.clusterserviceversion.yaml @@ -247,7 +247,7 @@ metadata: capabilities: Deep Insights categories: Integration & Delivery certified: "false" - createdAt: "2025-02-04T20:13:23Z" + createdAt: "2025-02-04T21:18:01Z" description: Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes. operators.operatorframework.io/builder: operator-sdk-v1.35.0 operators.operatorframework.io/project_layout: go.kubebuilder.io/v4