Skip to content

Commit

Permalink
add unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
adel121 committed Mar 6, 2025
1 parent 7c7986b commit eb8ffec
Show file tree
Hide file tree
Showing 2 changed files with 199 additions and 71 deletions.
266 changes: 196 additions & 70 deletions pkg/clusteragent/admission/mutate/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"strings"
"testing"

"github.com/aws/smithy-go/ptr"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/fx"
Expand Down Expand Up @@ -313,92 +314,217 @@ func TestInjectExternalDataEnvVar(t *testing.T) {
}

func TestInjectSocket(t *testing.T) {
pod := mutatecommon.FakePodWithContainer("foo-pod", corev1.Container{})
pod = mutatecommon.WithLabels(pod, map[string]string{"admission.datadoghq.com/enabled": "true", "admission.datadoghq.com/config.mode": "socket"})
wmeta := fxutil.Test[workloadmeta.Component](t, core.MockBundle(), workloadmetafxmock.MockModule(workloadmeta.NewParams()))
datadogConfig := fxutil.Test[config.Component](t, core.MockBundle())
filter, err := NewFilter(datadogConfig)
require.NoError(t, err)
mutator := NewMutator(NewMutatorConfig(datadogConfig), filter)
webhook := NewWebhook(wmeta, datadogConfig, mutator)
injected, err := webhook.inject(pod, "", nil)
assert.Nil(t, err)
assert.True(t, injected)

assert.Contains(t, pod.Spec.Containers[0].Env, mutatecommon.FakeEnvWithValue("DD_TRACE_AGENT_URL", "unix:///var/run/datadog/apm.socket"))
assert.Contains(t, pod.Spec.Containers[0].Env, mutatecommon.FakeEnvWithValue("DD_DOGSTATSD_URL", "unix:///var/run/datadog/dsd.socket"))
assert.Equal(t, pod.Spec.Containers[0].VolumeMounts[0].MountPath, "/var/run/datadog")
assert.Equal(t, pod.Spec.Containers[0].VolumeMounts[0].Name, "datadog")
assert.Equal(t, pod.Spec.Containers[0].VolumeMounts[0].ReadOnly, true)
assert.Equal(t, pod.Spec.Volumes[0].Name, "datadog")
assert.Equal(t, pod.Spec.Volumes[0].VolumeSource.HostPath.Path, "/var/run/datadog")
assert.Equal(t, *pod.Spec.Volumes[0].VolumeSource.HostPath.Type, corev1.HostPathDirectoryOrCreate)
assert.Equal(t, "datadog", pod.Annotations[mutatecommon.K8sAutoscalerSafeToEvictVolumesAnnotation])
}

func TestInjectSocket_VolumeTypeSocket(t *testing.T) {
pod := mutatecommon.FakePodWithContainer("foo-pod", corev1.Container{})
pod = mutatecommon.WithLabels(pod, map[string]string{"admission.datadoghq.com/enabled": "true", "admission.datadoghq.com/config.mode": "socket"})
wmeta := fxutil.Test[workloadmeta.Component](
t,
core.MockBundle(),
workloadmetafxmock.MockModule(workloadmeta.NewParams()),
fx.Replace(config.MockParams{
Overrides: map[string]interface{}{"admission_controller.inject_config.type_socket_volumes": true},
}),
)
datadogConfig := fxutil.Test[config.Component](t, core.MockBundle())
filter, err := NewFilter(datadogConfig)
require.NoError(t, err)
mutator := NewMutator(NewMutatorConfig(datadogConfig), filter)
webhook := NewWebhook(wmeta, datadogConfig, mutator)
injected, err := webhook.inject(pod, "", nil)
assert.Nil(t, err)
assert.True(t, injected)

assert.Contains(t, pod.Spec.Containers[0].Env, mutatecommon.FakeEnvWithValue("DD_TRACE_AGENT_URL", "unix:///var/run/datadog/apm.socket"))
assert.Contains(t, pod.Spec.Containers[0].Env, mutatecommon.FakeEnvWithValue("DD_DOGSTATSD_URL", "unix:///var/run/datadog/dsd.socket"))

expectedVolumeMounts := []corev1.VolumeMount{
tests := []struct {
name string
withCSIDriver bool
expectedVolumeMounts []corev1.VolumeMount
expectedVolumes []corev1.Volume
}{
{
Name: "datadog-dogstatsd",
MountPath: "/var/run/datadog/dsd.socket",
ReadOnly: true,
name: "no csi driver",
withCSIDriver: false,
expectedVolumes: []corev1.Volume{
{
Name: "datadog",
VolumeSource: corev1.VolumeSource{
HostPath: &corev1.HostPathVolumeSource{
Path: "/var/run/datadog",
Type: pointer.Ptr(corev1.HostPathDirectoryOrCreate),
},
},
},
},
expectedVolumeMounts: []corev1.VolumeMount{
{
Name: "datadog",
MountPath: "/var/run/datadog",
ReadOnly: true,
},
},
},
{
Name: "datadog-trace-agent",
MountPath: "/var/run/datadog/apm.socket",
ReadOnly: true,
name: "with csi driver",
withCSIDriver: true,
expectedVolumes: []corev1.Volume{
{
Name: "datadog",
VolumeSource: corev1.VolumeSource{
CSI: &corev1.CSIVolumeSource{
Driver: "k8s.csi.datadoghq.com",
ReadOnly: ptr.Bool(true),
VolumeAttributes: map[string]string{
"path": "/var/run/datadog",
"mode": "local",
},
},
},
},
},
expectedVolumeMounts: []corev1.VolumeMount{
{
Name: "datadog",
MountPath: "/var/run/datadog",
ReadOnly: true,
},
},
},
}
assert.ElementsMatch(t, pod.Spec.Containers[0].VolumeMounts, expectedVolumeMounts)

expectedVolumes := []corev1.Volume{
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
pod := mutatecommon.FakePodWithContainer("foo-pod", corev1.Container{})
pod = mutatecommon.WithLabels(pod, map[string]string{"admission.datadoghq.com/enabled": "true", "admission.datadoghq.com/config.mode": "socket"})
wmeta := fxutil.Test[workloadmeta.Component](t, core.MockBundle(), workloadmetafxmock.MockModule(workloadmeta.NewParams()))
datadogConfig := fxutil.Test[config.Component](t, core.MockBundle(), fx.Replace(config.MockParams{
Overrides: map[string]interface{}{"csi.enabled": test.withCSIDriver},
}))
filter, err := NewFilter(datadogConfig)
require.NoError(t, err)
mutator := NewMutator(NewMutatorConfig(datadogConfig), filter)
webhook := NewWebhook(wmeta, datadogConfig, mutator)
injected, err := webhook.inject(pod, "", nil)
assert.Nil(t, err)
assert.True(t, injected)

assert.Contains(t, pod.Spec.Containers[0].Env, mutatecommon.FakeEnvWithValue("DD_TRACE_AGENT_URL", "unix:///var/run/datadog/apm.socket"))
assert.Contains(t, pod.Spec.Containers[0].Env, mutatecommon.FakeEnvWithValue("DD_DOGSTATSD_URL", "unix:///var/run/datadog/dsd.socket"))

assert.ElementsMatch(t, pod.Spec.Containers[0].VolumeMounts, test.expectedVolumeMounts)
assert.ElementsMatch(t, pod.Spec.Volumes, test.expectedVolumes)

assert.Equal(t, "datadog", pod.Annotations[mutatecommon.K8sAutoscalerSafeToEvictVolumesAnnotation])
})
}
}

func TestInjectSocket_VolumeTypeSocket(t *testing.T) {

tests := []struct {
name string
withCSIDriver bool
expectedVolumeMounts []corev1.VolumeMount
expectedVolumes []corev1.Volume
}{
{
Name: "datadog-dogstatsd",
VolumeSource: corev1.VolumeSource{
HostPath: &corev1.HostPathVolumeSource{
Path: "/var/run/datadog/dsd.socket",
Type: pointer.Ptr(corev1.HostPathSocket),
name: "no csi driver",
withCSIDriver: false,
expectedVolumes: []corev1.Volume{
{
Name: "datadog-dogstatsd",
VolumeSource: corev1.VolumeSource{
HostPath: &corev1.HostPathVolumeSource{
Path: "/var/run/datadog/dsd.socket",
Type: pointer.Ptr(corev1.HostPathSocket),
},
},
},
{
Name: "datadog-trace-agent",
VolumeSource: corev1.VolumeSource{
HostPath: &corev1.HostPathVolumeSource{
Path: "/var/run/datadog/apm.socket",
Type: pointer.Ptr(corev1.HostPathSocket),
},
},
},
},
expectedVolumeMounts: []corev1.VolumeMount{
{
Name: "datadog-dogstatsd",
MountPath: "/var/run/datadog/dsd.socket",
ReadOnly: true,
},
{
Name: "datadog-trace-agent",
MountPath: "/var/run/datadog/apm.socket",
ReadOnly: true,
},
},
},
{
Name: "datadog-trace-agent",
VolumeSource: corev1.VolumeSource{
HostPath: &corev1.HostPathVolumeSource{
Path: "/var/run/datadog/apm.socket",
Type: pointer.Ptr(corev1.HostPathSocket),
name: "with csi driver",
withCSIDriver: true,
expectedVolumes: []corev1.Volume{
{
Name: "datadog-dogstatsd",

VolumeSource: corev1.VolumeSource{
CSI: &corev1.CSIVolumeSource{
Driver: "k8s.csi.datadoghq.com",
ReadOnly: ptr.Bool(true),
VolumeAttributes: map[string]string{
"path": "/var/run/datadog/dsd.socket",
"mode": "socket",
},
},
},
},
{
Name: "datadog-trace-agent",
VolumeSource: corev1.VolumeSource{
CSI: &corev1.CSIVolumeSource{
Driver: "k8s.csi.datadoghq.com",
ReadOnly: ptr.Bool(true),
VolumeAttributes: map[string]string{
"path": "/var/run/datadog/apm.socket",
"mode": "socket",
},
},
},
},
},
expectedVolumeMounts: []corev1.VolumeMount{
{
Name: "datadog-dogstatsd",
MountPath: "/var/run/datadog/dsd.socket",
ReadOnly: true,
},
{
Name: "datadog-trace-agent",
MountPath: "/var/run/datadog/apm.socket",
ReadOnly: true,
},
},
},
}
assert.ElementsMatch(t, pod.Spec.Volumes, expectedVolumes)

safeToEvictVolumes := strings.Split(pod.Annotations[mutatecommon.K8sAutoscalerSafeToEvictVolumesAnnotation], ",")
assert.Len(t, safeToEvictVolumes, 2)
assert.Contains(t, safeToEvictVolumes, "datadog-dogstatsd")
assert.Contains(t, safeToEvictVolumes, "datadog-trace-agent")
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
pod := mutatecommon.FakePodWithContainer("foo-pod", corev1.Container{})
pod = mutatecommon.WithLabels(pod, map[string]string{"admission.datadoghq.com/enabled": "true", "admission.datadoghq.com/config.mode": "socket"})
wmeta := fxutil.Test[workloadmeta.Component](
t,
core.MockBundle(),
workloadmetafxmock.MockModule(workloadmeta.NewParams()),
fx.Replace(config.MockParams{
Overrides: map[string]interface{}{"admission_controller.inject_config.type_socket_volumes": true},
}),
)
datadogConfig := fxutil.Test[config.Component](t, core.MockBundle(), fx.Replace(config.MockParams{
Overrides: map[string]interface{}{"csi.enabled": test.withCSIDriver},
}))
filter, err := NewFilter(datadogConfig)
require.NoError(t, err)
mutator := NewMutator(NewMutatorConfig(datadogConfig), filter)
webhook := NewWebhook(wmeta, datadogConfig, mutator)
injected, err := webhook.inject(pod, "", nil)
assert.Nil(t, err)
assert.True(t, injected)

assert.Contains(t, pod.Spec.Containers[0].Env, mutatecommon.FakeEnvWithValue("DD_TRACE_AGENT_URL", "unix:///var/run/datadog/apm.socket"))
assert.Contains(t, pod.Spec.Containers[0].Env, mutatecommon.FakeEnvWithValue("DD_DOGSTATSD_URL", "unix:///var/run/datadog/dsd.socket"))

assert.ElementsMatch(t, pod.Spec.Containers[0].VolumeMounts, test.expectedVolumeMounts)
assert.ElementsMatch(t, pod.Spec.Volumes, test.expectedVolumes)

safeToEvictVolumes := strings.Split(pod.Annotations[mutatecommon.K8sAutoscalerSafeToEvictVolumesAnnotation], ",")
assert.Len(t, safeToEvictVolumes, 2)
assert.Contains(t, safeToEvictVolumes, "datadog-dogstatsd")
assert.Contains(t, safeToEvictVolumes, "datadog-trace-agent")

})
}

}

func TestInjectSocketWithConflictingVolumeAndInitContainer(t *testing.T) {
Expand Down
4 changes: 3 additions & 1 deletion pkg/clusteragent/admission/mutate/config/mutator.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import (
corev1 "k8s.io/api/core/v1"
"k8s.io/client-go/dynamic"

"github.com/aws/smithy-go/ptr"

"github.com/DataDog/datadog-agent/comp/core/config"
"github.com/DataDog/datadog-agent/pkg/clusteragent/admission/common"
"github.com/DataDog/datadog-agent/pkg/clusteragent/admission/metrics"
Expand Down Expand Up @@ -269,7 +271,7 @@ func buildCSIVolume(volumeName, path string, injectionMode csiInjectionMode, rea
VolumeSource: corev1.VolumeSource{
CSI: &corev1.CSIVolumeSource{
Driver: csiDriver,
ReadOnly: &readOnly,
ReadOnly: ptr.Bool(readOnly),
VolumeAttributes: map[string]string{
"mode": string(injectionMode),
"path": path,
Expand Down

0 comments on commit eb8ffec

Please sign in to comment.