---

# Copyright 2020-present Open Networking Foundation
#
# 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.
apiVersion: v1
kind: ConfigMap
metadata:
  name: {{ .Release.Name }}-onos-configs-loader
data:
  loader.sh: >
    set -euo pipefail

    # a POST to a non ready netcfg return 207 in case of failure, while a GET returns 404,
    # check the apps key is ready to accept data before sending them

    until curl --fail -sSL --user {{ .Values.onos.username }}:{{ .Values.onos.password }} -X GET -H 'Accept: application/json' "http://{{ .Release.Name }}-onos-classic-hs:8181/onos/v1/network/configuration/apps";
    do
      echo -e "Waiting for netcfg to be active";
      sleep 5;
    done

    echo -e "\n\nLoading netcfg into ONOS\n";
    cat /opt/configs/netcfg.json;
    responseCode=$(curl --write-out '%{http_code}' --fail -sSL --user {{ .Values.onos.username }}:{{ .Values.onos.password }} -X POST "http://{{ .Release.Name }}-onos-classic-hs:8181/onos/v1/network/configuration/" -H Content-type:application/json -d @/opt/configs/netcfg.json);
    if [[ $responseCode == 207 ]]; then
      echo "Failed to load netcfg, exiting..."
      exit 1
    fi

    sleep 5;
    echo -e "Updated netconfig is:";
    curl --fail -sSL --user {{ .Values.onos.username }}:{{ .Values.onos.password }} -X GET -H 'Accept: application/json' "http://{{ .Release.Name }}-onos-classic-hs:8181/onos/v1/network/configuration";
    echo -e "\nCompleted on: ";
    date;

    echo -e "\n\n\nLoading component configs into ONOS\n";
    CFGS=$(ls /opt/configs | grep -v netcfg.json);
    for CFG in ${CFGS};
    do
      echo -e "Check that component $CFG is active";
      until curl --fail -sSL --user {{ .Values.onos.username }}:{{ .Values.onos.password }} -X GET "http://{{ .Release.Name }}-onos-classic-hs:8181/onos/v1/configuration/$CFG";
      do
        echo -e "Waiting for $CFG to be active";
        sleep 5;
      done
      echo -e "\nLoading $CFG config";
      cat /opt/configs/$CFG;
      responseCode=$(curl --write-out '%{http_code}' --fail -sSL --user {{ .Values.onos.username }}:{{ .Values.onos.password }} -X POST "http://{{ .Release.Name }}-onos-classic-hs:8181/onos/v1/configuration/$CFG" -H Content-type:application/json -d @/opt/configs/$CFG);
      if [[ $responseCode == 207 ]]; then
        echo "Failed to load $CFG, exiting..."
        exit 1
      fi
      echo -e "Updated component config for $CFG is:";
      curl --fail -sSL --user {{ .Values.onos.username }}:{{ .Values.onos.password }} -X GET "http://{{ .Release.Name }}-onos-classic-hs:8181/onos/v1/configuration/$CFG";
      echo -e "\nCompleted on: ";
      date;
      echo -e "\n\n\n"
    done
