| #!/bin/bash -e |
| |
| # Copyright (C) 2020 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| usage() { |
| me=`basename "$0"` |
| echo >&2 "Usage: $me [--output OUTPUT] [--dryrun] CONFIG" |
| exit 1 |
| } |
| |
| while test $# -gt 0 ; do |
| case "$1" in |
| --output) |
| shift |
| OUTPUT=$1 |
| shift |
| ;; |
| |
| --dryrun) |
| DRYRUN="true" |
| shift |
| ;; |
| |
| *) |
| break |
| esac |
| done |
| |
| test -z "$OUTPUT" && OUTPUT="$(dirname $0)/dist" |
| |
| CONFIG=$1 |
| test -z "$CONFIG" && usage |
| |
| NAMESPACE=$(yq r $CONFIG namespace) |
| TMP_CONFIG=$OUTPUT/$(basename $CONFIG) |
| |
| function updateOrInstall() { |
| if test -n "$(helm ls -n $NAMESPACE --short | grep $1)"; then |
| echo "upgrade" |
| else |
| echo "install" |
| fi |
| } |
| |
| function addHtpasswdEntryUnencrypted() { |
| local COMPONENT=$1 |
| |
| local HTPASSWD=$(htpasswd -nb \ |
| $(yq r $TMP_CONFIG $COMPONENT.username) \ |
| $(yq r $TMP_CONFIG $COMPONENT.password)) |
| |
| yq w -i $TMP_CONFIG $COMPONENT.htpasswd $HTPASSWD |
| } |
| |
| function addHtpasswdEntryEncrypted() { |
| local COMPONENT=$1 |
| |
| local HTPASSWD=$(htpasswd -nb \ |
| $(sops -d --extract "$COMPONENT['username']" $TMP_CONFIG) \ |
| $(sops -d --extract "$COMPONENT['password']" $TMP_CONFIG)) |
| |
| sops --set "$COMPONENT['htpasswd'] \"$HTPASSWD\"" $TMP_CONFIG |
| } |
| |
| function addDashboards() { |
| for dashboard in dashboards/*; do |
| local DASHBOARD_NAME="${dashboard%.json}" |
| local DASHBOARD_NAME="${DASHBOARD_NAME#"dashboards/"}" |
| |
| kubectl create configmap $DASHBOARD_NAME \ |
| --from-file=$dashboard \ |
| --dry-run=true \ |
| --namespace=$NAMESPACE \ |
| -o yaml > $OUTPUT/dashboards/$DASHBOARD_NAME.dashboard.yaml |
| |
| yq w -i $OUTPUT/dashboards/$DASHBOARD_NAME.dashboard.yaml \ |
| metadata.labels.grafana_dashboard $DASHBOARD_NAME |
| done |
| } |
| |
| |
| function runYtt() { |
| ytt \ |
| -f charts/namespace.yaml \ |
| -f charts/prometheus/ \ |
| -f charts/loki/ \ |
| -f charts/grafana/ \ |
| -f promtail/ \ |
| --output-directory $OUTPUT \ |
| --ignore-unknown-comments \ |
| -f $1 |
| } |
| |
| mkdir -p $OUTPUT |
| cp $CONFIG $TMP_CONFIG |
| |
| # Fill in templates |
| if test -z "$(grep -o '^sops:$' $TMP_CONFIG)"; then |
| addHtpasswdEntryUnencrypted loki |
| addHtpasswdEntryUnencrypted prometheus.server |
| echo -e "#@data/values\n---\n$(cat $TMP_CONFIG)" | runYtt - |
| else |
| addHtpasswdEntryEncrypted "['loki']" $TMP_CONFIG |
| addHtpasswdEntryEncrypted "['prometheus']['server']" $TMP_CONFIG |
| echo -e "#@data/values\n---\n$(sops -d $TMP_CONFIG)" | runYtt - |
| fi |
| |
| # Create configmaps with dashboards |
| mkdir -p $OUTPUT/dashboards |
| addDashboards |
| |
| test -n "$DRYRUN" && exit 0 |
| |
| # Install loose components |
| kubectl apply -f $OUTPUT/namespace.yaml |
| kubectl apply -f $OUTPUT/configuration |
| kubectl apply -f $OUTPUT/dashboardsq |
| kubectl apply -f $OUTPUT/storage |
| |
| # Add Loki helm repository |
| helm repo add loki https://grafana.github.io/loki/charts |
| helm repo update |
| |
| # Install Prometheus |
| PROMETHEUS_CHART_NAME=prometheus-$NAMESPACE |
| helm $(updateOrInstall $PROMETHEUS_CHART_NAME) $PROMETHEUS_CHART_NAME \ |
| stable/prometheus \ |
| --version $(cat ./charts/prometheus/VERSION) \ |
| --values $OUTPUT/prometheus.yaml \ |
| --namespace $NAMESPACE |
| |
| # Install Loki |
| LOKI_CHART_NAME=loki-$NAMESPACE |
| helm $(updateOrInstall $LOKI_CHART_NAME) $LOKI_CHART_NAME \ |
| loki/loki \ |
| --version $(cat ./charts/loki/VERSION) \ |
| --values $OUTPUT/loki.yaml \ |
| --namespace $NAMESPACE |
| |
| # Install Grafana |
| GRAFANA_CHART_NAME=grafana-$NAMESPACE |
| helm $(updateOrInstall $GRAFANA_CHART_NAME) $GRAFANA_CHART_NAME \ |
| stable/grafana \ |
| --version $(cat ./charts/grafana/VERSION) \ |
| --values $OUTPUT/grafana.yaml \ |
| --namespace $NAMESPACE |