#!/bin/bash
################################################################################
#   Copyright (c) 2020 Nordix 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.                                             #
################################################################################

# This script deploys NonRtRic components automatically



if [ "$#" -eq 1 ]; then
    OVERRIDEYAML=$1
else

    while [ -n "$1" ]; do # while loop starts

        case "$1" in

        -f) OVERRIDEYAML=$2
            shift
            ;;
        *) echo "Option $1 not recognized" ;; # In case you typed a different option other than a,b,c

        esac

        shift

    done
fi


if [ -z "$OVERRIDEYAML" ];then
    echo "****************************************************************************************************************"
    echo "                                                     ERROR                                                      "
    echo "****************************************************************************************************************"
    echo "RIC deployment without deployment recipe is currently disabled. Please specify an recipe with the -f option."
    echo "****************************************************************************************************************"
    exit 1
fi


ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"

echo "** $ROOT_DIR"
rm $ROOT_DIR/../nonrtric/helm/*/charts/*.tgz


#Check for helm3
IS_HELM3=$(helm version -c --short|grep -e "^v3")

if [ $IS_HELM3 ]
then
  # Check for servcm plugin
  helm plugin list | grep -q "^servecm"
  if [ $? -eq "1" ]
  then
    helm plugin install https://github.com/jdolitsky/helm-servecm
  fi
fi

# Start Helm local repo if there isn't one
HELM_REPO_PID=$(ps -x | grep  "helm serve" | grep -v "grep" | awk '{print $1}')
if [ -z "$HELM_REPO_PID" ]; then
    if [ -z $IS_HELM3 ]
    then
      nohup helm serve >& /dev/null &
    else
      echo EUID:$EUID
      if [ $EUID -ne "0" ]
         then
           echo "Error: Please run the command with sudo as helm servecm needs to copy a file in location needing privilege"
           exit;
         fi
      eval $(helm env |grep HELM_REPOSITORY_CACHE)
      echo yes > /tmp/ric-yes
      nohup sudo sh -c "helm servecm --port=8879 --context-path=/charts  --storage local --storage-local-rootdir $HELM_REPOSITORY_CACHE/local/  < /tmp/ric-yes " &
    fi
fi


# Package common templates and serve it using Helm local repo
HELM_LOCAL_REPO=""
if [ $IS_HELM3 ]
then
  eval $(helm env |grep HELM_REPOSITORY_CACHE)
  HELM_LOCAL_REPO="${HELM_REPOSITORY_CACHE}/local/"
else
  HELM_HOME=$(helm home)
  HELM_LOCAL_REPO="${HELM_HOME}/repository/local/"
fi


rm $HELM_LOCAL_REPO/*

helm repo remove local
$ROOT_DIR/prepare-common-templates

COMPONENTS="controlpanel a1controller a1simulator policymanagementservice informationservice rappcatalogueservice nonrtricgateway dmaapadapterservice dmaapmediatorservice helmmanager oruclosedlooprecovery odusliceassurance"
for component in $COMPONENTS; do
    echo "Packaging NONRTRIC component [$component]"
    helm dep up $ROOT_DIR/../nonrtric/helm/$component
    VERSION=$(cat $ROOT_DIR/../nonrtric/helm/$component/Chart.yaml | grep version | awk '{print $2}')
    helm package -d /tmp $ROOT_DIR/../nonrtric/helm/$component
    cp /tmp/$component-$VERSION.tgz ${HELM_LOCAL_REPO}
done

helm dep up $ROOT_DIR/../nonrtric/helm/nonrtric

helm repo index ${HELM_LOCAL_REPO}

# Make sure that helm local repo is added
helm repo add local http://127.0.0.1:8879/charts --force-update

echo "Finished Packaging NONRTRIC components [$COMPONENTS]"



COMMON_BLOCK=$(cat $OVERRIDEYAML | awk '/^common:/{getline; while ($0 ~ /^ +.*|^ *$/) {print $0; if (getline == 0) {break}}}')
NAMESPACE_BLOCK=$(cat $OVERRIDEYAML | awk '/^  namespace:/{getline; while ($0 ~ /^    .*|^ *$/) {print $0; if (getline == 0) {break}}}')
NONRTRIC_NAMESPACE=$(echo "$NAMESPACE_BLOCK" | awk '/^ *nonrtric:/{print $2}')
RELEASE_PREFIX=$(echo "$COMMON_BLOCK" | awk '/^ *releasePrefix:/{print $2}')
INSTALL_KONG=$(cat $OVERRIDEYAML | awk '/^  installKong:/{print $2}')
echo "Chart name- $PARENT_CHART"

if ! kubectl get ns ${NONRTRIC_NAMESPACE:-nonrtric}> /dev/null 2>&1; then
    kubectl create ns ${NONRTRIC_NAMESPACE:-nonrtric}
fi
if ! kubectl get ns onap > /dev/null 2>&1; then
    kubectl create ns onap
fi

echo "Install Kong- $INSTALL_KONG"

if [ "$INSTALL_KONG" = true ];then
   echo "Installing Kong"
   helm repo add kong https://charts.konghq.com --force-update
   helm repo update
   helm install kong-nonrtric --namespace ${NONRTRIC_NAMESPACE:-nonrtric} kong/kong --set ingressController.installCRDs=false --set admin.enabled=true
fi

kubectl create configmap -n ${NONRTRIC_NAMESPACE:-nonrtric} nonrtric-recipe --from-file=recipe=$OVERRIDEYAML

echo "Deploying NONRTRIC"

HELM_NAME_OPT=""
if [ -z $IS_HELM3 ];then
   HELM_NAME_OPT="--name"
fi

echo "helm install -f $OVERRIDEYAML --namespace ${NONRTRIC_NAMESPACE:-nonrtric} ${HELM_NAME_OPT} ${RELEASE_PREFIX} $ROOT_DIR/../nonrtric/helm/nonrtric"
helm install -f $OVERRIDEYAML --namespace "${NONRTRIC_NAMESPACE:-nonrtric}" ${HELM_NAME_OPT} "${RELEASE_PREFIX}" "$ROOT_DIR/../nonrtric/helm/nonrtric"


