Skip to content

Commit

Permalink
Improve defaulting when spec.Agent|ClusterAgent empty (#351)
Browse files Browse the repository at this point in the history
* Improve agent defaulting by enabling it if `spec.Agent` is empty.
* Improve ClusterAgent defaulting by enabling it if `spec.ClusterAgent`
  is empty.
* Fix credentials verification function.
  • Loading branch information
clamoriniere committed Aug 10, 2021
1 parent f40ab7d commit fad93d8
Show file tree
Hide file tree
Showing 10 changed files with 177 additions and 72 deletions.
79 changes: 55 additions & 24 deletions api/v1alpha1/datadogagent_default.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,12 @@ const (
defaultUseDogStatsDSocketVolume bool = false
defaultHostDogstatsdSocketName string = "statsd.sock"
defaultHostDogstatsdSocketPath string = "/var/run/datadog"
defaultAgentEnabled bool = true
defaultClusterAgentEnabled bool = true
defaultClusterChecksRunnerEnabled bool = false
defaultApmEnabled bool = false
defaultApmHostPort int32 = 8126
defaultExternalMetricsEnabled bool = false
defaultSystemProbeEnabled bool = false
defaultSystemProbeOOMKillEnabled bool = false
defaultSystemProbeTCPQueueLengthEnabled bool = false
Expand Down Expand Up @@ -108,6 +112,9 @@ func DefaultDatadogAgent(dda *DatadogAgent) *DatadogAgentStatus {
DefaultOverride: &DatadogAgentSpec{},
}

// Override spec given featureset
FeatureOverride(&dda.Spec, dso.DefaultOverride)

// Features
// default features because it might have an impact on the other defaulting
dso.DefaultOverride.Features = *DefaultFeatures(dda)
Expand All @@ -132,9 +139,6 @@ func DefaultDatadogAgent(dda *DatadogAgent) *DatadogAgentStatus {
}
}

// Override spec given featureset
FeatureOverride(&dda.Spec, dso.DefaultOverride)

return dso
}

Expand All @@ -146,14 +150,14 @@ func FeatureOverride(dda *DatadogAgentSpec, dso *DatadogAgentSpec) {
if !BoolValue(dda.Agent.Enabled) || dda.Agent.SystemProbe != nil {
dda.Agent.SystemProbe.Enabled = NewBoolPointer(true)
dso.Agent.SystemProbe = DefaultDatadogAgentSpecAgentSystemProbe(&dda.Agent)
dso.Agent.SystemProbe.Enabled = dda.Agent.SystemProbe.Enabled
dso.Agent.SystemProbe.Enabled = NewBoolPointer(true)
}
}
if dda.Features.OrchestratorExplorer != nil && BoolValue(dda.Features.OrchestratorExplorer.Enabled) {
if !BoolValue(dda.Agent.Enabled) || dda.Agent.Process != nil {
dda.Agent.Process.Enabled = NewBoolPointer(true)
dso.Agent.Process = DefaultDatadogAgentSpecAgentProcess(&dda.Agent)
dso.Agent.Process.Enabled = dda.Agent.Process.Enabled
dso.Agent.Process.Enabled = NewBoolPointer(true)
}
}
}
Expand All @@ -163,15 +167,23 @@ func FeatureOverride(dda *DatadogAgentSpec, dso *DatadogAgentSpec) {
func DefaultDatadogAgentSpecAgent(agent *DatadogAgentSpecAgentSpec) *DatadogAgentSpecAgentSpec {
// If the Agent is not specified in the spec, disable it.
if IsEqualStruct(*agent, DatadogAgentSpecAgentSpec{}) {
agent.Enabled = NewBoolPointer(false)
return agent
agent.Enabled = NewBoolPointer(defaultAgentEnabled)

if !BoolValue(agent.Enabled) {
return agent
}
}

agentOverride := &DatadogAgentSpecAgentSpec{}
if agent.Enabled == nil {
agent.Enabled = NewBoolPointer(true)
agent.Enabled = NewBoolPointer(defaultAgentEnabled)
agentOverride.Enabled = agent.Enabled
}

if !BoolValue(agent.Enabled) {
return agentOverride
}

agentOverride := &DatadogAgentSpecAgentSpec{Enabled: agent.Enabled}
if agent.UseExtendedDaemonset == nil {
agent.UseExtendedDaemonset = NewBoolPointer(false)
agentOverride.UseExtendedDaemonset = agent.UseExtendedDaemonset
Expand Down Expand Up @@ -877,7 +889,6 @@ func DefaultDatadogFeatureKubeStateMetricsCore(ft *DatadogFeatures, withClusterC
func DefaultDatadogFeaturePrometheusScrape(ft *DatadogFeatures) *PrometheusScrapeConfig {
if ft.PrometheusScrape == nil {
ft.PrometheusScrape = &PrometheusScrapeConfig{Enabled: NewBoolPointer(defaultPrometheusScrapeEnabled)}
return ft.PrometheusScrape
}

if ft.PrometheusScrape.Enabled == nil {
Expand All @@ -902,7 +913,10 @@ func DefaultDatadogFeaturePrometheusScrape(ft *DatadogFeatures) *PrometheusScrap
func DefaultDatadogFeatureNetworkMonitoring(ft *DatadogFeatures) *NetworkMonitoringConfig {
if ft.NetworkMonitoring == nil {
ft.NetworkMonitoring = &NetworkMonitoringConfig{Enabled: NewBoolPointer(false)}
return ft.NetworkMonitoring

if !BoolValue(ft.NetworkMonitoring.Enabled) {
return ft.NetworkMonitoring
}
}

if ft.NetworkMonitoring.Enabled == nil {
Expand All @@ -919,16 +933,24 @@ func DefaultDatadogFeatureNetworkMonitoring(ft *DatadogFeatures) *NetworkMonitor
// return the defaulted DatadogAgentSpecClusterAgentSpec to update the status
func DefaultDatadogAgentSpecClusterAgent(clusterAgent *DatadogAgentSpecClusterAgentSpec) *DatadogAgentSpecClusterAgentSpec {
if IsEqualStruct(*clusterAgent, DatadogAgentSpecClusterAgentSpec{}) {
clusterAgent.Enabled = NewBoolPointer(true)
return clusterAgent
clusterAgent.Enabled = NewBoolPointer(defaultClusterAgentEnabled)

if !BoolValue(clusterAgent.Enabled) {
return clusterAgent
}
}

clusterAgentOverride := &DatadogAgentSpecClusterAgentSpec{}

if clusterAgent.Enabled == nil {
// Cluster Agent is enabled by default unless undeclared then it is set to false.
clusterAgent.Enabled = NewBoolPointer(true)
clusterAgent.Enabled = NewBoolPointer(defaultClusterAgentEnabled)
clusterAgentOverride.Enabled = clusterAgent.Enabled
}

clusterAgentOverride := &DatadogAgentSpecClusterAgentSpec{Enabled: clusterAgent.Enabled}
if !BoolValue(clusterAgent.Enabled) {
return clusterAgentOverride
}

if clusterAgent.Image == nil {
clusterAgent.Image = &ImageConfig{}
Expand Down Expand Up @@ -998,13 +1020,16 @@ func DefaultDatadogAgentSpecClusterAgentConfig(dca *DatadogAgentSpecClusterAgent
// DefaultExternalMetrics defaults the External Metrics Server's config in the Cluster Agent's config
func DefaultExternalMetrics(conf *ClusterAgentConfig) *ExternalMetricsConfig {
if conf.ExternalMetrics == nil {
conf.ExternalMetrics = &ExternalMetricsConfig{Enabled: NewBoolPointer(false)}
return conf.ExternalMetrics
conf.ExternalMetrics = &ExternalMetricsConfig{Enabled: NewBoolPointer(defaultExternalMetricsEnabled)}

if !BoolValue(conf.ExternalMetrics.Enabled) {
return conf.ExternalMetrics
}
}

extMetricsOverride := &ExternalMetricsConfig{}
if conf.ExternalMetrics.Enabled == nil {
conf.ExternalMetrics.Enabled = NewBoolPointer(true)
conf.ExternalMetrics.Enabled = NewBoolPointer(defaultExternalMetricsEnabled)
extMetricsOverride.Enabled = conf.ExternalMetrics.Enabled
}

Expand All @@ -1019,7 +1044,10 @@ func DefaultExternalMetrics(conf *ClusterAgentConfig) *ExternalMetricsConfig {
func DefaultAdmissionController(conf *ClusterAgentConfig) *AdmissionControllerConfig {
if conf.AdmissionController == nil {
conf.AdmissionController = &AdmissionControllerConfig{Enabled: NewBoolPointer(defaultAdmissionControllerEnabled)}
return conf.AdmissionController

if !BoolValue(conf.AdmissionController.Enabled) {
return conf.AdmissionController
}
}
admCtrlOverride := &AdmissionControllerConfig{}

Expand Down Expand Up @@ -1074,16 +1102,19 @@ func DefaultDatadogClusterAgentImage(dca *DatadogAgentSpecClusterAgentSpec, name
// return the defaulted DatadogAgentSpecClusterChecksRunnerSpec
func DefaultDatadogAgentSpecClusterChecksRunner(clusterChecksRunner *DatadogAgentSpecClusterChecksRunnerSpec) *DatadogAgentSpecClusterChecksRunnerSpec {
if IsEqualStruct(clusterChecksRunner, DatadogAgentSpecClusterChecksRunnerSpec{}) {
clusterChecksRunner.Enabled = NewBoolPointer(false)
return clusterChecksRunner
clusterChecksRunner.Enabled = NewBoolPointer(defaultClusterChecksRunnerEnabled)

if !BoolValue(clusterChecksRunner.Enabled) {
return clusterChecksRunner
}
}

clcOverride := &DatadogAgentSpecClusterChecksRunnerSpec{}
if clusterChecksRunner.Enabled == nil {
clusterChecksRunner.Enabled = NewBoolPointer(true)
clusterChecksRunner.Enabled = NewBoolPointer(defaultClusterChecksRunnerEnabled)
clcOverride.Enabled = clusterChecksRunner.Enabled
}

clcOverride := &DatadogAgentSpecClusterChecksRunnerSpec{Enabled: clusterChecksRunner.Enabled}

if img := DefaultDatadogAgentSpecClusterChecksRunnerImage(clusterChecksRunner, defaultAgentImageName, defaultAgentImageTag); !IsEqualStruct(img, ImageConfig{}) {
clcOverride.Image = img
}
Expand Down
27 changes: 13 additions & 14 deletions api/v1alpha1/datadogagent_default_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -268,13 +268,13 @@ func TestDefaultDatadogAgentSpecClusterAgent(t *testing.T) {
internalDefaulted DatadogAgentSpecClusterAgentSpec
}{
{
name: "empty field",
dca: DatadogAgentSpecClusterAgentSpec{},
overrideExpected: &DatadogAgentSpecClusterAgentSpec{
Enabled: NewBoolPointer(true),
name: "disable field",
dca: DatadogAgentSpecClusterAgentSpec{
Enabled: NewBoolPointer(false),
},
overrideExpected: &DatadogAgentSpecClusterAgentSpec{},
internalDefaulted: DatadogAgentSpecClusterAgentSpec{
Enabled: NewBoolPointer(true),
Enabled: NewBoolPointer(false),
},
},
{
Expand Down Expand Up @@ -348,6 +348,7 @@ func TestDefaultDatadogAgentSpecClusterAgent(t *testing.T) {
},
Config: &ClusterAgentConfig{
ExternalMetrics: &ExternalMetricsConfig{
Enabled: NewBoolPointer(true),
WpaController: true,
UseDatadogMetrics: true,
},
Expand All @@ -366,14 +367,12 @@ func TestDefaultDatadogAgentSpecClusterAgent(t *testing.T) {
NetworkPolicy: &NetworkPolicySpec{Create: NewBoolPointer(true)},
},
overrideExpected: &DatadogAgentSpecClusterAgentSpec{
Enabled: NewBoolPointer(true),
Image: &ImageConfig{
Tag: defaultClusterAgentImageTag,
},
Config: &ClusterAgentConfig{
ExternalMetrics: &ExternalMetricsConfig{
Enabled: NewBoolPointer(true),
Port: NewInt32Pointer(8443),
Port: NewInt32Pointer(8443),
},
},
},
Expand Down Expand Up @@ -427,11 +426,11 @@ func TestDefaultDatadogAgentSpecAgent(t *testing.T) {
internalDefaulted DatadogAgentSpecAgentSpec
}{
{
name: "empty field",
agent: DatadogAgentSpecAgentSpec{},
overrideExpected: &DatadogAgentSpecAgentSpec{
name: "agent disabled field",
agent: DatadogAgentSpecAgentSpec{
Enabled: NewBoolPointer(false),
},
overrideExpected: &DatadogAgentSpecAgentSpec{},
internalDefaulted: DatadogAgentSpecAgentSpec{
Enabled: NewBoolPointer(false),
},
Expand Down Expand Up @@ -717,14 +716,14 @@ func TestDefaultDatadogAgentSpecClusterChecksRunner(t *testing.T) {
{
name: "sparse conf",
clc: DatadogAgentSpecClusterChecksRunnerSpec{
Config: &ClusterChecksRunnerConfig{},
Enabled: NewBoolPointer(true),
Config: &ClusterChecksRunnerConfig{},
Image: &ImageConfig{
Name: "gcr.io/datadog/agent:latest",
Tag: defaultAgentImageTag,
},
},
overrideExpected: &DatadogAgentSpecClusterChecksRunnerSpec{
Enabled: NewBoolPointer(true),
Image: &ImageConfig{
PullPolicy: &defaultImagePullPolicy,
},
Expand Down Expand Up @@ -761,6 +760,7 @@ func TestDefaultDatadogAgentSpecClusterChecksRunner(t *testing.T) {
{
name: "some conf",
clc: DatadogAgentSpecClusterChecksRunnerSpec{
Enabled: NewBoolPointer(true),
Config: &ClusterChecksRunnerConfig{
LogLevel: NewStringPointer("DEBUG"),
HealthPort: NewInt32Pointer(1664),
Expand All @@ -771,7 +771,6 @@ func TestDefaultDatadogAgentSpecClusterChecksRunner(t *testing.T) {
},
},
overrideExpected: &DatadogAgentSpecClusterChecksRunnerSpec{
Enabled: NewBoolPointer(true),
Image: &ImageConfig{
PullPolicy: &defaultImagePullPolicy,
},
Expand Down
13 changes: 12 additions & 1 deletion api/v1alpha1/test/new.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ func NewDefaultedDatadogAgent(ns, name string, options *NewDatadogAgentOptions)
},
}
ad.Spec = datadoghqv1alpha1.DatadogAgentSpec{
Credentials: &datadoghqv1alpha1.AgentCredentials{Token: "token-foo"},
Credentials: DefaultCredentials(),
Agent: datadoghqv1alpha1.DatadogAgentSpecAgentSpec{
Image: &datadoghqv1alpha1.ImageConfig{
Name: defaultImage,
Expand Down Expand Up @@ -405,6 +405,17 @@ func NewDefaultedDatadogAgent(ns, name string, options *NewDatadogAgentOptions)
return ad
}

// DefaultCredentials generate an AgentCredentials instance for test purpose
func DefaultCredentials() *datadoghqv1alpha1.AgentCredentials {
return &datadoghqv1alpha1.AgentCredentials{
DatadogCredentials: datadoghqv1alpha1.DatadogCredentials{
APIKey: "0000000000000000000000",
AppKey: "0000000000000000000000",
},
Token: "token-foo",
}
}

// NewExtendedDaemonSetOptions set of option for the ExtendedDaemonset creation
type NewExtendedDaemonSetOptions struct {
CreationTime *time.Time
Expand Down
12 changes: 9 additions & 3 deletions controllers/datadogagent/clusteragent.go
Original file line number Diff line number Diff line change
Expand Up @@ -442,8 +442,11 @@ func newClusterAgentPodTemplate(logger logr.Logger, dda *datadoghqv1alpha1.Datad
}

// Add other volumes
volumes = append(volumes, dda.Spec.ClusterAgent.Config.Volumes...)
volumeMounts = append(volumeMounts, dda.Spec.ClusterAgent.Config.VolumeMounts...)
if dda.Spec.ClusterAgent.Config != nil {
volumes = append(volumes, dda.Spec.ClusterAgent.Config.Volumes...)
volumeMounts = append(volumeMounts, dda.Spec.ClusterAgent.Config.VolumeMounts...)
}

envs, err := getEnvVarsForClusterAgent(logger, dda)
if err != nil {
return corev1.PodTemplateSpec{}, err
Expand Down Expand Up @@ -763,7 +766,10 @@ func getClusterAgentMetricsProviderPort(config datadoghqv1alpha1.ClusterAgentCon
}

func getAdmissionControllerServiceName(dda *datadoghqv1alpha1.DatadogAgent) string {
if isClusterAgentEnabled(dda.Spec.ClusterAgent) && dda.Spec.ClusterAgent.Config.AdmissionController != nil && dda.Spec.ClusterAgent.Config.AdmissionController.ServiceName != nil {
if isClusterAgentEnabled(dda.Spec.ClusterAgent) &&
dda.Spec.ClusterAgent.Config != nil &&
dda.Spec.ClusterAgent.Config.AdmissionController != nil &&
dda.Spec.ClusterAgent.Config.AdmissionController.ServiceName != nil {
return *dda.Spec.ClusterAgent.Config.AdmissionController.ServiceName
}
return datadoghqv1alpha1.DefaultAdmissionServiceName
Expand Down
1 change: 1 addition & 0 deletions controllers/datadogagent/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ func (r *Reconciler) internalReconcile(ctx context.Context, request reconcile.Re
if err != nil {
return result, err
}

newStatus := instance.Status.DeepCopy()
reconcileFuncs :=
[]reconcileFuncInterface{
Expand Down
2 changes: 1 addition & 1 deletion controllers/datadogagent/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ func TestReconcileDatadogAgent_Reconcile(t *testing.T) {
Annotations: map[string]string{"annotations-foo-key": "annotations-bar-value"},
},
Spec: datadoghqv1alpha1.DatadogAgentSpec{
Credentials: &datadoghqv1alpha1.AgentCredentials{Token: "token-foo"},
Credentials: test.DefaultCredentials(),
Agent: datadoghqv1alpha1.DatadogAgentSpecAgentSpec{},
ClusterAgent: datadoghqv1alpha1.DatadogAgentSpecClusterAgentSpec{},
},
Expand Down

0 comments on commit fad93d8

Please sign in to comment.