#!/bin/bash
################################################################################
#   Copyright (c) 2019 AT&T Intellectual Property.                             #
#   Copyright (c) 2019 Nokia.                                                  #
#                                                                              #
#   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 RIC aux 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 )"
#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


$ROOT_DIR/prepare-common-templates

$ROOT_DIR/../ric-aux/bin/install -f $OVERRIDEYAML