# 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}
    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
        for k in $(jq ' keys | .[]' "$config_file"); do
            file=$dir/$(jq -r ".[$k].file" "$config_file");
            url=$(jq -r ".[$k].url" "$config_file");

            new_file="$temp_dir/$file"
            jq -c '' < "$file" > "$new_file"
            curl -s -X POST -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
