Skip to content

Commit 57c4cd8

Browse files
authored
feat: Add configurable namespace support for ArgoCD agent addon (#135)
Add OperatorNamespace and AgentNamespace fields to ArgoCDAgentAddonSpec to allow customization of namespaces on managed clusters. This fixes the issue where customizing namespaces in Helm values didn't properly propagate to the managed cluster deployment. Signed-off-by: Mike Ng <[email protected]>
1 parent 4c0cdb5 commit 57c4cd8

File tree

15 files changed

+198
-67
lines changed

15 files changed

+198
-67
lines changed

Makefile

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -230,20 +230,26 @@ test-e2e-custom-namespace: manifests generate fmt vet ## Run e2e test with custo
230230
--namespace notargocd \
231231
--create-namespace \
232232
--set global.argoCDNamespace=notargocd \
233-
--set global.argoCDOperatorNamespace=argocd-operator-system \
233+
--set global.argoCDOperatorNamespace=notargocd-operator-system \
234234
--set controller.namespace=notargocd \
235235
--set gitOpsCluster.namespace=notargocd \
236+
--set gitOpsCluster.argoCDAgentAddon.agentNamespace=argocdnot \
237+
--set gitOpsCluster.argoCDAgentAddon.operatorNamespace=argocdnot-operator-system \
236238
--set image=quay.io/open-cluster-management/argocd-pull-integration \
237239
--set tag=latest \
238240
--wait \
239241
--timeout 10m
240242
@echo ""
241243
@echo "===== Running e2e tests with custom namespaces ====="
242-
HUB_ARGOCD_NAMESPACE=notargocd go test -tags=e2e ./test/e2e/ -v -ginkgo.v --ginkgo.label-filter="custom-namespace"
244+
HUB_ARGOCD_NAMESPACE=notargocd \
245+
HUB_ARGOCD_OPERATOR_NAMESPACE=notargocd-operator-system \
246+
SPOKE_ARGOCD_NAMESPACE=argocdnot \
247+
SPOKE_ARGOCD_OPERATOR_NAMESPACE=argocdnot-operator-system \
248+
go test -tags=e2e ./test/e2e/ -v -ginkgo.v --ginkgo.label-filter="custom-namespace"
243249
@echo ""
244250
@echo "===== E2E Custom Namespace Tests Complete ====="
245-
@echo "Hub context: kind-$(HUB_CLUSTER) (ArgoCD in notargocd namespace)"
246-
@echo "Spoke context: kind-$(SPOKE_CLUSTER) (ArgoCD in notargocd namespace)"
251+
@echo "Hub context: kind-$(HUB_CLUSTER) (ArgoCD: notargocd, Operator: notargocd-operator-system)"
252+
@echo "Spoke context: kind-$(SPOKE_CLUSTER) (ArgoCD: argocdnot, Operator: argocdnot-operator-system)"
247253

248254
.PHONY: test-e2e-custom-namespace-full
249255
test-e2e-custom-namespace-full: ## Complete e2e test with custom namespaces (cluster setup + custom namespace deployment + tests)

api/v1alpha1/gitopscluster_types.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ type ArgoCDAgentAddonSpec struct {
5454
// AgentImage is the ArgoCD agent image to use
5555
// +optional
5656
AgentImage string `json:"agentImage,omitempty"`
57+
58+
// OperatorNamespace is the namespace where the ArgoCD operator will be deployed on the managed cluster
59+
// +optional
60+
OperatorNamespace string `json:"operatorNamespace,omitempty"`
61+
62+
// AgentNamespace is the namespace where the ArgoCD agent (ArgoCD CR) will be deployed on the managed cluster
63+
// +optional
64+
AgentNamespace string `json:"agentNamespace,omitempty"`
5765
}
5866

5967
// GitOpsClusterStatus defines the observed state of GitOpsCluster

charts/argocd-agent-addon/crds/apps.open-cluster-management.io_gitopsclusters.yaml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,21 @@ spec:
5353
agentImage:
5454
description: AgentImage is the ArgoCD agent image to use
5555
type: string
56+
agentNamespace:
57+
description: AgentNamespace is the namespace where the ArgoCD
58+
agent (ArgoCD CR) will be deployed on the managed cluster
59+
type: string
5660
mode:
5761
default: managed
5862
description: Mode defines the agent mode (managed or autonomous)
5963
type: string
6064
operatorImage:
6165
description: OperatorImage is the ArgoCD operator image to use
6266
type: string
67+
operatorNamespace:
68+
description: OperatorNamespace is the namespace where the ArgoCD
69+
operator will be deployed on the managed cluster
70+
type: string
6371
principalServerAddress:
6472
description: PrincipalServerAddress is the address of the ArgoCD
6573
principal server
@@ -68,9 +76,6 @@ spec:
6876
description: PrincipalServerPort is the port of the ArgoCD principal
6977
server
7078
type: string
71-
uninstall:
72-
description: Uninstall indicates whether to uninstall the addon
73-
type: boolean
7479
type: object
7580
placementRef:
7681
description: PlacementRef references a Placement resource to select

charts/argocd-agent-addon/templates/argocd-operator/operator.yaml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ apiVersion: v1
1111
kind: ServiceAccount
1212
metadata:
1313
name: argocd-operator-controller-manager
14-
namespace: argocd-operator-system
14+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
1515
---
1616
apiVersion: rbac.authorization.k8s.io/v1
1717
kind: Role
1818
metadata:
1919
name: argocd-operator-leader-election-role
20-
namespace: argocd-operator-system
20+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
2121
rules:
2222
- apiGroups:
2323
- ""
@@ -295,15 +295,15 @@ apiVersion: rbac.authorization.k8s.io/v1
295295
kind: RoleBinding
296296
metadata:
297297
name: argocd-operator-leader-election-rolebinding
298-
namespace: argocd-operator-system
298+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
299299
roleRef:
300300
apiGroup: rbac.authorization.k8s.io
301301
kind: Role
302302
name: argocd-operator-leader-election-role
303303
subjects:
304304
- kind: ServiceAccount
305305
name: argocd-operator-controller-manager
306-
namespace: argocd-operator-system
306+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
307307
---
308308
apiVersion: rbac.authorization.k8s.io/v1
309309
kind: ClusterRoleBinding
@@ -316,7 +316,7 @@ roleRef:
316316
subjects:
317317
- kind: ServiceAccount
318318
name: argocd-operator-controller-manager
319-
namespace: argocd-operator-system
319+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
320320
---
321321
apiVersion: rbac.authorization.k8s.io/v1
322322
kind: ClusterRoleBinding
@@ -329,7 +329,7 @@ roleRef:
329329
subjects:
330330
- kind: ServiceAccount
331331
name: argocd-operator-controller-manager
332-
namespace: argocd-operator-system
332+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
333333
---
334334
apiVersion: v1
335335
data:
@@ -348,15 +348,15 @@ data:
348348
kind: ConfigMap
349349
metadata:
350350
name: argocd-operator-manager-config
351-
namespace: argocd-operator-system
351+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
352352
---
353353
apiVersion: v1
354354
kind: Service
355355
metadata:
356356
labels:
357357
control-plane: argocd-operator
358358
name: argocd-operator-controller-manager-metrics-service
359-
namespace: argocd-operator-system
359+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
360360
spec:
361361
ports:
362362
- name: https
@@ -369,7 +369,7 @@ apiVersion: v1
369369
kind: Service
370370
metadata:
371371
name: argocd-operator-webhook-service
372-
namespace: argocd-operator-system
372+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
373373
spec:
374374
ports:
375375
- port: 443
@@ -384,7 +384,7 @@ metadata:
384384
labels:
385385
control-plane: argocd-operator
386386
name: argocd-operator-controller-manager
387-
namespace: argocd-operator-system
387+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
388388
spec:
389389
replicas: 1
390390
selector:

charts/argocd-agent-addon/templates/gitopscluster/gitopscluster.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,9 @@ spec:
1616
principalServerPort: {{ .Values.gitOpsCluster.principalServerPort | quote }}
1717
{{- end }}
1818
mode: {{ .Values.gitOpsCluster.mode }}
19+
{{- if .Values.gitOpsCluster.argoCDAgentAddon.agentNamespace }}
20+
agentNamespace: {{ .Values.gitOpsCluster.argoCDAgentAddon.agentNamespace }}
21+
{{- end }}
22+
{{- if .Values.gitOpsCluster.argoCDAgentAddon.operatorNamespace }}
23+
operatorNamespace: {{ .Values.gitOpsCluster.argoCDAgentAddon.operatorNamespace }}
24+
{{- end }}

charts/argocd-agent-addon/values.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ gitOpsCluster:
2727
principalServerAddress: ""
2828
principalServerPort: ""
2929
mode: managed
30+
argoCDAgentAddon:
31+
agentNamespace: ""
32+
operatorNamespace: ""
3033

3134
# Controller settings
3235
controller:

config/crd/bases/apps.open-cluster-management.io_gitopsclusters.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,21 @@ spec:
5353
agentImage:
5454
description: AgentImage is the ArgoCD agent image to use
5555
type: string
56+
agentNamespace:
57+
description: AgentNamespace is the namespace where the ArgoCD
58+
agent (ArgoCD CR) will be deployed on the managed cluster
59+
type: string
5660
mode:
5761
default: managed
5862
description: Mode defines the agent mode (managed or autonomous)
5963
type: string
6064
operatorImage:
6165
description: OperatorImage is the ArgoCD operator image to use
6266
type: string
67+
operatorNamespace:
68+
description: OperatorNamespace is the namespace where the ArgoCD
69+
operator will be deployed on the managed cluster
70+
type: string
6371
principalServerAddress:
6472
description: PrincipalServerAddress is the address of the ArgoCD
6573
principal server

internal/addon/addon_cleanup.go

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,6 @@ const (
3737
PauseMarkerName = "argocd-agent-addon-pause"
3838
)
3939

40-
// getNamespaceConfig returns namespace configuration from environment variables or defaults
41-
func getNamespaceConfig() (operatorNamespace, argoCDNamespace string) {
42-
operatorNamespace = os.Getenv("ARGOCD_OPERATOR_NAMESPACE")
43-
if operatorNamespace == "" {
44-
operatorNamespace = "argocd-operator-system"
45-
}
46-
47-
argoCDNamespace = os.Getenv("ARGOCD_NAMESPACE")
48-
if argoCDNamespace == "" {
49-
argoCDNamespace = "argocd"
50-
}
51-
52-
return operatorNamespace, argoCDNamespace
53-
}
54-
5540
// uninstallArgoCDAgent uninstalls the ArgoCD agent addon in reverse order
5641
// Does NOT delete namespaces, only deletes operator after ArgoCD CR is gone
5742
func (r *ArgoCDAgentAddonReconciler) uninstallArgoCDAgent(ctx context.Context) error {

internal/addon/addon_install.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package addon
1919
import (
2020
"context"
2121
"fmt"
22+
"os"
2223
"strings"
2324

2425
corev1 "k8s.io/api/core/v1"
@@ -29,6 +30,27 @@ import (
2930
"open-cluster-management.io/argocd-pull-integration/internal/pkg/images"
3031
)
3132

33+
const (
34+
// Default namespace constants
35+
operatorNamespace = "argocd-operator-system"
36+
argoCDNamespace = "argocd"
37+
)
38+
39+
// getNamespaceConfig returns namespace configuration from environment variables or defaults
40+
func getNamespaceConfig() (string, string) {
41+
opNamespace := os.Getenv("ARGOCD_OPERATOR_NAMESPACE")
42+
if opNamespace == "" {
43+
opNamespace = operatorNamespace
44+
}
45+
46+
agentNamespace := os.Getenv("ARGOCD_NAMESPACE")
47+
if agentNamespace == "" {
48+
agentNamespace = argoCDNamespace
49+
}
50+
51+
return opNamespace, agentNamespace
52+
}
53+
3254
// ensureNamespace creates a namespace if it doesn't exist
3355
func (r *ArgoCDAgentAddonReconciler) ensureNamespace(ctx context.Context, namespaceName string) error {
3456
namespace := &corev1.Namespace{}

internal/addon/charts/argocd-agent-addon/templates/operator.yaml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ apiVersion: v1
1111
kind: ServiceAccount
1212
metadata:
1313
name: argocd-operator-controller-manager
14-
namespace: argocd-operator-system
14+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
1515
---
1616
apiVersion: rbac.authorization.k8s.io/v1
1717
kind: Role
1818
metadata:
1919
name: argocd-operator-leader-election-role
20-
namespace: argocd-operator-system
20+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
2121
rules:
2222
- apiGroups:
2323
- ""
@@ -295,15 +295,15 @@ apiVersion: rbac.authorization.k8s.io/v1
295295
kind: RoleBinding
296296
metadata:
297297
name: argocd-operator-leader-election-rolebinding
298-
namespace: argocd-operator-system
298+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
299299
roleRef:
300300
apiGroup: rbac.authorization.k8s.io
301301
kind: Role
302302
name: argocd-operator-leader-election-role
303303
subjects:
304304
- kind: ServiceAccount
305305
name: argocd-operator-controller-manager
306-
namespace: argocd-operator-system
306+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
307307
---
308308
apiVersion: rbac.authorization.k8s.io/v1
309309
kind: ClusterRoleBinding
@@ -316,7 +316,7 @@ roleRef:
316316
subjects:
317317
- kind: ServiceAccount
318318
name: argocd-operator-controller-manager
319-
namespace: argocd-operator-system
319+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
320320
---
321321
apiVersion: rbac.authorization.k8s.io/v1
322322
kind: ClusterRoleBinding
@@ -329,7 +329,7 @@ roleRef:
329329
subjects:
330330
- kind: ServiceAccount
331331
name: argocd-operator-controller-manager
332-
namespace: argocd-operator-system
332+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
333333
---
334334
apiVersion: v1
335335
data:
@@ -348,15 +348,15 @@ data:
348348
kind: ConfigMap
349349
metadata:
350350
name: argocd-operator-manager-config
351-
namespace: argocd-operator-system
351+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
352352
---
353353
apiVersion: v1
354354
kind: Service
355355
metadata:
356356
labels:
357357
control-plane: argocd-operator
358358
name: argocd-operator-controller-manager-metrics-service
359-
namespace: argocd-operator-system
359+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
360360
spec:
361361
ports:
362362
- name: https
@@ -369,7 +369,7 @@ apiVersion: v1
369369
kind: Service
370370
metadata:
371371
name: argocd-operator-webhook-service
372-
namespace: argocd-operator-system
372+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
373373
spec:
374374
ports:
375375
- port: 443
@@ -384,7 +384,7 @@ metadata:
384384
labels:
385385
control-plane: argocd-operator
386386
name: argocd-operator-controller-manager
387-
namespace: argocd-operator-system
387+
namespace: {{ .Values.global.argoCDOperatorNamespace }}
388388
spec:
389389
replicas: 1
390390
selector:

0 commit comments

Comments
 (0)