diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 5d1c07a58ae1dbf7ca6586baf15f9f29322465ce..6ebd77da288f2cd351313643071f609f589c3252 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -42,6 +42,12 @@ helm_lint: - helm dep update . - helm lint --strict . +unittest: + stage: test + image: registry.cern.ch/docker.io/helmunittest/helm-unittest:3.17.0-0.7.2 + script: + - helm unittest -f 'tests/**/*.yaml' . + version_test: stage: test rules: diff --git a/.helmignore b/.helmignore index df65d1087ee2367ca1d075fa9076635836ae0dff..f72da3305333c2c1bbd8ebb596c4b092f6fa3617 100644 --- a/.helmignore +++ b/.helmignore @@ -27,4 +27,5 @@ README.md .idea/ *.tmproj .vscode/ -config \ No newline at end of file +config +tests/ \ No newline at end of file diff --git a/tests/fluentbit-logs/configmap.yaml b/tests/fluentbit-logs/configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1627cb78f96cd84fb07b1f84c9cbc4605c8f5647 --- /dev/null +++ b/tests/fluentbit-logs/configmap.yaml @@ -0,0 +1,51 @@ +suite: test fluentbit-logs configmap +templates: + - fluentbit-logs/configmap.yaml +tests: + - it: should deploy nothing by default + asserts: + - containsDocument: + kind: ConfigMap + apiVersion: "apps/v1" + name: it-monit-logs-collector-fluentbit + not: true + - it: should fail to deploy if enabled due to missing cluster name + set: + logs.enabled: true + logs.fluentbit.enabled: true + asserts: + - failedTemplate: + errorMessage: "kubernetes.clusterName is missing" + - it: should fail to deploy if enabled due to missing tenant details + set: + logs.enabled: true + logs.fluentbit.enabled: true + kubernetes.clusterName: test + asserts: + - failedTemplate: + errorMessage: "Tenant name is required" + - it: should fail to deploy if enabled when tenant name available but no tenant password + set: + logs.enabled: true + logs.fluentbit.enabled: true + tenant.name: test + kubernetes.clusterName: test + asserts: + - failedTemplate: + errorMessage: "Tenant password is required" + - it: should deploy if logs processing is enabled and required values are fed + set: + tenant.name: test + tenant.password: test + kubernetes.clusterName: test + logs.enabled: true + logs.fluentbit.enabled: true + asserts: + - containsDocument: + kind: ConfigMap + apiVersion: v1 + name: it-monit-logs-collector-fluentbit + - exists: + path: data["custom_parsers.conf"] + - exists: + path: data["fluent-bit.conf"] diff --git a/tests/fluentbit-logs/daemonset.yaml b/tests/fluentbit-logs/daemonset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4669c91976fe0faa44f0a84cf480148fe3c4dd15 --- /dev/null +++ b/tests/fluentbit-logs/daemonset.yaml @@ -0,0 +1,38 @@ +suite: test fluentbit-logs daemonset +templates: + - fluentbit-logs/daemonset.yaml +tests: + - it: should not be deployed by default + asserts: + - containsDocument: + kind: DaemonSet + apiVersion: "apps/v1" + name: it-monit-logs-collector-fluentbit + not: true + - it: should be deployed if logs.enabled and logs.fluentbit.enabled is true + set: + logs.enabled: true + logs.fluentbit.enabled: true + asserts: + - containsDocument: + kind: DaemonSet + apiVersion: "apps/v1" + name: it-monit-logs-collector-fluentbit + - it: should not be deployed if logs.enabled is false + set: + logs.enabled: false + asserts: + - containsDocument: + kind: DaemonSet + apiVersion: "apps/v1" + not: true + - it: should not be deployed if logs.enabled is true and logs.fluentbit.enabled is false + set: + logs.enabled: true + logs.fluentbit.enabled: false + asserts: + - containsDocument: + kind: DaemonSet + apiVersion: "apps/v1" + name: it-monit-logs-collector-fluentbit + not: true diff --git a/tests/fluentbit-metrics/configmap.yaml b/tests/fluentbit-metrics/configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..82e9a843fb2280a87ca49742e1be32c89e3d3dfe --- /dev/null +++ b/tests/fluentbit-metrics/configmap.yaml @@ -0,0 +1,35 @@ +suite: test fluentbit-metrics configmap +templates: + - fluentbit-metrics/configmap.yaml +tests: + - it: should fail to deploy by default due to missing tenant details + asserts: + - failedTemplate: + errorMessage: "Tenant name is required" + - it: should fail to deploy if tenant name available but no tenant password + set: + tenant.name: test + asserts: + - failedTemplate: + errorMessage: "Tenant password is required" + - it: should deploy by default when required values are fed + set: + tenant.name: test + tenant.password: test + asserts: + - containsDocument: + kind: ConfigMap + apiVersion: v1 + - it: should deploy if metrics processing is enabled and required values are fed + set: + tenant.name: test + tenant.password: test + metrics.enabled: true + metrics.fluentbit.enabled: true + asserts: + - containsDocument: + kind: ConfigMap + apiVersion: v1 + name: it-monit-metrics-collector-fluentbit + - exists: + path: data["fluent-bit.yaml"] diff --git a/tests/fluentbit-metrics/statefulset.yaml b/tests/fluentbit-metrics/statefulset.yaml new file mode 100644 index 0000000000000000000000000000000000000000..56f19e06a37f517a6b0565b5a5138f340cb87c32 --- /dev/null +++ b/tests/fluentbit-metrics/statefulset.yaml @@ -0,0 +1,29 @@ +suite: test fluentbit-metrics statefulset +templates: + - fluentbit-metrics/statefulset.yaml +tests: + - it: should be deployed by default + asserts: + - containsDocument: + kind: StatefulSet + apiVersion: "apps/v1" + name: it-monit-metrics-collector-fluentbit + - it: should not be deployed if metrics.enabled is false + set: + metrics.enabled: false + asserts: + - containsDocument: + kind: StatefulSet + apiVersion: "apps/v1" + name: it-monit-metrics-collector-fluentbit + not: true + - it: should not be deployed if metrics.enabled is true and metrics.fluentbit.enabled is false + set: + metrics.enabled: true + metrics.fluentbit.enabled: false + asserts: + - containsDocument: + kind: StatefulSet + apiVersion: "apps/v1" + name: it-monit-metrics-collector-fluentbit + not: true diff --git a/tests/prometheus/prometheus.yaml b/tests/prometheus/prometheus.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a019b61ac8bf169c433bb950d0abc5132d6eab2e --- /dev/null +++ b/tests/prometheus/prometheus.yaml @@ -0,0 +1,75 @@ +suite: test prometheus prometheus +templates: + - prometheus/prometheus.yaml +tests: + - it: should not be deployed if metrics are disabled + set: + metrics.enabled: false + asserts: + - containsDocument: + kind: Prometheus + apiVersion: "monitoring.coreos.com/v1" + name: it-monit-metrics-collector-prometheus + not: true + - it: should not be deployed if Prometheus is disabled + set: + metrics.enabled: true + metrics.prometheus.enabled: false + asserts: + - containsDocument: + kind: Prometheus + apiVersion: "monitoring.coreos.com/v1" + name: it-monit-metrics-collector-prometheus + not: true + - it: should be deployed with cluster-local remote write by default + set: + kubernetes.clusterName: test + asserts: + - containsDocument: + kind: Prometheus + apiVersion: "monitoring.coreos.com/v1" + name: it-monit-metrics-collector-prometheus + - lengthEqual: + path: spec.remoteWrite + count: 1 + - equal: + path: spec.remoteWrite[0].url + value: "http://it-monit-metrics-fluentbit:8080/api/prom/push" + - it: should be deployed with no remoteWrites if no fluentbit is available + set: + kubernetes.clusterName: test + metrics.fluentbit.enabled: false + asserts: + - containsDocument: + kind: Prometheus + apiVersion: "monitoring.coreos.com/v1" + name: it-monit-metrics-collector-prometheus + - lengthEqual: + path: spec.remoteWrite + count: 0 + - it: should be deployed with external remote write if configured + set: + kubernetes.clusterName: test + metrics.fluentbit.enabled: false + metrics.prometheus.server.remoteWrite.endpoint: "http://foo:123" + asserts: + - containsDocument: + kind: Prometheus + apiVersion: "monitoring.coreos.com/v1" + name: it-monit-metrics-collector-prometheus + - contains: + path: spec.remoteWrite + content: + url: "http://foo:123" + tlsConfig: + insecureSkipVerify: true + basicAuth: + username: + name: it-monit-metrics-collector-prometheus + key: username + password: + name: it-monit-metrics-collector-prometheus + key: password + - lengthEqual: + path: spec.remoteWrite + count: 1 diff --git a/tests/prometheus/remotewritesecret.yaml b/tests/prometheus/remotewritesecret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1db96d7d614d36124bd3c31df7c3f3385bd36a07 --- /dev/null +++ b/tests/prometheus/remotewritesecret.yaml @@ -0,0 +1,36 @@ +suite: test prometheus remotewritesecret +templates: + - prometheus/remotewritesecret.yaml +tests: + - it: should be deployed with remote write specific creds if they're provided + set: + kubernetes.clusterName: test + tenant.name: test + tenant.password: tset + metrics.prometheus.server.remoteWrite.endpoint: "http://foo:123" + metrics.prometheus.server.remoteWrite.username: higgs + metrics.prometheus.server.remoteWrite.password: boson + asserts: + - containsDocument: + kind: Secret + apiVersion: "v1" + - equal: + path: data + value: + username: "aGlnZ3M=" # higgs + password: "Ym9zb24=" # boson + - it: should be deployed with tenant creds as user/password if provided + set: + kubernetes.clusterName: test + tenant.name: test + tenant.password: tset + metrics.prometheus.server.remoteWrite.endpoint: "http://foo:123" + asserts: + - containsDocument: + kind: Secret + apiVersion: "v1" + - equal: + path: data + value: + username: "dGVzdA==" # test + password: "dHNldA==" # tset