#!/bin/sh -x

# Copyright (c) 2021 AT&T. All rights reserved.
#
# 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.

# Pre-requisite
# 1. Chart packages available under local directory provided as input/argument
# 2. helm client installed with push plugin
# 3. ONAP chartmuseum service deployed

usage()
{
    echo "Chart Base directory must be provided as input!!"
    echo "Usage: registry-initialize.sh  -d chartdirectory \
<-n namespace override> <-r helmrelease override>"
    exit 1
}

if [ $# -eq 0 ]; then
    usage
fi

# defaults
NAMESPACE=onap
RLS_NAME=onap
LOGIN=""
PASSWORD=""

while getopts ":d:n:r:" opt; do
    case $opt in
        d) BASEDIR="$OPTARG"
        ;;
        n) NAMESPACE="$OPTARG"
        ;;
        r) RLS_NAME="$OPTARG"
        ;;
        \?) echo "Invalid option -$OPTARG" >&2
        usage
        ;;
   esac
done

if [ -z "$BASEDIR" ]; then
    exit "Chart base directory provided $BASEDIR is empty"
fi

if [ "$(find $BASEDIR -maxdepth 1 -name '*tgz' -print -quit)" ]; then
    echo "$BASEDIR valid"
else
    exit "No chart package on $BASEDIR provided"
fi

LOGIN=$(kubectl -n "$NAMESPACE" get secret \
 "${RLS_NAME}-chartmuseum-registrycred" \
 -o jsonpath='{.data.login}' | base64 -d)

PASSWORD=$(kubectl -n "$NAMESPACE" get secret \
 "${RLS_NAME}-chartmuseum-registrycred" \
 -o jsonpath='{.data.password}' | base64 -d)

if [ -z "$LOGIN" ] || [ -z "$PASSWORD" ]; then
    echo "Login/Password credential for target registry cannot be retrieved"
    exit 1
fi

# Expose cluster port via port-forwarding
kubectl -n $NAMESPACE port-forward service/chart-museum 27017:80 &
if [ $? -ne 0 ]; then
    echo "Error in portforwarding; registry cannot be added!!"
    exit 1
fi

sleep 5

# Add chartmuseum repo as helm repo
# Credentials should match config defined in
# oom\kubernetes\platform\components\chartmuseum\values.yaml
helm repo add k8s-registry http://127.0.0.1:27017 --username "$LOGIN" \
 --password "$PASSWORD"
if [ $? -ne 0 ]; then
    echo "registry cannot be added!!"
    pkill -f "port-forward service/chart-museum"
    exit 1
fi

# Initial scope is pushing only dcae charts
# can be expanded to include all onap charts if required
for file in $BASEDIR/dcae*tgz; do
    # use helm plugin to push charts
    helm push $file k8s-registry
    if [ $? -eq 0 ]; then
        echo "$file uploaded to registry successfully"
    else
        echo "registry upload failed!!"
        pkill -f "port-forward service/chart-museum"
        helm repo remove k8s-registry
        exit 1
    fi
done

echo "All Helm charts successfully uploaded into internal repository"

# Remove the port-forwarding process
pkill -f "port-forward service/chart-museum"

# Remove helm registry from local
helm repo remove k8s-registry
