Skip to content

Commit 84a8a5a

Browse files
committed
add unit tests
1 parent 56f7c05 commit 84a8a5a

File tree

10 files changed

+210
-44
lines changed

10 files changed

+210
-44
lines changed

controllers/telemetry/logpipeline_controller_test.go

+8-7
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ import (
2727

2828
var (
2929
testLogPipelineConfig = logpipelinereconciler.Config{
30-
DaemonSet: types.NamespacedName{Name: "test-telemetry-fluent-bit", Namespace: "default"},
31-
ParsersConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-parsers", Namespace: "default"},
32-
LuaConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-luascripts", Namespace: "default"},
33-
SectionsConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-sections", Namespace: "default"},
34-
FilesConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-files", Namespace: "default"},
35-
EnvSecret: types.NamespacedName{Name: "test-telemetry-fluent-bit-env", Namespace: "default"},
36-
OverrideConfigMap: types.NamespacedName{Name: "override-config", Namespace: "default"},
30+
DaemonSet: types.NamespacedName{Name: "test-telemetry-fluent-bit", Namespace: "default"},
31+
ParsersConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-parsers", Namespace: "default"},
32+
LuaConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-luascripts", Namespace: "default"},
33+
SectionsConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-sections", Namespace: "default"},
34+
FilesConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-files", Namespace: "default"},
35+
EnvSecret: types.NamespacedName{Name: "test-telemetry-fluent-bit-env", Namespace: "default"},
36+
OutputTLSConfigSecret: types.NamespacedName{Name: "test-telemetry-fluent-bit-output-tls-config", Namespace: "default"},
37+
OverrideConfigMap: types.NamespacedName{Name: "override-config", Namespace: "default"},
3738
DaemonSetConfig: logpipelineresources.DaemonSetConfig{
3839
FluentBitImage: "my-fluent-bit-image",
3940
FluentBitConfigPrepperImage: "my-fluent-bit-config-image",

internal/fluentbit/config/builder/output.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,13 @@ func generateHTTPOutput(httpOutput *telemetryv1alpha1.HTTPOutput, fsBufferLimit
9090
sb.AddConfigParam("tls.verify", tlsVerify)
9191

9292
if httpOutput.TLSConfig.CA.IsDefined() {
93-
sb.AddConfigParam("tls.ca_file", fmt.Sprintf("/fluent-bit/tls/%s-ca.crt", name))
93+
sb.AddConfigParam("tls.ca_file", fmt.Sprintf("/fluent-bit/etc/output-tls-config/%s-ca.crt", name))
9494
}
9595
if httpOutput.TLSConfig.Cert.IsDefined() {
96-
sb.AddConfigParam("tls.crt_file", fmt.Sprintf("/fluent-bit/tls/%s-cert.crt", name))
96+
sb.AddConfigParam("tls.crt_file", fmt.Sprintf("/fluent-bit/etc/output-tls-config/%s-cert.crt", name))
9797
}
9898
if httpOutput.TLSConfig.Key.IsDefined() {
99-
sb.AddConfigParam("tls.key_file", fmt.Sprintf("/fluent-bit/tls/%s-key.key", name))
99+
sb.AddConfigParam("tls.key_file", fmt.Sprintf("/fluent-bit/etc/output-tls-config/%s-key.key", name))
100100
}
101101

102102
return sb.Build()

internal/fluentbit/config/builder/output_test.go

+46
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"testing"
55

66
"github.com/stretchr/testify/require"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
78

89
telemetryv1alpha1 "github.com/kyma-project/telemetry-manager/apis/telemetry/v1alpha1"
910
)
@@ -121,6 +122,51 @@ func TestCreateOutputSectionWithHTTPOutputWithSecretReference(t *testing.T) {
121122
require.Equal(t, expected, actual)
122123
}
123124

125+
func TestCreateOutputSectionWithHTTPOutputWithTLS(t *testing.T) {
126+
expected := `[OUTPUT]
127+
name http
128+
match foo.*
129+
alias foo-http
130+
allow_duplicated_headers true
131+
format json
132+
host localhost
133+
port 443
134+
retry_limit 300
135+
storage.total_limit_size 1G
136+
tls on
137+
tls.ca_file /fluent-bit/etc/output-tls-config/foo-ca.crt
138+
tls.crt_file /fluent-bit/etc/output-tls-config/foo-cert.crt
139+
tls.key_file /fluent-bit/etc/output-tls-config/foo-key.key
140+
tls.verify on
141+
uri /my-uri
142+
143+
`
144+
logPipeline := &telemetryv1alpha1.LogPipeline{
145+
ObjectMeta: metav1.ObjectMeta{Name: "foo"},
146+
Spec: telemetryv1alpha1.LogPipelineSpec{
147+
Output: telemetryv1alpha1.Output{
148+
HTTP: &telemetryv1alpha1.HTTPOutput{
149+
Dedot: true,
150+
URI: "/my-uri",
151+
Host: telemetryv1alpha1.ValueType{Value: "localhost"},
152+
TLSConfig: telemetryv1alpha1.TLSConfig{
153+
Disabled: false,
154+
SkipCertificateValidation: false,
155+
CA: telemetryv1alpha1.ValueType{Value: "fake-ca-value"},
156+
Cert: telemetryv1alpha1.ValueType{Value: "fake-cert-value"},
157+
Key: telemetryv1alpha1.ValueType{Value: "fake-key-value"},
158+
},
159+
},
160+
},
161+
},
162+
}
163+
pipelineConfig := PipelineDefaults{FsBufferLimit: "1G"}
164+
165+
actual := createOutputSection(logPipeline, pipelineConfig)
166+
require.NotEmpty(t, actual)
167+
require.Equal(t, expected, actual)
168+
}
169+
124170
func TestCreateOutputSectionWithLokiOutput(t *testing.T) {
125171
expected := `[OUTPUT]
126172
name grafana-loki

internal/reconciler/logpipeline/reconciler.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,17 @@ import (
4040
)
4141

4242
type Config struct {
43-
DaemonSet types.NamespacedName
44-
SectionsConfigMap types.NamespacedName
45-
FilesConfigMap types.NamespacedName
46-
LuaConfigMap types.NamespacedName
47-
ParsersConfigMap types.NamespacedName
48-
EnvSecret types.NamespacedName
49-
TLSConfigSecret types.NamespacedName
50-
OverrideConfigMap types.NamespacedName
51-
PipelineDefaults configbuilder.PipelineDefaults
52-
Overrides overrides.Config
53-
DaemonSetConfig resources.DaemonSetConfig
43+
DaemonSet types.NamespacedName
44+
SectionsConfigMap types.NamespacedName
45+
FilesConfigMap types.NamespacedName
46+
LuaConfigMap types.NamespacedName
47+
ParsersConfigMap types.NamespacedName
48+
EnvSecret types.NamespacedName
49+
OutputTLSConfigSecret types.NamespacedName
50+
OverrideConfigMap types.NamespacedName
51+
PipelineDefaults configbuilder.PipelineDefaults
52+
Overrides overrides.Config
53+
DaemonSetConfig resources.DaemonSetConfig
5454
}
5555

5656
//go:generate mockery --name DaemonSetProber --filename daemon_set_prober.go

internal/reconciler/logpipeline/sync.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ func (s *syncer) syncReferencedSecrets(ctx context.Context, logPipelines *teleme
156156
}
157157

158158
func (s *syncer) syncTLSConfigSecrets(ctx context.Context, logPipelines *telemetryv1alpha1.LogPipelineList) error {
159-
oldSecret, err := utils.GetOrCreateSecret(ctx, s, s.config.TLSConfigSecret)
159+
oldSecret, err := utils.GetOrCreateSecret(ctx, s, s.config.OutputTLSConfigSecret)
160160
if err != nil {
161161
return fmt.Errorf("unable to get tls config secret: %w", err)
162162
}

internal/reconciler/logpipeline/sync_test.go

+127-5
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,12 @@ import (
2121

2222
var (
2323
testConfig = Config{
24-
DaemonSet: types.NamespacedName{Name: "test-telemetry-fluent-bit", Namespace: "default"},
25-
SectionsConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-sections", Namespace: "default"},
26-
FilesConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-files", Namespace: "default"},
27-
EnvSecret: types.NamespacedName{Name: "test-telemetry-fluent-bit-env", Namespace: "default"},
28-
OverrideConfigMap: types.NamespacedName{Name: "override-config", Namespace: "default"},
24+
DaemonSet: types.NamespacedName{Name: "test-telemetry-fluent-bit", Namespace: "default"},
25+
SectionsConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-sections", Namespace: "default"},
26+
FilesConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-files", Namespace: "default"},
27+
EnvSecret: types.NamespacedName{Name: "test-telemetry-fluent-bit-env", Namespace: "default"},
28+
OutputTLSConfigSecret: types.NamespacedName{Name: "test-telemetry-fluent-bit-output-tls-config", Namespace: "default"},
29+
OverrideConfigMap: types.NamespacedName{Name: "override-config", Namespace: "default"},
2930
DaemonSetConfig: resources.DaemonSetConfig{
3031
FluentBitImage: "my-fluent-bit-image",
3132
FluentBitConfigPrepperImage: "my-fluent-bit-config-image",
@@ -396,3 +397,124 @@ func TestSyncReferencedSecrets(t *testing.T) {
396397
require.NotContains(t, envSecret.Data, "HTTP_DEFAULT_CREDS_PASSWORD")
397398
})
398399
}
400+
401+
func TestSyncTLSConfigSecrets(t *testing.T) {
402+
allPipelines := telemetryv1alpha1.LogPipelineList{
403+
Items: []telemetryv1alpha1.LogPipeline{
404+
{
405+
ObjectMeta: metav1.ObjectMeta{Name: "pipeline-1"},
406+
Spec: telemetryv1alpha1.LogPipelineSpec{
407+
Output: telemetryv1alpha1.Output{
408+
HTTP: &telemetryv1alpha1.HTTPOutput{
409+
TLSConfig: telemetryv1alpha1.TLSConfig{
410+
Disabled: false,
411+
SkipCertificateValidation: false,
412+
CA: telemetryv1alpha1.ValueType{
413+
Value: "fake-ca-value",
414+
},
415+
Cert: telemetryv1alpha1.ValueType{
416+
Value: "fake-cert-value",
417+
},
418+
Key: telemetryv1alpha1.ValueType{
419+
ValueFrom: &telemetryv1alpha1.ValueFromSource{
420+
SecretKeyRef: &telemetryv1alpha1.SecretKeyRef{
421+
Name: "my-key-secret",
422+
Namespace: "default",
423+
Key: "my-key.key",
424+
},
425+
},
426+
},
427+
},
428+
},
429+
},
430+
},
431+
},
432+
},
433+
}
434+
435+
t.Run("should add output TLS config to secret during first sync", func(t *testing.T) {
436+
keySecret := corev1.Secret{
437+
ObjectMeta: metav1.ObjectMeta{
438+
Name: "my-key-secret",
439+
Namespace: "default",
440+
},
441+
Data: map[string][]byte{"my-key.key": []byte("fake-key-value")},
442+
}
443+
444+
fakeClient := fake.NewClientBuilder().WithObjects(&keySecret).Build()
445+
sut := syncer{fakeClient, testConfig}
446+
err := sut.syncReferencedSecrets(context.Background(), &allPipelines)
447+
require.NoError(t, err)
448+
449+
var tlsConfigSecret corev1.Secret
450+
err = fakeClient.Get(context.Background(), testConfig.OutputTLSConfigSecret, &tlsConfigSecret)
451+
require.NoError(t, err)
452+
require.Contains(t, tlsConfigSecret.Data, "pipeline-1-ca.crt")
453+
require.Contains(t, tlsConfigSecret.Data, "pipeline-1-cert.crt")
454+
require.Contains(t, tlsConfigSecret.Data, "pipeline-1-key.crt")
455+
require.Equal(t, []byte("fake-ca-value"), tlsConfigSecret.Data["pipeline-1-ca.crt"])
456+
require.Equal(t, []byte("fake-cert-value"), tlsConfigSecret.Data["pipeline-1-cert.crt"])
457+
require.Equal(t, []byte("fake-key-value"), tlsConfigSecret.Data["pipeline-1-key.crt"])
458+
require.Len(t, tlsConfigSecret.OwnerReferences, 1)
459+
require.Equal(t, allPipelines.Items[0].Name, tlsConfigSecret.OwnerReferences[0].Name)
460+
})
461+
462+
t.Run("should update output TLS config in secret during subsequent sync", func(t *testing.T) {
463+
keySecret := corev1.Secret{
464+
ObjectMeta: metav1.ObjectMeta{
465+
Name: "my-key-secret",
466+
Namespace: "default",
467+
},
468+
Data: map[string][]byte{"my-key.key": []byte("fake-key-value")},
469+
}
470+
fakeClient := fake.NewClientBuilder().WithObjects(&keySecret).Build()
471+
472+
sut := syncer{fakeClient, testConfig}
473+
err := sut.syncReferencedSecrets(context.Background(), &allPipelines)
474+
require.NoError(t, err)
475+
476+
keySecret.Data["my-key.key"] = []byte("new-fake-key-value")
477+
err = fakeClient.Update(context.Background(), &keySecret)
478+
require.NoError(t, err)
479+
480+
err = sut.syncReferencedSecrets(context.Background(), &allPipelines)
481+
require.NoError(t, err)
482+
483+
var tlsConfigSecret corev1.Secret
484+
err = fakeClient.Get(context.Background(), testConfig.OutputTLSConfigSecret, &tlsConfigSecret)
485+
require.NoError(t, err)
486+
require.Contains(t, tlsConfigSecret.Data, "pipeline-1-ca.crt")
487+
require.Contains(t, tlsConfigSecret.Data, "pipeline-1-cert.crt")
488+
require.Contains(t, tlsConfigSecret.Data, "pipeline-1-key.crt")
489+
require.Equal(t, []byte("fake-ca-value"), tlsConfigSecret.Data["pipeline-1-ca.crt"])
490+
require.Equal(t, []byte("fake-cert-value"), tlsConfigSecret.Data["pipeline-1-cert.crt"])
491+
require.Equal(t, []byte("new-fake-key-value"), tlsConfigSecret.Data["pipeline-1-key.crt"])
492+
})
493+
494+
t.Run("should delete value in env secret if marked for deletion", func(t *testing.T) {
495+
keySecret := corev1.Secret{
496+
ObjectMeta: metav1.ObjectMeta{
497+
Name: "my-key-secret",
498+
Namespace: "default",
499+
},
500+
Data: map[string][]byte{"my-key.key": []byte("fake-key-value")},
501+
}
502+
fakeClient := fake.NewClientBuilder().WithObjects(&keySecret).Build()
503+
504+
sut := syncer{fakeClient, testConfig}
505+
err := sut.syncReferencedSecrets(context.Background(), &allPipelines)
506+
require.NoError(t, err)
507+
508+
now := metav1.Now()
509+
allPipelines.Items[0].SetDeletionTimestamp(&now)
510+
err = sut.syncReferencedSecrets(context.Background(), &allPipelines)
511+
require.NoError(t, err)
512+
513+
var tlsConfigSecret corev1.Secret
514+
err = fakeClient.Get(context.Background(), testConfig.OutputTLSConfigSecret, &tlsConfigSecret)
515+
require.NoError(t, err)
516+
require.NotContains(t, tlsConfigSecret.Data, "pipeline-1-ca.crt")
517+
require.NotContains(t, tlsConfigSecret.Data, "pipeline-1-cert.crt")
518+
require.NotContains(t, tlsConfigSecret.Data, "pipeline-1-key.crt")
519+
})
520+
}

internal/resources/fluentbit/resources.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func MakeDaemonSet(name types.NamespacedName, checksum string, dsConfig DaemonSe
133133
{MountPath: "/var/log", Name: "varlog", ReadOnly: true},
134134
{MountPath: "/data", Name: "varfluentbit"},
135135
{MountPath: "/files", Name: "dynamic-files"},
136-
{MountPath: "/fluent-bit/tls/", Name: "output-tls-config"},
136+
{MountPath: "/fluent-bit/etc/output-tls-config/", Name: "output-tls-config", ReadOnly: true},
137137
},
138138
},
139139
{

main.go

+9-9
Original file line numberDiff line numberDiff line change
@@ -444,15 +444,15 @@ func validateFlags() error {
444444

445445
func createLogPipelineReconciler(client client.Client) *telemetrycontrollers.LogPipelineReconciler {
446446
config := logpipeline.Config{
447-
SectionsConfigMap: types.NamespacedName{Name: "telemetry-fluent-bit-sections", Namespace: telemetryNamespace},
448-
FilesConfigMap: types.NamespacedName{Name: "telemetry-fluent-bit-files", Namespace: telemetryNamespace},
449-
LuaConfigMap: types.NamespacedName{Name: "telemetry-fluent-bit-luascripts", Namespace: telemetryNamespace},
450-
ParsersConfigMap: types.NamespacedName{Name: "telemetry-fluent-bit-parsers", Namespace: telemetryNamespace},
451-
EnvSecret: types.NamespacedName{Name: "telemetry-fluent-bit-env", Namespace: telemetryNamespace},
452-
TLSConfigSecret: types.NamespacedName{Name: "telemetry-fluent-bit-output-tls-config", Namespace: telemetryNamespace},
453-
DaemonSet: types.NamespacedName{Name: fluentBitDaemonSet, Namespace: telemetryNamespace},
454-
OverrideConfigMap: types.NamespacedName{Name: overridesConfigMapName, Namespace: telemetryNamespace},
455-
PipelineDefaults: createPipelineDefaults(),
447+
SectionsConfigMap: types.NamespacedName{Name: "telemetry-fluent-bit-sections", Namespace: telemetryNamespace},
448+
FilesConfigMap: types.NamespacedName{Name: "telemetry-fluent-bit-files", Namespace: telemetryNamespace},
449+
LuaConfigMap: types.NamespacedName{Name: "telemetry-fluent-bit-luascripts", Namespace: telemetryNamespace},
450+
ParsersConfigMap: types.NamespacedName{Name: "telemetry-fluent-bit-parsers", Namespace: telemetryNamespace},
451+
EnvSecret: types.NamespacedName{Name: "telemetry-fluent-bit-env", Namespace: telemetryNamespace},
452+
OutputTLSConfigSecret: types.NamespacedName{Name: "telemetry-fluent-bit-output-tls-config", Namespace: telemetryNamespace},
453+
DaemonSet: types.NamespacedName{Name: fluentBitDaemonSet, Namespace: telemetryNamespace},
454+
OverrideConfigMap: types.NamespacedName{Name: overridesConfigMapName, Namespace: telemetryNamespace},
455+
PipelineDefaults: createPipelineDefaults(),
456456
DaemonSetConfig: fluentbit.DaemonSetConfig{
457457
FluentBitImage: fluentBitImageVersion,
458458
FluentBitConfigPrepperImage: fluentBitConfigPrepperImageVersion,

test/e2e/logs_fluentbit_metrics_test.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import (
1414
"sigs.k8s.io/controller-runtime/pkg/client"
1515

1616
kitk8s "github.com/kyma-project/telemetry-manager/test/testkit/k8s"
17-
kymakit "github.com/kyma-project/telemetry-manager/test/testkit/kyma"
1817
kitlog "github.com/kyma-project/telemetry-manager/test/testkit/kyma/telemetry/log"
1918
. "github.com/kyma-project/telemetry-manager/test/testkit/matchers"
2019
"github.com/kyma-project/telemetry-manager/test/testkit/mocks/backend"
@@ -55,7 +54,7 @@ var _ = Describe("Logs Fluent Bit Metrics", Label("logging"), func() {
5554
It("Should have a healthy webhook", func() {
5655
Eventually(func(g Gomega) {
5756
var endPoint corev1.Endpoints
58-
key := types.NamespacedName{Name: telemetryWebhookEndpoint, Namespace: kymakit.SystemNamespaceName}
57+
key := types.NamespacedName{Name: telemetryWebhookEndpoint, Namespace: kymaSystemNamespaceName}
5958
g.Expect(k8sClient.Get(ctx, key, &endPoint)).To(Succeed())
6059
g.Expect(endPoint.Subsets).NotTo(BeEmpty())
6160
}, periodic.EventuallyTimeout, periodic.DefaultInterval).Should(Succeed())
@@ -64,12 +63,12 @@ var _ = Describe("Logs Fluent Bit Metrics", Label("logging"), func() {
6463
It("Should have a running fluent-bit daemonset", func() {
6564
Eventually(func(g Gomega) bool {
6665
var daemonSet appsv1.DaemonSet
67-
key := types.NamespacedName{Name: telemetryFluentbitName, Namespace: kymakit.SystemNamespaceName}
66+
key := types.NamespacedName{Name: telemetryFluentbitName, Namespace: kymaSystemNamespaceName}
6867
g.Expect(k8sClient.Get(ctx, key, &daemonSet)).To(Succeed())
6968

7069
listOptions := client.ListOptions{
7170
LabelSelector: labels.SelectorFromSet(daemonSet.Spec.Selector.MatchLabels),
72-
Namespace: kymakit.SystemNamespaceName,
71+
Namespace: kymaSystemNamespaceName,
7372
}
7473
var pods corev1.PodList
7574
g.Expect(k8sClient.List(ctx, &pods, &listOptions)).To(Succeed())
@@ -86,7 +85,7 @@ var _ = Describe("Logs Fluent Bit Metrics", Label("logging"), func() {
8685
It("Should be able to get fluent-bit metrics endpoint", Label(operationalTest), func() {
8786
Eventually(func(g Gomega) {
8887
resp, err := proxyClient.Get(proxyClient.ProxyURLForService(
89-
kymakit.SystemNamespaceName, telemetryFluentbitMetricServiceName, "/metrics", 2020))
88+
kymaSystemNamespaceName, telemetryFluentbitMetricServiceName, "/metrics", 2020))
9089
g.Expect(err).NotTo(HaveOccurred())
9190
g.Expect(resp).To(HaveHTTPStatus(http.StatusOK))
9291
g.Expect(resp).To(HaveHTTPBody(SatisfyAll(

test/testkit/mocks/backend/fluentd/config_map.go

-2
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ const configTemplateFluentd = `<source>
4646
port 8006
4747
weight 60
4848
</server>
49-
5049
</match>`
5150

5251
const configTemplateFluentdTLS = `<source>
@@ -78,7 +77,6 @@ const configTemplateFluentdTLS = `<source>
7877
port 8006
7978
weight 60
8079
</server>
81-
8280
</match>`
8381

8482
func (cm *ConfigMap) Name() string {

0 commit comments

Comments
 (0)