X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c16577403820fdfd88410cfe7048a2c2d65cc111..1e64cd695a165bd55a5aa595e566eb780aa10edb:/build/run-tests.sh diff --git a/build/run-tests.sh b/build/run-tests.sh index 51d80c34ae..ec6ced2226 100755 --- a/build/run-tests.sh +++ b/build/run-tests.sh @@ -35,8 +35,7 @@ Options: --short Skip (or scale down) some slow tests. --interactive Set up, then prompt for test/install steps to perform. WORKSPACE=path Arvados source tree to test. -CONFIGSRC=path Dir with api server config files to copy into source tree. - (If none given, leave config files alone in source tree.) +CONFIGSRC=path Dir with config.yml file containing PostgreSQL section for use by tests. (required) services/api_test="TEST=test/functional/arvados/v1/collections_controller_test.rb" Restrict apiserver tests to the given file sdk/python_test="--test-suite tests.test_keep_locator" @@ -96,6 +95,7 @@ services/arv-git-httpd services/crunchstat services/dockercleaner services/fuse +services/fuse:py3 services/health services/keep-web services/keepproxy @@ -196,6 +196,10 @@ sanity_checks() { [[ -n "${skip[sanity]}" ]] && return 0 ( [[ -n "$WORKSPACE" ]] && [[ -d "$WORKSPACE/services" ]] ) \ || fatal "WORKSPACE environment variable not set to a source directory (see: $0 --help)" + [[ -n "$CONFIGSRC" ]] \ + || fatal "CONFIGSRC environment not set (see: $0 --help)" + [[ -s "$CONFIGSRC/config.yml" ]] \ + || fatal "'$CONFIGSRC/config.yml' is empty or not found (see: $0 --help)" echo Checking dependencies: echo "locale: ${LANG}" [[ "$(locale charmap)" = "UTF-8" ]] \ @@ -209,8 +213,8 @@ sanity_checks() { echo -n 'go: ' go version \ || fatal "No go binary. See http://golang.org/doc/install" - [[ $(go version) =~ go1.([0-9]+) ]] && [[ ${BASH_REMATCH[1]} -ge 10 ]] \ - || fatal "Go >= 1.10 required. See http://golang.org/doc/install" + [[ $(go version) =~ go1.([0-9]+) ]] && [[ ${BASH_REMATCH[1]} -ge 12 ]] \ + || fatal "Go >= 1.12 required. See http://golang.org/doc/install" echo -n 'gcc: ' gcc --version | egrep ^gcc \ || fatal "No gcc. Try: apt-get install build-essential" @@ -226,6 +230,8 @@ sanity_checks() { echo -n 'Python3 pyconfig.h: ' find /usr/include -path '*/python3*/pyconfig.h' | egrep --max-count=1 . \ || fatal "No Python3 pyconfig.h. Try: apt-get install python3-dev" + which netstat \ + || fatal "No netstat. Try: apt-get install net-tools" echo -n 'nginx: ' PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin" nginx -v \ || fatal "No nginx. Try: apt-get install nginx" @@ -255,12 +261,6 @@ sanity_checks() { echo -n 'libpq libpq-fe.h: ' find /usr/include -path '*/postgresql/libpq-fe.h' | egrep --max-count=1 . \ || fatal "No libpq libpq-fe.h. Try: apt-get install libpq-dev" - echo -n 'services/api/config/database.yml: ' - if [[ ! -f "$WORKSPACE/services/api/config/database.yml" ]]; then - fatal "Please provide a database.yml file for the test suite" - else - echo "OK" - fi echo -n 'postgresql: ' psql --version || fatal "No postgresql. Try: apt-get install postgresql postgresql-client-common" echo -n 'phantomjs: ' @@ -388,12 +388,8 @@ checkpidfile() { checkhealth() { svc="$1" - port="$(cat "$WORKSPACE/tmp/${svc}.port")" - scheme=http - if [[ ${svc} =~ -ssl$ || ${svc} = wss ]]; then - scheme=https - fi - url="$scheme://localhost:${port}/_health/ping" + base=$(python -c "import yaml; print list(yaml.safe_load(file('$ARVADOS_CONFIG'))['Clusters']['zzzzz']['Services']['$1']['InternalURLs'].keys())[0]") + url="$base/_health/ping" if ! curl -Ss -H "Authorization: Bearer e687950a23c3a9bceec28c6223a06c79" "${url}" | tee -a /dev/stderr | grep '"OK"'; then echo "${url} failed" return 1 @@ -425,28 +421,29 @@ start_services() { fi all_services_stopped= fail=1 + cd "$WORKSPACE" \ && eval $(python sdk/python/tests/run_test_server.py start --auth admin) \ && export ARVADOS_TEST_API_HOST="$ARVADOS_API_HOST" \ && export ARVADOS_TEST_API_INSTALLED="$$" \ && checkpidfile api \ && checkdiscoverydoc $ARVADOS_API_HOST \ + && eval $(python sdk/python/tests/run_test_server.py start_nginx) \ + && checkpidfile nginx \ && python sdk/python/tests/run_test_server.py start_controller \ && checkpidfile controller \ - && checkhealth controller \ + && checkhealth Controller \ + && checkdiscoverydoc $ARVADOS_API_HOST \ && python sdk/python/tests/run_test_server.py start_keep_proxy \ && checkpidfile keepproxy \ && python sdk/python/tests/run_test_server.py start_keep-web \ && checkpidfile keep-web \ - && checkhealth keep-web \ + && checkhealth WebDAV \ && python sdk/python/tests/run_test_server.py start_arv-git-httpd \ && checkpidfile arv-git-httpd \ - && checkhealth arv-git-httpd \ + && checkhealth GitHTTP \ && python sdk/python/tests/run_test_server.py start_ws \ && checkpidfile ws \ - && eval $(python sdk/python/tests/run_test_server.py start_nginx) \ - && checkdiscoverydoc $ARVADOS_API_HOST \ - && checkpidfile nginx \ && export ARVADOS_TEST_PROXY_SERVICES=1 \ && (env | egrep ^ARVADOS) \ && fail=0 @@ -575,8 +572,6 @@ setup_virtualenv() { else "$venvdest/bin/pip" install --no-cache-dir 'setuptools>=18.5' 'pip>=7' fi - # ubuntu1404 can't seem to install mock via tests_require, but it can do this. - "$venvdest/bin/pip" install --no-cache-dir 'mock>=1.0' 'pbr<1.7.0' } initialize() { @@ -584,11 +579,6 @@ initialize() { echo "WORKSPACE=$WORKSPACE" - if [[ -z "$CONFIGSRC" ]] && [[ -d "$HOME/arvados-api-server" ]]; then - # Jenkins expects us to use this by default. - CONFIGSRC="$HOME/arvados-api-server" - fi - # Clean up .pyc files that may exist in the workspace cd "$WORKSPACE" find -name '*.pyc' -delete @@ -616,6 +606,8 @@ initialize() { export R_LIBS export GOPATH + # Make sure our compiled binaries under test override anything + # else that might be in the environment. export PATH=$GOPATH/bin:$PATH # Jenkins config requires that glob tmp/*.log match something. Ensure @@ -626,7 +618,6 @@ initialize() { unset http_proxy https_proxy no_proxy - # Note: this must be the last time we change PATH, otherwise rvm will # whine a lot. setup_ruby_environment @@ -663,7 +654,7 @@ install_env() { . "$VENVDIR/bin/activate" # Needed for run_test_server.py which is used by certain (non-Python) tests. - pip install --no-cache-dir PyYAML \ + pip install --no-cache-dir PyYAML future \ || fatal "pip install PyYAML failed" # Preinstall libcloud if using a fork; otherwise nodemanager "pip @@ -721,6 +712,8 @@ retry() { } do_test() { + check_arvados_config "$1" + case "${1}" in apps/workbench_units | apps/workbench_functionals | apps/workbench_integration) suite=apps/workbench @@ -773,7 +766,7 @@ do_test_once() { # before trying "go test". Otherwise, coverage-reporting # mode makes Go show the wrong line numbers when reporting # compilation errors. - go get -ldflags "-X main.version=${ARVADOS_VERSION:-$(git log -n1 --format=%H)-dev}" -t "git.curoverse.com/arvados.git/$1" && \ + go get -ldflags "-X git.curoverse.com/arvados.git/lib/cmd.version=${ARVADOS_VERSION:-$(git log -n1 --format=%H)-dev}" -t "git.curoverse.com/arvados.git/$1" && \ cd "$GOPATH/src/git.curoverse.com/arvados.git/$1" && \ if [[ -n "${testargs[$1]}" ]] then @@ -800,7 +793,10 @@ do_test_once() { tries=$((${tries}+1)) # $3 can name a path directory for us to use, including trailing # slash; e.g., the bin/ subdirectory of a virtualenv. - "${3}python" setup.py ${short:+--short-tests-only} test ${testargs[$1]} + if [[ -e "${3}activate" ]]; then + . "${3}activate" + fi + python setup.py ${short:+--short-tests-only} test ${testargs[$1]} result=$? if [[ ${tries} < 3 && ${result} == 137 ]] then @@ -822,7 +818,25 @@ do_test_once() { return $result } +check_arvados_config() { + if [[ "$1" = "env" ]] ; then + return + fi + if [[ -z "$ARVADOS_CONFIG" ]] ; then + # Create config file. The run_test_server script requires PyYAML, + # so virtualenv needs to be active. Downstream steps like + # workbench install which require a valid config.yml. + if [[ ! -s "$VENVDIR/bin/activate" ]] ; then + install_env + fi + . "$VENVDIR/bin/activate" + eval $(python sdk/python/tests/run_test_server.py setup_config) + deactivate + fi +} + do_install() { + check_arvados_config "$1" if [[ -n "${skip[install]}" || ( -n "${only_install}" && "${only_install}" != "${1}" && "${only_install}" != "${2}" ) ]]; then return 0 fi @@ -839,7 +853,7 @@ do_install_once() { result=1 elif [[ "$2" == "go" ]] then - go get -ldflags "-X main.version=${ARVADOS_VERSION:-$(git log -n1 --format=%H)-dev}" -t "git.curoverse.com/arvados.git/$1" + go get -ldflags "-X git.curoverse.com/arvados.git/lib/cmd.version=${ARVADOS_VERSION:-$(git log -n1 --format=%H)-dev}" -t "git.curoverse.com/arvados.git/$1" elif [[ "$2" == "pip" ]] then # $3 can name a path directory for us to use, including trailing @@ -932,19 +946,11 @@ install_services/api() { rm -f config/environments/test.rb cp config/environments/test.rb.example config/environments/test.rb - if [ -n "$CONFIGSRC" ] - then - for f in database.yml - do - cp "$CONFIGSRC/$f" config/ || fatal "$f" - done - fi - # Clear out any lingering postgresql connections to the test # database, so that we can drop it. This assumes the current user # is a postgresql superuser. cd "$WORKSPACE/services/api" \ - && test_database=$(python -c "import yaml; print yaml.safe_load(file('config/database.yml'))['test']['database']") \ + && test_database=$(python -c "import yaml; print yaml.safe_load(file('$ARVADOS_CONFIG'))['Clusters']['zzzzz']['PostgreSQL']['Connection']['dbname']") \ && psql "$test_database" -c "SELECT pg_terminate_backend (pg_stat_activity.pid::int) FROM pg_stat_activity WHERE pg_stat_activity.datname = '$test_database';" 2>/dev/null mkdir -p "$WORKSPACE/services/api/tmp/pids" @@ -968,11 +974,15 @@ install_services/api() { && git --git-dir internal.git init \ || return 1 - cd "$WORKSPACE/services/api" \ - && RAILS_ENV=test bundle exec rails db:environment:set \ - && RAILS_ENV=test bundle exec rake db:drop \ - && RAILS_ENV=test bundle exec rake db:setup \ - && RAILS_ENV=test bundle exec rake db:fixtures:load + + (cd "$WORKSPACE/services/api" + export RAILS_ENV=test + if bundle exec rails db:environment:set ; then + bundle exec rake db:drop + fi + bundle exec rake db:setup \ + && bundle exec rake db:fixtures:load + ) } declare -a pythonstuff @@ -984,13 +994,14 @@ pythonstuff=( sdk/cwl:py3 services/dockercleaner:py3 services/fuse + services/fuse:py3 services/nodemanager tools/crunchstat-summary tools/crunchstat-summary:py3 ) declare -a gostuff -gostuff=($(git grep -lw func | grep \\.go | sed -e 's/\/[^\/]*$//' | sort -u)) +gostuff=($(cd "$WORKSPACE" && git grep -lw func | grep \\.go | sed -e 's/\/[^\/]*$//' | sort -u)) install_apps/workbench() { cd "$WORKSPACE/apps/workbench" \ @@ -1040,7 +1051,7 @@ test_govendor() { test_services/api() { rm -f "$WORKSPACE/services/api/git-commit.version" cd "$WORKSPACE/services/api" \ - && env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake test TESTOPTS='-v -d' ${testargs[services/api]} + && eval env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake test TESTOPTS=\'-v -d\' ${testargs[services/api]} } test_sdk/ruby() { @@ -1077,47 +1088,32 @@ test_services/nodemanager_integration() { test_apps/workbench_units() { local TASK="test:units" - if [[ -n "${testargs[apps/workbench]}" ]] || [[ -n "${testargs[apps/workbench_units]}" ]]; then - TASK="test" - fi cd "$WORKSPACE/apps/workbench" \ - && env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} TESTOPTS='-v -d' ${testargs[apps/workbench]} ${testargs[apps/workbench_units]} + && eval env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} TESTOPTS=\'-v -d\' ${testargs[apps/workbench]} ${testargs[apps/workbench_units]} } test_apps/workbench_functionals() { local TASK="test:functionals" - if [[ -n "${testargs[apps/workbench]}" ]] || [[ -n "${testargs[apps/workbench_functionals]}" ]]; then - TASK="test" - fi cd "$WORKSPACE/apps/workbench" \ - && env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} TESTOPTS='-v -d' ${testargs[apps/workbench]} ${testargs[apps/workbench_functionals]} + && eval env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} TESTOPTS=\'-v -d\' ${testargs[apps/workbench]} ${testargs[apps/workbench_functionals]} } test_apps/workbench_integration() { local TASK="test:integration" - if [[ -n "${testargs[apps/workbench]}" ]] || [[ -n "${testargs[apps/workbench_integration]}" ]]; then - TASK="test" - fi cd "$WORKSPACE/apps/workbench" \ - && env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} TESTOPTS='-v -d' ${testargs[apps/workbench]} ${testargs[apps/workbench_integration]} + && eval env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} TESTOPTS=\'-v -d\' ${testargs[apps/workbench]} ${testargs[apps/workbench_integration]} } test_apps/workbench_benchmark() { local TASK="test:benchmark" - if [[ -n "${testargs[apps/workbench]}" ]] || [[ -n "${testargs[apps/workbench_benchmark]}" ]]; then - TASK="test" - fi cd "$WORKSPACE/apps/workbench" \ - && env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} ${testargs[apps/workbench_benchmark]} + && eval env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} ${testargs[apps/workbench_benchmark]} } test_apps/workbench_profile() { local TASK="test:profile" - if [[ -n "${testargs[apps/workbench]}" ]] || [[ -n "${testargs[apps/workbench_profile]}" ]]; then - TASK="test" - fi cd "$WORKSPACE/apps/workbench" \ - && env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} ${testargs[apps/workbench_profile]} + && eval env RAILS_ENV=test ${short:+RAILS_TEST_SHORT=1} bundle exec rake ${TASK} ${testargs[apps/workbench_profile]} } install_deps() { @@ -1157,11 +1153,11 @@ install_all() { fi fi done - do_install services/api for g in "${gostuff[@]}" do do_install "$g" go done + do_install services/api do_install apps/workbench } @@ -1238,6 +1234,13 @@ for p in "${pythonstuff[@]}"; do done testfuncargs["sdk/cli"]="sdk/cli" +testfuncargs["sdk/R"]="sdk/R" +testfuncargs["sdk/java-v2"]="sdk/java-v2" +testfuncargs["apps/workbench_units"]="apps/workbench_units" +testfuncargs["apps/workbench_functionals"]="apps/workbench_functionals" +testfuncargs["apps/workbench_integration"]="apps/workbench_integration" +testfuncargs["apps/workbench_benchmark"]="apps/workbench_benchmark" +testfuncargs["apps/workbench_profile"]="apps/workbench_profile" if [[ -z ${interactive} ]]; then install_all