diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e8afc8d64..3de155b11b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - feat(fluentd): expose extra configuration for fluentd output plugin [#2244][#2244] -- feat(monitors): the Sumo Logic monitors installation as part of the setup job [#2250][#2250] +- feat(monitors): the Sumo Logic monitors installation as part of the setup job [#2250][#2250], [#2274][#2274] ### Changed @@ -36,6 +36,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [#2250]: https://github.com/SumoLogic/sumologic-kubernetes-collection/pull/2250 [#2251]: https://github.com/SumoLogic/sumologic-kubernetes-collection/pull/2251 [#2272]: https://github.com/SumoLogic/sumologic-kubernetes-collection/pull/2272 +[#2274]: https://github.com/SumoLogic/sumologic-kubernetes-collection/pull/2274 [Unreleased]: https://github.com/SumoLogic/sumologic-kubernetes-collection/compare/v2.7.1...main ## [v2.7.1] diff --git a/deploy/helm/sumologic/conf/setup/monitors.sh b/deploy/helm/sumologic/conf/setup/monitors.sh index 5004d9452a..9b2f35a205 100644 --- a/deploy/helm/sumologic/conf/setup/monitors.sh +++ b/deploy/helm/sumologic/conf/setup/monitors.sh @@ -7,6 +7,7 @@ readonly SUMOLOGIC_ACCESSKEY SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL +INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" {{- if eq .Values.sumologic.setup.monitors.monitorStatus "enabled" }} MONITORS_DISABLED="false" @@ -14,18 +15,42 @@ MONITORS_DISABLED="false" MONITORS_DISABLED="true" {{- end}} -# verify if the k8s monitors folder already exists -MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" -readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID +# verify if the integrations folder already exists +INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" +readonly INTEGRATIONS_RESPONSE + +INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + +# and create it if necessary +if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" +fi + +# verify if the k8s monitors folder already exists +MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" +readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -44,9 +69,12 @@ if [[ -z "${MONITORS_FOLDER_ID}" ]]; then fi {{- if not (.Values.sumologic.setup.monitors.notificationEmails | empty) }} - +{{- if kindIs "slice" .Values.sumologic.setup.monitors.notificationEmails }} NOTIFICATIONS_RECIPIENTS='{{- .Values.sumologic.setup.monitors.notificationEmails | toRawJson }}' - NOTIFICATIONS_CONTENT="subject=\"Monitor Alert: {{ printf `{{ TriggerType }}` }} on {{ printf `{{ Name }}` }}\",message_body=\"Triggered {{ printf `{{ TriggerType }}` }} Alert on {{ printf `{{ Name }}` }}: {{ printf `{{ QueryURL }}` }}\"" +{{- else }} + NOTIFICATIONS_RECIPIENTS='[{{- .Values.sumologic.setup.monitors.notificationEmails | toRawJson }}]' +{{- end }} + NOTIFICATIONS_CONTENT="subject=\"Monitor Alert: {{ printf `{{TriggerType}}` }} on {{ printf `{{Name}}` }}\",message_body=\"Triggered {{ printf `{{TriggerType}}` }} alert on {{ printf `{{Name}}` }}: {{ printf `{{QueryURL}}` }}\"" NOTIFICATIONS_SETTINGS="recipients=${NOTIFICATIONS_RECIPIENTS},connection_type=\"Email\",time_zone=\"UTC\"" {{- end }} @@ -56,6 +84,7 @@ if [[ -z "${MONITORS_FOLDER_ID}" ]]; then -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ {{- if not (.Values.sumologic.setup.monitors.notificationEmails | empty) }} -var="email_notifications_critical=[{${NOTIFICATIONS_SETTINGS},${NOTIFICATIONS_CONTENT},run_for_trigger_types=[\"Critical\", \"ResolvedCritical\"]}]" \ diff --git a/deploy/helm/sumologic/values.yaml b/deploy/helm/sumologic/values.yaml index ea73dcf3bc..73b075ed7b 100644 --- a/deploy/helm/sumologic/values.yaml +++ b/deploy/helm/sumologic/values.yaml @@ -96,7 +96,7 @@ sumologic: job: image: repository: public.ecr.aws/sumologic/kubernetes-setup - tag: 3.2.2 + tag: 3.3.0 pullPolicy: IfNotPresent ## Optionally specify an array of pullSecrets. ## They will be added to serviceaccount that is used for Sumo Logic's diff --git a/tests/helm/terraform/static/all_fields.output.yaml b/tests/helm/terraform/static/all_fields.output.yaml index 88ac341a75..5fed6a80a3 100644 --- a/tests/helm/terraform/static/all_fields.output.yaml +++ b/tests/helm/terraform/static/all_fields.output.yaml @@ -155,21 +155,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -193,6 +218,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else diff --git a/tests/helm/terraform/static/collector_fields.output.yaml b/tests/helm/terraform/static/collector_fields.output.yaml index dcdcd1da71..14ecbf4651 100644 --- a/tests/helm/terraform/static/collector_fields.output.yaml +++ b/tests/helm/terraform/static/collector_fields.output.yaml @@ -154,21 +154,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -192,6 +217,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else diff --git a/tests/helm/terraform/static/conditional_sources.output.yaml b/tests/helm/terraform/static/conditional_sources.output.yaml index e229aecebb..248108aaa6 100644 --- a/tests/helm/terraform/static/conditional_sources.output.yaml +++ b/tests/helm/terraform/static/conditional_sources.output.yaml @@ -144,21 +144,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -182,6 +207,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else diff --git a/tests/helm/terraform/static/custom.output.yaml b/tests/helm/terraform/static/custom.output.yaml index e229aecebb..248108aaa6 100644 --- a/tests/helm/terraform/static/custom.output.yaml +++ b/tests/helm/terraform/static/custom.output.yaml @@ -144,21 +144,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -182,6 +207,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else diff --git a/tests/helm/terraform/static/default.output.yaml b/tests/helm/terraform/static/default.output.yaml index 9ac535817f..063ca8c4fd 100644 --- a/tests/helm/terraform/static/default.output.yaml +++ b/tests/helm/terraform/static/default.output.yaml @@ -154,21 +154,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -192,6 +217,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else diff --git a/tests/helm/terraform/static/disable_default_metrics.output.yaml b/tests/helm/terraform/static/disable_default_metrics.output.yaml index 1ac3f0c3f0..a52c98f282 100644 --- a/tests/helm/terraform/static/disable_default_metrics.output.yaml +++ b/tests/helm/terraform/static/disable_default_metrics.output.yaml @@ -153,21 +153,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -191,6 +216,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else diff --git a/tests/helm/terraform/static/disabled_monitors.output.yaml b/tests/helm/terraform/static/disabled_monitors.output.yaml index 11ea8115bb..5ec8d979c7 100644 --- a/tests/helm/terraform/static/disabled_monitors.output.yaml +++ b/tests/helm/terraform/static/disabled_monitors.output.yaml @@ -154,21 +154,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="true" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -192,6 +217,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else diff --git a/tests/helm/terraform/static/monitors_with_email_notifications.output.yaml b/tests/helm/terraform/static/monitors_with_email_notifications.output.yaml index f880e4541a..542319b890 100644 --- a/tests/helm/terraform/static/monitors_with_email_notifications.output.yaml +++ b/tests/helm/terraform/static/monitors_with_email_notifications.output.yaml @@ -154,21 +154,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -185,9 +210,8 @@ data: if [[ "${SUMOLOGIC_BASE_URL}" == "${SUMOLOGIC_ENV}" ]] ; then SUMOLOGIC_ENV="us1" fi - NOTIFICATIONS_RECIPIENTS='["test@test.lh","email@locahost.lh"]' - NOTIFICATIONS_CONTENT="subject=\"Monitor Alert: {{ TriggerType }} on {{ Name }}\",message_body=\"Triggered {{ TriggerType }} Alert on {{ Name }}: {{ QueryURL }}\"" + NOTIFICATIONS_CONTENT="subject=\"Monitor Alert: {{TriggerType}} on {{Name}}\",message_body=\"Triggered {{TriggerType}} alert on {{Name}}: {{QueryURL}}\"" NOTIFICATIONS_SETTINGS="recipients=${NOTIFICATIONS_RECIPIENTS},connection_type=\"Email\",time_zone=\"UTC\"" TF_LOG_PROVIDER=DEBUG terraform apply \ @@ -196,6 +220,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ -var="email_notifications_critical=[{${NOTIFICATIONS_SETTINGS},${NOTIFICATIONS_CONTENT},run_for_trigger_types=[\"Critical\", \"ResolvedCritical\"]}]" \ -var="email_notifications_warning=[{${NOTIFICATIONS_SETTINGS},${NOTIFICATIONS_CONTENT},run_for_trigger_types=[\"Warning\", \"ResolvedWarning\"]}]" \ diff --git a/tests/helm/terraform/static/monitors_with_single_email.input.yaml b/tests/helm/terraform/static/monitors_with_single_email.input.yaml new file mode 100644 index 0000000000..d271d4eb2a --- /dev/null +++ b/tests/helm/terraform/static/monitors_with_single_email.input.yaml @@ -0,0 +1,4 @@ +sumologic: + setup: + monitors: + notificationEmails: "email@locahost.lh" diff --git a/tests/helm/terraform/static/monitors_with_single_email.output.yaml b/tests/helm/terraform/static/monitors_with_single_email.output.yaml new file mode 100644 index 0000000000..0cb19dcc61 --- /dev/null +++ b/tests/helm/terraform/static/monitors_with_single_email.output.yaml @@ -0,0 +1,497 @@ +--- +# Source: sumologic/templates/setup/configmap.yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: RELEASE-NAME-sumologic-setup + annotations: + helm.sh/hook: pre-install,pre-upgrade + helm.sh/hook-weight: "2" + helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded + labels: + app: RELEASE-NAME-sumologic + chart: "sumologic-%CURRENT_CHART_VERSION%" + release: "RELEASE-NAME" + heritage: "Helm" +data: + custom.sh: | + #!/bin/bash + # + # This script copies files from /customer-scripts to /scripts/ basing on the filename + # + # Example file structure: + # + # /customer-scripts + # ├── dir1_main.tf + # ├── dir1_setup.sh + # ├── dir2_list.txt + # └── dir2_setup.sh + # + # Expected structure: + # + # /scripts + # ├── dir1 + # │ ├── main.tf + # │ └── setup.sh + # └── dir2 + # ├── list.txt + # └── setup.sh + # + # shellcheck disable=SC2010 + # extract target directory names from the file names using _ as separator + err_report() { + echo "Custom script error on line $1" + exit 1 + } + trap 'err_report $LINENO' ERR + + for dir in $(ls -1 /customer-scripts | grep _ | grep -oE '^.*?_' | sed 's/_//g' | sort | uniq); do + target="/scripts/${dir}" + mkdir "${target}" + # shellcheck disable=SC2010 + # Get files for given directory and take only filename part (after first _) + for file in $(ls -1 "/customer-scripts/${dir}_"* | grep -oE '_.*' | sed 's/_//g'); do + cp "/customer-scripts/${dir}_${file}" "${target}/${file}" + done + + if [[ ! -f setup.sh ]]; then + echo "You're missing setup.sh script in custom scripts directory: '${dir}'" + continue + fi + + cd "${target}" && bash setup.sh + done + fields.tf: | + resource "sumologic_field" "cluster" { + count = var.create_fields ? 1 : 0 + + field_name = "cluster" + data_type = "String" + state = "Enabled" + } + resource "sumologic_field" "container" { + count = var.create_fields ? 1 : 0 + + field_name = "container" + data_type = "String" + state = "Enabled" + } + resource "sumologic_field" "deployment" { + count = var.create_fields ? 1 : 0 + + field_name = "deployment" + data_type = "String" + state = "Enabled" + } + resource "sumologic_field" "host" { + count = var.create_fields ? 1 : 0 + + field_name = "host" + data_type = "String" + state = "Enabled" + } + resource "sumologic_field" "namespace" { + count = var.create_fields ? 1 : 0 + + field_name = "namespace" + data_type = "String" + state = "Enabled" + } + resource "sumologic_field" "node" { + count = var.create_fields ? 1 : 0 + + field_name = "node" + data_type = "String" + state = "Enabled" + } + resource "sumologic_field" "pod" { + count = var.create_fields ? 1 : 0 + + field_name = "pod" + data_type = "String" + state = "Enabled" + } + resource "sumologic_field" "service" { + count = var.create_fields ? 1 : 0 + + field_name = "service" + data_type = "String" + state = "Enabled" + } + locals.tf: | + locals { + default_events_source = "events" + default_logs_source = "logs" + apiserver_metrics_source = "apiserver-metrics" + control_plane_metrics_source = "control-plane-metrics" + controller_metrics_source = "kube-controller-manager-metrics" + default_metrics_source = "(default-metrics)" + kubelet_metrics_source = "kubelet-metrics" + node_metrics_source = "node-exporter-metrics" + scheduler_metrics_source = "kube-scheduler-metrics" + state_metrics_source = "kube-state-metrics" + } + main.tf: | + terraform { + required_providers { + sumologic = { + source = "sumologic/sumologic" + version = "~> 2.11" + } + kubernetes = { + source = "hashicorp/kubernetes" + version = "~> 1.13" + } + } + } + monitors.sh: | + #!/bin/bash + + SUMOLOGIC_ACCESSID=${SUMOLOGIC_ACCESSID:=""} + readonly SUMOLOGIC_ACCESSID + SUMOLOGIC_ACCESSKEY=${SUMOLOGIC_ACCESSKEY:=""} + readonly SUMOLOGIC_ACCESSKEY + SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} + readonly SUMOLOGIC_BASE_URL + + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" + MONITORS_FOLDER_NAME="Kubernetes" + MONITORS_DISABLED="false" + + MONITORS_ROOT_ID="$(curl -XGET -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" + readonly MONITORS_ROOT_ID + + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" + readonly MONITORS_FOLDER_ID + + if [[ -z "${MONITORS_FOLDER_ID}" ]]; then + # go to monitors directory + cd /monitors || exit 2 + + # Fall back to init -upgrade to prevent: + # Error: Inconsistent dependency lock file + terraform init -input=false || terraform init -input=false -upgrade + + # extract environment from SUMOLOGIC_BASE_URL + # see: https://help.sumologic.com/APIs/General-API-Information/Sumo-Logic-Endpoints-by-Deployment-and-Firewall-Security + SUMOLOGIC_ENV=$( echo "${SUMOLOGIC_BASE_URL}" | sed -E 's/https:\/\/.*(au|ca|de|eu|fed|in|jp|us2)\.sumologic\.com.*/\1/' ) + if [[ "${SUMOLOGIC_BASE_URL}" == "${SUMOLOGIC_ENV}" ]] ; then + SUMOLOGIC_ENV="us1" + fi + NOTIFICATIONS_RECIPIENTS='["email@locahost.lh"]' + NOTIFICATIONS_CONTENT="subject=\"Monitor Alert: {{TriggerType}} on {{Name}}\",message_body=\"Triggered {{TriggerType}} alert on {{Name}}: {{QueryURL}}\"" + NOTIFICATIONS_SETTINGS="recipients=${NOTIFICATIONS_RECIPIENTS},connection_type=\"Email\",time_zone=\"UTC\"" + + TF_LOG_PROVIDER=DEBUG terraform apply \ + -auto-approve \ + -var="access_id=${SUMOLOGIC_ACCESSID}" \ + -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ + -var="environment=${SUMOLOGIC_ENV}" \ + -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ + -var="monitors_disabled=${MONITORS_DISABLED}" \ + -var="email_notifications_critical=[{${NOTIFICATIONS_SETTINGS},${NOTIFICATIONS_CONTENT},run_for_trigger_types=[\"Critical\", \"ResolvedCritical\"]}]" \ + -var="email_notifications_warning=[{${NOTIFICATIONS_SETTINGS},${NOTIFICATIONS_CONTENT},run_for_trigger_types=[\"Warning\", \"ResolvedWarning\"]}]" \ + -var="email_notifications_missingdata=[{${NOTIFICATIONS_SETTINGS},${NOTIFICATIONS_CONTENT},run_for_trigger_types=[\"MissingData\", \"ResolvedMissingData\"]}]" \ + || { echo "Error during applying Terraform monitors."; exit 1; } + else + echo "The monitors were already installed in ${MONITORS_FOLDER_NAME}." + echo "You can (re)install them manually with:" + echo "https://github.com/SumoLogic/terraform-sumologic-sumo-logic-monitor/tree/main/monitor_packages/kubernetes" + fi + providers.tf: |- + provider "sumologic" {} + + provider "kubernetes" { + + cluster_ca_certificate = file("/var/run/secrets/kubernetes.io/serviceaccount/ca.crt") + host = "https://kubernetes.default.svc" + load_config_file = "false" + token = file("/var/run/secrets/kubernetes.io/serviceaccount/token") + } + resources.tf: | + resource "sumologic_collector" "collector" { + name = var.collector_name + fields = { + cluster = var.cluster_name + } + } + + resource "sumologic_http_source" "default_events_source" { + name = local.default_events_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "default_logs_source" { + name = local.default_logs_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "apiserver_metrics_source" { + name = local.apiserver_metrics_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "control_plane_metrics_source" { + name = local.control_plane_metrics_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "controller_metrics_source" { + name = local.controller_metrics_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "default_metrics_source" { + name = local.default_metrics_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "kubelet_metrics_source" { + name = local.kubelet_metrics_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "node_metrics_source" { + name = local.node_metrics_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "scheduler_metrics_source" { + name = local.scheduler_metrics_source + collector_id = sumologic_collector.collector.id + } + + resource "sumologic_http_source" "state_metrics_source" { + name = local.state_metrics_source + collector_id = sumologic_collector.collector.id + } + + resource "kubernetes_secret" "sumologic_collection_secret" { + metadata { + name = "sumologic" + namespace = var.namespace_name + } + + data = { + endpoint-events = sumologic_http_source.default_events_source.url + endpoint-logs = sumologic_http_source.default_logs_source.url + endpoint-metrics-apiserver = sumologic_http_source.apiserver_metrics_source.url + endpoint-control_plane_metrics_source = sumologic_http_source.control_plane_metrics_source.url + endpoint-metrics-kube-controller-manager = sumologic_http_source.controller_metrics_source.url + endpoint-metrics = sumologic_http_source.default_metrics_source.url + endpoint-metrics-kubelet = sumologic_http_source.kubelet_metrics_source.url + endpoint-metrics-node-exporter = sumologic_http_source.node_metrics_source.url + endpoint-metrics-kube-scheduler = sumologic_http_source.scheduler_metrics_source.url + endpoint-metrics-kube-state = sumologic_http_source.state_metrics_source.url + } + + type = "Opaque" + } + setup.sh: | + #!/bin/bash + + readonly DEBUG_MODE=${DEBUG_MODE:="false"} + readonly DEBUG_MODE_ENABLED_FLAG="true" + + # Let's compare the variables ignoring the case with help of ${VARIABLE,,} which makes the string lowercased + # so that we don't have to deal with True vs true vs TRUE + if [[ ${DEBUG_MODE,,} == "${DEBUG_MODE_ENABLED_FLAG}" ]]; then + echo "Entering the debug mode with continuous sleep. No setup will be performed." + echo "Please exec into the setup container and run the setup.sh by hand or set the sumologic.setup.debug=false and reinstall." + + while true; do + sleep 10 + echo "$(date) Sleeping in the debug mode..." + done + fi + + function fix_sumo_base_url() { + local BASE_URL + BASE_URL=${SUMOLOGIC_BASE_URL} + + if [[ "${BASE_URL}" =~ ^\s*$ ]]; then + BASE_URL="https://api.sumologic.com/api/" + fi + + OPTIONAL_REDIRECTION="$(curl -XGET -s -o /dev/null -D - \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${BASE_URL}"v1/collectors \ + | grep -Fi location )" + + if [[ ! ${OPTIONAL_REDIRECTION} =~ ^\s*$ ]]; then + BASE_URL=$( echo "${OPTIONAL_REDIRECTION}" | sed -E 's/.*: (https:\/\/.*(au|ca|de|eu|fed|in|jp|us2)?\.sumologic\.com\/api\/).*/\1/' ) + fi + + BASE_URL=${BASE_URL%v1*} + + echo "${BASE_URL}" + } + + SUMOLOGIC_BASE_URL=$(fix_sumo_base_url) + export SUMOLOGIC_BASE_URL + # Support proxy for Terraform + export HTTP_PROXY=${HTTP_PROXY:=""} + export HTTPS_PROXY=${HTTPS_PROXY:=""} + export NO_PROXY=${NO_PROXY:=""} + + function get_remaining_fields() { + local RESPONSE + RESPONSE="$(curl -XGET -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/fields/quota)" + readonly RESPONSE + + echo "${RESPONSE}" + } + + # Check if we'd have at least 10 fields remaining after additional fields + # would be created for the collection + function should_create_fields() { + local RESPONSE + RESPONSE=$(get_remaining_fields) + readonly RESPONSE + + if ! jq -e <<< "${RESPONSE}" ; then + printf "Failed requesting fields API:\n%s\n" "${RESPONSE}" + return 1 + fi + + if ! jq -e '.remaining' <<< "${RESPONSE}" ; then + printf "Failed requesting fields API:\n%s\n" "${RESPONSE}" + return 1 + fi + + local REMAINING + REMAINING=$(jq -e '.remaining' <<< "${RESPONSE}") + readonly REMAINING + if [[ $(( REMAINING - 8 )) -ge 10 ]] ; then + return 0 + else + return 1 + fi + } + + cp /etc/terraform/{locals,main,providers,resources,variables,fields}.tf /terraform/ + cd /terraform || exit 1 + + # Fall back to init -upgrade to prevent: + # Error: Inconsistent dependency lock file + terraform init -input=false -get=false || terraform init -input=false -upgrade + + # Sumo Logic fields + if should_create_fields ; then + readonly CREATE_FIELDS=1 + FIELDS_RESPONSE="$(curl -XGET -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/fields | jq '.data[]' )" + readonly FIELDS_RESPONSE + + declare -ra FIELDS=("cluster" "container" "deployment" "host" "namespace" "node" "pod" "service") + for FIELD in "${FIELDS[@]}" ; do + FIELD_ID=$( echo "${FIELDS_RESPONSE}" | jq -r "select(.fieldName == \"${FIELD}\") | .fieldId" ) + # Don't try to import non existing fields + if [[ -z "${FIELD_ID}" ]]; then + continue + fi + + terraform import \ + -var="create_fields=1" \ + sumologic_field."${FIELD}" "${FIELD_ID}" + done + else + readonly CREATE_FIELDS=0 + echo "Couldn't automatically create fields" + echo "You do not have enough field capacity to create the required fields automatically." + echo "Please refer to https://help.sumologic.com/Manage/Fields to manually create the fields after you have removed unused fields to free up capacity." + fi + + readonly COLLECTOR_NAME="kubernetes" + + # Sumo Logic Collector and HTTP sources + # Only import sources when collector exists. + if terraform import sumologic_collector.collector "${COLLECTOR_NAME}"; then + true # prevent to render empty if; then + terraform import sumologic_http_source.default_events_source "${COLLECTOR_NAME}/events" + terraform import sumologic_http_source.default_logs_source "${COLLECTOR_NAME}/logs" + terraform import sumologic_http_source.apiserver_metrics_source "${COLLECTOR_NAME}/apiserver-metrics" + terraform import sumologic_http_source.control_plane_metrics_source "${COLLECTOR_NAME}/control-plane-metrics" + terraform import sumologic_http_source.controller_metrics_source "${COLLECTOR_NAME}/kube-controller-manager-metrics" + terraform import sumologic_http_source.default_metrics_source "${COLLECTOR_NAME}/(default-metrics)" + terraform import sumologic_http_source.kubelet_metrics_source "${COLLECTOR_NAME}/kubelet-metrics" + terraform import sumologic_http_source.node_metrics_source "${COLLECTOR_NAME}/node-exporter-metrics" + terraform import sumologic_http_source.scheduler_metrics_source "${COLLECTOR_NAME}/kube-scheduler-metrics" + terraform import sumologic_http_source.state_metrics_source "${COLLECTOR_NAME}/kube-state-metrics" + fi + + # Kubernetes Secret + terraform import kubernetes_secret.sumologic_collection_secret sumologic/sumologic + + # Apply planned changes + TF_LOG_PROVIDER=DEBUG terraform apply \ + -auto-approve \ + -var="create_fields=${CREATE_FIELDS}" \ + || { echo "Error during applying Terraform changes"; exit 1; } + + # Setup Sumo Logic monitors if enabled + bash /etc/terraform/monitors.sh + + # Cleanup env variables + export SUMOLOGIC_BASE_URL= + export SUMOLOGIC_ACCESSKEY= + export SUMOLOGIC_ACCESSID= + + bash /etc/terraform/custom.sh + variables.tf: | + variable "cluster_name" { + type = string + default = "kubernetes" + } + + variable "collector_name" { + type = string + default = "kubernetes" + } + + variable "namespace_name" { + type = string + default = "sumologic" + } + + variable "create_fields" { + description = "If set, Terraform will attempt to create fields at Sumo Logic" + type = bool + default = true + } diff --git a/tests/helm/terraform/static/strip_extrapolation.output.yaml b/tests/helm/terraform/static/strip_extrapolation.output.yaml index bc9f83a56b..4cbc07a5ea 100644 --- a/tests/helm/terraform/static/strip_extrapolation.output.yaml +++ b/tests/helm/terraform/static/strip_extrapolation.output.yaml @@ -154,21 +154,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -192,6 +217,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else diff --git a/tests/helm/terraform/static/traces.output.yaml b/tests/helm/terraform/static/traces.output.yaml index 3ea7c249ff..6a4eedaf3a 100644 --- a/tests/helm/terraform/static/traces.output.yaml +++ b/tests/helm/terraform/static/traces.output.yaml @@ -146,21 +146,46 @@ data: SUMOLOGIC_BASE_URL=${SUMOLOGIC_BASE_URL:=""} readonly SUMOLOGIC_BASE_URL + INTEGRATIONS_FOLDER_NAME="Sumo Logic Integrations" MONITORS_FOLDER_NAME="Kubernetes" MONITORS_DISABLED="false" - # verify if the k8s monitors folder already exists - MONITORS_RESPONSE="$(curl -XGET -s \ - -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ - "${SUMOLOGIC_BASE_URL}"v1/monitors/search?query=type:folder%20"${MONITORS_FOLDER_NAME}" | jq '.[]' )" - readonly MONITORS_RESPONSE MONITORS_ROOT_ID="$(curl -XGET -s \ -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ "${SUMOLOGIC_BASE_URL}"v1/monitors/root | jq -r '.id' )" readonly MONITORS_ROOT_ID + # verify if the integrations folder already exists + INTEGRATIONS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${INTEGRATIONS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly INTEGRATIONS_RESPONSE + + INTEGRATIONS_FOLDER_ID="$( echo "${INTEGRATIONS_RESPONSE}" | \ + jq -r "select(.item.name == \"${INTEGRATIONS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + + # and create it if necessary + if [[ -z "${INTEGRATIONS_FOLDER_ID}" ]]; then + INTEGRATIONS_FOLDER_ID="$(curl -XPOST -s \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + -H "Content-Type: application/json" \ + -d "{\"name\":\"${INTEGRATIONS_FOLDER_NAME}\",\"type\":\"MonitorsLibraryFolder\",\"description\":\"Monitors provided by the Sumo Logic integrations.\"}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors?parentId="${MONITORS_ROOT_ID}" | \ + jq -r " .id" )" + fi + + # verify if the k8s monitors folder already exists + MONITORS_RESPONSE="$(curl -XGET -s -G \ + -u "${SUMOLOGIC_ACCESSID}:${SUMOLOGIC_ACCESSKEY}" \ + "${SUMOLOGIC_BASE_URL}"v1/monitors/search \ + --data-urlencode "query=type:folder ${MONITORS_FOLDER_NAME}" | \ + jq '.[]' )" + readonly MONITORS_RESPONSE + MONITORS_FOLDER_ID="$( echo "${MONITORS_RESPONSE}" | \ - jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${MONITORS_ROOT_ID}\") | .item.id" )" + jq -r "select(.item.name == \"${MONITORS_FOLDER_NAME}\") | select(.item.parentId == \"${INTEGRATIONS_FOLDER_ID}\") | .item.id" )" readonly MONITORS_FOLDER_ID if [[ -z "${MONITORS_FOLDER_ID}" ]]; then @@ -184,6 +209,7 @@ data: -var="access_key=${SUMOLOGIC_ACCESSKEY}" \ -var="environment=${SUMOLOGIC_ENV}" \ -var="folder=${MONITORS_FOLDER_NAME}" \ + -var="folder_parent_id=${INTEGRATIONS_FOLDER_ID}" \ -var="monitors_disabled=${MONITORS_DISABLED}" \ || { echo "Error during applying Terraform monitors."; exit 1; } else