#!/usr/bin/env bash

# Copyright 2015 Open Networking Foundation (ONF)
#
# Please refer questions to either the onos test mailing list at <onos-test@onosproject.org>,
# the System Testing Plans and Results wiki page at <https://wiki.onosproject.org/x/voMg>,
# or the System Testing Guide page at <https://wiki.onosproject.org/x/WYQg>
#
#     TestON is free software: you can redistribute it and/or modify
#     it under the terms of the GNU General Public License as published by
#     the Free Software Foundation, either version 2 of the License, or
#     (at your option) any later version.
#
#     TestON is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#     GNU General Public License for more details.
#
#     You should have received a copy of the GNU General Public License
#     along with TestON.  If not, see <http://www.gnu.org/licenses/>.

# TestON install script for Ubuntu (Debian and Fedora)

# Fail on error
set -e

# Fail on unset var usage
set -o nounset

function init {
    # Identify Linux release
    DIST=Unknown
    RELEASE=Unknown
    CODENAME=Unknown

    ARCH=`uname -m`
    if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; fi
    if [ "$ARCH" = "i686" ]; then ARCH="i386"; fi

    if [ -e /etc/debian_version ]; then DIST="Debian"; fi
    if [ -e /etc/fedora-release ]; then DIST="Debian"; fi
    grep Ubuntu /etc/lsb-release &> /dev/null && DIST="Ubuntu"

    if [ "$DIST" = "Ubuntu" ] || [ "$DIST" = "Debian" ]; then
        install='sudo apt-get -y install'
        remove='sudo apt-get -y remove'
        pipinstall='sudo pip install'
        # Prereqs for this script
        if ! which lsb_release &> /dev/null; then
            $install lsb-release
        fi
    fi

    if [ "$DIST" = "Fedora" ]; then
        install='sudo yum -y install'
        remove='sudo yum -y erase'
        pipinstall='sudo pip install'
        # Prereqs for this script
        if ! which lsb_release &> /dev/null; then
            $install redhat-lsb-core
        fi
    fi
    if which lsb_release &> /dev/null; then
        DIST=`lsb_release -is`
        RELEASE=`lsb_release -rs`
        CODENAME=`lsb_release -cs`
    fi
    echo "Detected Linux distribution: $DIST $RELEASE $CODENAME $ARCH"

    if ! echo $DIST | egrep 'Ubuntu|Debian|Fedora'; then
        echo "Install.sh currently only supports Ubuntu, Debian and Fedora."
        exit 1
    fi

    #Get location of TestON dir
    SOURCE="${BASH_SOURCE[0]}"
    while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink
        DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
        SOURCE="$(readlink "$SOURCE")"
        [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located
    done
    DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"
    echo "Found TestON at $DIR"
}

function requirements {
    system_reqs
    python_reqs
}

function system_reqs {
    # Specify a specific command with $1
    set +o nounset
    if [ -z $1 ]
    then
        cmd=$install
    else
        cmd=$1
    fi
    set -o nounset
    # Install TestON dependencies
    echo "Installing TestON dependencies"
    if [ "$DIST" = "Fedora" ]; then
        # Fedora may have vlan enabled by default. Still need to confirm and update later
        $cmd python-pip build-essential python-dev pep8 python3-requests
    else
        $cmd python-pip build-essential python-dev pep8 vlan python3-requests
    fi

    # Some Distos have this already from another package
    if which arping > /dev/null ; then
        echo "Arping command detected, skipping package installation."
    else
        $cmd arping
    fi
}

function python_reqs {
    # Specify a specific pip command with $1
    set +o nounset
    if [ -z $1 ]
    then
        cmd=$pipinstall
    else
        cmd=$1' install'
    fi
    set -o nounset
    $cmd -r requirements.txt
}

function symlinks {
    set +e
    # Add symbolic link to main TestON folder in Home dir
    pushd ~
    sudo ln -s $DIR && echo "Added symbolic link to TestON folder in HOME directory."
    popd

    # Add symbolic link to TestON cli in /usr/local/bin
    pushd /usr/local/bin
    sudo ln -s $DIR/bin/cli.py teston && echo "Added symbolic link to TestON CLI in /usr/local/bin."
    popd

    # Add symlink to get bash completion
    pushd /etc/bash_completion.d
    sudo cp $DIR/bin/.teston_completion teston_completion
    echo "Bash completion will now be enabled for new shells"
    popd
    set -e
}

function git {
    # OnosSystemTest git pre-commit hooks
    pushd $DIR/..
    cp .git/hooks/pre-commit.sample .git/hooks/pre-commit
    popd
}

function get_pypy {
    echo "Getting pypy"
    pushd ~
    if [ ! -e pypy2-v5.3.1-linux64.tar.bz2 ]
    then
        wget https://bitbucket.org/pypy/pypy/downloads/pypy2-v5.3.1-linux64.tar.bz2
    fi
    tar xf pypy2-v5.3.1-linux64.tar.bz2
    python_impl=~/pypy2-v5.3.1-linux64/bin/pypy
    popd
    venv $python_impl "venv-teston-pypy"
}

# Optionally install in virtual env
function venv {
    # $1 is the path to python implementation, $2 is the venv-name
    echo "Installing virtual env for TestON..."
    pushd $DIR
    set +o nounset
    if [ -z "$2" ]
    then
        venv_name="venv-teston"
    else
        venv_name=$2
    fi
    pip install virtualenv

    # Setup virtual env
    if [ -z "$1" ]; then
        echo "No python implementation specified for virtual env, using default."
        virtualenv $venv_name
    else
        python_impl=$1
        echo "Using $python_impl for python in virtual env."
        virtualenv -p $python_impl $venv_name
    fi
    python_reqs $venv_name/bin/pip
    set -o nounset
    popd
}


function default {
    requirements
    symlinks
    git
}

function finished {
    echo ""
    echo "Completed running install.sh script"
    echo "Run TestON CLI by typing teston at bash prompt"
    echo "Example: teston run <TestSuite Name>"
}

# TODO Add log rotation configuration for TestON logs here (place holder)
# TODO Add bash tab completion script to this

function usage {
    printf "Usage: $(basename $0) [-dgprsv] \n"
    printf "Usage: $(basename $0) -y [PATH] \n\n"
    printf "This install script attempts to install deoendencies needed to run teston\n"
    printf "and any tests included in the official repository. If a test still does \n"
    printf "not run after running this script, you can try looking at the test's README\n"
    printf "or the driver files used by the tests. There are some software components\n"
    printf "such as software switches that this script does not attempt to install as\n"
    printf "they are more complicated.\n\n"

    printf "Options:\n"
    printf "\t -d (default) requirements, symlinks and git hooks\n"
    printf "\t -g install git hooks\n"
    printf "\t -p install pypy in a virtual env\n"
    printf "\t -r install requirements for TestON/tests\n"
    printf "\t -s install symlinks\n"
    printf "\t -v install a python virtual environment for teston using the default python implementation\n"
    printf "\t -y <PATH> install a python virtual environment for testonusing a specific python implementation at PATH.\n"

}

if [ $# -eq 0 ]
then
    init
    default
elif [ $1 == "--help" ]
then
    usage
else
    init
    while getopts 'dgprsvy:' OPTION
    do
      case $OPTION in
      d)    default;;
      g)    git;;
      p)    get_pypy;;
      r)    requirements;;
      s)    symlinks;;
      v)    venv;;
      y)    venv  $OPTARG;;
      ?)    usage;;
      esac
  done
  shift $(($OPTIND -1))
  finished
fi
