X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/b174ae5f406a0254e017a9428ca3d3deda177b97..add09f355520b2bd1214b8c74d5a8d6c8e76dc88:/build/run-tests.sh diff --git a/build/run-tests.sh b/build/run-tests.sh index 766ff1b824..f83b045dce 100755 --- a/build/run-tests.sh +++ b/build/run-tests.sh @@ -35,7 +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 config.yml file containing PostgreSQL section for use by tests. (required) +CONFIGSRC=path Dir with config.yml file containing PostgreSQL section for use by tests. 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" @@ -81,6 +81,7 @@ lib/controller/railsproxy lib/controller/router lib/controller/rpc lib/crunchstat +lib/crunch-run lib/cloud lib/cloud/azure lib/cloud/cloudtest @@ -89,6 +90,8 @@ lib/dispatchcloud/container lib/dispatchcloud/scheduler lib/dispatchcloud/ssh_executor lib/dispatchcloud/worker +lib/mount +lib/pam lib/service services/api services/arv-git-httpd @@ -102,15 +105,10 @@ services/keepproxy services/keepstore services/keep-balance services/login-sync -services/nodemanager -services/nodemanager_integration -services/crunch-run services/crunch-dispatch-local services/crunch-dispatch-slurm services/ws sdk/cli -sdk/pam -sdk/pam:py3 sdk/python sdk/python:py3 sdk/ruby @@ -126,7 +124,7 @@ sdk/go/blockdigest sdk/go/asyncbuf sdk/go/stats sdk/go/crunchrunner -sdk/cwl +sdk/cwl:py3 sdk/R sdk/java-v2 tools/sync-groups @@ -196,17 +194,12 @@ 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)" + [[ -z "$CONFIGSRC" ]] || [[ -s "$CONFIGSRC/config.yml" ]] \ + || fatal "CONFIGSRC is $CONFIGSRC but '$CONFIGSRC/config.yml' is empty or not found (see: $0 --help)" echo Checking dependencies: echo "locale: ${LANG}" [[ "$(locale charmap)" = "UTF-8" ]] \ || fatal "Locale '${LANG}' is broken/missing. Try: echo ${LANG} | sudo tee -a /etc/locale.gen && sudo locale-gen" - echo -n 'virtualenv: ' - virtualenv --version \ - || fatal "No virtualenv. Try: apt-get install virtualenv (on ubuntu: python-virtualenv)" echo -n 'ruby: ' ruby -v \ || fatal "No ruby. Install >=2.1.9 (using rbenv, rvm, or source)" @@ -224,9 +217,9 @@ sanity_checks() { echo -n 'gnutls.h: ' find /usr/include -path '*gnutls/gnutls.h' | egrep --max-count=1 . \ || fatal "No gnutls/gnutls.h. Try: apt-get install libgnutls28-dev" - echo -n 'Python2 pyconfig.h: ' - find /usr/include -path '*/python2*/pyconfig.h' | egrep --max-count=1 . \ - || fatal "No Python2 pyconfig.h. Try: apt-get install python2.7-dev" + echo -n 'virtualenv: ' + python3 -m venv -h | egrep --max-count=1 . \ + || fatal "No virtualenv. Try: apt-get install python3-venv" 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" @@ -261,6 +254,9 @@ 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 'libpam pam_appl.h: ' + find /usr/include -path '*/security/pam_appl.h' | egrep --max-count=1 . \ + || fatal "No libpam pam_appl.h. Try: apt-get install libpam0g-dev" echo -n 'postgresql: ' psql --version || fatal "No postgresql. Try: apt-get install postgresql postgresql-client-common" echo -n 'phantomjs: ' @@ -283,6 +279,10 @@ sanity_checks() { # needed for pkgdown, builds R SDK doc pages which pandoc || fatal "No pandoc. Try: apt-get install pandoc" fi + echo 'procs with /dev/fuse open:' + find /proc/*/fd -lname /dev/fuse 2>/dev/null | cut -d/ -f3 | xargs --no-run-if-empty ps -lywww + echo 'grep fuse /proc/self/mountinfo:' + grep fuse /proc/self/mountinfo } rotate_logfile() { @@ -300,8 +300,6 @@ declare -A skip declare -A only declare -A testargs skip[apps/workbench_profile]=1 -# nodemanager_integration tests are not reliable, see #12061. -skip[services/nodemanager_integration]=1 while [[ -n "$1" ]] do @@ -372,7 +370,7 @@ if [[ ${skip["sdk/R"]} == 1 && ${skip["doc"]} == 1 ]]; then fi if [[ $NEED_SDK_R == false ]]; then - echo "R SDK not needed, it will not be installed." + echo "R SDK not needed, it will not be installed." fi checkpidfile() { @@ -388,7 +386,7 @@ checkpidfile() { checkhealth() { svc="$1" - base=$(python -c "import yaml; print list(yaml.safe_load(file('$ARVADOS_CONFIG'))['Clusters']['zzzzz']['Services']['$1']['InternalURLs'].keys())[0]") + base=$("${VENV3DIR}/bin/python3" -c "import yaml; print(list(yaml.safe_load(open('$ARVADOS_CONFIG','r'))['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" @@ -400,7 +398,7 @@ checkdiscoverydoc() { dd="https://${1}/discovery/v1/apis/arvados/v1/rest" if ! (set -o pipefail; curl -fsk "$dd" | grep -q ^{ ); then echo >&2 "ERROR: could not retrieve discovery doc from RailsAPI at $dd" - tail -v $WORKSPACE/services/api/log/test.log + tail -v $WORKSPACE/tmp/railsapi.log return 1 fi echo "${dd} ok" @@ -410,39 +408,39 @@ start_services() { if [[ -n "$ARVADOS_TEST_API_HOST" ]]; then return 0 fi - . "$VENVDIR/bin/activate" + . "$VENV3DIR/bin/activate" echo 'Starting API, controller, keepproxy, keep-web, arv-git-httpd, ws, and nginx ssl proxy...' if [[ ! -d "$WORKSPACE/services/api/log" ]]; then - mkdir -p "$WORKSPACE/services/api/log" + mkdir -p "$WORKSPACE/services/api/log" fi # Remove empty api.pid file if it exists if [[ -f "$WORKSPACE/tmp/api.pid" && ! -s "$WORKSPACE/tmp/api.pid" ]]; then - rm -f "$WORKSPACE/tmp/api.pid" + rm -f "$WORKSPACE/tmp/api.pid" fi all_services_stopped= fail=1 cd "$WORKSPACE" \ - && eval $(python sdk/python/tests/run_test_server.py start --auth admin) \ + && eval $(python3 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) \ + && eval $(python3 sdk/python/tests/run_test_server.py start_nginx) \ && checkpidfile nginx \ - && python sdk/python/tests/run_test_server.py start_controller \ + && python3 sdk/python/tests/run_test_server.py start_controller \ && checkpidfile controller \ && checkhealth Controller \ && checkdiscoverydoc $ARVADOS_API_HOST \ - && python sdk/python/tests/run_test_server.py start_keep_proxy \ + && python3 sdk/python/tests/run_test_server.py start_keep_proxy \ && checkpidfile keepproxy \ - && python sdk/python/tests/run_test_server.py start_keep-web \ + && python3 sdk/python/tests/run_test_server.py start_keep-web \ && checkpidfile keep-web \ && checkhealth WebDAV \ - && python sdk/python/tests/run_test_server.py start_arv-git-httpd \ + && python3 sdk/python/tests/run_test_server.py start_arv-git-httpd \ && checkpidfile arv-git-httpd \ && checkhealth GitHTTP \ - && python sdk/python/tests/run_test_server.py start_ws \ + && python3 sdk/python/tests/run_test_server.py start_ws \ && checkpidfile ws \ && export ARVADOS_TEST_PROXY_SERVICES=1 \ && (env | egrep ^ARVADOS) \ @@ -459,15 +457,15 @@ stop_services() { return fi unset ARVADOS_TEST_API_HOST ARVADOS_TEST_PROXY_SERVICES - . "$VENVDIR/bin/activate" || return + . "$VENV3DIR/bin/activate" || return cd "$WORKSPACE" \ - && python sdk/python/tests/run_test_server.py stop_nginx \ - && python sdk/python/tests/run_test_server.py stop_arv-git-httpd \ - && python sdk/python/tests/run_test_server.py stop_ws \ - && python sdk/python/tests/run_test_server.py stop_keep-web \ - && python sdk/python/tests/run_test_server.py stop_keep_proxy \ - && python sdk/python/tests/run_test_server.py stop_controller \ - && python sdk/python/tests/run_test_server.py stop \ + && python3 sdk/python/tests/run_test_server.py stop_nginx \ + && python3 sdk/python/tests/run_test_server.py stop_arv-git-httpd \ + && python3 sdk/python/tests/run_test_server.py stop_ws \ + && python3 sdk/python/tests/run_test_server.py stop_keep-web \ + && python3 sdk/python/tests/run_test_server.py stop_keep_proxy \ + && python3 sdk/python/tests/run_test_server.py stop_controller \ + && python3 sdk/python/tests/run_test_server.py stop \ && all_services_stopped=1 deactivate unset ARVADOS_CONFIG @@ -516,6 +514,10 @@ setup_ruby_environment() { || fatal 'rvm gemset setup' rvm env + (bundle version | grep -q 2.0.2) || gem install bundler -v 2.0.2 + bundle="$(which bundle)" + echo "$bundle" + "$bundle" version | grep 2.0.2 || fatal 'install bundler' else # When our "bundle install"s need to install new gems to # satisfy dependencies, we want them to go where "gem install @@ -541,9 +543,20 @@ setup_ruby_environment() { echo "Will install dependencies to $(gem env gemdir)" echo "Will install arvados gems to $tmpdir_gem_home" echo "Gem search path is GEM_PATH=$GEM_PATH" + bundle="$(gem env gempath | cut -f1 -d:)/bin/bundle" + ( + export HOME=$GEMHOME + bundlers="$(gem list --details bundler)" + versions=(1.11.0 1.17.3 2.0.2) + for v in ${versions[@]}; do + if ! echo "$bundlers" | fgrep -q "($v)"; then + gem install --user $(for v in ${versions[@]}; do echo bundler:${v}; done) + break + fi + done + "$bundle" version | tee /dev/stderr | grep -q 'version 2' + ) #|| fatal 'install bundler' ## This is needed for now. fi - bundle config || gem install bundler \ - || fatal 'install bundler' } with_test_gemset() { @@ -562,20 +575,20 @@ gem_uninstall_if_exists() { setup_virtualenv() { local venvdest="$1"; shift - if ! [[ -e "$venvdest/bin/activate" ]] || ! [[ -e "$venvdest/bin/pip" ]]; then - virtualenv --setuptools "$@" "$venvdest" || fatal "virtualenv $venvdest failed" + if ! [[ -e "$venvdest/bin/activate" ]] || ! [[ -e "$venvdest/bin/pip3" ]]; then + python3 -m venv "$@" "$venvdest" || fatal "virtualenv $venvdest failed" elif [[ -n "$short" ]]; then return fi - if [[ $("$venvdest/bin/python" --version 2>&1) =~ \ 3\.[012]\. ]]; then - # pip 8.0.0 dropped support for python 3.2, e.g., debian wheezy - "$venvdest/bin/pip" install --no-cache-dir 'setuptools>=18.5' 'pip>=7,<8' - else - "$venvdest/bin/pip" install --no-cache-dir 'setuptools>=18.5' 'pip>=7' - fi + "$venvdest/bin/pip3" install --no-cache-dir 'setuptools>=18.5' 'pip>=7' } initialize() { + # If dependencies like ruby, go, etc. are installed in + # /var/lib/arvados -- presumably by "arvados-server install" -- + # then we want to use those versions, instead of whatever happens + # to be installed in /usr. + PATH="/var/lib/arvados/bin:${PATH}" sanity_checks echo "WORKSPACE=$WORKSPACE" @@ -589,7 +602,7 @@ initialize() { fi # Set up temporary install dirs (unless existing dirs were supplied) - for tmpdir in VENVDIR VENV3DIR GOPATH GEMHOME PERLINSTALLBASE R_LIBS + for tmpdir in VENV3DIR GOPATH GEMHOME PERLINSTALLBASE R_LIBS do if [[ -z "${!tmpdir}" ]]; then eval "$tmpdir"="$temp/$tmpdir" @@ -627,63 +640,24 @@ initialize() { } install_env() { - ( - set -e - mkdir -p "$GOPATH/src/git.curoverse.com" - if [[ ! -h "$GOPATH/src/git.curoverse.com/arvados.git" ]]; then - for d in \ - "$GOPATH/src/git.curoverse.com/arvados.git/tmp/GOPATH" \ - "$GOPATH/src/git.curoverse.com/arvados.git/tmp" \ - "$GOPATH/src/git.curoverse.com/arvados.git/arvados" \ - "$GOPATH/src/git.curoverse.com/arvados.git"; do - [[ -h "$d" ]] && rm "$d" - [[ -d "$d" ]] && rmdir "$d" - done - fi - ln -vsfT "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" - go get -v github.com/kardianos/govendor - cd "$GOPATH/src/git.curoverse.com/arvados.git" - go get -v -d ... - "$GOPATH/bin/govendor" sync - which goimports >/dev/null || go get golang.org/x/tools/cmd/goimports - ) || fatal "Go setup failed" + go mod download || fatal "Go deps failed" + which goimports >/dev/null || go get golang.org/x/tools/cmd/goimports || fatal "Go setup failed" - setup_virtualenv "$VENVDIR" --python python2.7 - . "$VENVDIR/bin/activate" + setup_virtualenv "$VENV3DIR" # Needed for run_test_server.py which is used by certain (non-Python) tests. - pip install --no-cache-dir PyYAML future \ - || fatal "pip install PyYAML failed" - - # Preinstall libcloud if using a fork; otherwise nodemanager "pip - # install" won't pick it up by default. - if [[ -n "$LIBCLOUD_PIN_SRC" ]]; then - pip freeze 2>/dev/null | egrep ^apache-libcloud==$LIBCLOUD_PIN \ - || pip install --pre --ignore-installed --no-cache-dir "$LIBCLOUD_PIN_SRC" >/dev/null \ - || fatal "pip install apache-libcloud failed" - fi - - # Deactivate Python 2 virtualenv - deactivate - - # If Python 3 is available, set up its virtualenv in $VENV3DIR. - # Otherwise, skip dependent tests. - PYTHON3=$(which python3) - if [[ ${?} = 0 ]]; then - setup_virtualenv "$VENV3DIR" --python python3 - else - PYTHON3= - cat >&2 </dev/null - then - gem install --user-install bundler || fatal 'Could not install bundler' - fi + ( + set -e + "${VENV3DIR}/bin/pip3" install PyYAML + "${VENV3DIR}/bin/pip3" install httplib2 + "${VENV3DIR}/bin/pip3" install future + "${VENV3DIR}/bin/pip3" install google-api-python-client + "${VENV3DIR}/bin/pip3" install ciso8601 + "${VENV3DIR}/bin/pip3" install pycurl + "${VENV3DIR}/bin/pip3" install ws4py + cd "$WORKSPACE/sdk/python" + python3 setup.py install + ) || fatal "installing PyYAML and sdk/python failed" } retry() { @@ -714,9 +688,6 @@ do_test() { apps/workbench_units | apps/workbench_functionals | apps/workbench_integration) suite=apps/workbench ;; - services/nodemanager | services/nodemanager_integration) - suite=services/nodemanager_suite - ;; *) suite="${1}" ;; @@ -731,7 +702,7 @@ do_test() { stop_services check_arvados_config "$1" ;; - gofmt | govendor | doc | lib/cli | lib/cloud/azure | lib/cloud/ec2 | lib/cloud/cloudtest | lib/cmd | lib/dispatchcloud/ssh_executor | lib/dispatchcloud/worker) + gofmt | doc | lib/cli | lib/cloud/azure | lib/cloud/ec2 | lib/cloud/cloudtest | lib/cmd | lib/dispatchcloud/ssh_executor | lib/dispatchcloud/worker) check_arvados_config "$1" # don't care whether services are running ;; @@ -749,7 +720,7 @@ do_test() { go_ldflags() { version=${ARVADOS_VERSION:-$(git log -n1 --format=%H)-dev} - echo "-X git.curoverse.com/arvados.git/lib/cmd.version=${version} -X main.version=${version}" + echo "-X git.arvados.org/arvados.git/lib/cmd.version=${version} -X main.version=${version}" } do_test_once() { @@ -760,19 +731,19 @@ do_test_once() { result= if which deactivate >/dev/null; then deactivate; fi - if ! . "$VENVDIR/bin/activate" + if ! . "$VENV3DIR/bin/activate" then result=1 elif [[ "$2" == "go" ]] then covername="coverage-$(echo "$1" | sed -e 's/\//_/g')" coverflags=("-covermode=count" "-coverprofile=$WORKSPACE/tmp/.$covername.tmp") - # We do "go get -t" here to catch compilation errors + # We do "go install" here to catch compilation errors # before trying "go test". Otherwise, coverage-reporting # mode makes Go show the wrong line numbers when reporting # compilation errors. - go get -ldflags "$(go_ldflags)" -t "git.curoverse.com/arvados.git/$1" && \ - cd "$GOPATH/src/git.curoverse.com/arvados.git/$1" && \ + go install -ldflags "$(go_ldflags)" "$WORKSPACE/$1" && \ + cd "$WORKSPACE/$1" && \ if [[ -n "${testargs[$1]}" ]] then # "go test -check.vv giturl" doesn't work, but this @@ -781,7 +752,7 @@ do_test_once() { else # The above form gets verbose even when testargs is # empty, so use this form in such cases: - go test ${short:+-short} ${coverflags[@]} "git.curoverse.com/arvados.git/$1" + go test ${short:+-short} ${coverflags[@]} "git.arvados.org/arvados.git/$1" fi result=${result:-$?} if [[ -f "$WORKSPACE/tmp/.$covername.tmp" ]] @@ -825,19 +796,19 @@ do_test_once() { check_arvados_config() { if [[ "$1" = "env" ]] ; then - return + 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" + # 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 "$VENV3DIR/bin/activate" ]] ; then + install_env + fi + . "$VENV3DIR/bin/activate" cd "$WORKSPACE" - eval $(python sdk/python/tests/run_test_server.py setup_config) - deactivate + eval $(python3 sdk/python/tests/run_test_server.py setup_config) + deactivate fi } @@ -855,11 +826,11 @@ do_install_once() { result= if which deactivate >/dev/null; then deactivate; fi - if [[ "$1" != "env" ]] && ! . "$VENVDIR/bin/activate"; then + if [[ "$1" != "env" ]] && ! . "$VENV3DIR/bin/activate"; then result=1 elif [[ "$2" == "go" ]] then - go get -ldflags "$(go_ldflags)" -t "git.curoverse.com/arvados.git/$1" + go install -ldflags "$(go_ldflags)" "$WORKSPACE/$1" elif [[ "$2" == "pip" ]] then # $3 can name a path directory for us to use, including trailing @@ -875,10 +846,10 @@ do_install_once() { # install" ensures that we've actually installed the local package # we just built. cd "$WORKSPACE/$1" \ - && "${3}python" setup.py sdist rotate --keep=1 --match .tar.gz \ + && "${3}python3" setup.py sdist rotate --keep=1 --match .tar.gz \ && cd "$WORKSPACE" \ - && "${3}pip" install --no-cache-dir --quiet "$WORKSPACE/$1/dist"/*.tar.gz \ - && "${3}pip" install --no-cache-dir --quiet --no-deps --ignore-installed "$WORKSPACE/$1/dist"/*.tar.gz + && "${3}pip3" install --no-cache-dir "$WORKSPACE/$1/dist"/*.tar.gz \ + && "${3}pip3" install --no-cache-dir --no-deps --ignore-installed "$WORKSPACE/$1/dist"/*.tar.gz elif [[ "$2" != "" ]] then "install_$2" @@ -895,11 +866,11 @@ bundle_install_trylocal() { ( set -e echo "(Running bundle install --local. 'could not find package' messages are OK.)" - if ! bundle install --local --no-deployment; then + if ! "$bundle" install --local --no-deployment; then echo "(Running bundle install again, without --local.)" - bundle install --no-deployment + "$bundle" install --no-deployment fi - bundle package --all + "$bundle" package ) } @@ -946,8 +917,10 @@ install_services/login-sync() { install_services/api() { stop_services + check_arvados_config "services/api" cd "$WORKSPACE/services/api" \ - && RAILS_ENV=test bundle_install_trylocal + && RAILS_ENV=test bundle_install_trylocal \ + || return 1 rm -f config/environments/test.rb cp config/environments/test.rb.example config/environments/test.rb @@ -956,7 +929,7 @@ install_services/api() { # 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('$ARVADOS_CONFIG'))['Clusters']['zzzzz']['PostgreSQL']['Connection']['dbname']") \ + && test_database=$("${VENV3DIR}/bin/python3" -c "import yaml; print(yaml.safe_load(open('$ARVADOS_CONFIG','r'))['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" @@ -965,7 +938,7 @@ install_services/api() { if [[ ! -e "$cert.pem" || "$(date -r "$cert.pem" +%s)" -lt 1512659226 ]]; then ( dir="$WORKSPACE/services/api/tmp" - set -ex + set -e openssl req -newkey rsa:2048 -nodes -subj '/C=US/ST=State/L=City/CN=localhost' -out "$cert.csr" -keyout "$cert.key" &2 "vendor/vendor.json has unused or missing dependencies -- try: - -(export GOPATH=\"${GOPATH}\"; cd \$GOPATH/src/git.curoverse.com/arvados.git && \$GOPATH/bin/govendor add +missing +external && \$GOPATH/bin/govendor remove +unused) - -" - return 1 - fi - ) -} - test_services/api() { rm -f "$WORKSPACE/services/api/git-commit.version" cd "$WORKSPACE/services/api" \ - && eval 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() { cd "$WORKSPACE/sdk/ruby" \ - && bundle exec rake test TESTOPTS=-v ${testargs[sdk/ruby]} + && "$bundle" exec rake test TESTOPTS=-v ${testargs[sdk/ruby]} } test_sdk/R() { @@ -1075,51 +1022,46 @@ test_sdk/R() { test_sdk/cli() { cd "$WORKSPACE/sdk/cli" \ && mkdir -p /tmp/keep \ - && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test TESTOPTS=-v ${testargs[sdk/cli]} + && KEEP_LOCAL_STORE=/tmp/keep "$bundle" exec rake test TESTOPTS=-v ${testargs[sdk/cli]} } test_sdk/java-v2() { - cd "$WORKSPACE/sdk/java-v2" && gradle test + cd "$WORKSPACE/sdk/java-v2" && gradle test ${testargs[sdk/java-v2]} } test_services/login-sync() { cd "$WORKSPACE/services/login-sync" \ - && bundle exec rake test TESTOPTS=-v ${testargs[services/login-sync]} -} - -test_services/nodemanager_integration() { - cd "$WORKSPACE/services/nodemanager" \ - && tests/integration_test.py ${testargs[services/nodemanager_integration]} + && "$bundle" exec rake test TESTOPTS=-v ${testargs[services/login-sync]} } test_apps/workbench_units() { local TASK="test:units" cd "$WORKSPACE/apps/workbench" \ - && eval 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" cd "$WORKSPACE/apps/workbench" \ - && eval 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" cd "$WORKSPACE/apps/workbench" \ - && eval 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" cd "$WORKSPACE/apps/workbench" \ - && eval 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" cd "$WORKSPACE/apps/workbench" \ - && eval 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() { @@ -1128,7 +1070,7 @@ install_deps() { do_install cmd/arvados-server go do_install sdk/cli do_install sdk/perl - do_install sdk/python pip + do_install sdk/python pip "${VENV3DIR}/bin/" do_install sdk/ruby do_install services/api do_install services/arv-git-httpd go @@ -1146,6 +1088,7 @@ install_all() { do_install sdk/perl do_install sdk/cli do_install services/login-sync + ## FIXME, ignore all python2 for p in "${pythonstuff[@]}" do dir=${p%:py3} @@ -1179,14 +1122,13 @@ test_all() { fi do_test gofmt - do_test govendor do_test doc do_test sdk/ruby do_test sdk/R do_test sdk/cli do_test services/login-sync do_test sdk/java-v2 - do_test services/nodemanager_integration + ## FIXME, ignore all python2 for p in "${pythonstuff[@]}" do dir=${p%:py3} @@ -1216,6 +1158,7 @@ help_interactive() { echo "== Interactive commands:" echo "TARGET (short for 'test DIR')" echo "test TARGET" + echo "10 test TARGET (run test 10 times)" echo "test TARGET:py3 (test with python3)" echo "test TARGET -check.vv (pass arguments to test)" echo "install TARGET" @@ -1235,7 +1178,6 @@ for g in "${gostuff[@]}"; do done for p in "${pythonstuff[@]}"; do dir=${p%:py3} - testfuncargs[$dir]="$dir pip $VENVDIR/bin/" testfuncargs[$dir:py3]="$dir pip $VENV3DIR/bin/" done @@ -1255,13 +1197,13 @@ else skip=() only=() only_install=() - if [[ -e "$VENVDIR/bin/activate" ]]; then stop_services; fi + if [[ -e "$VENV3DIR/bin/activate" ]]; then stop_services; fi setnextcmd() { if [[ "$TERM" = dumb ]]; then # assume emacs, or something, is offering a history buffer # and pre-populating the command will only cause trouble nextcmd= - elif [[ ! -e "$VENVDIR/bin/activate" ]]; then + elif [[ ! -e "$VENV3DIR/bin/activate" ]]; then nextcmd="install deps" else nextcmd="" @@ -1276,6 +1218,10 @@ else while read -p 'What next? ' -e -i "$nextcmd" nextcmd; do history -s "$nextcmd" history -w + count=1 + if [[ "${nextcmd}" =~ ^[0-9] ]]; then + read count nextcmd <<<"${nextcmd}" + fi read verb target opts <<<"${nextcmd}" target="${target%/}" target="${target/\/:/:}" @@ -1295,10 +1241,14 @@ else ${verb}_${target} ;; *) - testargs["$target"]="${opts}" + argstarget=${target%:py3} + testargs["$argstarget"]="${opts}" tt="${testfuncargs[${target}]}" tt="${tt:-$target}" - do_$verb $tt + while [ $count -gt 0 ]; do + do_$verb $tt + let "count=count-1" + done ;; esac ;;