# Environmental defaults for ONOS build, package and test

# Root of the ONOS source tree
export ONOS_ROOT=${ONOS_ROOT:-~/onos}

# M2 repository and Karaf gold bits
export M2_REPO=${M2_REPO:-~/.m2/repository}
export KARAF_VERSION=${KARAF_VERSION:-3.0.5}
export KARAF_ZIP=${KARAF_ZIP:-~/Downloads/apache-karaf-$KARAF_VERSION.zip}
export KARAF_TAR=${KARAF_TAR:-~/Downloads/apache-karaf-$KARAF_VERSION.tar.gz}
export KARAF_DIST=$(basename $KARAF_ZIP .zip)

# Add ONOS-specific directories to the exectable PATH
export PATH="$ONOS_ROOT/tools/dev/bin:$ONOS_ROOT/tools/test/bin:$PATH"
export PATH="$ONOS_ROOT/tools/build:$PATH"

# Fallback build number us derived from from the user name & time
export BUILD_NUMBER=${BUILD_NUMBER:-$(id -un)~$(date +'%Y/%m/%d@%H:%M')}

# ONOS Version and onos.tar.gz staging environment
export ONOS_POM_VERSION="1.7.0-SNAPSHOT"
export ONOS_VERSION=${ONOS_VERSION:-1.7.0-rc2.$BUILD_NUMBER}

# ONOS production bits (onos.tar.gz, onos.zip, onos.deb, onos.rpm) staging environment
export ONOS_BITS=onos-${ONOS_VERSION%~*}
export ONOS_STAGE_ROOT=${ONOS_STAGE_ROOT:-/tmp}
export ONOS_STAGE=$ONOS_STAGE_ROOT/$ONOS_BITS
export ONOS_DEB_ROOT=$ONOS_STAGE_ROOT/deb
export ONOS_DEB=$ONOS_STAGE.deb
export ONOS_RPM_ROOT=$ONOS_STAGE_ROOT/rpm
export ONOS_RPM=$ONOS_STAGE.rpm
export ONOS_RPM_VERSION=${ONOS_POM_VERSION//-/.}
export ONOS_TAR=$ONOS_STAGE.tar.gz
export ONOS_ZIP=$ONOS_STAGE.zip

# If the BUCK-built bits are newer than the Maven-built bits, use the former.
BUCK_TAR=$ONOS_ROOT/buck-out/gen/tools/package/onos-package/onos.tar.gz
if [ -f $BUCK_TAR -a $BUCK_TAR -nt $ONOS_TAR ]; then
    rm -f $ONOS_TAR >/dev/null; ln -s $BUCK_TAR $ONOS_TAR
fi

# ONOS test bits (onos-test.tar.gz) staging environment
export ONOS_TEST_BITS=onos-test-${ONOS_VERSION%~*}
export ONOS_TEST_STAGE_ROOT=${ONOS_TEST_STAGE_ROOT:-/tmp}
export ONOS_TEST_STAGE=$ONOS_STAGE_ROOT/$ONOS_TEST_BITS
export ONOS_TEST_TAR=$ONOS_TEST_STAGE.tar.gz

# Defaults for ONOS testing using remote machines.
# if [ -n "${ONOS_CELL}" -a -f $ONOS_ROOT/tools/test/cells/${ONOS_CELL} ]; then
#   . $ONOS_ROOT/tools/test/cells/${ONOS_CELL}
# fi
export ONOS_INSTALL_DIR="/opt/onos"     # Installation directory on remote
export OCI="${OCI:-192.168.56.101}"     # ONOS Controller Instance
export ONOS_USER="${ONOS_USER:-sdn}"    # ONOS user on remote system
export ONOS_GROUP="${ONOS_GROUP:-sdn}"  # ONOS group on remote system
export ONOS_PWD="rocks"                 # ONOS user password on remote system
export ONOS_SCENARIOS=$ONOS_ROOT/tools/test/scenarios
