# Copyright 2021-present Open Networking Foundation
# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
#
apiVersion: v1
kind: ConfigMap
metadata:
  name: "{{ .Release.Name }}-scripts"
  labels:
    app: onos
    chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
    release: "{{ .Release.Name }}"
    heritage: "{{ .Release.Service }}"
data:
  update.sh: |
    #!/bin/bash
    host=${ES_URL:-localhost:9201}
    skip_tls=${SKIP_TLS:true}
    auth_username=${AUTH_USERNAME}
    auth_password=${AUTH_PASSWORD}
    dest_dir=${DEST_DIR}
    monitor_dir=${MONITOR_DIR}
    setting_dir=${SETTING_DIR}
    temp_dir=${OUTPUT_DIR:-/opendistro_temp}

    cleanup() {
      echo "Cleaning up..."
      exit
    }

    #return destination id if exist
    check_destination() { name=$1
        curl -s -H "content-type: application/json" "$host/_opendistro/_alerting/destinations" | jq -r ".destinations[] | select(.name == \"$name\").id"
    }

    update_destination() {
        echo "update"
        file=$1
        id=$2
        #compress the json file to reduce the http size
        new_file="$temp_dir/$file"
        jq -c '' < "$file" > "$new_file"
        curl -s -X PUT -H "content-type: application/json" -d "@$new_file" "$host/_opendistro/_alerting/destinations/$id"
        rm "$new_file"
        echo "  "
    }

    create_destination() {
        echo "create"
        file=$1
        new_file="$temp_dir/$file"
        jq -c '' < "$file" > "$new_file"
        curl -s -X POST -H "content-type: application/json" -d "@$new_file" "$host/_opendistro/_alerting/destinations"
        rm "$new_file"
        echo "  "
    }

    #return cluster_id if exist
    check_monitor() {
        name=$1
        curl -s -H "content-type: application/json" \
            --data "{\"query\":{\"match\":{ \"monitor.name\": \"$name\"}}}" \
            "$host/_opendistro/_alerting/monitors/_search" | jq -r '.hits.hits[0]._id'
    }

    create_monitor() {
        file=$1
        dest_id=$2
        new_file="$temp_dir/$file"
        echo "create monitor"
        jq -c ".triggers[0].actions[0].destination_id=\"$dest_id\""  "$file" > "$new_file"
        curl -s -X POST -H "content-type: application/json" -d "@$new_file" "$host/_opendistro/_alerting/monitors/"
        rm "$new_file"
        echo " "
    }

    update_monitor() {
        file=$1
        dest_id=$2
        monitor_id=$3
        new_file="$temp_dir/$file"
        echo "update monitor"
        jq -c ".triggers[0].actions[0].destination_id=\"$dest_id\""  "$file" > "$new_file"
        curl -s -X PUT -H "content-type: application/json" -d "@$new_file" "$host/_opendistro/_alerting/monitors/$monitor_id"
        rm "$new_file"
        echo " "
    }

    # handle the destination
    handle_destination() {
        dir=$dest_dir
        mkdir -p "$temp_dir/$dir"
        config_file=$dir/config.json
        for k in $(jq ' keys | .[]' "$config_file"); do
            file=$dir/$(jq -r ".[$k].file" "$config_file");

            name=$(jq -r '.name' "$file")
            id=$(check_destination "$name")
            if [ -z "$id" ]; then
                create_destination "$file"
            else
                update_destination "$file" "$id"
            fi
        done
    }

    # handle the monitors
    handle_monitor() {
        dir=$monitor_dir
        mkdir -p "$temp_dir/$dir"
        config_file=$dir/config.json
        for k in $(jq ' keys | .[]' "$config_file"); do
            file=$dir/$(jq -r ".[$k].file" "$config_file");
            dest_name=$(jq -r ".[$k].destination" "$config_file");
            format=$(jq -r ".[$k].format" "$config_file");

            dest_id=$(check_destination "$dest_name")
            if [ -z "$dest_id" ]; then
                echo "destination doesn't exist, skip this monitor"
                continue
            fi

            name=$(jq -r '.name' "$file")

            ## Replace the slack output format
            FILENAME=$(mktemp)
            jq --arg slack "${format}" '.triggers[0].actions[0].message_template.source=$slack' "$file" > "$FILENAME"
            monitor_id=$(check_monitor "$name")
            if [ "$monitor_id" = "null" ]; then
                create_monitor "$FILENAME" "$dest_id"
            else
                update_monitor "$FILENAME" "$dest_id" "$monitor_id"
            fi
        done

    }

    handle_settings() {
        dir=$setting_dir
        mkdir -p "$temp_dir/$dir"
        config_file=$dir/config.json

        curl_opts=""

        if [ ! -z $auth_username ]; then
          curl_opts="$curl_opts -u $auth_username:$auth_password"
        fi

        if [ $skip_tls ]; then
          curl_opts="$curl_opts -k"
        fi


        for k in $(jq ' keys | .[]' "$config_file"); do
            file=$dir/$(jq -r ".[$k].file" "$config_file");
            type=$(jq -r ".[$k].type" "$config_file");
            url=$(jq -r ".[$k].url" "$config_file");

            new_file="$temp_dir/$file"
            jq -c '' < "$file" > "$new_file"
            curl -s $curl_opts -X $type -H "content-type: application/json" -d "@$new_file" "$host/$url"
            rm "$new_file"
            echo "  "
        done
    }

    if [ ! -z $setting_dir ]; then
      echo "handle setting"
      handle_settings
    fi
    if [ ! -z $dest_dir ]; then
      echo "handle destination"
      handle_destination
    fi
    if [ ! -z $monitor_dir ]; then
      echo "handle monitor"
      handle_monitor
    fi

    trap cleanup INT TERM
    sleep infinity
