From 4f178bab1aa4139132cca677a3121795c0110df2 Mon Sep 17 00:00:00 2001 From: Celene Date: Tue, 31 May 2022 22:04:31 -0400 Subject: [PATCH] add volumeMountManager (#509) --- controllers/datadogagent/clusteragent.go | 4 +- controllers/datadogagent/clusteragent_test.go | 1 + .../datadogagent/feature/cspm/feature.go | 24 ++-- .../datadogagent/feature/cspm/feature_test.go | 4 +- .../feature/fake/PodTemplateManagers.go | 7 ++ .../feature/kubernetesstatecore/feature.go | 3 +- .../feature/logcollection/feature.go | 12 +- .../feature/logcollection/feature_test.go | 20 +-- .../datadogagent/feature/npm/feature.go | 13 +- .../datadogagent/feature/npm/feature_test.go | 6 +- .../datadogagent/feature/oom_kill/feature.go | 6 +- .../feature/oom_kill/feature_test.go | 2 +- .../feature/tcp_queue_length/feature.go | 6 +- .../feature/tcp_queue_length/feature_test.go | 2 +- controllers/datadogagent/feature/types.go | 10 +- .../datadogagent/feature/usm/feature.go | 13 +- .../datadogagent/feature/usm/feature_test.go | 6 +- .../merger/fake/volume_manager.go | 68 +--------- .../merger/fake/volume_mount_manager.go | 78 ++++++++++++ controllers/datadogagent/merger/volume.go | 75 ++--------- .../datadogagent/merger/volume_mount.go | 119 ++++++++++++++++++ ...lumemount_test.go => volume_mount_test.go} | 2 +- .../datadogagent/merger/volumemount.go | 57 --------- 23 files changed, 304 insertions(+), 234 deletions(-) create mode 100644 controllers/datadogagent/merger/fake/volume_mount_manager.go create mode 100644 controllers/datadogagent/merger/volume_mount.go rename controllers/datadogagent/merger/{volumemount_test.go => volume_mount_test.go} (96%) delete mode 100644 controllers/datadogagent/merger/volumemount.go diff --git a/controllers/datadogagent/clusteragent.go b/controllers/datadogagent/clusteragent.go index 13e63e640..92a5d2a81 100644 --- a/controllers/datadogagent/clusteragent.go +++ b/controllers/datadogagent/clusteragent.go @@ -284,6 +284,7 @@ func newClusterAgentPodTemplate(logger logr.Logger, dda *datadoghqv1alpha1.Datad volumeMounts := []corev1.VolumeMount{} volumeManager := merger.NewVolumeManager(&newPodTemplate) + volumeMountManager := merger.NewVolumeMountManager(&newPodTemplate) // confd volumes configuration if dda.Spec.ClusterAgent.Config != nil && dda.Spec.ClusterAgent.Config.Confd != nil { @@ -312,7 +313,8 @@ func newClusterAgentPodTemplate(logger logr.Logger, dda *datadoghqv1alpha1.Datad Name: apicommon.ConfdVolumeName, VolumeSource: confdVolumeSource, } - volumeManager.AddVolume(&confdVolume, &confdVolumeMount) + volumeManager.AddVolume(&confdVolume) + volumeMountManager.AddVolumeMount(&confdVolumeMount) } if dda.Spec.ClusterAgent.CustomConfig != nil { diff --git a/controllers/datadogagent/clusteragent_test.go b/controllers/datadogagent/clusteragent_test.go index 77000caa2..b5fcae02b 100644 --- a/controllers/datadogagent/clusteragent_test.go +++ b/controllers/datadogagent/clusteragent_test.go @@ -540,6 +540,7 @@ func Test_newClusterAgentDeploymentMountKSMCore(t *testing.T) { KubeStateMetricsCore: &ksmCore, }, ) + testDCA := clusterAgentDeploymentFromInstanceTest{ name: "with KSM core check custom conf volumes and mounts", agentdeployment: clusterAgentDeployment, diff --git a/controllers/datadogagent/feature/cspm/feature.go b/controllers/datadogagent/feature/cspm/feature.go index 80cb11c2b..0fb060ad2 100644 --- a/controllers/datadogagent/feature/cspm/feature.go +++ b/controllers/datadogagent/feature/cspm/feature.go @@ -151,7 +151,8 @@ func (f *cspmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) e cspmConfigVolumeName, cspmConfigVolumePath, ) - managers.Volume().AddVolumeToContainer(&cmVol, &cmVolMount, apicommonv1.ClusterAgentContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&cmVolMount, apicommonv1.ClusterAgentContainerName) + managers.Volume().AddVolume(&cmVol) } enabledEnvVar := &corev1.EnvVar{ @@ -181,6 +182,9 @@ func (f *cspmFeature) ManageNodeAgent(managers feature.PodTemplateManagers) erro } managers.SecurityContext().AddCapabilitiesToContainer(capabilities, apicommonv1.SecurityAgentContainerName) + volMountMgr := managers.VolumeMount() + VolMgr := managers.Volume() + // configmap volume mount if f.configMapConfig != nil && f.configMapName != "" { cmVol, cmVolMount := volume.GetConfigMapVolumes( @@ -189,28 +193,34 @@ func (f *cspmFeature) ManageNodeAgent(managers feature.PodTemplateManagers) erro cspmConfigVolumeName, cspmConfigVolumePath, ) - managers.Volume().AddVolumeToContainer(&cmVol, &cmVolMount, apicommonv1.SecurityAgentContainerName) + volMountMgr.AddVolumeMountToContainer(&cmVolMount, apicommonv1.SecurityAgentContainerName) + VolMgr.AddVolume(&cmVol) } // cgroups volume mount cgroupsVol, cgroupsVolMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true) - managers.Volume().AddVolumeToContainer(&cgroupsVol, &cgroupsVolMount, apicommonv1.SecurityAgentContainerName) + volMountMgr.AddVolumeMountToContainer(&cgroupsVolMount, apicommonv1.SecurityAgentContainerName) + VolMgr.AddVolume(&cgroupsVol) // passwd volume mount passwdVol, passwdVolMount := volume.GetVolumes(apicommon.PasswdVolumeName, apicommon.PasswdHostPath, apicommon.PasswdMountPath, true) - managers.Volume().AddVolumeToContainer(&passwdVol, &passwdVolMount, apicommonv1.SecurityAgentContainerName) + volMountMgr.AddVolumeMountToContainer(&passwdVolMount, apicommonv1.SecurityAgentContainerName) + VolMgr.AddVolume(&passwdVol) // procdir volume mount procdirVol, procdirVolMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true) - managers.Volume().AddVolumeToContainer(&procdirVol, &procdirVolMount, apicommonv1.SecurityAgentContainerName) + volMountMgr.AddVolumeMountToContainer(&procdirVolMount, apicommonv1.SecurityAgentContainerName) + VolMgr.AddVolume(&procdirVol) // host root volume mount hostRootVol, hostRootVolMount := volume.GetVolumes(apicommon.HostRootVolumeName, apicommon.HostRootHostPath, apicommon.HostRootMountPath, true) - managers.Volume().AddVolumeToContainer(&hostRootVol, &hostRootVolMount, apicommonv1.SecurityAgentContainerName) + volMountMgr.AddVolumeMountToContainer(&hostRootVolMount, apicommonv1.SecurityAgentContainerName) + VolMgr.AddVolume(&hostRootVol) // group volume mount groupVol, groupVolMount := volume.GetVolumes(apicommon.GroupVolumeName, apicommon.GroupHostPath, apicommon.GroupMountPath, true) - managers.Volume().AddVolumeToContainer(&groupVol, &groupVolMount, apicommonv1.SecurityAgentContainerName) + volMountMgr.AddVolumeMountToContainer(&groupVolMount, apicommonv1.SecurityAgentContainerName) + VolMgr.AddVolume(&groupVol) // env vars enabledEnvVar := &corev1.EnvVar{ diff --git a/controllers/datadogagent/feature/cspm/feature_test.go b/controllers/datadogagent/feature/cspm/feature_test.go index d8c431b32..0b316c7cf 100644 --- a/controllers/datadogagent/feature/cspm/feature_test.go +++ b/controllers/datadogagent/feature/cspm/feature_test.go @@ -106,7 +106,7 @@ func Test_cspmFeature_Configure(t *testing.T) { }, } - volumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.ClusterAgentContainerName] + volumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.ClusterAgentContainerName] assert.True(t, apiutils.IsEqualStruct(volumeMounts, wantVolumeMounts), "Cluster Agent volume mounts \ndiff = %s", cmp.Diff(volumeMounts, wantVolumeMounts)) wantVolumes := []corev1.Volume{ @@ -180,7 +180,7 @@ func Test_cspmFeature_Configure(t *testing.T) { }, } - securityAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.SecurityAgentContainerName] + securityAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.SecurityAgentContainerName] assert.True(t, apiutils.IsEqualStruct(securityAgentVolumeMounts, wantVolumeMounts), "Security Agent volume mounts \ndiff = %s", cmp.Diff(securityAgentVolumeMounts, wantVolumeMounts)) // check volumes diff --git a/controllers/datadogagent/feature/fake/PodTemplateManagers.go b/controllers/datadogagent/feature/fake/PodTemplateManagers.go index cee1c36a8..d09cbc53f 100644 --- a/controllers/datadogagent/feature/fake/PodTemplateManagers.go +++ b/controllers/datadogagent/feature/fake/PodTemplateManagers.go @@ -14,6 +14,7 @@ type PodTemplateManagers struct { Tpl v1.PodTemplateSpec EnvVarMgr *mergerfake.EnvVarManager VolumeMgr *mergerfake.VolumeManager + VolumeMountMgr *mergerfake.VolumeMountManager SecurityContextMgr *mergerfake.SecurityContextManager AnnotationMgr *mergerfake.AnnotationManager } @@ -33,6 +34,11 @@ func (_m *PodTemplateManagers) Volume() merger.VolumeManager { return _m.VolumeMgr } +// VolumeMount provides a mock function with given fields: +func (_m *PodTemplateManagers) VolumeMount() merger.VolumeMountManager { + return _m.VolumeMountMgr +} + // SecurityContext provides a mock function with given fields: func (_m *PodTemplateManagers) SecurityContext() merger.SecurityContextManager { return _m.SecurityContextMgr @@ -48,6 +54,7 @@ func NewPodTemplateManagers(t testing.TB) *PodTemplateManagers { return &PodTemplateManagers{ EnvVarMgr: mergerfake.NewFakeEnvVarManager(t), VolumeMgr: mergerfake.NewFakeVolumeManager(t), + VolumeMountMgr: mergerfake.NewFakeVolumeMountManager(t), SecurityContextMgr: mergerfake.NewFakeSecurityContextManager(t), AnnotationMgr: mergerfake.NewFakeAnnotationManager(t), } diff --git a/controllers/datadogagent/feature/kubernetesstatecore/feature.go b/controllers/datadogagent/feature/kubernetesstatecore/feature.go index e9a97ef80..b0eb23b29 100644 --- a/controllers/datadogagent/feature/kubernetesstatecore/feature.go +++ b/controllers/datadogagent/feature/kubernetesstatecore/feature.go @@ -145,7 +145,8 @@ func (f *ksmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) er ksmCoreCheckFolderName, ) - managers.Volume().AddVolumeToContainer(&vol, &volMount, apicommonv1.ClusterAgentContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&volMount, apicommonv1.ClusterAgentContainerName) + managers.Volume().AddVolume(&vol) managers.EnvVar().AddEnvVar(&corev1.EnvVar{ Name: apicommon.DDKubeStateMetricsCoreEnabled, diff --git a/controllers/datadogagent/feature/logcollection/feature.go b/controllers/datadogagent/feature/logcollection/feature.go index 1add528c9..402e4cbc9 100644 --- a/controllers/datadogagent/feature/logcollection/feature.go +++ b/controllers/datadogagent/feature/logcollection/feature.go @@ -121,19 +121,23 @@ func (f *logCollectionFeature) ManageClusterAgent(managers feature.PodTemplateMa func (f *logCollectionFeature) ManageNodeAgent(managers feature.PodTemplateManagers) error { // pointerdir volume mount pointerVol, pointerVolMount := volume.GetVolumes(apicommon.PointerVolumeName, f.tempStoragePath, apicommon.PointerVolumePath, false) - managers.Volume().AddVolumeToContainer(&pointerVol, &pointerVolMount, apicommonv1.CoreAgentContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&pointerVolMount, apicommonv1.CoreAgentContainerName) + managers.Volume().AddVolume(&pointerVol) // pod logs volume mount podLogVol, podLogVolMount := volume.GetVolumes(apicommon.PodLogVolumeName, f.podLogsPath, f.podLogsPath, true) - managers.Volume().AddVolumeToContainer(&podLogVol, &podLogVolMount, apicommonv1.CoreAgentContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&podLogVolMount, apicommonv1.CoreAgentContainerName) + managers.Volume().AddVolume(&podLogVol) // container logs volume mount containerLogVol, containerLogVolMount := volume.GetVolumes(apicommon.ContainerLogVolumeName, f.containerLogsPath, f.containerLogsPath, true) - managers.Volume().AddVolumeToContainer(&containerLogVol, &containerLogVolMount, apicommonv1.CoreAgentContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&containerLogVolMount, apicommonv1.CoreAgentContainerName) + managers.Volume().AddVolume(&containerLogVol) // symlink volume mount symlinkVol, symlinkVolMount := volume.GetVolumes(apicommon.SymlinkContainerVolumeName, f.containerSymlinksPath, f.containerSymlinksPath, true) - managers.Volume().AddVolumeToContainer(&symlinkVol, &symlinkVolMount, apicommonv1.CoreAgentContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&symlinkVolMount, apicommonv1.CoreAgentContainerName) + managers.Volume().AddVolume(&symlinkVol) // envvars managers.EnvVar().AddEnvVarToContainer(apicommonv1.CoreAgentContainerName, &corev1.EnvVar{ diff --git a/controllers/datadogagent/feature/logcollection/feature_test.go b/controllers/datadogagent/feature/logcollection/feature_test.go index 79557143e..2242d4ab7 100644 --- a/controllers/datadogagent/feature/logcollection/feature_test.go +++ b/controllers/datadogagent/feature/logcollection/feature_test.go @@ -168,7 +168,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentVolumeMounts, wantVolumeMounts), "Volume mounts \ndiff = %s", cmp.Diff(coreAgentVolumeMounts, wantVolumeMounts)) volumes := mgr.VolumeMgr.Volumes assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes)) @@ -199,7 +199,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentVolumeMounts, wantVolumeMounts), "Volume mounts \ndiff = %s", cmp.Diff(coreAgentVolumeMounts, wantVolumeMounts)) volumes := mgr.VolumeMgr.Volumes assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes)) @@ -230,7 +230,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentVolumeMounts, wantVolumeMounts), "Volume mounts \ndiff = %s", cmp.Diff(coreAgentVolumeMounts, wantVolumeMounts)) volumes := mgr.VolumeMgr.Volumes assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes)) @@ -261,7 +261,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentVolumeMounts, wantVolumeMounts), "Volume mounts \ndiff = %s", cmp.Diff(coreAgentVolumeMounts, wantVolumeMounts)) volumes := mgr.VolumeMgr.Volumes assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes)) @@ -296,7 +296,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] wantCustomVolumeMounts := []corev1.VolumeMount{ { Name: apicommon.PointerVolumeName, @@ -391,7 +391,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentVolumeMounts, wantVolumeMounts), "Volume mounts \ndiff = %s", cmp.Diff(coreAgentVolumeMounts, wantVolumeMounts)) volumes := mgr.VolumeMgr.Volumes assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes)) @@ -422,7 +422,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentVolumeMounts, wantVolumeMounts), "Volume mounts \ndiff = %s", cmp.Diff(coreAgentVolumeMounts, wantVolumeMounts)) volumes := mgr.VolumeMgr.Volumes assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes)) @@ -453,7 +453,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentVolumeMounts, wantVolumeMounts), "Volume mounts \ndiff = %s", cmp.Diff(coreAgentVolumeMounts, wantVolumeMounts)) volumes := mgr.VolumeMgr.Volumes assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes)) @@ -484,7 +484,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentVolumeMounts, wantVolumeMounts), "Volume mounts \ndiff = %s", cmp.Diff(coreAgentVolumeMounts, wantVolumeMounts)) volumes := mgr.VolumeMgr.Volumes assert.True(t, apiutils.IsEqualStruct(volumes, wantVolumes), "Volumes \ndiff = %s", cmp.Diff(volumes, wantVolumes)) @@ -519,7 +519,7 @@ func Test_LogCollectionFeature_Configure(t *testing.T) { CreateFunc: createEmptyFakeManager, WantFunc: func(t testing.TB, mgrInterface feature.PodTemplateManagers) { mgr := mgrInterface.(*fake.PodTemplateManagers) - coreAgentVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] wantVolumeMounts := []corev1.VolumeMount{ { Name: apicommon.PointerVolumeName, diff --git a/controllers/datadogagent/feature/npm/feature.go b/controllers/datadogagent/feature/npm/feature.go index a9e398b88..eda711399 100644 --- a/controllers/datadogagent/feature/npm/feature.go +++ b/controllers/datadogagent/feature/npm/feature.go @@ -102,20 +102,23 @@ func (f *npmFeature) ManageNodeAgent(managers feature.PodTemplateManagers) error // procdir volume mount procdirVol, procdirVolMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true) - managers.Volume().AddVolumeToContainers(&procdirVol, &procdirVolMount, []apicommonv1.AgentContainerName{apicommonv1.ProcessAgentContainerName, apicommonv1.SystemProbeContainerName}) + managers.Volume().AddVolume(&procdirVol) + managers.VolumeMount().AddVolumeMountToContainers(&procdirVolMount, []apicommonv1.AgentContainerName{apicommonv1.ProcessAgentContainerName, apicommonv1.SystemProbeContainerName}) // cgroups volume mount cgroupsVol, cgroupsVolMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true) - managers.Volume().AddVolumeToContainers(&cgroupsVol, &cgroupsVolMount, []apicommonv1.AgentContainerName{apicommonv1.ProcessAgentContainerName, apicommonv1.SystemProbeContainerName}) + managers.Volume().AddVolume(&cgroupsVol) + managers.VolumeMount().AddVolumeMountToContainers(&cgroupsVolMount, []apicommonv1.AgentContainerName{apicommonv1.ProcessAgentContainerName, apicommonv1.SystemProbeContainerName}) // debugfs volume mount debugfsVol, debugfsVolMount := volume.GetVolumes(apicommon.DebugfsVolumeName, apicommon.DebugfsPath, apicommon.DebugfsPath, true) - managers.Volume().AddVolumeToContainers(&debugfsVol, &debugfsVolMount, []apicommonv1.AgentContainerName{apicommonv1.ProcessAgentContainerName, apicommonv1.SystemProbeContainerName}) + managers.Volume().AddVolume(&debugfsVol) + managers.VolumeMount().AddVolumeMountToContainers(&debugfsVolMount, []apicommonv1.AgentContainerName{apicommonv1.ProcessAgentContainerName, apicommonv1.SystemProbeContainerName}) // socket volume mount socketVol, socketVolMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath) - managers.Volume().AddVolumeToContainers( - &socketVol, + managers.Volume().AddVolume(&socketVol) + managers.VolumeMount().AddVolumeMountToContainers( &socketVolMount, []apicommonv1.AgentContainerName{ apicommonv1.CoreAgentContainerName, diff --git a/controllers/datadogagent/feature/npm/feature_test.go b/controllers/datadogagent/feature/npm/feature_test.go index 48d76305d..5f8ece1f0 100644 --- a/controllers/datadogagent/feature/npm/feature_test.go +++ b/controllers/datadogagent/feature/npm/feature_test.go @@ -103,10 +103,10 @@ func Test_npmFeature_Configure(t *testing.T) { }, } - processAgentMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.ProcessAgentContainerName] + processAgentMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.ProcessAgentContainerName] assert.True(t, apiutils.IsEqualStruct(processAgentMounts, wantVolumeMounts), "Process Agent volume mounts \ndiff = %s", cmp.Diff(processAgentMounts, wantVolumeMounts)) - sysProbeAgentMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.SystemProbeContainerName] + sysProbeAgentMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.SystemProbeContainerName] assert.True(t, apiutils.IsEqualStruct(sysProbeAgentMounts, wantVolumeMounts), "System Probe volume mounts \ndiff = %s", cmp.Diff(sysProbeAgentMounts, wantVolumeMounts)) coreWantVolumeMounts := []corev1.VolumeMount{ @@ -116,7 +116,7 @@ func Test_npmFeature_Configure(t *testing.T) { ReadOnly: true, }, } - coreAgentMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentMounts, coreWantVolumeMounts), "Core Agent volume mounts \ndiff = %s", cmp.Diff(coreAgentMounts, coreWantVolumeMounts)) // check volumes diff --git a/controllers/datadogagent/feature/oom_kill/feature.go b/controllers/datadogagent/feature/oom_kill/feature.go index f79212c47..82e36bfc5 100644 --- a/controllers/datadogagent/feature/oom_kill/feature.go +++ b/controllers/datadogagent/feature/oom_kill/feature.go @@ -74,11 +74,13 @@ func (f *oomKillFeature) ManageClusterAgent(managers feature.PodTemplateManagers func (f *oomKillFeature) ManageNodeAgent(managers feature.PodTemplateManagers) error { // modules volume mount modulesVol, modulesVolMount := volume.GetVolumes(apicommon.ModulesVolumeName, apicommon.ModulesVolumePath, apicommon.ModulesVolumePath, true) - managers.Volume().AddVolumeToContainer(&modulesVol, &modulesVolMount, apicommonv1.SystemProbeContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&modulesVolMount, apicommonv1.SystemProbeContainerName) + managers.Volume().AddVolume(&modulesVol) // src volume mount srcVol, srcVolMount := volume.GetVolumes(apicommon.SrcVolumeName, apicommon.SrcVolumePath, apicommon.SrcVolumePath, true) - managers.Volume().AddVolumeToContainer(&srcVol, &srcVolMount, apicommonv1.SystemProbeContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&srcVolMount, apicommonv1.SystemProbeContainerName) + managers.Volume().AddVolume(&srcVol) enableEnvVar := &corev1.EnvVar{ Name: apicommon.DDEnableOOMKillEnvVar, diff --git a/controllers/datadogagent/feature/oom_kill/feature_test.go b/controllers/datadogagent/feature/oom_kill/feature_test.go index 8fd6d9ffd..2832365af 100644 --- a/controllers/datadogagent/feature/oom_kill/feature_test.go +++ b/controllers/datadogagent/feature/oom_kill/feature_test.go @@ -74,7 +74,7 @@ func Test_oomKillFeature_Configure(t *testing.T) { }, } - systemProbeVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.SystemProbeContainerName] + systemProbeVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.SystemProbeContainerName] assert.True(t, apiutils.IsEqualStruct(systemProbeVolumeMounts, wantVolumeMounts), "System Probe volume mounts \ndiff = %s", cmp.Diff(systemProbeVolumeMounts, wantVolumeMounts)) // check volumes diff --git a/controllers/datadogagent/feature/tcp_queue_length/feature.go b/controllers/datadogagent/feature/tcp_queue_length/feature.go index 484cfc9bb..e283d11c0 100644 --- a/controllers/datadogagent/feature/tcp_queue_length/feature.go +++ b/controllers/datadogagent/feature/tcp_queue_length/feature.go @@ -74,11 +74,13 @@ func (f *tcpQueueLengthFeature) ManageClusterAgent(managers feature.PodTemplateM func (f *tcpQueueLengthFeature) ManageNodeAgent(managers feature.PodTemplateManagers) error { // modules volume mount modulesVol, modulesVolMount := volume.GetVolumes(apicommon.ModulesVolumeName, apicommon.ModulesVolumePath, apicommon.ModulesVolumePath, true) - managers.Volume().AddVolumeToContainer(&modulesVol, &modulesVolMount, apicommonv1.SystemProbeContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&modulesVolMount, apicommonv1.SystemProbeContainerName) + managers.Volume().AddVolume(&modulesVol) // src volume mount srcVol, srcVolMount := volume.GetVolumes(apicommon.SrcVolumeName, apicommon.SrcVolumePath, apicommon.SrcVolumePath, true) - managers.Volume().AddVolumeToContainer(&srcVol, &srcVolMount, apicommonv1.SystemProbeContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&srcVolMount, apicommonv1.SystemProbeContainerName) + managers.Volume().AddVolume(&srcVol) enableEnvVar := &corev1.EnvVar{ Name: apicommon.DDEnableTCPQueueLengthEnvVar, diff --git a/controllers/datadogagent/feature/tcp_queue_length/feature_test.go b/controllers/datadogagent/feature/tcp_queue_length/feature_test.go index fbee2505b..cbfb7f253 100644 --- a/controllers/datadogagent/feature/tcp_queue_length/feature_test.go +++ b/controllers/datadogagent/feature/tcp_queue_length/feature_test.go @@ -74,7 +74,7 @@ func Test_tcpQueueLengthFeature_Configure(t *testing.T) { }, } - systemProbeVolumeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.SystemProbeContainerName] + systemProbeVolumeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.SystemProbeContainerName] assert.True(t, apiutils.IsEqualStruct(systemProbeVolumeMounts, wantVolumeMounts), "System Probe volume mounts \ndiff = %s", cmp.Diff(systemProbeVolumeMounts, wantVolumeMounts)) // check volumes diff --git a/controllers/datadogagent/feature/types.go b/controllers/datadogagent/feature/types.go index 540acb093..060751dde 100644 --- a/controllers/datadogagent/feature/types.go +++ b/controllers/datadogagent/feature/types.go @@ -177,8 +177,10 @@ type PodTemplateManagers interface { PodTemplateSpec() *corev1.PodTemplateSpec // EnvVar used to access the EnvVarManager to manage the Environment variable defined in the PodTemplateSpec. EnvVar() merger.EnvVarManager - // Volume used to access the VolumeManager to manage the Volume and VolumeMount defined in the PodTemplateSpec. + // Volume used to access the VolumeManager to manage the Volume defined in the PodTemplateSpec. Volume() merger.VolumeManager + // VolumeMount used to access the VolumeMountManager to manage the VolumeMount defined in the PodTemplateSpec. + VolumeMount() merger.VolumeMountManager // SecurityContext is used to access the SecurityContextManager to manage container Security Context defined in the PodTemplateSpec. SecurityContext() merger.SecurityContextManager // Annotation is used access the AnnotationManager to manage PodTemplateSpec annotations. @@ -192,6 +194,7 @@ func NewPodTemplateManagers(podTmpl *corev1.PodTemplateSpec) PodTemplateManagers podTmpl: podTmpl, envVarManager: merger.NewEnvVarManager(podTmpl), volumeManager: merger.NewVolumeManager(podTmpl), + volumeMountManager: merger.NewVolumeMountManager(podTmpl), securityContextManager: merger.NewSecurityContextManager(podTmpl), annotationManager: merger.NewAnnotationManager(podTmpl), } @@ -201,6 +204,7 @@ type podTemplateManagerImpl struct { podTmpl *corev1.PodTemplateSpec envVarManager merger.EnvVarManager volumeManager merger.VolumeManager + volumeMountManager merger.VolumeMountManager securityContextManager merger.SecurityContextManager annotationManager merger.AnnotationManager } @@ -217,6 +221,10 @@ func (impl *podTemplateManagerImpl) Volume() merger.VolumeManager { return impl.volumeManager } +func (impl *podTemplateManagerImpl) VolumeMount() merger.VolumeMountManager { + return impl.volumeMountManager +} + func (impl *podTemplateManagerImpl) SecurityContext() merger.SecurityContextManager { return impl.securityContextManager } diff --git a/controllers/datadogagent/feature/usm/feature.go b/controllers/datadogagent/feature/usm/feature.go index ee73c2992..c5d3bab1a 100644 --- a/controllers/datadogagent/feature/usm/feature.go +++ b/controllers/datadogagent/feature/usm/feature.go @@ -113,17 +113,19 @@ func (f *usmFeature) ManageNodeAgent(managers feature.PodTemplateManagers) error // volume mounts procdirVol, procdirMount := volume.GetVolumes(apicommon.ProcdirVolumeName, apicommon.ProcdirHostPath, apicommon.ProcdirMountPath, true) - managers.Volume().AddVolumeToContainer(&procdirVol, &procdirMount, apicommonv1.SystemProbeContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&procdirMount, apicommonv1.SystemProbeContainerName) + managers.Volume().AddVolume(&procdirVol) cgroupsVol, cgroupsMount := volume.GetVolumes(apicommon.CgroupsVolumeName, apicommon.CgroupsHostPath, apicommon.CgroupsMountPath, true) - managers.Volume().AddVolumeToContainer(&cgroupsVol, &cgroupsMount, apicommonv1.SystemProbeContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&cgroupsMount, apicommonv1.SystemProbeContainerName) + managers.Volume().AddVolume(&cgroupsVol) debugfsVol, debugfsMount := volume.GetVolumes(apicommon.DebugfsVolumeName, apicommon.DebugfsPath, apicommon.DebugfsPath, true) - managers.Volume().AddVolumeToContainer(&debugfsVol, &debugfsMount, apicommonv1.SystemProbeContainerName) + managers.VolumeMount().AddVolumeMountToContainer(&debugfsMount, apicommonv1.SystemProbeContainerName) + managers.Volume().AddVolume(&debugfsVol) socketDirVol, socketDirMount := volume.GetVolumesEmptyDir(apicommon.SystemProbeSocketVolumeName, apicommon.SystemProbeSocketVolumePath) - managers.Volume().AddVolumeToContainers( - &socketDirVol, + managers.VolumeMount().AddVolumeMountToContainers( &socketDirMount, []apicommonv1.AgentContainerName{ apicommonv1.CoreAgentContainerName, @@ -131,6 +133,7 @@ func (f *usmFeature) ManageNodeAgent(managers feature.PodTemplateManagers) error apicommonv1.SystemProbeContainerName, }, ) + managers.Volume().AddVolume(&socketDirVol) // env vars for System Probe and Process Agent enabledEnvVar := &corev1.EnvVar{ diff --git a/controllers/datadogagent/feature/usm/feature_test.go b/controllers/datadogagent/feature/usm/feature_test.go index 26bd02fb7..682a9c55e 100644 --- a/controllers/datadogagent/feature/usm/feature_test.go +++ b/controllers/datadogagent/feature/usm/feature_test.go @@ -110,7 +110,7 @@ func Test_usmFeature_Configure(t *testing.T) { }, } - sysProbeMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.SystemProbeContainerName] + sysProbeMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.SystemProbeContainerName] assert.True(t, apiutils.IsEqualStruct(sysProbeMounts, wantVolumeMounts), "System Probe volume mounts \ndiff = %s", cmp.Diff(sysProbeMounts, wantVolumeMounts)) coreWantVolumeMounts := []corev1.VolumeMount{ @@ -120,7 +120,7 @@ func Test_usmFeature_Configure(t *testing.T) { ReadOnly: true, }, } - coreAgentMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.CoreAgentContainerName] + coreAgentMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.CoreAgentContainerName] assert.True(t, apiutils.IsEqualStruct(coreAgentMounts, coreWantVolumeMounts), "Core Agent volume mounts \ndiff = %s", cmp.Diff(coreAgentMounts, coreWantVolumeMounts)) processWantVolumeMounts := []corev1.VolumeMount{ @@ -130,7 +130,7 @@ func Test_usmFeature_Configure(t *testing.T) { ReadOnly: true, }, } - processAgentMounts := mgr.VolumeMgr.VolumeMountByC[apicommonv1.ProcessAgentContainerName] + processAgentMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommonv1.ProcessAgentContainerName] assert.True(t, apiutils.IsEqualStruct(processAgentMounts, processWantVolumeMounts), "Process Agent volume mounts \ndiff = %s", cmp.Diff(processAgentMounts, processWantVolumeMounts)) // check volumes diff --git a/controllers/datadogagent/merger/fake/volume_manager.go b/controllers/datadogagent/merger/fake/volume_manager.go index b72089cbe..ad3520268 100644 --- a/controllers/datadogagent/merger/fake/volume_manager.go +++ b/controllers/datadogagent/merger/fake/volume_manager.go @@ -3,7 +3,6 @@ package fake import ( "testing" - commonv1 "github.com/DataDog/datadog-operator/apis/datadoghq/common/v1" merger "github.com/DataDog/datadog-operator/controllers/datadogagent/merger" v1 "k8s.io/api/core/v1" @@ -11,53 +10,24 @@ import ( // VolumeManager is an autogenerated mock type for the VolumeManager type type VolumeManager struct { - Volumes []*v1.Volume - VolumeMountByC map[commonv1.AgentContainerName][]*v1.VolumeMount + Volumes []*v1.Volume t testing.TB } // AddVolume provides a mock function with given fields: volume, volumeMount -func (_m *VolumeManager) AddVolume(volume *v1.Volume, volumeMount *v1.VolumeMount) { +func (_m *VolumeManager) AddVolume(volume *v1.Volume) { _m.Volumes = append(_m.Volumes, volume) - _m.VolumeMountByC[AllContainers] = append(_m.VolumeMountByC[AllContainers], volumeMount) } -// AddVolumeToContainer provides a mock function with given fields: volume, volumeMount, containerName -func (_m *VolumeManager) AddVolumeToContainer(volume *v1.Volume, volumeMount *v1.VolumeMount, containerName commonv1.AgentContainerName) { - _m.Volumes = append(_m.Volumes, volume) - _m.VolumeMountByC[containerName] = append(_m.VolumeMountByC[containerName], volumeMount) -} - -// AddVolumeToContainers provides a mock function with given fields: volume, volumeMount, containerNames -func (_m *VolumeManager) AddVolumeToContainers(volume *v1.Volume, volumeMount *v1.VolumeMount, containerNames []commonv1.AgentContainerName) { - _m.Volumes = append(_m.Volumes, volume) - for _, c := range containerNames { - _m.VolumeMountByC[c] = append(_m.VolumeMountByC[c], volumeMount) - } -} - -// AddVolumeToContainersWithMergeFunc provides a mock function with given fields: volume, volumeMount, containerNames, volumeMergeFunc, volumeMountMergeFunc -func (_m *VolumeManager) AddVolumeToContainersWithMergeFunc(volume *v1.Volume, volumeMount *v1.VolumeMount, containerNames []commonv1.AgentContainerName, volumeMergeFunc merger.VolumeMergeFunction, volumeMountMergeFunc merger.VolumeMountMergeFunction) error { +// AddVolumeWithMergeFunc provides a mock function with given fields: volume, volumeMount, containerName, volumeMergeFunc, volumeMountMergeFunc +func (_m *VolumeManager) AddVolumeWithMergeFunc(volume *v1.Volume, volumeMergeFunc merger.VolumeMergeFunction) error { if err := _m.volumeMerge(volume, volumeMergeFunc); err != nil { return err } - for _, cName := range containerNames { - if err := _m.volumeMountMerge(cName, volumeMount, volumeMountMergeFunc); err != nil { - return err - } - } return nil } -// AddVolumeToContainerWithMergeFunc provides a mock function with given fields: volume, volumeMount, containerName, volumeMergeFunc, volumeMountMergeFunc -func (_m *VolumeManager) AddVolumeToContainerWithMergeFunc(volume *v1.Volume, volumeMount *v1.VolumeMount, containerName commonv1.AgentContainerName, volumeMergeFunc merger.VolumeMergeFunction, volumeMountMergeFunc merger.VolumeMountMergeFunction) error { - if err := _m.volumeMerge(volume, volumeMergeFunc); err != nil { - return err - } - return _m.volumeMountMerge(containerName, volumeMount, volumeMountMergeFunc) -} - func (_m *VolumeManager) volumeMerge(volume *v1.Volume, volumeMergeFunc merger.VolumeMergeFunction) error { found := false idFound := 0 @@ -79,36 +49,10 @@ func (_m *VolumeManager) volumeMerge(volume *v1.Volume, volumeMergeFunc merger.V return nil } -func (_m *VolumeManager) volumeMountMerge(containerName commonv1.AgentContainerName, volume *v1.VolumeMount, volumeMergeFunc merger.VolumeMountMergeFunction) error { - found := false - idFound := 0 - for id, v := range _m.VolumeMountByC[containerName] { - if volume.Name == v.Name { - found = true - idFound = id - } - } - - if found { - var err error - volume, err = volumeMergeFunc(_m.VolumeMountByC[containerName][idFound], volume) - _m.VolumeMountByC[containerName][idFound] = volume - return err - } - - _m.VolumeMountByC[containerName] = append(_m.VolumeMountByC[containerName], volume) - return nil -} - -// AddVolumeWithMergeFunc provides a mock function with given fields: volume, volumeMount, volumeMergeFunc, volumeMountMergeFunc -func (_m *VolumeManager) AddVolumeWithMergeFunc(volume *v1.Volume, volumeMount *v1.VolumeMount, volumeMergeFunc merger.VolumeMergeFunction, volumeMountMergeFunc merger.VolumeMountMergeFunction) error { - return _m.AddVolumeToContainersWithMergeFunc(volume, volumeMount, []commonv1.AgentContainerName{AllContainers}, volumeMergeFunc, volumeMountMergeFunc) -} - // NewFakeVolumeManager creates a new instance of VolumeManager. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. func NewFakeVolumeManager(t testing.TB) *VolumeManager { return &VolumeManager{ - VolumeMountByC: make(map[commonv1.AgentContainerName][]*v1.VolumeMount), - t: t, + Volumes: []*v1.Volume{}, + t: t, } } diff --git a/controllers/datadogagent/merger/fake/volume_mount_manager.go b/controllers/datadogagent/merger/fake/volume_mount_manager.go new file mode 100644 index 000000000..40c70e0c5 --- /dev/null +++ b/controllers/datadogagent/merger/fake/volume_mount_manager.go @@ -0,0 +1,78 @@ +package fake + +import ( + "testing" + + commonv1 "github.com/DataDog/datadog-operator/apis/datadoghq/common/v1" + merger "github.com/DataDog/datadog-operator/controllers/datadogagent/merger" + + v1 "k8s.io/api/core/v1" +) + +// VolumeMountManager is an autogenerated mock type for the VolumeMountManager type +type VolumeMountManager struct { + VolumeMountsByC map[commonv1.AgentContainerName][]*v1.VolumeMount + + t testing.TB +} + +// AddVolumeMount provides a mock function with given field: volumeMount +func (_m *VolumeMountManager) AddVolumeMount(volumeMount *v1.VolumeMount) { + _m.VolumeMountsByC[AllContainers] = append(_m.VolumeMountsByC[AllContainers], volumeMount) +} + +// AddVolumeMountToContainer provides a mock function with given fields: volumeMount, containerName +func (_m *VolumeMountManager) AddVolumeMountToContainer(volumeMount *v1.VolumeMount, containerName commonv1.AgentContainerName) { + _m.VolumeMountsByC[containerName] = append(_m.VolumeMountsByC[containerName], volumeMount) +} + +// AddVolumeMountToContainers provides a mock function with given fields: volume, volumeMount, containerNames +func (_m *VolumeMountManager) AddVolumeMountToContainers(volumeMount *v1.VolumeMount, containerNames []commonv1.AgentContainerName) { + for _, c := range containerNames { + _m.VolumeMountsByC[c] = append(_m.VolumeMountsByC[c], volumeMount) + } +} + +// AddVolumeMountToContainersWithMergeFunc provides a mock function with given fields: volume, volumeMount, containerNames, volumeMergeFunc, volumeMountMergeFunc +func (_m *VolumeMountManager) AddVolumeMountToContainersWithMergeFunc(volumeMount *v1.VolumeMount, containerNames []commonv1.AgentContainerName, volumeMountMergeFunc merger.VolumeMountMergeFunction) error { + for _, cName := range containerNames { + if err := _m.volumeMountMerge(cName, volumeMount, volumeMountMergeFunc); err != nil { + return err + } + } + return nil +} + +// AddVolumeMountToContainerWithMergeFunc provides a mock function with given fields: volume, volumeMount, containerName, volumeMergeFunc, volumeMountMergeFunc +func (_m *VolumeMountManager) AddVolumeMountToContainerWithMergeFunc(volumeMount *v1.VolumeMount, containerName commonv1.AgentContainerName, volumeMountMergeFunc merger.VolumeMountMergeFunction) error { + return _m.volumeMountMerge(containerName, volumeMount, volumeMountMergeFunc) +} + +func (_m *VolumeMountManager) volumeMountMerge(containerName commonv1.AgentContainerName, volume *v1.VolumeMount, volumeMergeFunc merger.VolumeMountMergeFunction) error { + found := false + idFound := 0 + for id, v := range _m.VolumeMountsByC[containerName] { + if volume.Name == v.Name { + found = true + idFound = id + } + } + + if found { + var err error + volume, err = volumeMergeFunc(_m.VolumeMountsByC[containerName][idFound], volume) + _m.VolumeMountsByC[containerName][idFound] = volume + return err + } + + _m.VolumeMountsByC[containerName] = append(_m.VolumeMountsByC[containerName], volume) + return nil +} + +// NewFakeVolumeMountManager creates a new instance of VolumeMountManager. It also registers the testing.TB interface on the mock and a cleanup function to assert the mocks expectations. +func NewFakeVolumeMountManager(t testing.TB) *VolumeMountManager { + return &VolumeMountManager{ + VolumeMountsByC: make(map[commonv1.AgentContainerName][]*v1.VolumeMount), + t: t, + } +} diff --git a/controllers/datadogagent/merger/volume.go b/controllers/datadogagent/merger/volume.go index b92589d52..e57172825 100644 --- a/controllers/datadogagent/merger/volume.go +++ b/controllers/datadogagent/merger/volume.go @@ -8,27 +8,16 @@ package merger import ( "fmt" - commonv1 "github.com/DataDog/datadog-operator/apis/datadoghq/common/v1" corev1 "k8s.io/api/core/v1" ) -// VolumeManager use to add a Volume and VolumeMount to Pod and associated containers. +// VolumeManager use to add a Volume to Pod and associated containers. type VolumeManager interface { - // Add the volume to the PodTemplate and add the volumeMount to every containers present in the PodTemplate. - AddVolume(volume *corev1.Volume, volumeMount *corev1.VolumeMount) - // Add the volume to the PodTemplate and add the volumeMount to container matching the containerName. - AddVolumeToContainer(volume *corev1.Volume, volumeMount *corev1.VolumeMount, containerName commonv1.AgentContainerName) - // Add the volume to the PodTemplate and add the volumeMount to container matching the containerNames. - AddVolumeToContainers(volume *corev1.Volume, volumeMount *corev1.VolumeMount, containerName []commonv1.AgentContainerName) - // Add the volume to the PodTemplate and add the volumeMount to every containers present in the PodTemplate. + // Add the volume to the PodTemplate. + AddVolume(volume *corev1.Volume) + // Add the volume to the PodTemplate. // Provide merge functions if the merge is specific. - AddVolumeWithMergeFunc(volume *corev1.Volume, volumeMount *corev1.VolumeMount, volumeMergeFunc VolumeMergeFunction, volumeMountMergeFunc VolumeMountMergeFunction) error - // Add the volume to the PodTemplate and add the volumeMount to container matching the containerName. - // Provide merge functions if the merge is specific. - AddVolumeToContainerWithMergeFunc(volume *corev1.Volume, volumeMount *corev1.VolumeMount, containerName commonv1.AgentContainerName, volumeMergeFunc VolumeMergeFunction, volumeMountMergeFunc VolumeMountMergeFunction) error - // Add the volume to the PodTemplate and add the volumeMount to container matching the containerNames. - // Provide merge functions if the merge is specific. - AddVolumeToContainersWithMergeFunc(volume *corev1.Volume, volumeMount *corev1.VolumeMount, containerNames []commonv1.AgentContainerName, volumeMergeFunc VolumeMergeFunction, volumeMountMergeFunc VolumeMountMergeFunction) error + AddVolumeWithMergeFunc(volume *corev1.Volume, volumeMergeFunc VolumeMergeFunction) error } // NewVolumeManager returns a new instance of the VolumeManager @@ -42,62 +31,16 @@ type volumeManagerImpl struct { podTmpl *corev1.PodTemplateSpec } -func (impl *volumeManagerImpl) AddVolume(volume *corev1.Volume, volumeMount *corev1.VolumeMount) { - _ = impl.AddVolumeWithMergeFunc(volume, volumeMount, DefaultVolumeMergeFunction, DefaultVolumeMountMergeFunction) -} - -func (impl *volumeManagerImpl) AddVolumeToContainer(volume *corev1.Volume, volumeMount *corev1.VolumeMount, containerName commonv1.AgentContainerName) { - _ = impl.AddVolumeToContainersWithMergeFunc(volume, volumeMount, []commonv1.AgentContainerName{containerName}, DefaultVolumeMergeFunction, DefaultVolumeMountMergeFunction) -} - -func (impl *volumeManagerImpl) AddVolumeToContainers(volume *corev1.Volume, volumeMount *corev1.VolumeMount, containerNames []commonv1.AgentContainerName) { - _ = impl.AddVolumeToContainersWithMergeFunc(volume, volumeMount, containerNames, DefaultVolumeMergeFunction, DefaultVolumeMountMergeFunction) -} - -func (impl *volumeManagerImpl) AddVolumeWithMergeFunc(volume *corev1.Volume, volumeMount *corev1.VolumeMount, volumeMergeFunc VolumeMergeFunction, volumeMountMergeFunc VolumeMountMergeFunction) error { - _, err := AddVolumeToPod(&impl.podTmpl.Spec, volume, volumeMergeFunc) - if err != nil { - return err - } - for id := range impl.podTmpl.Spec.Containers { - _, err = AddVolumeMountToContainer(&impl.podTmpl.Spec.Containers[id], volumeMount, volumeMountMergeFunc) - if err != nil { - return err - } - } - return nil -} - -func (impl *volumeManagerImpl) AddVolumeToContainersWithMergeFunc(volume *corev1.Volume, volumeMount *corev1.VolumeMount, containerNames []commonv1.AgentContainerName, volumeMergeFunc VolumeMergeFunction, volumeMountMergeFunc VolumeMountMergeFunction) error { - _, err := AddVolumeToPod(&impl.podTmpl.Spec, volume, volumeMergeFunc) - if err != nil { - return err - } - - for _, containerName := range containerNames { - if err := impl.AddVolumeToContainerWithMergeFunc(volume, volumeMount, containerName, volumeMergeFunc, volumeMountMergeFunc); err != nil { - return err - } - } - - return nil +func (impl *volumeManagerImpl) AddVolume(volume *corev1.Volume) { + _ = impl.AddVolumeWithMergeFunc(volume, DefaultVolumeMergeFunction) } -func (impl *volumeManagerImpl) AddVolumeToContainerWithMergeFunc(volume *corev1.Volume, volumeMount *corev1.VolumeMount, containerName commonv1.AgentContainerName, volumeMergeFunc VolumeMergeFunction, volumeMountMergeFunc VolumeMountMergeFunction) error { +func (impl *volumeManagerImpl) AddVolumeWithMergeFunc(volume *corev1.Volume, volumeMergeFunc VolumeMergeFunction) error { _, err := AddVolumeToPod(&impl.podTmpl.Spec, volume, volumeMergeFunc) if err != nil { return err } - for id := range impl.podTmpl.Spec.Containers { - if impl.podTmpl.Spec.Containers[id].Name == string(containerName) { - _, err = AddVolumeMountToContainer(&impl.podTmpl.Spec.Containers[id], volumeMount, DefaultVolumeMountMergeFunction) - if err != nil { - return err - } - return nil - } - } return nil } @@ -115,7 +58,7 @@ func OverrideCurrentVolumeMergeFunction(current, newVolume *corev1.Volume) (*cor return newVolume.DeepCopy(), nil } -// MergeConfigMapItemsVolumeMergeFunction used when the existing corev1.VolumeMount new to be replace by the new one. +// MergeConfigMapItemsVolumeMergeFunction used when the existing corev1.Volume needs to be replace by the new one. func MergeConfigMapItemsVolumeMergeFunction(current, newVolume *corev1.Volume) (*corev1.Volume, error) { if current.ConfigMap.Name != newVolume.ConfigMap.Name { return newVolume.DeepCopy(), nil diff --git a/controllers/datadogagent/merger/volume_mount.go b/controllers/datadogagent/merger/volume_mount.go new file mode 100644 index 000000000..421fd21da --- /dev/null +++ b/controllers/datadogagent/merger/volume_mount.go @@ -0,0 +1,119 @@ +// 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 merger + +import ( + commonv1 "github.com/DataDog/datadog-operator/apis/datadoghq/common/v1" + corev1 "k8s.io/api/core/v1" +) + +// VolumeMountManager use to add a Volume to Pod and associated containers. +type VolumeMountManager interface { + // Add the volumeMount to all containers of the PodTemplate. + AddVolumeMount(volumeMount *corev1.VolumeMount) + // Add the volumeMount to one container of the PodTemplate. + AddVolumeMountToContainer(volumeMount *corev1.VolumeMount, containerName commonv1.AgentContainerName) + // Add the volumeMount to a list of containers in the PodTemplate. + AddVolumeMountToContainers(volumeMount *corev1.VolumeMount, containerNames []commonv1.AgentContainerName) + // Add the volumeMount to the container matching the containerName. + // Provide merge functions if the merge is specific. + AddVolumeMountToContainerWithMergeFunc(volumeMount *corev1.VolumeMount, containerName commonv1.AgentContainerName, volumeMountMergeFunc VolumeMountMergeFunction) error +} + +// NewVolumeMountManager returns a new instance of the VolumeMountManager +func NewVolumeMountManager(podTmpl *corev1.PodTemplateSpec) VolumeMountManager { + return &volumeMountManagerImpl{ + podTmpl: podTmpl, + } +} + +type volumeMountManagerImpl struct { + podTmpl *corev1.PodTemplateSpec +} + +func (impl *volumeMountManagerImpl) AddVolumeMount(volumeMount *corev1.VolumeMount) { + _ = impl.AddVolumeMountWithMergeFunc(volumeMount, DefaultVolumeMountMergeFunction) +} + +func (impl *volumeMountManagerImpl) AddVolumeMountToContainer(volumeMount *corev1.VolumeMount, containerName commonv1.AgentContainerName) { + for id, container := range impl.podTmpl.Spec.Containers { + if container.Name == string(containerName) { + _, _ = AddVolumeMountToContainerWithMergeFunc(&impl.podTmpl.Spec.Containers[id], volumeMount, DefaultVolumeMountMergeFunction) + } + } +} + +func (impl *volumeMountManagerImpl) AddVolumeMountToContainers(volumeMount *corev1.VolumeMount, containerNames []commonv1.AgentContainerName) { + for _, containerName := range containerNames { + impl.AddVolumeMountToContainer(volumeMount, containerName) + } +} + +func (impl *volumeMountManagerImpl) AddVolumeMountWithMergeFunc(volumeMount *corev1.VolumeMount, volumeMountMergeFunc VolumeMountMergeFunction) error { + for id := range impl.podTmpl.Spec.Containers { + _, err := AddVolumeMountToContainerWithMergeFunc(&impl.podTmpl.Spec.Containers[id], volumeMount, volumeMountMergeFunc) + return err + } + return nil +} + +func (impl *volumeMountManagerImpl) AddVolumeMountToContainerWithMergeFunc(volumeMount *corev1.VolumeMount, containerName commonv1.AgentContainerName, volumeMountMergeFunc VolumeMountMergeFunction) error { + for id, container := range impl.podTmpl.Spec.Containers { + if container.Name == string(containerName) { + _, err := AddVolumeMountToContainerWithMergeFunc(&impl.podTmpl.Spec.Containers[id], volumeMount, volumeMountMergeFunc) + return err + } + } + return nil +} + +// AddVolumeMountToContainerWithMergeFunc is used to add a corev1.VolumeMount to a container +// the mergeFunc can be provided to change the default merge behavior +func AddVolumeMountToContainerWithMergeFunc(container *corev1.Container, volumeMount *corev1.VolumeMount, mergeFunc VolumeMountMergeFunction) ([]corev1.VolumeMount, error) { + var found bool + for id, cVolumeMount := range container.VolumeMounts { + if volumeMount.Name == cVolumeMount.Name { + if mergeFunc == nil { + mergeFunc = DefaultVolumeMountMergeFunction + } + newVolumeMount, err := mergeFunc(&cVolumeMount, volumeMount) + if err != nil { + return nil, err + } + container.VolumeMounts[id] = *newVolumeMount + found = true + } + } + + if !found { + container.VolumeMounts = append(container.VolumeMounts, *volumeMount) + } + return container.VolumeMounts, nil +} + +// VolumeMountMergeFunction signature for corev1.VolumeMount merge function +type VolumeMountMergeFunction func(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) + +// DefaultVolumeMountMergeFunction default corev1.VolumeMount merge function +// default correspond to OverrideCurrentVolumeMountMergeOption +func DefaultVolumeMountMergeFunction(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) { + return OverrideCurrentVolumeMountMergeFunction(current, newVolumeMount) +} + +// OverrideCurrentVolumeMountMergeFunction used when the existing corev1.VolumeMount new to be replace by the new one. +func OverrideCurrentVolumeMountMergeFunction(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) { + return newVolumeMount.DeepCopy(), nil +} + +// IgnoreNewVolumeMountMergeFunction used when the existing corev1.VolumeMount needs to be kept. +func IgnoreNewVolumeMountMergeFunction(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) { + return current.DeepCopy(), nil +} + +// ErrorOnMergeAttemptdVolumeMountMergeFunction used to avoid replacing an existing VolumeMount +func ErrorOnMergeAttemptdVolumeMountMergeFunction(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) { + return nil, errMergeAttempted +} diff --git a/controllers/datadogagent/merger/volumemount_test.go b/controllers/datadogagent/merger/volume_mount_test.go similarity index 96% rename from controllers/datadogagent/merger/volumemount_test.go rename to controllers/datadogagent/merger/volume_mount_test.go index 68629f9d2..9fd128a59 100644 --- a/controllers/datadogagent/merger/volumemount_test.go +++ b/controllers/datadogagent/merger/volume_mount_test.go @@ -105,7 +105,7 @@ func TestAddVolumeMountToContainer(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { t.Logf("description: %s", tt.description) - got, err := AddVolumeMountToContainer(tt.args.container, tt.args.volumemount, tt.args.mergeFunc) + got, err := AddVolumeMountToContainerWithMergeFunc(tt.args.container, tt.args.volumemount, tt.args.mergeFunc) if (err != nil) != tt.wantErr { t.Errorf("AddVolumeMountToContainer() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/controllers/datadogagent/merger/volumemount.go b/controllers/datadogagent/merger/volumemount.go deleted file mode 100644 index 44fa3e972..000000000 --- a/controllers/datadogagent/merger/volumemount.go +++ /dev/null @@ -1,57 +0,0 @@ -// 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 merger - -import ( - corev1 "k8s.io/api/core/v1" -) - -// VolumeMountMergeFunction signature for corev1.VolumeMount merge function -type VolumeMountMergeFunction func(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) - -// DefaultVolumeMountMergeFunction default corev1.VolumeMount merge function -// default correspond to OverrideCurrentVolumeMountMergeOption -func DefaultVolumeMountMergeFunction(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) { - return OverrideCurrentVolumeMountMergeFunction(current, newVolumeMount) -} - -// OverrideCurrentVolumeMountMergeFunction used when the existing corev1.VolumeMount new to be replace by the new one. -func OverrideCurrentVolumeMountMergeFunction(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) { - return newVolumeMount.DeepCopy(), nil -} - -// IgnoreNewVolumeMountMergeFunction used when the existing corev1.VolumeMount needs to be kept. -func IgnoreNewVolumeMountMergeFunction(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) { - return current.DeepCopy(), nil -} - -// ErrorOnMergeAttemptdVolumeMountMergeFunction used to avoid replacing an existing VolumeMount -func ErrorOnMergeAttemptdVolumeMountMergeFunction(current, newVolumeMount *corev1.VolumeMount) (*corev1.VolumeMount, error) { - return nil, errMergeAttempted -} - -// AddVolumeMountToContainer use to add a corev1.VolumeMount to a container -// the mergeFunc can be provided to change the default merge behavior -func AddVolumeMountToContainer(container *corev1.Container, volumeMount *corev1.VolumeMount, mergeFunc VolumeMountMergeFunction) ([]corev1.VolumeMount, error) { - var found bool - for id, cVolumeMount := range container.VolumeMounts { - if volumeMount.Name == cVolumeMount.Name { - if mergeFunc == nil { - mergeFunc = DefaultVolumeMountMergeFunction - } - newVolumeMount, err := mergeFunc(&cVolumeMount, volumeMount) - if err != nil { - return nil, err - } - container.VolumeMounts[id] = *newVolumeMount - found = true - } - } - if !found { - container.VolumeMounts = append(container.VolumeMounts, *volumeMount) - } - return container.VolumeMounts, nil -}