diff --git a/api/datadoghq/v2alpha1/datadogagent_types.go b/api/datadoghq/v2alpha1/datadogagent_types.go index 3929616e1d..036c4e9193 100644 --- a/api/datadoghq/v2alpha1/datadogagent_types.go +++ b/api/datadoghq/v2alpha1/datadogagent_types.go @@ -90,6 +90,8 @@ type DatadogFeatures struct { ServiceDiscovery *ServiceDiscoveryFeatureConfig `json:"serviceDiscovery,omitempty"` // GPU monitoring GPU *GPUFeatureConfig `json:"gpu,omitempty"` + // Kata Containers monitoring + KataContainers *KataContainersFeatureConfig `json:"kataContainers,omitempty"` // DataPlane configuration for the Agent Data Plane. // Agent Data Plane is a high-performance sidecar that handles data ingestion. // +optional @@ -687,6 +689,14 @@ type GPUFeatureConfig struct { PatchCgroupPermissions *bool `json:"patchCgroupPermissions,omitempty"` } +// KataContainersFeatureConfig contains the Kata Containers monitoring configuration. +type KataContainersFeatureConfig struct { + // Enabled enables the Kata Containers core check. + // Default: false + // +optional + Enabled *bool `json:"enabled,omitempty"` +} + // DataPlaneFeatureConfig contains the Data Plane configuration. // Data Plane runs as a sidecar container alongside the Core Agent. // +k8s:openapi-gen=true diff --git a/api/datadoghq/v2alpha1/zz_generated.deepcopy.go b/api/datadoghq/v2alpha1/zz_generated.deepcopy.go index 9c768f10ab..d824215c35 100644 --- a/api/datadoghq/v2alpha1/zz_generated.deepcopy.go +++ b/api/datadoghq/v2alpha1/zz_generated.deepcopy.go @@ -1551,6 +1551,11 @@ func (in *DatadogFeatures) DeepCopyInto(out *DatadogFeatures) { *out = new(GPUFeatureConfig) (*in).DeepCopyInto(*out) } + if in.KataContainers != nil { + in, out := &in.KataContainers, &out.KataContainers + *out = new(KataContainersFeatureConfig) + (*in).DeepCopyInto(*out) + } if in.DataPlane != nil { in, out := &in.DataPlane, &out.DataPlane *out = new(DataPlaneFeatureConfig) @@ -2261,6 +2266,26 @@ func (in *InjectorConfig) DeepCopy() *InjectorConfig { return out } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *KataContainersFeatureConfig) DeepCopyInto(out *KataContainersFeatureConfig) { + *out = *in + if in.Enabled != nil { + in, out := &in.Enabled, &out.Enabled + *out = new(bool) + **out = **in + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new KataContainersFeatureConfig. +func (in *KataContainersFeatureConfig) DeepCopy() *KataContainersFeatureConfig { + if in == nil { + return nil + } + out := new(KataContainersFeatureConfig) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *KubeStateMetricsCoreFeatureConfig) DeepCopyInto(out *KubeStateMetricsCoreFeatureConfig) { *out = *in diff --git a/api/datadoghq/v2alpha1/zz_generated.openapi.go b/api/datadoghq/v2alpha1/zz_generated.openapi.go index e35c857471..2a4748a93b 100644 --- a/api/datadoghq/v2alpha1/zz_generated.openapi.go +++ b/api/datadoghq/v2alpha1/zz_generated.openapi.go @@ -834,6 +834,12 @@ func schema_datadog_operator_api_datadoghq_v2alpha1_DatadogFeatures(ref common.R Ref: ref("github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.GPUFeatureConfig"), }, }, + "kataContainers": { + SchemaProps: spec.SchemaProps{ + Description: "Kata Containers monitoring", + Ref: ref("github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.KataContainersFeatureConfig"), + }, + }, "dataPlane": { SchemaProps: spec.SchemaProps{ Description: "DataPlane configuration for the Agent Data Plane. Agent Data Plane is a high-performance sidecar that handles data ingestion.", @@ -904,7 +910,7 @@ func schema_datadog_operator_api_datadoghq_v2alpha1_DatadogFeatures(ref common.R }, }, Dependencies: []string{ - "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.APMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ASMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.AdmissionControllerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.AutoscalingFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CSPMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CWSFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ClusterChecksFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ControlPlaneMonitoringFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.DataPlaneFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.DogstatsdFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.EBPFCheckFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.EventCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ExternalMetricsServerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.GPUFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.HelmCheckFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.KubeStateMetricsCoreFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LiveContainerCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LiveProcessCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LogCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.NPMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OOMKillFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OTLPFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OrchestratorExplorerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OtelAgentGatewayFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OtelCollectorFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ProcessDiscoveryFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.PrometheusScrapeFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.RemoteConfigurationFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.SBOMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ServiceDiscoveryFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.TCPQueueLengthFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.USMFeatureConfig"}, + "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.APMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ASMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.AdmissionControllerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.AutoscalingFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CSPMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.CWSFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ClusterChecksFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ControlPlaneMonitoringFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.DataPlaneFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.DogstatsdFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.EBPFCheckFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.EventCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ExternalMetricsServerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.GPUFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.HelmCheckFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.KataContainersFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.KubeStateMetricsCoreFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LiveContainerCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LiveProcessCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.LogCollectionFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.NPMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OOMKillFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OTLPFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OrchestratorExplorerFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OtelAgentGatewayFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.OtelCollectorFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ProcessDiscoveryFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.PrometheusScrapeFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.RemoteConfigurationFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.SBOMFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.ServiceDiscoveryFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.TCPQueueLengthFeatureConfig", "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1.USMFeatureConfig"}, } } diff --git a/config/crd/bases/v1/datadoghq.com_datadogagentinternals.yaml b/config/crd/bases/v1/datadoghq.com_datadogagentinternals.yaml index 30ad410214..62ff2c1a46 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogagentinternals.yaml +++ b/config/crd/bases/v1/datadoghq.com_datadogagentinternals.yaml @@ -1695,6 +1695,15 @@ spec: Default: {} type: object type: object + kataContainers: + description: Kata Containers monitoring + properties: + enabled: + description: |- + Enabled enables the Kata Containers core check. + Default: false + type: boolean + type: object kubeStateMetricsCore: description: KubeStateMetricsCore check configuration. properties: @@ -10127,6 +10136,15 @@ spec: Default: {} type: object type: object + kataContainers: + description: Kata Containers monitoring + properties: + enabled: + description: |- + Enabled enables the Kata Containers core check. + Default: false + type: boolean + type: object kubeStateMetricsCore: description: KubeStateMetricsCore check configuration. properties: diff --git a/config/crd/bases/v1/datadoghq.com_datadogagentinternals_v1alpha1.json b/config/crd/bases/v1/datadoghq.com_datadogagentinternals_v1alpha1.json index b6e0f69009..5973854ce4 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogagentinternals_v1alpha1.json +++ b/config/crd/bases/v1/datadoghq.com_datadogagentinternals_v1alpha1.json @@ -1701,6 +1701,17 @@ }, "type": "object" }, + "kataContainers": { + "additionalProperties": false, + "description": "Kata Containers monitoring", + "properties": { + "enabled": { + "description": "Enabled enables the Kata Containers core check.\nDefault: false", + "type": "boolean" + } + }, + "type": "object" + }, "kubeStateMetricsCore": { "additionalProperties": false, "description": "KubeStateMetricsCore check configuration.", @@ -9870,6 +9881,17 @@ }, "type": "object" }, + "kataContainers": { + "additionalProperties": false, + "description": "Kata Containers monitoring", + "properties": { + "enabled": { + "description": "Enabled enables the Kata Containers core check.\nDefault: false", + "type": "boolean" + } + }, + "type": "object" + }, "kubeStateMetricsCore": { "additionalProperties": false, "description": "KubeStateMetricsCore check configuration.", diff --git a/config/crd/bases/v1/datadoghq.com_datadogagentprofiles.yaml b/config/crd/bases/v1/datadoghq.com_datadogagentprofiles.yaml index afd1b0e507..dff3cb5a77 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogagentprofiles.yaml +++ b/config/crd/bases/v1/datadoghq.com_datadogagentprofiles.yaml @@ -1695,6 +1695,15 @@ spec: Default: {} type: object type: object + kataContainers: + description: Kata Containers monitoring + properties: + enabled: + description: |- + Enabled enables the Kata Containers core check. + Default: false + type: boolean + type: object kubeStateMetricsCore: description: KubeStateMetricsCore check configuration. properties: diff --git a/config/crd/bases/v1/datadoghq.com_datadogagentprofiles_v1alpha1.json b/config/crd/bases/v1/datadoghq.com_datadogagentprofiles_v1alpha1.json index 3185fb8533..8f104bc85f 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogagentprofiles_v1alpha1.json +++ b/config/crd/bases/v1/datadoghq.com_datadogagentprofiles_v1alpha1.json @@ -1705,6 +1705,17 @@ }, "type": "object" }, + "kataContainers": { + "additionalProperties": false, + "description": "Kata Containers monitoring", + "properties": { + "enabled": { + "description": "Enabled enables the Kata Containers core check.\nDefault: false", + "type": "boolean" + } + }, + "type": "object" + }, "kubeStateMetricsCore": { "additionalProperties": false, "description": "KubeStateMetricsCore check configuration.", diff --git a/config/crd/bases/v1/datadoghq.com_datadogagents.yaml b/config/crd/bases/v1/datadoghq.com_datadogagents.yaml index 22ecfd013a..45f779bc40 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogagents.yaml +++ b/config/crd/bases/v1/datadoghq.com_datadogagents.yaml @@ -1699,6 +1699,15 @@ spec: Default: {} type: object type: object + kataContainers: + description: Kata Containers monitoring + properties: + enabled: + description: |- + Enabled enables the Kata Containers core check. + Default: false + type: boolean + type: object kubeStateMetricsCore: description: KubeStateMetricsCore check configuration. properties: @@ -10207,6 +10216,15 @@ spec: Default: {} type: object type: object + kataContainers: + description: Kata Containers monitoring + properties: + enabled: + description: |- + Enabled enables the Kata Containers core check. + Default: false + type: boolean + type: object kubeStateMetricsCore: description: KubeStateMetricsCore check configuration. properties: diff --git a/config/crd/bases/v1/datadoghq.com_datadogagents_v2alpha1.json b/config/crd/bases/v1/datadoghq.com_datadogagents_v2alpha1.json index 84ba9c4e7d..21938c99db 100644 --- a/config/crd/bases/v1/datadoghq.com_datadogagents_v2alpha1.json +++ b/config/crd/bases/v1/datadoghq.com_datadogagents_v2alpha1.json @@ -1701,6 +1701,17 @@ }, "type": "object" }, + "kataContainers": { + "additionalProperties": false, + "description": "Kata Containers monitoring", + "properties": { + "enabled": { + "description": "Enabled enables the Kata Containers core check.\nDefault: false", + "type": "boolean" + } + }, + "type": "object" + }, "kubeStateMetricsCore": { "additionalProperties": false, "description": "KubeStateMetricsCore check configuration.", @@ -9963,6 +9974,17 @@ }, "type": "object" }, + "kataContainers": { + "additionalProperties": false, + "description": "Kata Containers monitoring", + "properties": { + "enabled": { + "description": "Enabled enables the Kata Containers core check.\nDefault: false", + "type": "boolean" + } + }, + "type": "object" + }, "kubeStateMetricsCore": { "additionalProperties": false, "description": "KubeStateMetricsCore check configuration.", diff --git a/docs/configuration.v2alpha1.md b/docs/configuration.v2alpha1.md index 3705d38cdd..bded016baa 100644 --- a/docs/configuration.v2alpha1.md +++ b/docs/configuration.v2alpha1.md @@ -135,6 +135,7 @@ spec: | features.helmCheck.collectEvents | CollectEvents set to `true` enables event collection in the Helm check (Requires Agent 7.36.0+ and Cluster Agent 1.20.0+) Default: false | | features.helmCheck.enabled | Enables the Helm check. Default: false | | features.helmCheck.valuesAsTags | ValuesAsTags collects Helm values from a release and uses them as tags (Requires Agent and Cluster Agent 7.40.0+). Default: {} | +| features.kataContainers.enabled | Enables the Kata Containers core check. Default: false | | features.kubeStateMetricsCore.collectCrMetrics | `CollectCrMetrics` defines custom resources for the kube-state-metrics core check to collect. The datadog agent uses the same logic as upstream `kube-state-metrics`. So is its configuration. The exact structure and existing fields of each item in this list can be found in: https://github.com/kubernetes/kube-state-metrics/blob/main/docs/metrics/extend/customresourcestate-metrics.md | | features.kubeStateMetricsCore.conf.configData | ConfigData corresponds to the configuration file content. | | features.kubeStateMetricsCore.conf.configMap.items | Maps a ConfigMap data `key` to a file `path` mount. | diff --git a/docs/configuration_public.md b/docs/configuration_public.md index c536cfd615..cd0b83c420 100644 --- a/docs/configuration_public.md +++ b/docs/configuration_public.md @@ -237,6 +237,9 @@ spec: `features.helmCheck.valuesAsTags` : ValuesAsTags collects Helm values from a release and uses them as tags (Requires Agent and Cluster Agent 7.40.0+). Default: {} +`features.kataContainers.enabled` +: Enables the Kata Containers core check. Default: false + `features.kubeStateMetricsCore.collectCrMetrics` : `CollectCrMetrics` defines custom resources for the kube-state-metrics core check to collect. The datadog agent uses the same logic as upstream `kube-state-metrics`. So is its configuration. The exact structure and existing fields of each item in this list can be found in: https://github.com/kubernetes/kube-state-metrics/blob/main/docs/metrics/extend/customresourcestate-metrics.md diff --git a/internal/controller/datadogagent/controller.go b/internal/controller/datadogagent/controller.go index 943985cf13..1a2cad3ecd 100644 --- a/internal/controller/datadogagent/controller.go +++ b/internal/controller/datadogagent/controller.go @@ -43,6 +43,7 @@ import ( _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/gpu" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/helmcheck" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/hostprofiler" + _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/katacontainers" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/kubernetesstatecore" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/livecontainer" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/liveprocess" diff --git a/internal/controller/datadogagent/feature/ids.go b/internal/controller/datadogagent/feature/ids.go index 7399510e6b..b5a831f1b3 100644 --- a/internal/controller/datadogagent/feature/ids.go +++ b/internal/controller/datadogagent/feature/ids.go @@ -87,4 +87,6 @@ const ( DataPlaneIDType = "data_plane" // FlightRecorderIDType Flight Recorder feature. FlightRecorderIDType = "flightrecorder" + // KataContainersIDType Kata Containers monitoring feature. + KataContainersIDType IDType = "katacontainers" ) diff --git a/internal/controller/datadogagent/feature/katacontainers/feature.go b/internal/controller/datadogagent/feature/katacontainers/feature.go new file mode 100644 index 0000000000..e42c53826b --- /dev/null +++ b/internal/controller/datadogagent/feature/katacontainers/feature.go @@ -0,0 +1,86 @@ +// 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 katacontainers + +import ( + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/utils/ptr" + + apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common" + "github.com/DataDog/datadog-operator/api/datadoghq/v2alpha1" + apiutils "github.com/DataDog/datadog-operator/api/utils" + "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature" + "github.com/DataDog/datadog-operator/internal/controller/datadogagent/object/volume" +) + +const ( + kataVcSbsVolumeName = "kata-vc-sbs" + kataVcSbsHostPath = "/run/vc/sbs" + kataVcSbsMountPath = "/host/run/vc/sbs" + kataRunVolumeName = "kata-run" + kataRunHostPath = "/run/kata" + kataRunMountPath = "/host/run/kata" +) + +func init() { + if err := feature.Register(feature.KataContainersIDType, buildFeature); err != nil { + panic(err) + } +} + +func buildFeature(*feature.Options) feature.Feature { + return &kataContainersFeature{} +} + +type kataContainersFeature struct{} + +func (f *kataContainersFeature) ID() feature.IDType { + return feature.KataContainersIDType +} + +func (f *kataContainersFeature) Configure(_ metav1.Object, ddaSpec *v2alpha1.DatadogAgentSpec, _ *v2alpha1.RemoteConfigConfiguration) (reqComp feature.RequiredComponents) { + if ddaSpec.Features == nil || ddaSpec.Features.KataContainers == nil || !apiutils.BoolValue(ddaSpec.Features.KataContainers.Enabled) { + return reqComp + } + + reqComp.Agent = feature.RequiredComponent{ + IsRequired: ptr.To(true), + Containers: []apicommon.AgentContainerName{apicommon.CoreAgentContainerName}, + } + return reqComp +} + +func (f *kataContainersFeature) ManageDependencies(feature.ResourceManagers, string) error { + return nil +} + +func (f *kataContainersFeature) ManageClusterAgent(feature.PodTemplateManagers, string) error { + return nil +} + +func (f *kataContainersFeature) ManageNodeAgent(managers feature.PodTemplateManagers, _ string) error { + vcSbsVol, vcSbsMount := volume.GetVolumes(kataVcSbsVolumeName, kataVcSbsHostPath, kataVcSbsMountPath, true) + managers.Volume().AddVolume(&vcSbsVol) + managers.VolumeMount().AddVolumeMountToContainer(&vcSbsMount, apicommon.CoreAgentContainerName) + + kataRunVol, kataRunMount := volume.GetVolumes(kataRunVolumeName, kataRunHostPath, kataRunMountPath, true) + managers.Volume().AddVolume(&kataRunVol) + managers.VolumeMount().AddVolumeMountToContainer(&kataRunMount, apicommon.CoreAgentContainerName) + + return nil +} + +func (f *kataContainersFeature) ManageSingleContainerNodeAgent(feature.PodTemplateManagers, string) error { + return nil +} + +func (f *kataContainersFeature) ManageClusterChecksRunner(feature.PodTemplateManagers, string) error { + return nil +} + +func (f *kataContainersFeature) ManageOtelAgentGateway(feature.PodTemplateManagers, string) error { + return nil +} diff --git a/internal/controller/datadogagent/feature/katacontainers/feature_test.go b/internal/controller/datadogagent/feature/katacontainers/feature_test.go new file mode 100644 index 0000000000..b3a542ed97 --- /dev/null +++ b/internal/controller/datadogagent/feature/katacontainers/feature_test.go @@ -0,0 +1,99 @@ +// 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 katacontainers + +import ( + "testing" + + "github.com/stretchr/testify/assert" + corev1 "k8s.io/api/core/v1" + + apicommon "github.com/DataDog/datadog-operator/api/datadoghq/common" + "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature" + "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/fake" + "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/test" + "github.com/DataDog/datadog-operator/pkg/testutils" +) + +func Test_kataContainersFeature(t *testing.T) { + expectedVcSbsVolume := corev1.Volume{ + Name: kataVcSbsVolumeName, + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: kataVcSbsHostPath, + }, + }, + } + expectedVcSbsMount := corev1.VolumeMount{ + Name: kataVcSbsVolumeName, + MountPath: kataVcSbsMountPath, + ReadOnly: true, + } + expectedKataRunVolume := corev1.Volume{ + Name: kataRunVolumeName, + VolumeSource: corev1.VolumeSource{ + HostPath: &corev1.HostPathVolumeSource{ + Path: kataRunHostPath, + }, + }, + } + expectedKataRunMount := corev1.VolumeMount{ + Name: kataRunVolumeName, + MountPath: kataRunMountPath, + ReadOnly: true, + } + + tests := test.FeatureTestSuite{ + { + Name: "kata containers disabled (default)", + DDA: testutils.NewDatadogAgentBuilder(). + BuildWithDefaults(), + WantConfigure: false, + Agent: test.NewDefaultComponentTest().WithWantFunc( + func(t testing.TB, mgrInterface feature.PodTemplateManagers) { + mgr := mgrInterface.(*fake.PodTemplateManagers) + assert.Empty(t, mgr.VolumeMgr.Volumes, "no volumes should be added when kata containers is disabled") + assert.Empty(t, mgr.VolumeMountMgr.VolumeMountsByC[apicommon.CoreAgentContainerName], "no volume mounts should be added when kata containers is disabled") + }, + ), + }, + { + Name: "kata containers enabled", + DDA: testutils.NewDatadogAgentBuilder(). + WithKataContainersEnabled(true). + BuildWithDefaults(), + WantConfigure: true, + Agent: test.NewDefaultComponentTest().WithWantFunc( + func(t testing.TB, mgrInterface feature.PodTemplateManagers) { + mgr := mgrInterface.(*fake.PodTemplateManagers) + + assert.Contains(t, mgr.VolumeMgr.Volumes, &expectedVcSbsVolume, "/run/vc/sbs volume should be added") + assert.Contains(t, mgr.VolumeMgr.Volumes, &expectedKataRunVolume, "/run/kata volume should be added") + + coreAgentMounts := mgr.VolumeMountMgr.VolumeMountsByC[apicommon.CoreAgentContainerName] + assert.Contains(t, coreAgentMounts, &expectedVcSbsMount, "/run/vc/sbs mount should be added to core agent") + assert.Contains(t, coreAgentMounts, &expectedKataRunMount, "/run/kata mount should be added to core agent") + }, + ), + }, + { + Name: "kata containers explicitly disabled", + DDA: testutils.NewDatadogAgentBuilder(). + WithKataContainersEnabled(false). + BuildWithDefaults(), + WantConfigure: false, + Agent: test.NewDefaultComponentTest().WithWantFunc( + func(t testing.TB, mgrInterface feature.PodTemplateManagers) { + mgr := mgrInterface.(*fake.PodTemplateManagers) + assert.Empty(t, mgr.VolumeMgr.Volumes, "no volumes should be added when kata containers is explicitly disabled") + assert.Empty(t, mgr.VolumeMountMgr.VolumeMountsByC[apicommon.CoreAgentContainerName], "no volume mounts should be added when kata containers is explicitly disabled") + }, + ), + }, + } + + tests.Run(t, buildFeature) +} diff --git a/internal/controller/datadogagentinternal/controller.go b/internal/controller/datadogagentinternal/controller.go index 25aebff4d4..3aacc862d2 100644 --- a/internal/controller/datadogagentinternal/controller.go +++ b/internal/controller/datadogagentinternal/controller.go @@ -39,6 +39,7 @@ import ( _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/externalmetrics" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/gpu" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/helmcheck" + _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/katacontainers" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/kubernetesstatecore" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/livecontainer" _ "github.com/DataDog/datadog-operator/internal/controller/datadogagent/feature/liveprocess" diff --git a/pkg/testutils/builder.go b/pkg/testutils/builder.go index 7e90bf02c2..b156bc3f0a 100644 --- a/pkg/testutils/builder.go +++ b/pkg/testutils/builder.go @@ -1265,3 +1265,17 @@ func (builder *DatadogAgentBuilder) WithStatus(status v2alpha1.DatadogAgentStatu builder.datadogAgent.Status = status return builder } + +// KataContainers + +func (builder *DatadogAgentBuilder) initKataContainers() { + if builder.datadogAgent.Spec.Features.KataContainers == nil { + builder.datadogAgent.Spec.Features.KataContainers = &v2alpha1.KataContainersFeatureConfig{} + } +} + +func (builder *DatadogAgentBuilder) WithKataContainersEnabled(enabled bool) *DatadogAgentBuilder { + builder.initKataContainers() + builder.datadogAgent.Spec.Features.KataContainers.Enabled = ptr.To(enabled) + return builder +}