#!/usr/bin/env bash

function show_help {
    echo "Usage: ${0#*/} -h | this help -o <onos source path> -t <onos docker tag> -p <onos package> -b | build onos package"
    exit 1
}

OPTIND=1
onos_src_dir="$HOME/onos"
onos_tag="test/onos:clustertest"
onos_package=
onos_build=0

while getopts "h?o:t:p:b" opt; do
    case "$opt" in
        h|\?)
            show_help
            ;;
        o)
            onos_src_dir=$OPTARG
            ;;
        p)
            onos_package=$OPTARG
            ;;
        t)
            onos_tag=$OPTARG
            ;;
        b)
            onos_build=1
            ;;
        *)
            show_help
            ;;
    esac
done

shift $((OPTIND-1))
if [ $# -gt 0 ]; then
    echo "Invalid arguments"
    show_help
fi
mydir=$(dirname $0)
if [ x"$onos_package" = "x" ]; then
    if [ ! -d $onos_src_dir ]; then
        onos_build=1
    fi
    onos_package=$onos_src_dir/buck-out/gen/tools/package/onos-package/onos.tar.gz
fi

onos_cloned=0

#if onos package is not built, then exit
if [ $onos_build -eq 1 ]; then
    if [ ! -d $onos_src_dir ]; then
        mkdir -p $onos_src_dir
        onos_cloned=1
      ( cd $onos_src_dir && git clone http://github.com/opennetworkinglab/onos.git . )
    else
      ( cd $onos_src_dir && git pull --ff-only origin master || git clone http://github.com/opennetworkinglab/onos.git . )
    fi
    ( cd $onos_src_dir && tools/build/onos-buck build onos ) && echo "ONOS build success" || {
      echo "ONOS build failure. Exiting ..." && exit 1
    }
    onos_package=$onos_src_dir/buck-out/gen/tools/package/onos-package/onos.tar.gz
fi

if [ ! -f $onos_package ]; then
    echo "ONOS package $onos_package does not exist. Exiting ..."
    exit 1
fi

cp -v $onos_package $mydir

function finish {
    if [ $onos_cloned -eq 1 ]; then
        rm -rf $onos_src_dir
    fi
    rm -f onos.tar.gz
    rm -f Dockerfile.cord-tester
}

trap finish EXIT

#create a ONOS docker file
cat > $mydir/Dockerfile.cord-tester <<EOF
FROM onosproject/onos:latest

MAINTAINER Ali Al-Shabibi <ali@onlab.us>

# Add Java 8 repository
# Set the environment variables
ENV HOME /root
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
ENV ONOS_ROOT /src/onos
ENV KARAF_VERSION 3.0.5
ENV KARAF_ROOT /root/onos/apache-karaf-3.0.5
ENV KARAF_LOG /root/onos/apache-karaf-3.0.5/data/log/karaf.log
ENV BUILD_NUMBER docker
ENV PATH \$PATH:\$KARAF_ROOT/bin

#Download and Build ONOS
# Change to /root directory
WORKDIR /root
COPY ./onos.tar.gz /tmp
#Install ONOS

RUN rm -rf onos && mkdir onos && \
   mv /tmp/onos.tar.gz . && \
   tar -xf onos.tar.gz -C onos --strip-components=1 && \
   rm -rf onos.tar.gz


# Ports
# 6653 - OpenFlow
# 8181 - GUI
# 8101 - ONOS CLI
# 9876 - ONOS CLUSTER COMMUNICATION
EXPOSE 6653 8181 8101 9876

# Get ready to run command
WORKDIR /root/onos
ENTRYPOINT ["./bin/onos-service"]
EOF

#Now build the docker image

docker build -t $onos_tag -f $mydir/Dockerfile.cord-tester $mydir
