---

# 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

    # onos-config-loader most likely start before ONOS is deployed, so check for ONOS before waiting for it to be ready

    has_onos=$(kubectl get pods -l app=onos-classic --all-namespaces | wc -l);

    while [[ $has_onos == 0 ]]; do
      echo -e "Waiting for ONOS to be deployed";
      sleep 5;
      has_onos=$(kubectl get pods -l app=onos-classic --all-namespaces | wc -l);
    done

    # wait all ONOS pods to be ready

    onos_starting=$(kubectl get pods -l app=onos-classic --all-namespaces --field-selector=status.phase!=Running | wc -l);

    while [[ $onos_starting != 0 ]]; do
      echo -e "$onos_starting ONOS instances are still starting...";
      sleep 5;
      onos_starting=$(kubectl get pods --all-namespaces -l app=onos-classic | grep "0/" | wc -l);
    done

    # 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
