From e66ef73fc64334a2ff5f82a2d2fcaca597dc679e Mon Sep 17 00:00:00 2001 From: Avadhut Pisal Date: Wed, 19 Oct 2022 14:24:58 +0530 Subject: [PATCH] Add support for priorityClassName for collector (#1178) --- apis/v1alpha1/opentelemetrycollector_types.go | 5 ++++ .../opentelemetrycollector_webhook.go | 5 ++++ .../opentelemetrycollector_webhook_test.go | 10 +++++++ ...ntelemetry.io_opentelemetrycollectors.yaml | 4 +++ ...ntelemetry.io_opentelemetrycollectors.yaml | 4 +++ docs/api.md | 7 +++++ pkg/collector/daemonset.go | 1 + pkg/collector/daemonset_test.go | 29 +++++++++++++++++++ pkg/collector/deployment.go | 1 + pkg/collector/deployment_test.go | 29 +++++++++++++++++++ pkg/collector/statefulset.go | 1 + pkg/collector/statefulset_test.go | 29 +++++++++++++++++++ 12 files changed, 125 insertions(+) diff --git a/apis/v1alpha1/opentelemetrycollector_types.go b/apis/v1alpha1/opentelemetrycollector_types.go index 5b2ee5f0b9..9f34405b30 100644 --- a/apis/v1alpha1/opentelemetrycollector_types.go +++ b/apis/v1alpha1/opentelemetrycollector_types.go @@ -138,6 +138,11 @@ type OpenTelemetryCollectorSpec struct { // HostNetwork indicates if the pod should run in the host networking namespace. // +optional HostNetwork bool `json:"hostNetwork,omitempty"` + // If specified, indicates the pod's priority. + // If not specified, the pod priority will be default or zero if there is no + // default. + // +optional + PriorityClassName string `json:"priorityClassName,omitempty"` } // OpenTelemetryTargetAllocator defines the configurations for the Prometheus target allocator. diff --git a/apis/v1alpha1/opentelemetrycollector_webhook.go b/apis/v1alpha1/opentelemetrycollector_webhook.go index 6c8c22ccdc..6fde5d8070 100644 --- a/apis/v1alpha1/opentelemetrycollector_webhook.go +++ b/apis/v1alpha1/opentelemetrycollector_webhook.go @@ -108,6 +108,11 @@ func (r *OpenTelemetryCollector) validateCRDSpec() error { return fmt.Errorf("the OpenTelemetry Collector mode is set to %s, which does not support the attribute 'tolerations'", r.Spec.Mode) } + // validate priorityClassName + if r.Spec.Mode == ModeSidecar && r.Spec.PriorityClassName != "" { + return fmt.Errorf("the OpenTelemetry Collector mode is set to %s, which does not support the attribute 'priorityClassName'", r.Spec.Mode) + } + // validate target allocation if r.Spec.TargetAllocator.Enabled && r.Spec.Mode != ModeStatefulSet { return fmt.Errorf("the OpenTelemetry Collector mode is set to %s, which does not support the target allocation deployment", r.Spec.Mode) diff --git a/apis/v1alpha1/opentelemetrycollector_webhook_test.go b/apis/v1alpha1/opentelemetrycollector_webhook_test.go index 008067f224..3ec2879564 100644 --- a/apis/v1alpha1/opentelemetrycollector_webhook_test.go +++ b/apis/v1alpha1/opentelemetrycollector_webhook_test.go @@ -332,6 +332,16 @@ func TestOTELColValidatingWebhook(t *testing.T) { ModeDeployment, ModeDaemonSet, ModeStatefulSet, ), }, + { + name: "invalid mode with priorityClassName", + otelcol: OpenTelemetryCollector{ + Spec: OpenTelemetryCollectorSpec{ + Mode: ModeSidecar, + PriorityClassName: "test-class", + }, + }, + expectedErr: "does not support the attribute 'priorityClassName'", + }, } for _, test := range tests { diff --git a/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml b/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml index ca5d28a00c..0fdf671e4e 100644 --- a/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml +++ b/bundle/manifests/opentelemetry.io_opentelemetrycollectors.yaml @@ -660,6 +660,10 @@ spec: type: object type: array x-kubernetes-list-type: atomic + priorityClassName: + description: If specified, indicates the pod's priority. If not specified, + the pod priority will be default or zero if there is no default. + type: string replicas: description: Replicas is the number of pod instances for the underlying OpenTelemetry Collector. Set this if your are not using autoscaling diff --git a/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml b/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml index 57681b4950..06db1901ec 100644 --- a/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml +++ b/config/crd/bases/opentelemetry.io_opentelemetrycollectors.yaml @@ -658,6 +658,10 @@ spec: type: object type: array x-kubernetes-list-type: atomic + priorityClassName: + description: If specified, indicates the pod's priority. If not specified, + the pod priority will be default or zero if there is no default. + type: string replicas: description: Replicas is the number of pod instances for the underlying OpenTelemetry Collector. Set this if your are not using autoscaling diff --git a/docs/api.md b/docs/api.md index de084d0efd..1bb6512d3c 100644 --- a/docs/api.md +++ b/docs/api.md @@ -1802,6 +1802,13 @@ OpenTelemetryCollectorSpec defines the desired state of OpenTelemetryCollector. Ports allows a set of ports to be exposed by the underlying v1.Service. By default, the operator will attempt to infer the required ports by parsing the .Spec.Config property but this property can be used to open additional ports that can't be inferred by the operator, like for custom receivers.
false + + priorityClassName + string + + If specified, indicates the pod's priority. If not specified, the pod priority will be default or zero if there is no default.
+ + false replicas integer diff --git a/pkg/collector/daemonset.go b/pkg/collector/daemonset.go index dec920a094..b8245354c3 100644 --- a/pkg/collector/daemonset.go +++ b/pkg/collector/daemonset.go @@ -57,6 +57,7 @@ func DaemonSet(cfg config.Config, logger logr.Logger, otelcol v1alpha1.OpenTelem HostNetwork: otelcol.Spec.HostNetwork, DNSPolicy: getDnsPolicy(otelcol), SecurityContext: otelcol.Spec.PodSecurityContext, + PriorityClassName: otelcol.Spec.PriorityClassName, }, }, }, diff --git a/pkg/collector/daemonset_test.go b/pkg/collector/daemonset_test.go index f1705adc39..7be991de4e 100644 --- a/pkg/collector/daemonset_test.go +++ b/pkg/collector/daemonset_test.go @@ -207,3 +207,32 @@ func TestDaemonSetNodeSelector(t *testing.T) { d2 := DaemonSet(cfg, logger, otelcol_2) assert.Equal(t, d2.Spec.Template.Spec.NodeSelector, map[string]string{"node-key": "node-value"}) } + +func TestDaemonSetPriorityClassName(t *testing.T) { + 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.PriorityClassName) + + priorityClassName := "test-class" + + otelcol_2 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance-priortyClassName", + }, + Spec: v1alpha1.OpenTelemetryCollectorSpec{ + PriorityClassName: priorityClassName, + }, + } + + cfg = config.New() + + d2 := DaemonSet(cfg, logger, otelcol_2) + assert.Equal(t, priorityClassName, d2.Spec.Template.Spec.PriorityClassName) +} diff --git a/pkg/collector/deployment.go b/pkg/collector/deployment.go index bc0e4ce7c7..f6ce3fd187 100644 --- a/pkg/collector/deployment.go +++ b/pkg/collector/deployment.go @@ -59,6 +59,7 @@ func Deployment(cfg config.Config, logger logr.Logger, otelcol v1alpha1.OpenTele Tolerations: otelcol.Spec.Tolerations, NodeSelector: otelcol.Spec.NodeSelector, SecurityContext: otelcol.Spec.PodSecurityContext, + PriorityClassName: otelcol.Spec.PriorityClassName, }, }, }, diff --git a/pkg/collector/deployment_test.go b/pkg/collector/deployment_test.go index f9e1be9353..23ca4bc93d 100644 --- a/pkg/collector/deployment_test.go +++ b/pkg/collector/deployment_test.go @@ -229,3 +229,32 @@ func TestDeploymentNodeSelector(t *testing.T) { d2 := Deployment(cfg, logger, otelcol_2) assert.Equal(t, d2.Spec.Template.Spec.NodeSelector, map[string]string{"node-key": "node-value"}) } + +func TestDeploymentPriorityClassName(t *testing.T) { + 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.PriorityClassName) + + priorityClassName := "test-class" + + otelcol_2 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance-priortyClassName", + }, + Spec: v1alpha1.OpenTelemetryCollectorSpec{ + PriorityClassName: priorityClassName, + }, + } + + cfg = config.New() + + d2 := Deployment(cfg, logger, otelcol_2) + assert.Equal(t, priorityClassName, d2.Spec.Template.Spec.PriorityClassName) +} diff --git a/pkg/collector/statefulset.go b/pkg/collector/statefulset.go index cfe20fcee6..464f77caf5 100644 --- a/pkg/collector/statefulset.go +++ b/pkg/collector/statefulset.go @@ -59,6 +59,7 @@ func StatefulSet(cfg config.Config, logger logr.Logger, otelcol v1alpha1.OpenTel Tolerations: otelcol.Spec.Tolerations, NodeSelector: otelcol.Spec.NodeSelector, SecurityContext: otelcol.Spec.PodSecurityContext, + PriorityClassName: otelcol.Spec.PriorityClassName, }, }, Replicas: otelcol.Spec.Replicas, diff --git a/pkg/collector/statefulset_test.go b/pkg/collector/statefulset_test.go index add60afba6..66c5926e6e 100644 --- a/pkg/collector/statefulset_test.go +++ b/pkg/collector/statefulset_test.go @@ -288,3 +288,32 @@ func TestStatefulSetNodeSelector(t *testing.T) { d2 := StatefulSet(cfg, logger, otelcol_2) assert.Equal(t, d2.Spec.Template.Spec.NodeSelector, map[string]string{"node-key": "node-value"}) } + +func TestStatefulSetPriorityClassName(t *testing.T) { + otelcol_1 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance", + }, + } + + cfg := config.New() + + sts1 := StatefulSet(cfg, logger, otelcol_1) + assert.Empty(t, sts1.Spec.Template.Spec.PriorityClassName) + + priorityClassName := "test-class" + + otelcol_2 := v1alpha1.OpenTelemetryCollector{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-instance-priortyClassName", + }, + Spec: v1alpha1.OpenTelemetryCollectorSpec{ + PriorityClassName: priorityClassName, + }, + } + + cfg = config.New() + + sts2 := StatefulSet(cfg, logger, otelcol_2) + assert.Equal(t, priorityClassName, sts2.Spec.Template.Spec.PriorityClassName) +}