From 84374bc0386dc979cdccd4275cf55a3dc8e3ebd5 Mon Sep 17 00:00:00 2001 From: Len Smith Date: Thu, 21 Sep 2023 18:03:52 -0700 Subject: [PATCH] feat: Added support for multiple class declerations in pod annotation --- sidecar.go | 13 ++++++--- sidecar_test.go | 71 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 4 deletions(-) mode change 100644 => 100755 sidecar.go mode change 100644 => 100755 sidecar_test.go diff --git a/sidecar.go b/sidecar.go old mode 100644 new mode 100755 index be4bb2f..cb63f8e --- a/sidecar.go +++ b/sidecar.go @@ -244,9 +244,15 @@ func (h *sidecarHandler) getClassData(className string) (string, error) { // Assembling telegraf configuration func (h *sidecarHandler) assembleConf(pod *corev1.Pod, className string) (telegrafConf string, err error) { - classData, err := h.ClassDataHandler.getData(className) - if err != nil { - return "", newNonFatalError(err, "telegraf-operator could not create sidecar container for unknown class") + + var classData string + + for _, className := range strings.Split(className, ",") { + singleClassData, err := h.ClassDataHandler.getData(strings.TrimSpace(className)) + if err != nil { + return "", newNonFatalError(err, "telegraf-operator could not create sidecar container for unknown class") + } + classData += singleClassData } ports := ports(pod) @@ -407,7 +413,6 @@ func (h *sidecarHandler) parseCustomTelegrafVolumeMounts(volumeMounts *map[strin if err = json.Unmarshal([]byte(telegrafVolumeMount), volumeMounts); err != nil { return err } - } return nil } diff --git a/sidecar_test.go b/sidecar_test.go old mode 100644 new mode 100755 index ee983f0..4569f88 --- a/sidecar_test.go +++ b/sidecar_test.go @@ -406,6 +406,77 @@ func Test_assembleConf(t *testing.T) { } } +func Test_assembleConfs(t *testing.T) { + tests := []struct { + name string + pod *corev1.Pod + classData string + enableDefaultInternalPlugin bool + wantConfig string + wantErr bool + }{ + { + name: "validate multiple class configs with one undefined", + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + TelegrafClass: "stdout,notdefined", + }, + }, + }, + wantErr: true, + }, + { + name: "validate multiple class configs", + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + TelegrafClass: "stdout,influxdb", + }, + }, + }, + wantConfig: ` +[[outputs.file]] +[[outputs.influxdb]]`, + }, + { + name: "validate multiple class configs with whitespace", + pod: &corev1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + TelegrafClass: "stdout , influxdb", + }, + }, + }, + wantConfig: ` +[[outputs.file]] +[[outputs.influxdb]]`, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + + handler := &sidecarHandler{ + ClassDataHandler: newMockClassDataHandler(map[string]string{"stdout": "[[outputs.file]]\n", "influxdb": "[[outputs.influxdb]]\n"}), + EnableDefaultInternalPlugin: tt.enableDefaultInternalPlugin, + RequestsCPU: defaultRequestsCPU, + RequestsMemory: defaultRequestsMemory, + LimitsCPU: defaultLimitsCPU, + LimitsMemory: defaultLimitsMemory, + Logger: &logrTesting.TestLogger{T: t}, + } + gotConfig, err := handler.assembleConf(tt.pod, tt.pod.ObjectMeta.Annotations[TelegrafClass]) + if (err != nil) != tt.wantErr { + t.Errorf("assembleConf() error = %v, wantErr %v", err, tt.wantErr) + return + } + if strings.TrimSpace(gotConfig) != strings.TrimSpace(tt.wantConfig) { + t.Errorf("assembleConf() = %v, want %v", gotConfig, tt.wantConfig) + } + }) + } +} + func Test_addSidecars(t *testing.T) { tests := []struct { name string