#!/bin/bash
#
#   Copyright 2016 Telefónica Investigación y Desarrollo, S.A.U.
#
#   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.
# 
# Authors:
#    - Gerardo Garcia - gerardo.garciadeblas@telefonica.com
# 

HERE=$(realpath $(dirname $0))
OSM_JENKINS=$(dirname $HERE)
. $OSM_JENKINS/common/all_funcs

# SET YOU MDG repository name here
export OSM_MDG=RO
OSM_load_config

NOTEST=""
if [ "$1" = "--notest" ]; then
    shift
    NOTEST="y"
fi

OSM_git_checkout "$@"

INFO "installing RO packages and dependencies from current repo (--noclone)"
./scripts/install-openmano.sh --noclone --force -q
RC=$?

if [ -n "$NOTEST" ]; then
    INFO "done, RC=$RC"
    exit $RC
fi

INFO "starting build"

INFO "  cleaning .pyc"
rm -f *.pyc

INFO "  compiling *.py"
TEMPFILE="$(mktemp -q -p . "openmanolinker.XXXXXX.py")"
trap 'rm -f "$TEMPFILE"' EXIT
for i in `ls vimconn_*.py |sed "s/\.py//"`; do echo "import $i" >> $TEMPFILE; done

python $TEMPFILE &&
python -m py_compile *.py  # &&

#INFO "  basic_test"         &&
#./test/basictest.sh --force --insert-bashrc --install-openvim --init-openvim  #&&   #uncomment to add new tests
# OTHER TESTS HERE

RC=$?
INFO "done, RC=$RC"
exit $RC


