#!/bin/bash
#
# Start minukube with the selected k8s version and deploy rook.
#
# This script uses helper scripts from the main ceph-csi branch.
#

# fail when a command returns an error
set -e -o pipefail

ARGUMENT_LIST=(
    "k8s-version"
)

opts=$(getopt \
    --longoptions "$(printf "%s:," "${ARGUMENT_LIST[@]}")help" \
    --name "$(basename "${0}")" \
    --options "" \
    -- "$@"
)
ret=$?

if [ ${ret} -ne 0 ]
then
    echo "Try '--help' for more information."
    exit 1
fi

eval set -- "${opts}"

while true; do
    case "${1}" in
    --help)
        shift
        echo "Options:"
        echo "--help|-h                 specify the flags"
        echo "--k8s-version             specify the kubernetes version"

        echo " "
        echo "Sample Usage:"
        echo "./single-node-k8s.sh --k8s-version=v1.18.3"
        exit 0
        ;;
    --k8s-version)
        shift
        k8s_version=${1}
        ;;
    --)
        shift
        break
        ;;
    esac
    shift
done

test -n "${k8s_version}" || { echo "k8s_version is not set"; exit 1;}

function set_env() {
    export GOPATH="/opt/build/go"
    # build.env is not part of the ci/centos branch, so shellcheck can not find
    # it and will cause a failure if not annotated with /dev/null.
    # shellcheck source=/dev/null
    source "${GOPATH}"/src/github.com/ceph/ceph-csi/build.env
    CSI_IMAGE_VERSION=${CSI_IMAGE_VERSION:-"canary"}
    export GO111MODULE="on"
    export TEST_COVERAGE="stdout"
    export VM_DRIVER="podman"
    export MEMORY="14336"
    export NUM_DISKS="3"
    export DISK_SIZE="32gb"
    export CEPH_CSI_RUN_ALL_TESTS=true
    # downloading rook images is sometimes slow, extend timeout to 15 minutes
    export ROOK_VERSION=${ROOK_VERSION:-'v1.3.9'}
    export ROOK_DEPLOY_TIMEOUT=900
    export ROOK_CEPH_CLUSTER_IMAGE="${ROOK_CEPH_CLUSTER_IMAGE}"
    # use podman for minikube.sh, Docker is not installed on the host
    export CONTAINER_CMD='podman'

    export CSI_ATTACHER_VERSION=${CSI_ATTACHER_VERSION:-"v3.2.1"}
    export CSI_SNAPSHOTTER_VERSION=${CSI_SNAPSHOTTER_VERSION:-"v4.1.1"}
    export CSI_PROVISIONER_VERSION=${CSI_PROVISIONER_VERSION:-"v2.2.2"}
    export CSI_RESIZER_VERSION=${CSI_RESIZER_VERSION:-"v1.2.0"}
    export CSI_NODE_DRIVER_REGISTRAR_VERSION=${CSI_NODE_DRIVER_REGISTRAR_VERSION:-"v2.2.0"}

    # script/minikube.sh installs under /usr/local/bin
    export PATH=$PATH:/usr/local/bin
}

# prepare_disks uses the /dev/xvdb EBS device (40GB) and creates 3 12GB
# partitions on it. The function uses 'fdisk' with a script that has empty
# lines for default values while fdisk prompts for them.
function prepare_disks() {
    fdisk /dev/xvdb << EOS
n
p


+12G
n
p


+12G
n
p


+12G
w
EOS
}

function install_minikube()
{
    # minikube needs socat
    dnf -y install socat

    # deploy minikube
    MINIKUBE_VERSION="${MINIKUBE_VERSION}" MINIKUBE_ISO_URL="${MINIKUBE_ISO_URL}" KUBE_VERSION="${k8s_version}" ${GOPATH}/src/github.com/ceph/ceph-csi/scripts/minikube.sh up

    # copy kubectl from minikube to /usr/bin
    if [ -x ~/.minikube/cache/linux/"${k8s_version}"/kubectl ]
    then
        cp ~/.minikube/cache/linux/"${k8s_version}"/kubectl /usr/bin/
    else
        # minikube 1.25.2 adds the GOARCH to the path ("amd64" in our CI)
        cp ~/.minikube/cache/linux/amd64/"${k8s_version}"/kubectl /usr/bin/
    fi
}

function deploy_rook()
{
    ${GOPATH}/src/github.com/ceph/ceph-csi/scripts/minikube.sh deploy-rook
    ${GOPATH}/src/github.com/ceph/ceph-csi/scripts/minikube.sh create-block-pool
    ${GOPATH}/src/github.com/ceph/ceph-csi/scripts/minikube.sh create-block-ec-pool
    ${GOPATH}/src/github.com/ceph/ceph-csi/scripts/minikube.sh k8s-sidecar

    # TODO: only needed for k8s 1.17.0 and newer
    # delete snapshot CRD created by ceph-csi in rook
    ${GOPATH}/src/github.com/ceph/ceph-csi/scripts/install-snapshot.sh delete-crd || true
    # install snapshot controller
    ${GOPATH}/src/github.com/ceph/ceph-csi/scripts/install-snapshot.sh install
}

# Set environment variables
set_env

# create disk partitions
prepare_disks

# prepare minikube environment
install_minikube

./podman2minikube.sh "quay.io/cephcsi/cephcsi:${CSI_IMAGE_VERSION}"

# incase rook/ceph is available on the local system, push it into the VM
if podman inspect "rook/ceph:${ROOK_VERSION}" > /dev/null
then
    ./podman2minikube.sh "rook/ceph:${ROOK_VERSION}"
fi

# Rook also uses ceph/ceph:v15 (build.env:BASE_IMAGE), so push it into the VM
if [ -n "${BASE_IMAGE}" ] && podman inspect "${BASE_IMAGE}" > /dev/null
then
    ./podman2minikube.sh "${BASE_IMAGE}"
fi

# Rook also uses ceph/ceph:v15 (build.env:ROOK_CEPH_CLUSTER_IMAGE), so push it into the VM
if [ -n "${ROOK_CEPH_CLUSTER_IMAGE}" ] && podman inspect "${ROOK_CEPH_CLUSTER_IMAGE}" > /dev/null
then
    ./podman2minikube.sh "${ROOK_CEPH_CLUSTER_IMAGE}"
fi

deploy_rook

# running e2e.test requires librados and librbd
dnf -y install librados2 librbd1

# now it is time to run the e2e tests!