#!/bin/bash
##############################################################################
#
#   Copyright (c) 2019 AT&T Intellectual Property.
#   Copyright (c) 2022 Samsung Electronics Co., Ltd.
#
#   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.
#
##############################################################################
# Verifies RIC helm charts
# Requires Linux with wget and tar.
# This script should be executed inside the ric-plt/ric-dep bin directory only.
set -eu
echo "--> verify-ric-charts"


# (Optional) provide HELMVERSION as first parameter. It selects the helm client version
# (Optional) provide OVERRIDEYAML as the second parameter. It allows us to specify an override file to replace values used to render the helm charts
if [[ "${1:-nope}" != "nope" ]]; then
    HELMVERSION=$1
else
    HELMVERSION=3.9.0
fi
if [[ "${2:-nope}" != "nope" ]]; then
    OVERRIDEYAML=$2
fi

ROOT_DIR="$(pwd)"
HELM_COMMAND=helm
CHARTMUSEUM_COMMAND=chartmuseum
CHARTMUSEUM_VERSION=0.14.0

if ! $($HELM_COMMAND > /dev/null);then
    echo "Download and install Helm"
    if [ ! -e helm-v${HELMVERSION}-linux-amd64.tar.gz ]; then
      wget -nv https://get.helm.sh/helm-v${HELMVERSION}-linux-amd64.tar.gz
    fi
    tar -xvf ./helm-v${HELMVERSION}-linux-amd64.tar.gz
    mv linux-amd64/helm ./
    HELM_COMMAND=./helm
fi

# Set up ric common template
# Download it/dep common template charts
git clone --single-branch --branch master "https://gerrit.o-ran-sc.org/r/it/dep" ./dep

# Start Helm local repo if there isn't one
# In Helm3, running local repo requires chartmuseum and helm-servecm plugin
if ! $($CHARTMUSEUM_COMMAND > /dev/null);then
    echo "Download and install chartmuseum"
    wget -nv https://get.helm.sh/chartmuseum-v${CHARTMUSEUM_VERSION}-linux-amd64.tar.gz
    tar -xvf ./chartmuseum-v${CHARTMUSEUM_VERSION}-linux-amd64.tar.gz
    mv linux-amd64/chartmuseum ./
    CHARTMUSEUM_COMMAND=./chartmuseum

    curl https://raw.githubusercontent.com/helm/chartmuseum/main/scripts/get-chartmuseum | bash
    $HELM_COMMAND plugin install https://github.com/jdolitsky/helm-servecm
fi

if [ ! -z $(pgrep servecm) ]; then
    echo "Stopping existing local Helm server."
    kill -9 "$(pgrep servecm)"
fi

echo "Wait for installing servecm plugin"
timeout=10
while [ "$timeout" -gt 0 ]; do
  if $HELM_COMMAND servecm --help | grep "ChartMuseum"; then
    break
  fi
  sleep 1s
  ((timeout--))
done

rm -rf ./local-repo
mkdir ./local-repo

echo "Starting local Helm server"
$HELM_COMMAND servecm --port=8879 --storage local --storage-local-rootdir ./local-repo --context-path=/charts &

# Package ric-common and serve it using Helm local repo
$HELM_COMMAND package --destination ./local-repo "$ROOT_DIR/dep/ric-common/Common-Template/helm/ric-common"
$HELM_COMMAND package --destination ./local-repo "$ROOT_DIR/dep/ric-common/Common-Template/helm/aux-common"

# Make sure that helm local repo is added
$HELM_COMMAND repo index ./local-repo
$HELM_COMMAND repo add local http://127.0.0.1:8879/charts

# Remove it/dep charts
rm -rf ./dep

# Create array of helm charts
echo "Finding all Helm charts"
CHART_ARRAY=()
while IFS= read -r -d $'\0'; do
    CHART_ARRAY+=("$REPLY")
done < <(find "$ROOT_DIR/../" -maxdepth 4 -name Chart.yaml -printf '%h\0')

echo "***************************************"
for dir in "${CHART_ARRAY[@]}"
do
    echo "Running helm lint and verification on chart $dir"
    echo "Update chart dependency"
    $HELM_COMMAND dep up "$dir"
    # Lint clearly marks errors; e.g., [ERROR]
    echo "Performing Helm lint"
    if [[ "${OVERRIDEYAML:-nope}" != "nope" ]]; then
        $HELM_COMMAND lint -f "$OVERRIDEYAML" "$dir"
    else
        $HELM_COMMAND lint "$dir" 
    fi
    echo "***************************************************************************************************************"
    echo "Rendering Helm charts locally"
    if [[ "${OVERRIDEYAML:-nope}" != "nope" ]]; then
	$HELM_COMMAND template -f "$OVERRIDEYAML" "$dir"
    else
        $HELM_COMMAND template "$dir"
    fi
    echo "***************************************************************************************************************"
done
echo "--> verify-ric-charts ends"
exit 0

