From 7a686d7fc5594bf194a62292ca87dc39c09cc1a1 Mon Sep 17 00:00:00 2001 From: Jake Utley <5660346+jutley@users.noreply.github.com> Date: Thu, 7 Apr 2022 00:49:32 -0700 Subject: [PATCH] Support nodeSelector field for non-sidecar collectors (#789) * Support nodeSelector field for non-sidecar collectors Signed-off-by: Jake Utley * Add tests for nodeSelector Signed-off-by: Jake Utley * Revise resource names in tests Signed-off-by: Jake Utley * Run make bundle Signed-off-by: Jake Utley * More automated changes after 'make test' Signed-off-by: Jake Utley * Manually revert changes to kustomization.yaml Signed-off-by: Jake Utley * Revise field description Signed-off-by: Jake Utley * Use open-telemetry image repo Signed-off-by: Jake Utley --- apis/v1alpha1/opentelemetrycollector_types.go | 7 +++- apis/v1alpha1/zz_generated.deepcopy.go | 7 ++++ ...ntelemetry.io_opentelemetrycollectors.yaml | 10 +++++- ...ntelemetry.io_opentelemetrycollectors.yaml | 10 +++++- docs/api.md | 9 ++++- pkg/collector/daemonset.go | 1 + pkg/collector/daemonset_test.go | 33 +++++++++++++++++++ pkg/collector/deployment.go | 1 + pkg/collector/deployment_test.go | 33 +++++++++++++++++++ pkg/collector/statefulset.go | 1 + pkg/collector/statefulset_test.go | 33 +++++++++++++++++++ 11 files changed, 141 insertions(+), 4 deletions(-) diff --git a/apis/v1alpha1/opentelemetrycollector_types.go b/apis/v1alpha1/opentelemetrycollector_types.go index e9a6e1dcf4..61f7e3f16a 100644 --- a/apis/v1alpha1/opentelemetrycollector_types.go +++ b/apis/v1alpha1/opentelemetrycollector_types.go @@ -108,10 +108,15 @@ type OpenTelemetryCollectorSpec struct { Resources v1.ResourceRequirements `json:"resources,omitempty"` // Toleration to schedule OpenTelemetry Collector pods. - // This is only relevant to daemonsets, statefulsets and deployments + // This is only relevant to daemonset, statefulset, and deployment mode // +optional Tolerations []v1.Toleration `json:"tolerations,omitempty"` + // NodeSelector to schedule OpenTelemetry Collector pods. + // This is only relevant to daemonset, statefulset, and deployment mode + // +optional + NodeSelector map[string]string `json:"nodeSelector,omitempty"` + // PodAnnotations is the set of annotations that will be attached to // Collector and Target Allocator pods. // +optional diff --git a/apis/v1alpha1/zz_generated.deepcopy.go b/apis/v1alpha1/zz_generated.deepcopy.go index a14c5fa08c..e375a200c1 100644 --- a/apis/v1alpha1/zz_generated.deepcopy.go +++ b/apis/v1alpha1/zz_generated.deepcopy.go @@ -330,6 +330,13 @@ func (in *OpenTelemetryCollectorSpec) DeepCopyInto(out *OpenTelemetryCollectorSp (*in)[i].DeepCopyInto(&(*out)[i]) } } + if in.NodeSelector != nil { + in, out := &in.NodeSelector, &out.NodeSelector + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } if in.PodAnnotations != nil { in, out := &in.PodAnnotations, &out.PodAnnotations *out = make(map[string]string, len(*in)) diff --git a/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml b/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml index 1d4f20b671..528f570884 100644 --- a/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml +++ b/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml @@ -232,6 +232,13 @@ spec: - sidecar - statefulset type: string + nodeSelector: + additionalProperties: + type: string + description: NodeSelector to schedule OpenTelemetry Collector pods. + This is only relevant to daemonset, statefulset, and deployment + mode + type: object podAnnotations: additionalProperties: type: string @@ -676,7 +683,8 @@ spec: type: object tolerations: description: Toleration to schedule OpenTelemetry Collector pods. - This is only relevant to daemonsets, statefulsets and deployments + This is only relevant to daemonset, statefulset, and deployment + mode items: description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching diff --git a/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml b/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml index e19701acaa..a51bde6888 100644 --- a/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml +++ b/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml @@ -230,6 +230,13 @@ spec: - sidecar - statefulset type: string + nodeSelector: + additionalProperties: + type: string + description: NodeSelector to schedule OpenTelemetry Collector pods. + This is only relevant to daemonset, statefulset, and deployment + mode + type: object podAnnotations: additionalProperties: type: string @@ -674,7 +681,8 @@ spec: type: object tolerations: description: Toleration to schedule OpenTelemetry Collector pods. - This is only relevant to daemonsets, statefulsets and deployments + This is only relevant to daemonset, statefulset, and deployment + mode items: description: The pod this Toleration is attached to tolerates any taint that matches the triple using the matching diff --git a/docs/api.md b/docs/api.md index a826628df3..9e9e42de1f 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1464,6 +1464,13 @@ OpenTelemetryCollectorSpec defines the desired state of OpenTelemetryCollector. Enum: daemonset, deployment, sidecar, statefulset
false + + nodeSelector + map[string]string + + NodeSelector to schedule OpenTelemetry Collector pods. This is only relevant to daemonset, statefulset, and deployment mode
+ + false podAnnotations map[string]string @@ -1526,7 +1533,7 @@ OpenTelemetryCollectorSpec defines the desired state of OpenTelemetryCollector. tolerations []object - Toleration to schedule OpenTelemetry Collector pods. This is only relevant to daemonsets, statefulsets and deployments
+ Toleration to schedule OpenTelemetry Collector pods. This is only relevant to daemonset, statefulset, and deployment mode
false diff --git a/pkg/collector/daemonset.go b/pkg/collector/daemonset.go index 9bbb9472b3..5af932957d 100644 --- a/pkg/collector/daemonset.go +++ b/pkg/collector/daemonset.go @@ -53,6 +53,7 @@ func DaemonSet(cfg config.Config, logger logr.Logger, otelcol v1alpha1.OpenTelem Containers: []corev1.Container{Container(cfg, logger, otelcol)}, Volumes: Volumes(cfg, otelcol), Tolerations: otelcol.Spec.Tolerations, + NodeSelector: otelcol.Spec.NodeSelector, HostNetwork: otelcol.Spec.HostNetwork, DNSPolicy: getDnsPolicy(otelcol), SecurityContext: otelcol.Spec.PodSecurityContext, diff --git a/pkg/collector/daemonset_test.go b/pkg/collector/daemonset_test.go index 03ee735e86..eab9cd9d6a 100644 --- a/pkg/collector/daemonset_test.go +++ b/pkg/collector/daemonset_test.go @@ -153,3 +153,36 @@ func TestDaemonsetFilterLabels(t *testing.T) { assert.NotContains(t, d.ObjectMeta.Labels, k) } } + +func TestDaemonSetNodeSelector(t *testing.T) { + // Test default + otelcol_1 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance", + }, + } + + cfg := config.New() + + d1 := DaemonSet(cfg, logger, otelcol_1) + + assert.Empty(t, d1.Spec.Template.Spec.NodeSelector) + + // Test nodeSelector + otelcol_2 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance-nodeselector", + }, + Spec: v1alpha1.OpenTelemetryCollectorSpec{ + HostNetwork: true, + NodeSelector: map[string]string{ + "node-key": "node-value", + }, + }, + } + + cfg = config.New() + + d2 := DaemonSet(cfg, logger, otelcol_2) + assert.Equal(t, d2.Spec.Template.Spec.NodeSelector, map[string]string{"node-key": "node-value"}) +} diff --git a/pkg/collector/deployment.go b/pkg/collector/deployment.go index 08da24b761..f69f6203fa 100644 --- a/pkg/collector/deployment.go +++ b/pkg/collector/deployment.go @@ -57,6 +57,7 @@ func Deployment(cfg config.Config, logger logr.Logger, otelcol v1alpha1.OpenTele DNSPolicy: getDnsPolicy(otelcol), HostNetwork: otelcol.Spec.HostNetwork, Tolerations: otelcol.Spec.Tolerations, + NodeSelector: otelcol.Spec.NodeSelector, SecurityContext: otelcol.Spec.PodSecurityContext, }, }, diff --git a/pkg/collector/deployment_test.go b/pkg/collector/deployment_test.go index 37a1e1caa6..145ede5329 100644 --- a/pkg/collector/deployment_test.go +++ b/pkg/collector/deployment_test.go @@ -175,3 +175,36 @@ func TestDeploymentFilterLabels(t *testing.T) { assert.NotContains(t, d.ObjectMeta.Labels, k) } } + +func TestDeploymentNodeSelector(t *testing.T) { + // Test default + otelcol_1 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance", + }, + } + + cfg := config.New() + + d1 := Deployment(cfg, logger, otelcol_1) + + assert.Empty(t, d1.Spec.Template.Spec.NodeSelector) + + // Test nodeSelector + otelcol_2 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance-nodeselector", + }, + Spec: v1alpha1.OpenTelemetryCollectorSpec{ + HostNetwork: true, + NodeSelector: map[string]string{ + "node-key": "node-value", + }, + }, + } + + cfg = config.New() + + d2 := Deployment(cfg, logger, otelcol_2) + assert.Equal(t, d2.Spec.Template.Spec.NodeSelector, map[string]string{"node-key": "node-value"}) +} diff --git a/pkg/collector/statefulset.go b/pkg/collector/statefulset.go index 9d14e52218..04fe18b334 100644 --- a/pkg/collector/statefulset.go +++ b/pkg/collector/statefulset.go @@ -57,6 +57,7 @@ func StatefulSet(cfg config.Config, logger logr.Logger, otelcol v1alpha1.OpenTel DNSPolicy: getDnsPolicy(otelcol), HostNetwork: otelcol.Spec.HostNetwork, Tolerations: otelcol.Spec.Tolerations, + NodeSelector: otelcol.Spec.NodeSelector, SecurityContext: otelcol.Spec.PodSecurityContext, }, }, diff --git a/pkg/collector/statefulset_test.go b/pkg/collector/statefulset_test.go index d26866b1ae..bfdc6e26bd 100644 --- a/pkg/collector/statefulset_test.go +++ b/pkg/collector/statefulset_test.go @@ -234,3 +234,36 @@ func TestStatefulSetFilterLabels(t *testing.T) { assert.NotContains(t, d.ObjectMeta.Labels, k) } } + +func TestStatefulSetNodeSelector(t *testing.T) { + // Test default + otelcol_1 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance", + }, + } + + cfg := config.New() + + d1 := StatefulSet(cfg, logger, otelcol_1) + + assert.Empty(t, d1.Spec.Template.Spec.NodeSelector) + + // Test nodeSelector + otelcol_2 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance-nodeselector", + }, + Spec: v1alpha1.OpenTelemetryCollectorSpec{ + HostNetwork: true, + NodeSelector: map[string]string{ + "node-key": "node-value", + }, + }, + } + + cfg = config.New() + + d2 := StatefulSet(cfg, logger, otelcol_2) + assert.Equal(t, d2.Spec.Template.Spec.NodeSelector, map[string]string{"node-key": "node-value"}) +}