From 3f041eb4c6f60de9289e2160484b2c921e261715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Bavelier?= Date: Mon, 21 Oct 2024 15:06:19 +0200 Subject: [PATCH 1/4] Inject DCA, node Agent and DDA names in DCA --- .../feature/enabledefault/const.go | 12 +++++++ .../feature/enabledefault/feature.go | 12 +++++++ .../feature/enabledefault/utils.go | 36 +++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 internal/controller/datadogagent/feature/enabledefault/const.go create mode 100644 internal/controller/datadogagent/feature/enabledefault/utils.go diff --git a/internal/controller/datadogagent/feature/enabledefault/const.go b/internal/controller/datadogagent/feature/enabledefault/const.go new file mode 100644 index 000000000..3f8716514 --- /dev/null +++ b/internal/controller/datadogagent/feature/enabledefault/const.go @@ -0,0 +1,12 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package enabledefault + +const ( + DDAgentDaemonSet = "AGENT_DAEMONSET" + DDClusterAgentDeployment = "CLUSTER_AGENT_DEPLOYMENT" + DDDatadogAgentCustomResource = "DATADOG_AGENT_CR_NAME" +) diff --git a/internal/controller/datadogagent/feature/enabledefault/feature.go b/internal/controller/datadogagent/feature/enabledefault/feature.go index 61156d247..3ec5a14be 100644 --- a/internal/controller/datadogagent/feature/enabledefault/feature.go +++ b/internal/controller/datadogagent/feature/enabledefault/feature.go @@ -378,6 +378,18 @@ func (f *defaultFeature) ManageClusterAgent(managers feature.PodTemplateManagers Name: apicommon.DDClusterAgentServiceAccountName, Value: f.clusterAgent.serviceAccountName, }) + managers.EnvVar().AddEnvVar(&corev1.EnvVar{ + Name: DDAgentDaemonSet, + Value: getDaemonSetNameFromDatadogAgent(f.owner.(*v2alpha1.DatadogAgent)), + }) + managers.EnvVar().AddEnvVar(&corev1.EnvVar{ + Name: DDClusterAgentDeployment, + Value: getDeploymentNameFromDatadogAgent(f.owner.(*v2alpha1.DatadogAgent)), + }) + managers.EnvVar().AddEnvVar(&corev1.EnvVar{ + Name: DDDatadogAgentCustomResource, + Value: f.owner.GetName(), + }) return nil } diff --git a/internal/controller/datadogagent/feature/enabledefault/utils.go b/internal/controller/datadogagent/feature/enabledefault/utils.go new file mode 100644 index 000000000..779790cda --- /dev/null +++ b/internal/controller/datadogagent/feature/enabledefault/utils.go @@ -0,0 +1,36 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package enabledefault + +import ( + "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1" + componentagent "github.com/DataDog/datadog-operator/internal/controller/datadogagent/component/agent" + componentdca "github.com/DataDog/datadog-operator/internal/controller/datadogagent/component/clusteragent" +) + +// getDaemonSetNameFromDatadogAgent returns the expected node Agent DS/EDS name based on +// the DDA name and nodeAgent name override +func getDaemonSetNameFromDatadogAgent(dda *v2alpha1.DatadogAgent) string { + dsName := componentagent.GetAgentName(dda) + if componentOverride, ok := dda.Spec.Override[v2alpha1.NodeAgentComponentName]; ok { + if componentOverride.Name != nil && *componentOverride.Name != "" { + dsName = *componentOverride.Name + } + } + return dsName +} + +// getDeploymentNameFromDatadogAgent returns the expected Cluster Agent Deployment name based on +// the DDA name and clusterAgent name override +func getDeploymentNameFromDatadogAgent(dda *v2alpha1.DatadogAgent) string { + deployName := componentdca.GetClusterAgentName(dda) + if componentOverride, ok := dda.Spec.Override[v2alpha1.ClusterAgentComponentName]; ok { + if componentOverride.Name != nil && *componentOverride.Name != "" { + deployName = *componentOverride.Name + } + } + return deployName +} From 866006764a5078b810254fae690174000ebe6fd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Bavelier?= Date: Mon, 21 Oct 2024 15:44:46 +0200 Subject: [PATCH 2/4] Add DCA RBAC to query dd CR --- .../controller/datadogagent/feature/enabledefault/rbac.go | 8 ++++++++ pkg/kubernetes/rbac/const.go | 1 + 2 files changed, 9 insertions(+) diff --git a/internal/controller/datadogagent/feature/enabledefault/rbac.go b/internal/controller/datadogagent/feature/enabledefault/rbac.go index 1f9e6f432..ed4789c97 100644 --- a/internal/controller/datadogagent/feature/enabledefault/rbac.go +++ b/internal/controller/datadogagent/feature/enabledefault/rbac.go @@ -89,6 +89,14 @@ func getDefaultClusterAgentRolePolicyRules(dda metav1.Object) []rbacv1.PolicyRul }, Verbs: []string{rbac.GetVerb, rbac.UpdateVerb, rbac.CreateVerb}, }) + rules = append(rules, rbacv1.PolicyRule{ + APIGroups: []string{rbac.DatadogAPIGroup}, + Resources: []string{rbac.DatadogAgentsResource}, + ResourceNames: []string{ + dda.GetName(), + }, + Verbs: []string{rbac.GetVerb}, + }) return rules } diff --git a/pkg/kubernetes/rbac/const.go b/pkg/kubernetes/rbac/const.go index 4116f910d..43aa7b40e 100644 --- a/pkg/kubernetes/rbac/const.go +++ b/pkg/kubernetes/rbac/const.go @@ -43,6 +43,7 @@ const ( CronjobsResource = "cronjobs" CustomResourceDefinitionsResource = "customresourcedefinitions" DaemonsetsResource = "daemonsets" + DatadogAgentsResource = "datadogagents" DatadogMetricsResource = "datadogmetrics" DatadogMetricsStatusResource = "datadogmetrics/status" DatadogPodAutoscalersResource = "datadogpodautoscalers" From 1f7982586a2caba142b015425bbf946ab532f3e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Bavelier?= Date: Tue, 22 Oct 2024 10:51:45 +0200 Subject: [PATCH 3/4] Add utils test --- .../feature/enabledefault/utils_test.go | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 internal/controller/datadogagent/feature/enabledefault/utils_test.go diff --git a/internal/controller/datadogagent/feature/enabledefault/utils_test.go b/internal/controller/datadogagent/feature/enabledefault/utils_test.go new file mode 100644 index 000000000..99495cd82 --- /dev/null +++ b/internal/controller/datadogagent/feature/enabledefault/utils_test.go @@ -0,0 +1,84 @@ +// Unless explicitly stated otherwise all files in this repository are licensed +// under the Apache License Version 2.0. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2016-present Datadog, Inc. + +package enabledefault + +import ( + "testing" + + "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1" + v2alpha1test "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1/test" + "github.com/stretchr/testify/assert" +) + +func Test_getDaemonSetNameFromDatadogAgent(t *testing.T) { + tests := []struct { + name string + ddaName string + overrideAgentName string + expectedName string + }{ + { + name: "No override", + ddaName: "foo", + overrideAgentName: "", + expectedName: "foo-agent", + }, + { + name: "With override", + ddaName: "bar", + overrideAgentName: "node", + expectedName: "node", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + dda := v2alpha1test.NewDatadogAgentBuilder(). + WithName(tt.ddaName). + WithComponentOverride(v2alpha1.NodeAgentComponentName, v2alpha1.DatadogAgentComponentOverride{ + Name: &tt.overrideAgentName, + }). + Build() + dsName := getDaemonSetNameFromDatadogAgent(dda) + assert.Equal(t, tt.expectedName, dsName) + }) + } +} + +func Test_getDeploymentNameFromDatadogAgent(t *testing.T) { + tests := []struct { + name string + ddaName string + overrideClusterAgentName string + expectedName string + }{ + { + name: "No override", + ddaName: "foo", + overrideClusterAgentName: "", + expectedName: "foo-cluster-agent", + }, + { + name: "With override", + ddaName: "bar", + overrideClusterAgentName: "dca", + expectedName: "dca", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + dda := v2alpha1test.NewDatadogAgentBuilder(). + WithName(tt.ddaName). + WithComponentOverride(v2alpha1.ClusterAgentComponentName, v2alpha1.DatadogAgentComponentOverride{ + Name: &tt.overrideClusterAgentName, + }). + Build() + deployName := getDeploymentNameFromDatadogAgent(dda) + assert.Equal(t, tt.expectedName, deployName) + }) + } +} From c17311a4713ddef849d180504e0abd2eb7475bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Bavelier?= Date: Wed, 30 Oct 2024 15:47:07 +0100 Subject: [PATCH 4/4] Change datadog_agent_cr_name to datadogagent_cr_name --- internal/controller/datadogagent/feature/enabledefault/const.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/controller/datadogagent/feature/enabledefault/const.go b/internal/controller/datadogagent/feature/enabledefault/const.go index 3f8716514..439ffd3b0 100644 --- a/internal/controller/datadogagent/feature/enabledefault/const.go +++ b/internal/controller/datadogagent/feature/enabledefault/const.go @@ -8,5 +8,5 @@ package enabledefault const ( DDAgentDaemonSet = "AGENT_DAEMONSET" DDClusterAgentDeployment = "CLUSTER_AGENT_DEPLOYMENT" - DDDatadogAgentCustomResource = "DATADOG_AGENT_CR_NAME" + DDDatadogAgentCustomResource = "DATADOGAGENT_CR_NAME" )