diff --git a/internal/controller/datadogagent/controller_reconcile_dca.go b/internal/controller/datadogagent/controller_reconcile_dca.go index 197d7874a1..403cae4cb2 100644 --- a/internal/controller/datadogagent/controller_reconcile_dca.go +++ b/internal/controller/datadogagent/controller_reconcile_dca.go @@ -30,66 +30,103 @@ import ( "github.com/DataDog/datadog-operator/internal/controller/datadogagent/override" "github.com/DataDog/datadog-operator/pkg/condition" "github.com/DataDog/datadog-operator/pkg/constants" + "github.com/DataDog/datadog-operator/pkg/controller/utils" "github.com/DataDog/datadog-operator/pkg/controller/utils/datadog" "github.com/DataDog/datadog-operator/pkg/kubernetes" ) -func (r *Reconciler) reconcileV2ClusterAgent(logger logr.Logger, requiredComponents feature.RequiredComponents, features []feature.Feature, dda *datadoghqv2alpha1.DatadogAgent, resourcesManager feature.ResourceManagers, newStatus *datadoghqv2alpha1.DatadogAgentStatus) (reconcile.Result, error) { +func (r *Reconciler) reconcileV2ClusterAgent(ctx context.Context, logger logr.Logger, requiredComponents feature.RequiredComponents, features []feature.Feature, dda *datadoghqv2alpha1.DatadogAgent, resourcesManager feature.ResourceManagers, newStatus *datadoghqv2alpha1.DatadogAgentStatus) (reconcile.Result, error) { var result reconcile.Result now := metav1.NewTime(time.Now()) - // Start by creating the Default Cluster-Agent deployment - deployment := componentdca.NewDefaultClusterAgentDeployment(dda.GetObjectMeta(), &dda.Spec) - podManagers := feature.NewPodTemplateManagers(&deployment.Spec.Template) - - // Set Global setting on the default deployment - global.ApplyGlobalSettingsClusterAgent(logger, podManagers, dda, resourcesManager, requiredComponents) - - // Apply features changes on the Deployment.Spec.Template - var featErrors []error - for _, feat := range features { - if errFeat := feat.ManageClusterAgent(podManagers); errFeat != nil { - featErrors = append(featErrors, errFeat) + // Get provider list for introspection + providerList := map[string]struct{}{kubernetes.LegacyProvider: {}} + if r.options.IntrospectionEnabled { + nodeList, err := r.getNodeList(ctx) + if err != nil { + return reconcile.Result{}, err } + providerList = kubernetes.GetProviderListFromNodeList(nodeList, logger) + logger.Info("providerList for cluster agent", "providerList", providerList) } - if len(featErrors) > 0 { - err := utilerrors.NewAggregate(featErrors) - updateStatusV2WithClusterAgent(deployment, newStatus, now, metav1.ConditionFalse, "ClusterAgent feature error", err.Error()) - return result, err - } - deploymentLogger := logger.WithValues("component", datadoghqv2alpha1.ClusterAgentComponentName) - - // The requiredComponents can change depending on if updates to features result in disabled components - dcaEnabled := requiredComponents.ClusterAgent.IsEnabled() - - // If Override is defined for the clusterAgent component, apply the override on the PodTemplateSpec, it will cascade to container. - if componentOverride, ok := dda.Spec.Override[datadoghqv2alpha1.ClusterAgentComponentName]; ok { - if apiutils.BoolValue(componentOverride.Disabled) { - if dcaEnabled { - // The override supersedes what's set in requiredComponents; update status to reflect the conflict - condition.UpdateDatadogAgentStatusConditions( - newStatus, - metav1.NewTime(time.Now()), - common.OverrideReconcileConflictConditionType, - metav1.ConditionTrue, - "OverrideConflict", - "ClusterAgent component is set to disabled", - true, - ) + // Reconcile cluster agent for each provider + var errs []error + for provider := range providerList { + logger.Info("DCA providerList", "provider", provider) + // Start by creating the Default Cluster-Agent deployment + deployment := componentdca.NewDefaultClusterAgentDeployment(dda.GetObjectMeta(), &dda.Spec) + podManagers := feature.NewPodTemplateManagers(&deployment.Spec.Template) + + // Set Global setting on the default deployment + global.ApplyGlobalSettingsClusterAgent(logger, podManagers, dda, resourcesManager, requiredComponents) + + // Apply features changes on the Deployment.Spec.Template + var featErrors []error + for _, feat := range features { + logger.Info("DCA feature", "feature", feat.ID()) + if errFeat := feat.ManageClusterAgent(podManagers, provider); errFeat != nil { + featErrors = append(featErrors, errFeat) + } + } + if len(featErrors) > 0 { + err := utilerrors.NewAggregate(featErrors) + updateStatusV2WithClusterAgent(deployment, newStatus, now, metav1.ConditionFalse, "ClusterAgent feature error", err.Error()) + return result, err + } + + deploymentLogger := logger.WithValues("component", datadoghqv2alpha1.ClusterAgentComponentName, "provider", provider) + + // The requiredComponents can change depending on if updates to features result in disabled components + dcaEnabled := requiredComponents.ClusterAgent.IsEnabled() + + // If Override is defined for the clusterAgent component, apply the override on the PodTemplateSpec, it will cascade to container. + if componentOverride, ok := dda.Spec.Override[datadoghqv2alpha1.ClusterAgentComponentName]; ok { + if apiutils.BoolValue(componentOverride.Disabled) { + if dcaEnabled { + // The override supersedes what's set in requiredComponents; update status to reflect the conflict + condition.UpdateDatadogAgentStatusConditions( + newStatus, + metav1.NewTime(time.Now()), + common.OverrideReconcileConflictConditionType, + metav1.ConditionTrue, + "OverrideConflict", + "ClusterAgent component is set to disabled", + true, + ) + } + deleteStatusV2WithClusterAgent(newStatus) + return r.cleanupV2ClusterAgent(deploymentLogger, dda, deployment, resourcesManager, newStatus) } + override.PodTemplateSpec(logger, podManagers, componentOverride, datadoghqv2alpha1.ClusterAgentComponentName, dda.Name) + override.Deployment(deployment, componentOverride) + } else if !dcaEnabled { + // If the override is not defined, then disable based on dcaEnabled value deleteStatusV2WithClusterAgent(newStatus) return r.cleanupV2ClusterAgent(deploymentLogger, dda, deployment, resourcesManager, newStatus) } - override.PodTemplateSpec(logger, podManagers, componentOverride, datadoghqv2alpha1.ClusterAgentComponentName, dda.Name) - override.Deployment(deployment, componentOverride) - } else if !dcaEnabled { - // If the override is not defined, then disable based on dcaEnabled value - deleteStatusV2WithClusterAgent(newStatus) - return r.cleanupV2ClusterAgent(deploymentLogger, dda, deployment, resourcesManager, newStatus) + + // Add provider label to deployment + if deployment.Labels == nil { + deployment.Labels = make(map[string]string) + } + deployment.Labels[constants.MD5AgentDeploymentProviderLabelKey] = provider + + res, err := r.createOrUpdateDeployment(deploymentLogger, dda, deployment, newStatus, updateStatusV2WithClusterAgent) + if err != nil { + errs = append(errs, err) + } + if utils.ShouldReturn(res, err) { + return res, err + } } - return r.createOrUpdateDeployment(deploymentLogger, dda, deployment, newStatus, updateStatusV2WithClusterAgent) + if len(errs) > 0 { + return result, utilerrors.NewAggregate(errs) + } + + condition.UpdateDatadogAgentStatusConditions(newStatus, now, common.ClusterAgentReconcileConditionType, metav1.ConditionTrue, "reconcile_succeed", "reconcile succeed", false) + return reconcile.Result{}, nil } func updateStatusV2WithClusterAgent(dca *appsv1.Deployment, newStatus *datadoghqv2alpha1.DatadogAgentStatus, updateTime metav1.Time, status metav1.ConditionStatus, reason, message string) { diff --git a/internal/controller/datadogagent/controller_reconcile_v2.go b/internal/controller/datadogagent/controller_reconcile_v2.go index b94169bf80..296ad08d4b 100644 --- a/internal/controller/datadogagent/controller_reconcile_v2.go +++ b/internal/controller/datadogagent/controller_reconcile_v2.go @@ -143,7 +143,7 @@ func (r *Reconciler) reconcileInstanceV2(ctx context.Context, logger logr.Logger // 2. Reconcile each component. // 2.a. Cluster Agent - result, err = r.reconcileV2ClusterAgent(logger, requiredComponents, append(configuredFeatures, enabledFeatures...), instance, resourceManagers, newStatus) + result, err = r.reconcileV2ClusterAgent(ctx, logger, requiredComponents, append(configuredFeatures, enabledFeatures...), instance, resourceManagers, newStatus) if utils.ShouldReturn(result, err) { return r.updateStatusIfNeededV2(logger, instance, newStatus, result, err, now) } diff --git a/internal/controller/datadogagent/controller_reconcile_v2_helpers_test.go b/internal/controller/datadogagent/controller_reconcile_v2_helpers_test.go index 4e902abc36..a547360d0e 100644 --- a/internal/controller/datadogagent/controller_reconcile_v2_helpers_test.go +++ b/internal/controller/datadogagent/controller_reconcile_v2_helpers_test.go @@ -42,7 +42,7 @@ func (df *dummyFeature) ManageDependencies(managers feature.ResourceManagers) er } // ManageClusterAgent returns a predefined error (or nil for success). -func (df *dummyFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (df *dummyFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return df.ManageClusterAgentError } diff --git a/internal/controller/datadogagent/feature/admissioncontroller/envvar.go b/internal/controller/datadogagent/feature/admissioncontroller/envvar.go index da94b900bf..a7d4ef1814 100644 --- a/internal/controller/datadogagent/feature/admissioncontroller/envvar.go +++ b/internal/controller/datadogagent/feature/admissioncontroller/envvar.go @@ -29,4 +29,5 @@ const ( DDAdmissionControllerCWSInstrumentationEnabled = "DD_ADMISSION_CONTROLLER_CWS_INSTRUMENTATION_ENABLED" DDAdmissionControllerCWSInstrumentationMode = "DD_ADMISSION_CONTROLLER_CWS_INSTRUMENTATION_MODE" DDAdmissionControllerKubernetesAdmissionEventsEnabled = "DD_ADMISSION_CONTROLLER_KUBERNETES_ADMISSION_EVENTS_ENABLED" + DDAdmissionControllerAddAKSSelectors = "DD_ADMISSION_CONTROLLER_ADD_AKS_SELECTORS" ) diff --git a/internal/controller/datadogagent/feature/admissioncontroller/feature.go b/internal/controller/datadogagent/feature/admissioncontroller/feature.go index 7536024b9c..d23fb74e19 100644 --- a/internal/controller/datadogagent/feature/admissioncontroller/feature.go +++ b/internal/controller/datadogagent/feature/admissioncontroller/feature.go @@ -23,6 +23,7 @@ import ( cilium "github.com/DataDog/datadog-operator/pkg/cilium/v1" "github.com/DataDog/datadog-operator/pkg/constants" "github.com/DataDog/datadog-operator/pkg/images" + "github.com/DataDog/datadog-operator/pkg/kubernetes" ) func init() { @@ -323,7 +324,7 @@ func (f *admissionControllerFeature) ManageDependencies(managers feature.Resourc return nil } -func (f *admissionControllerFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *admissionControllerFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{ Name: DDAdmissionControllerEnabled, Value: "true", @@ -405,6 +406,14 @@ func (f *admissionControllerFeature) ManageClusterAgent(managers feature.PodTemp Value: f.webhookName, }) + _, providerLabel := kubernetes.GetProviderLabelKeyValue(provider) + if providerLabel == kubernetes.AKSRoleType { + managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{ + Name: DDAdmissionControllerAddAKSSelectors, + Value: "true", + }) + } + if f.agentSidecarConfig != nil { managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{ Name: DDAdmissionControllerAgentSidecarEnabled, diff --git a/internal/controller/datadogagent/feature/admissioncontroller/feature_test.go b/internal/controller/datadogagent/feature/admissioncontroller/feature_test.go index ee4843dea5..4abb071a45 100644 --- a/internal/controller/datadogagent/feature/admissioncontroller/feature_test.go +++ b/internal/controller/datadogagent/feature/admissioncontroller/feature_test.go @@ -14,11 +14,13 @@ import ( "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/images" + "github.com/DataDog/datadog-operator/pkg/kubernetes" "github.com/DataDog/datadog-operator/pkg/testutils" "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/assert" corev1 "k8s.io/api/core/v1" + logf "sigs.k8s.io/controller-runtime/pkg/log" ) func Test_admissionControllerFeature_Configure(t *testing.T) { @@ -429,3 +431,31 @@ func sidecarInjectionWantFunc(acm, acRegistry, sidecarRegstry, imageName, imageT ) } } + +func TestAdmissionController_AddAKSSelectorsEnvVar(t *testing.T) { + logger := logf.Log.WithName("TestAdmissionController_AddAKSSelectorsEnvVar") + + dda := testutils.NewDatadogAgentBuilder(). + WithAdmissionControllerEnabled(true). + Build() + + feat := buildAdmissionControllerFeature(&feature.Options{Logger: logger}) + feat.Configure(dda, &dda.Spec, nil) + + ptm := fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{}) + + aksProvider := kubernetes.AKSCloudProvider + "-" + kubernetes.AKSRoleType + + err := feat.ManageClusterAgent(ptm, aksProvider) + assert.NoError(t, err) + + envs := ptm.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName] + expected := &corev1.EnvVar{Name: DDAdmissionControllerAddAKSSelectors, Value: "true"} + assert.Contains(t, envs, expected, "expected env var %s not found when provider is %s", DDAdmissionControllerAddAKSSelectors, aksProvider) + + ptmNoAks := fake.NewPodTemplateManagers(t, corev1.PodTemplateSpec{}) + err = feat.ManageClusterAgent(ptmNoAks, kubernetes.DefaultProvider) + assert.NoError(t, err) + envsNoAks := ptmNoAks.EnvVarMgr.EnvVarsByC[apicommon.ClusterAgentContainerName] + assert.NotContains(t, envsNoAks, expected, "env var %s should not be present when provider is not AKS", DDAdmissionControllerAddAKSSelectors) +} diff --git a/internal/controller/datadogagent/feature/apm/feature.go b/internal/controller/datadogagent/feature/apm/feature.go index 8a2611fa65..f64979f44e 100644 --- a/internal/controller/datadogagent/feature/apm/feature.go +++ b/internal/controller/datadogagent/feature/apm/feature.go @@ -301,7 +301,7 @@ func (f *apmFeature) ManageDependencies(managers feature.ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *apmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *apmFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { if f.singleStepInstrumentation != nil { if len(f.singleStepInstrumentation.disabledNamespaces) > 0 && len(f.singleStepInstrumentation.enabledNamespaces) > 0 { // This configuration is not supported diff --git a/internal/controller/datadogagent/feature/asm/feature.go b/internal/controller/datadogagent/feature/asm/feature.go index 29f7ff86a5..52cd8d6628 100644 --- a/internal/controller/datadogagent/feature/asm/feature.go +++ b/internal/controller/datadogagent/feature/asm/feature.go @@ -79,7 +79,7 @@ func (f *asmFeature) ManageDependencies(managers feature.ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *asmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *asmFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { if f.threatsEnabled { if err := managers.EnvVar().AddEnvVarToContainerWithMergeFunc(apicommon.ClusterAgentContainerName, &corev1.EnvVar{ Name: DDAdmissionControllerAppsecEnabled, diff --git a/internal/controller/datadogagent/feature/autoscaling/feature.go b/internal/controller/datadogagent/feature/autoscaling/feature.go index 282360328a..08046ca07c 100644 --- a/internal/controller/datadogagent/feature/autoscaling/feature.go +++ b/internal/controller/datadogagent/feature/autoscaling/feature.go @@ -86,7 +86,7 @@ func (f *autoscalingFeature) ManageDependencies(managers feature.ResourceManager // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *autoscalingFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *autoscalingFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{ Name: DDAutoscalingWorkloadEnabled, Value: "true", diff --git a/internal/controller/datadogagent/feature/clusterchecks/feature.go b/internal/controller/datadogagent/feature/clusterchecks/feature.go index 0698019a10..c6b1257305 100644 --- a/internal/controller/datadogagent/feature/clusterchecks/feature.go +++ b/internal/controller/datadogagent/feature/clusterchecks/feature.go @@ -147,7 +147,7 @@ func (f *clusterChecksFeature) ManageDependencies(managers feature.ResourceManag return nil } -func (f *clusterChecksFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *clusterChecksFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { managers.EnvVar().AddEnvVarToContainer( apicommon.ClusterAgentContainerName, &corev1.EnvVar{ diff --git a/internal/controller/datadogagent/feature/clusterchecks/feature_test.go b/internal/controller/datadogagent/feature/clusterchecks/feature_test.go index 4dced2ec45..169d1691c4 100644 --- a/internal/controller/datadogagent/feature/clusterchecks/feature_test.go +++ b/internal/controller/datadogagent/feature/clusterchecks/feature_test.go @@ -147,7 +147,7 @@ func TestClusterAgentChecksumsDifferentForDifferentConfig(t *testing.T) { for _, datadogAgent := range datadogAgents { feature.Configure(datadogAgent, &datadogAgent.Spec, nil) - feature.ManageClusterAgent(podTemplateManager) + feature.ManageClusterAgent(podTemplateManager, "") md5 := podTemplateManager.AnnotationMgr.Annotations[annotationKey] md5Values[md5] = "" } diff --git a/internal/controller/datadogagent/feature/cspm/feature.go b/internal/controller/datadogagent/feature/cspm/feature.go index ac861b4f3f..42dbb2755a 100644 --- a/internal/controller/datadogagent/feature/cspm/feature.go +++ b/internal/controller/datadogagent/feature/cspm/feature.go @@ -162,7 +162,7 @@ func (f *cspmFeature) ManageDependencies(managers feature.ResourceManagers) erro // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *cspmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *cspmFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { if f.customConfig != nil { var vol corev1.Volume var volMount corev1.VolumeMount diff --git a/internal/controller/datadogagent/feature/cws/feature.go b/internal/controller/datadogagent/feature/cws/feature.go index d5a140b646..1b0577814c 100644 --- a/internal/controller/datadogagent/feature/cws/feature.go +++ b/internal/controller/datadogagent/feature/cws/feature.go @@ -161,7 +161,7 @@ func (f *cwsFeature) ManageDependencies(managers feature.ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *cwsFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *cwsFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/dogstatsd/feature.go b/internal/controller/datadogagent/feature/dogstatsd/feature.go index ea8ca681cd..057280ed4c 100644 --- a/internal/controller/datadogagent/feature/dogstatsd/feature.go +++ b/internal/controller/datadogagent/feature/dogstatsd/feature.go @@ -138,7 +138,7 @@ func (f *dogstatsdFeature) ManageDependencies(managers feature.ResourceManagers) // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *dogstatsdFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *dogstatsdFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/dummy/feature.go b/internal/controller/datadogagent/feature/dummy/feature.go index 6d70266d96..86a71af937 100644 --- a/internal/controller/datadogagent/feature/dummy/feature.go +++ b/internal/controller/datadogagent/feature/dummy/feature.go @@ -47,7 +47,7 @@ func (f *dummyFeature) ManageDependencies(managers feature.ResourceManagers) err // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *dummyFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *dummyFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { podTemplate := managers.PodTemplateSpec() if podTemplate.Labels == nil { podTemplate.Labels = make(map[string]string) diff --git a/internal/controller/datadogagent/feature/ebpfcheck/feature.go b/internal/controller/datadogagent/feature/ebpfcheck/feature.go index f59484acc3..5c59121f77 100644 --- a/internal/controller/datadogagent/feature/ebpfcheck/feature.go +++ b/internal/controller/datadogagent/feature/ebpfcheck/feature.go @@ -58,7 +58,7 @@ func (f *ebpfCheckFeature) ManageDependencies(managers feature.ResourceManagers) // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *ebpfCheckFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *ebpfCheckFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/enabledefault/feature.go b/internal/controller/datadogagent/feature/enabledefault/feature.go index cbfbd3fa2a..9b9ea820ec 100644 --- a/internal/controller/datadogagent/feature/enabledefault/feature.go +++ b/internal/controller/datadogagent/feature/enabledefault/feature.go @@ -81,7 +81,7 @@ func (f *defaultFeature) ManageDependencies(managers feature.ResourceManagers) e // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *defaultFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *defaultFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/eventcollection/feature.go b/internal/controller/datadogagent/feature/eventcollection/feature.go index 26b9cce1eb..1917e0b638 100644 --- a/internal/controller/datadogagent/feature/eventcollection/feature.go +++ b/internal/controller/datadogagent/feature/eventcollection/feature.go @@ -144,7 +144,7 @@ func (f *eventCollectionFeature) ManageDependencies(managers feature.ResourceMan // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *eventCollectionFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *eventCollectionFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { // Env vars managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{ Name: DDCollectKubernetesEvents, diff --git a/internal/controller/datadogagent/feature/externalmetrics/feature.go b/internal/controller/datadogagent/feature/externalmetrics/feature.go index af2853f962..bb70699f5a 100644 --- a/internal/controller/datadogagent/feature/externalmetrics/feature.go +++ b/internal/controller/datadogagent/feature/externalmetrics/feature.go @@ -265,7 +265,7 @@ func (f *externalMetricsFeature) ManageDependencies(managers feature.ResourceMan // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *externalMetricsFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *externalMetricsFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{ Name: DDExternalMetricsProviderEnabled, Value: "true", diff --git a/internal/controller/datadogagent/feature/gpu/feature.go b/internal/controller/datadogagent/feature/gpu/feature.go index c1666a4617..67f37d9df1 100644 --- a/internal/controller/datadogagent/feature/gpu/feature.go +++ b/internal/controller/datadogagent/feature/gpu/feature.go @@ -71,7 +71,7 @@ func (f *gpuFeature) ManageDependencies(managers feature.ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *gpuFeature) ManageClusterAgent(feature.PodTemplateManagers) error { +func (f *gpuFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/helmcheck/feature.go b/internal/controller/datadogagent/feature/helmcheck/feature.go index 93386ee17d..5bd6e49aee 100644 --- a/internal/controller/datadogagent/feature/helmcheck/feature.go +++ b/internal/controller/datadogagent/feature/helmcheck/feature.go @@ -132,7 +132,7 @@ func (f *helmCheckFeature) ManageDependencies(managers feature.ResourceManagers) // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *helmCheckFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *helmCheckFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { // Manage Helm check config in configMap var vol corev1.Volume var volMount corev1.VolumeMount diff --git a/internal/controller/datadogagent/feature/kubernetesstatecore/feature.go b/internal/controller/datadogagent/feature/kubernetesstatecore/feature.go index 3b7ddfa91b..8bb8a98a8f 100644 --- a/internal/controller/datadogagent/feature/kubernetesstatecore/feature.go +++ b/internal/controller/datadogagent/feature/kubernetesstatecore/feature.go @@ -167,7 +167,7 @@ func (f *ksmFeature) ManageDependencies(managers feature.ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *ksmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *ksmFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { // Manage KSM config in configmap var vol corev1.Volume var volMount corev1.VolumeMount diff --git a/internal/controller/datadogagent/feature/livecontainer/feature.go b/internal/controller/datadogagent/feature/livecontainer/feature.go index dd1ad1aa47..c7b681a957 100644 --- a/internal/controller/datadogagent/feature/livecontainer/feature.go +++ b/internal/controller/datadogagent/feature/livecontainer/feature.go @@ -72,7 +72,7 @@ func (f *liveContainerFeature) ManageDependencies(managers feature.ResourceManag // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *liveContainerFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *liveContainerFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/liveprocess/feature.go b/internal/controller/datadogagent/feature/liveprocess/feature.go index 378806ef24..ffef8c0b3b 100644 --- a/internal/controller/datadogagent/feature/liveprocess/feature.go +++ b/internal/controller/datadogagent/feature/liveprocess/feature.go @@ -80,7 +80,7 @@ func (f *liveProcessFeature) ManageDependencies(managers feature.ResourceManager // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *liveProcessFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *liveProcessFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/logcollection/feature.go b/internal/controller/datadogagent/feature/logcollection/feature.go index 418a5b96fe..1ae004363e 100644 --- a/internal/controller/datadogagent/feature/logcollection/feature.go +++ b/internal/controller/datadogagent/feature/logcollection/feature.go @@ -89,7 +89,7 @@ func (f *logCollectionFeature) ManageDependencies(managers feature.ResourceManag // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *logCollectionFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *logCollectionFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/npm/feature.go b/internal/controller/datadogagent/feature/npm/feature.go index b0fffba20b..82fc9c3f7d 100644 --- a/internal/controller/datadogagent/feature/npm/feature.go +++ b/internal/controller/datadogagent/feature/npm/feature.go @@ -74,7 +74,7 @@ func (f *npmFeature) ManageDependencies(managers feature.ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *npmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *npmFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/oomkill/feature.go b/internal/controller/datadogagent/feature/oomkill/feature.go index 46b770ba7a..b4e1a91b5a 100644 --- a/internal/controller/datadogagent/feature/oomkill/feature.go +++ b/internal/controller/datadogagent/feature/oomkill/feature.go @@ -59,7 +59,7 @@ func (f *oomKillFeature) ManageDependencies(managers feature.ResourceManagers) e // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *oomKillFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *oomKillFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/orchestratorexplorer/feature.go b/internal/controller/datadogagent/feature/orchestratorexplorer/feature.go index 618c03ade4..ffe52fa77d 100644 --- a/internal/controller/datadogagent/feature/orchestratorexplorer/feature.go +++ b/internal/controller/datadogagent/feature/orchestratorexplorer/feature.go @@ -210,7 +210,7 @@ func (f *orchestratorExplorerFeature) ManageDependencies(managers feature.Resour // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *orchestratorExplorerFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *orchestratorExplorerFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { // Add the env var to explicitly disable this feature // Otherwise, this feature is enabled by default in the Agent code managers.EnvVar().AddEnvVar(f.getEnabledEnvVar()) diff --git a/internal/controller/datadogagent/feature/otelcollector/feature.go b/internal/controller/datadogagent/feature/otelcollector/feature.go index a08366a932..d97d3ea0a7 100644 --- a/internal/controller/datadogagent/feature/otelcollector/feature.go +++ b/internal/controller/datadogagent/feature/otelcollector/feature.go @@ -167,7 +167,7 @@ func (o *otelCollectorFeature) ManageDependencies(managers feature.ResourceManag return nil } -func (o *otelCollectorFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (o *otelCollectorFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/otlp/feature.go b/internal/controller/datadogagent/feature/otlp/feature.go index 6b9384155a..cff0d53e06 100644 --- a/internal/controller/datadogagent/feature/otlp/feature.go +++ b/internal/controller/datadogagent/feature/otlp/feature.go @@ -309,7 +309,7 @@ func (f *otlpFeature) ManageDependencies(managers feature.ResourceManagers) erro // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *otlpFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *otlpFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/processdiscovery/feature.go b/internal/controller/datadogagent/feature/processdiscovery/feature.go index a0cac6832b..5049ed8d6c 100644 --- a/internal/controller/datadogagent/feature/processdiscovery/feature.go +++ b/internal/controller/datadogagent/feature/processdiscovery/feature.go @@ -64,7 +64,7 @@ func (p processDiscoveryFeature) ManageDependencies(managers feature.ResourceMan return nil } -func (p processDiscoveryFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (p processDiscoveryFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/prometheusscrape/feature.go b/internal/controller/datadogagent/feature/prometheusscrape/feature.go index c43bfa69af..17b79ae6dc 100644 --- a/internal/controller/datadogagent/feature/prometheusscrape/feature.go +++ b/internal/controller/datadogagent/feature/prometheusscrape/feature.go @@ -84,7 +84,7 @@ func (f *prometheusScrapeFeature) ManageDependencies(managers feature.ResourceMa // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *prometheusScrapeFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *prometheusScrapeFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { managers.EnvVar().AddEnvVarToContainer(apicommon.ClusterAgentContainerName, &corev1.EnvVar{ Name: DDPrometheusScrapeEnabled, Value: "true", diff --git a/internal/controller/datadogagent/feature/remoteconfig/feature.go b/internal/controller/datadogagent/feature/remoteconfig/feature.go index 302ec87f98..11dcb3f333 100644 --- a/internal/controller/datadogagent/feature/remoteconfig/feature.go +++ b/internal/controller/datadogagent/feature/remoteconfig/feature.go @@ -91,7 +91,7 @@ func (f *rcFeature) ManageDependencies(managers feature.ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *rcFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *rcFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { enabledEnvVar := &corev1.EnvVar{ Name: DDRemoteConfigurationEnabled, Value: apiutils.BoolToString(&f.enabled), diff --git a/internal/controller/datadogagent/feature/sbom/feature.go b/internal/controller/datadogagent/feature/sbom/feature.go index d394128f0d..e9f8f593b9 100644 --- a/internal/controller/datadogagent/feature/sbom/feature.go +++ b/internal/controller/datadogagent/feature/sbom/feature.go @@ -127,7 +127,7 @@ func (f *sbomFeature) ManageDependencies(managers feature.ResourceManagers) erro // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *sbomFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *sbomFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/servicediscovery/feature.go b/internal/controller/datadogagent/feature/servicediscovery/feature.go index bb639076ac..a9d46ad5a1 100644 --- a/internal/controller/datadogagent/feature/servicediscovery/feature.go +++ b/internal/controller/datadogagent/feature/servicediscovery/feature.go @@ -63,7 +63,7 @@ func (f *serviceDiscoveryFeature) ManageDependencies(managers feature.ResourceMa // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *serviceDiscoveryFeature) ManageClusterAgent(feature.PodTemplateManagers) error { +func (f *serviceDiscoveryFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/tcpqueuelength/feature.go b/internal/controller/datadogagent/feature/tcpqueuelength/feature.go index ee2f8a0e10..1554f34c36 100644 --- a/internal/controller/datadogagent/feature/tcpqueuelength/feature.go +++ b/internal/controller/datadogagent/feature/tcpqueuelength/feature.go @@ -62,7 +62,7 @@ func (f *tcpQueueLengthFeature) ManageDependencies(managers feature.ResourceMana // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *tcpQueueLengthFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *tcpQueueLengthFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/feature/test/testsuite.go b/internal/controller/datadogagent/feature/test/testsuite.go index 9561b38700..26fca927e3 100644 --- a/internal/controller/datadogagent/feature/test/testsuite.go +++ b/internal/controller/datadogagent/feature/test/testsuite.go @@ -149,7 +149,7 @@ func runTest(t *testing.T, tt FeatureTest) { // check Manage functions if tt.ClusterAgent != nil { tplManager, _ := tt.ClusterAgent.CreateFunc(t) - _ = feat.ManageClusterAgent(tplManager) + _ = feat.ManageClusterAgent(tplManager, "") tt.ClusterAgent.WantFunc(t, tplManager) } diff --git a/internal/controller/datadogagent/feature/types.go b/internal/controller/datadogagent/feature/types.go index 200486451b..a1fca9fc05 100644 --- a/internal/controller/datadogagent/feature/types.go +++ b/internal/controller/datadogagent/feature/types.go @@ -136,7 +136,7 @@ type Feature interface { ManageDependencies(managers ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. - ManageClusterAgent(managers PodTemplateManagers) error + ManageClusterAgent(managers PodTemplateManagers, provider string) error // ManageNodeAgent allows a feature to configure the Node Agent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. ManageNodeAgent(managers PodTemplateManagers, provider string) error diff --git a/internal/controller/datadogagent/feature/usm/feature.go b/internal/controller/datadogagent/feature/usm/feature.go index 6ecd802c0a..94d951309a 100644 --- a/internal/controller/datadogagent/feature/usm/feature.go +++ b/internal/controller/datadogagent/feature/usm/feature.go @@ -87,7 +87,7 @@ func (f *usmFeature) ManageDependencies(managers feature.ResourceManagers) error // ManageClusterAgent allows a feature to configure the ClusterAgent's corev1.PodTemplateSpec // It should do nothing if the feature doesn't need to configure it. -func (f *usmFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (f *usmFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return nil } diff --git a/internal/controller/datadogagent/profile_test.go b/internal/controller/datadogagent/profile_test.go index b56691c691..79cf9747f7 100644 --- a/internal/controller/datadogagent/profile_test.go +++ b/internal/controller/datadogagent/profile_test.go @@ -255,10 +255,10 @@ func Test_computeProfileMerge(t *testing.T) { }, Name: apiutils.NewStringPointer("datadog-agent-with-profile-bar-foo-profile"), }, - v2alpha1.ClusterAgentComponentName: &v2alpha1.DatadogAgentComponentOverride{ + v2alpha1.ClusterAgentComponentName: { Disabled: apiutils.NewBoolPointer(true), }, - v2alpha1.ClusterChecksRunnerComponentName: &v2alpha1.DatadogAgentComponentOverride{ + v2alpha1.ClusterChecksRunnerComponentName: { Disabled: apiutils.NewBoolPointer(true), }, }, @@ -532,10 +532,10 @@ func Test_setProfileSpec(t *testing.T) { }, Name: apiutils.NewStringPointer("datadog-agent-with-profile-bar-foo-profile"), }, - v2alpha1.ClusterAgentComponentName: &v2alpha1.DatadogAgentComponentOverride{ + v2alpha1.ClusterAgentComponentName: { Disabled: apiutils.NewBoolPointer(true), }, - v2alpha1.ClusterChecksRunnerComponentName: &v2alpha1.DatadogAgentComponentOverride{ + v2alpha1.ClusterChecksRunnerComponentName: { Disabled: apiutils.NewBoolPointer(true), }, }, diff --git a/internal/controller/datadogagentinternal/controller_reconcile_dca.go b/internal/controller/datadogagentinternal/controller_reconcile_dca.go index f171a90b81..5406c94810 100644 --- a/internal/controller/datadogagentinternal/controller_reconcile_dca.go +++ b/internal/controller/datadogagentinternal/controller_reconcile_dca.go @@ -49,7 +49,7 @@ func (r *Reconciler) reconcileV2ClusterAgent(logger logr.Logger, requiredCompone // Apply features changes on the Deployment.Spec.Template var featErrors []error for _, feat := range features { - if errFeat := feat.ManageClusterAgent(podManagers); errFeat != nil { + if errFeat := feat.ManageClusterAgent(podManagers, kubernetes.DefaultProvider); errFeat != nil { featErrors = append(featErrors, errFeat) } } diff --git a/internal/controller/datadogagentinternal/controller_reconcile_v2_helpers_test.go b/internal/controller/datadogagentinternal/controller_reconcile_v2_helpers_test.go index 691be12960..30fa16aaa1 100644 --- a/internal/controller/datadogagentinternal/controller_reconcile_v2_helpers_test.go +++ b/internal/controller/datadogagentinternal/controller_reconcile_v2_helpers_test.go @@ -42,7 +42,7 @@ func (df *dummyFeature) ManageDependencies(managers feature.ResourceManagers) er } // ManageClusterAgent returns a predefined error (or nil for success). -func (df *dummyFeature) ManageClusterAgent(managers feature.PodTemplateManagers) error { +func (df *dummyFeature) ManageClusterAgent(managers feature.PodTemplateManagers, provider string) error { return df.ManageClusterAgentError } diff --git a/pkg/kubernetes/provider.go b/pkg/kubernetes/provider.go index 54c42bb1dc..0bedaa0bf3 100644 --- a/pkg/kubernetes/provider.go +++ b/pkg/kubernetes/provider.go @@ -31,11 +31,21 @@ const ( // GKEProviderLabel is the GKE node label used to determine the node's provider GKEProviderLabel = "cloud.google.com/gke-os-distribution" + + // AKSProviderLabel is the AKS node label used to determine the node's provider + AKSProviderLabel = "kubernetes.azure.com/role" + + // AKSCloudProvider AKS CloudProvider name + AKSCloudProvider = "aks" + + // AKSRoleType is the AKS provider type + AKSRoleType = "agent" ) // ProviderValue allowlist var providerValueAllowlist = map[string]struct{}{ - GKECosType: {}, + GKECosType: {}, + AKSRoleType: {}, } // determineProvider creates a Provider based on a map of labels @@ -47,6 +57,12 @@ func determineProvider(labels map[string]string) string { return provider } } + // AKS + if val, ok := labels[AKSProviderLabel]; ok { + if provider := generateValidProviderName(AKSCloudProvider, val); provider != "" { + return provider + } + } } return DefaultProvider @@ -131,6 +147,7 @@ func GetProviderLabelKeyValue(provider string) (string, string) { // cloud provider to label mapping providerMapping := map[string]string{ GKECloudProvider: GKEProviderLabel, + AKSCloudProvider: AKSProviderLabel, } cp, value := splitProviderSuffix(provider) diff --git a/pkg/kubernetes/provider_test.go b/pkg/kubernetes/provider_test.go index 87ac6dab12..65e9fc728e 100644 --- a/pkg/kubernetes/provider_test.go +++ b/pkg/kubernetes/provider_test.go @@ -15,6 +15,7 @@ import ( var ( defaultProvider = DefaultProvider gkeCosProvider = generateValidProviderName(GKECloudProvider, GKECosType) + aksRoleProvider = generateValidProviderName(AKSCloudProvider, AKSRoleType) ) func Test_determineProvider(t *testing.T) { @@ -43,6 +44,14 @@ func Test_determineProvider(t *testing.T) { }, provider: generateValidProviderName(GKECloudProvider, GKECosType), }, + { + name: "aks provider", + labels: map[string]string{ + "foo": "bar", + AKSProviderLabel: AKSRoleType, + }, + provider: generateValidProviderName(AKSCloudProvider, AKSRoleType), + }, } for _, tt := range tests { @@ -64,6 +73,11 @@ func Test_isProviderValueAllowed(t *testing.T) { value: GKECosType, want: true, }, + { + name: "valid value", + value: AKSRoleType, + want: true, + }, { name: "invalid value", value: "foo", @@ -105,14 +119,14 @@ func Test_sortProviders(t *testing.T) { { name: "multiple providers", existingProviders: map[string]struct{}{ - gkeCosProvider: {}, - "abcde": {}, - "zyxwv": {}, - "12345": {}, + gkeCosProvider: {}, + aksRoleProvider: {}, + "zyxwv": {}, + "12345": {}, }, wantSortedProviders: []string{ "12345", - "abcde", + aksRoleProvider, gkeCosProvider, "zyxwv", }, @@ -314,6 +328,158 @@ func Test_getProviderNodeAffinity(t *testing.T) { }, }, }, + { + name: "single aks provider", + existingProviders: map[string]struct{}{ + aksRoleProvider: {}, + }, + provider: aksRoleProvider, + wantAffinity: &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ + NodeSelectorTerms: []corev1.NodeSelectorTerm{ + { + MatchExpressions: []corev1.NodeSelectorRequirement{ + { + Key: AKSProviderLabel, + Operator: corev1.NodeSelectorOpIn, + Values: []string{ + AKSRoleType, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "one other provider, default provider with aks", + existingProviders: map[string]struct{}{ + aksRoleProvider: {}, + defaultProvider: {}, + }, + provider: defaultProvider, + wantAffinity: &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ + NodeSelectorTerms: []corev1.NodeSelectorTerm{ + { + MatchExpressions: []corev1.NodeSelectorRequirement{ + { + Key: AKSProviderLabel, + Operator: corev1.NodeSelectorOpNotIn, + Values: []string{ + AKSRoleType, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "one other provider, aks provider", + existingProviders: map[string]struct{}{ + defaultProvider: {}, + aksRoleProvider: {}, + }, + provider: aksRoleProvider, + wantAffinity: &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ + NodeSelectorTerms: []corev1.NodeSelectorTerm{ + { + MatchExpressions: []corev1.NodeSelectorRequirement{ + { + Key: AKSProviderLabel, + Operator: corev1.NodeSelectorOpIn, + Values: []string{ + AKSRoleType, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "multiple providers, default provider with aks and gke", + existingProviders: map[string]struct{}{ + aksRoleProvider: {}, + gkeCosProvider: {}, + "gke-abcde": {}, + defaultProvider: {}, + }, + provider: defaultProvider, + wantAffinity: &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ + NodeSelectorTerms: []corev1.NodeSelectorTerm{ + { + MatchExpressions: []corev1.NodeSelectorRequirement{ + { + Key: AKSProviderLabel, + Operator: corev1.NodeSelectorOpNotIn, + Values: []string{ + AKSRoleType, + }, + }, + { + Key: GKEProviderLabel, + Operator: corev1.NodeSelectorOpNotIn, + Values: []string{ + "abcde", + }, + }, + { + Key: GKEProviderLabel, + Operator: corev1.NodeSelectorOpNotIn, + Values: []string{ + GKECosType, + }, + }, + }, + }, + }, + }, + }, + }, + }, + { + name: "multiple providers, aks provider", + existingProviders: map[string]struct{}{ + defaultProvider: {}, + "gke-xyz": {}, + gkeCosProvider: {}, + aksRoleProvider: {}, + }, + provider: aksRoleProvider, + wantAffinity: &corev1.Affinity{ + NodeAffinity: &corev1.NodeAffinity{ + RequiredDuringSchedulingIgnoredDuringExecution: &corev1.NodeSelector{ + NodeSelectorTerms: []corev1.NodeSelectorTerm{ + { + MatchExpressions: []corev1.NodeSelectorRequirement{ + { + Key: AKSProviderLabel, + Operator: corev1.NodeSelectorOpIn, + Values: []string{ + AKSRoleType, + }, + }, + }, + }, + }, + }, + }, + }, + }, } for _, tt := range tests { @@ -367,6 +533,12 @@ func Test_GetProviderLabelKeyValue(t *testing.T) { wantLabel: GKEProviderLabel, wantValue: GKECosType, }, + { + name: "aks provider", + provider: aksRoleProvider, + wantLabel: AKSProviderLabel, + wantValue: AKSRoleType, + }, } for _, tt := range tests {