#!/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 enrichmentservice rappcatalogueservice nonrtricgateway"
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"
echo "Install Kong- $INSTALL_KONG"

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

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

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"


