#
# SPDX-License-Identifier: AGPL-3.0
+set -e -o pipefail
+
+cleanup() {
+ set -x
+ kill ${arvboot_PID} ${consume_stdout_PID} ${wb2_PID} ${consume_wb2_stdout_PID}
+ wait ${arvboot_PID} ${consume_stdout_PID} ${wb2_PID} ${consume_wb2_stdout_PID} || true
+ if [ "${CLEANUP_ARVADOS_DIR}" -eq "1" ]; then
+ rm -rf ${ARVADOS_DIR}
+ fi
+ echo >&2 "done"
+}
+
random_free_port() {
while port=$(shuf -n1 -i $(cat /proc/sys/net/ipv4/ip_local_port_range | tr '\011' '-'))
netstat -atun | grep -q ":$port\s" ; do
echo $port
}
+usage() {
+ echo "Usage: ${0} [options]"
+ echo "Options:"
+ echo " -i Run Cypress in interactive mode."
+ echo " -a PATH Arvados dir. If PATH doesn't exist, a repo clone is downloaded there."
+ echo " -w PATH Workbench2 dir. Default: Current working directory"
+ exit 0
+}
+
# Allow self-signed certs on 'wait-on'
export NODE_TLS_REJECT_UNAUTHORIZED=0
-WORKDIR=`mktemp -d`
-ARVADOS_LOG=${WORKDIR}/arvados.log
-ARVADOS_CONF=`pwd`/tools/arvados_config.yml
+CLEANUP_ARVADOS_DIR=0
+CYPRESS_MODE="run"
+ARVADOS_DIR=`mktemp -d`
+WB2_DIR=`pwd`
+
+while getopts "ia:w:" o; do
+ case "${o}" in
+ i)
+ # Interactive mode
+ CYPRESS_MODE="open"
+ ;;
+ a)
+ ARVADOS_DIR=${OPTARG}
+ ;;
+ w)
+ WB2_DIR=${OPTARG}
+ ;;
+ *)
+ echo "Invalid Option: -$OPTARG" 1>&2
+ usage
+ ;;
+ esac
+done
+shift $((OPTIND-1))
+
+ARVADOS_LOG=${ARVADOS_DIR}/arvados.log
+ARVADOS_CONF=${WB2_DIR}/tools/arvados_config.yml
+
+if [ ! -f "${WB2_DIR}/src/index.tsx" ]; then
+ echo "ERROR: '${WB2_DIR}' isn't workbench2's directory"
+ usage
+fi
+
+if [ ! -f ${ARVADOS_CONF} ]; then
+ echo "ERROR: Arvados config file ${ARVADOS_CONF} not found"
+ exit 1
+fi
-if [ ! -e "${WORKDIR}/lib" ]; then
+if [ -f "${WB2_DIR}/public/config.json" ]; then
+ echo "ERROR: Please move public/config.json file out of the way"
+ exit 1
+fi
+
+if [ ! -d "${ARVADOS_DIR}/.git" ]; then
+ mkdir -p ${ARVADOS_DIR} || exit 1
+ CLEANUP_ARVADOS_DIR=1
echo "Downloading arvados..."
- git clone https://git.arvados.org/arvados.git ${WORKDIR} || exit 1
+ git clone https://git.arvados.org/arvados.git ${ARVADOS_DIR} || exit 1
fi
echo "Building & installing arvados-server..."
-cd ${WORKDIR}
+cd ${ARVADOS_DIR}
go mod download || exit 1
+cd cmd/arvados-server
+go install
+cd -
echo "Installing dev dependencies..."
-sudo go run ./cmd/arvados-server install -type test || exit 1
+~/go/bin/arvados-server install -type test || exit 1
-echo "Running arvados in test mode..."
-ARVADOS_PORT=`random_free_port`
-go run ./cmd/arvados-server boot \
- -config ${ARVADOS_CONF} \
+echo "Launching arvados in test mode..."
+coproc arvboot (~/go/bin/arvados-server boot \
-type test \
+ -config ${ARVADOS_CONF} \
-own-temporary-database \
- -controller-address :${ARVADOS_PORT} \
- -listen-host localhost > ${ARVADOS_LOG} 2>&1 &
+ -timeout 20m 2> ${ARVADOS_LOG})
+trap cleanup ERR EXIT
-cd -
-echo "Running workbench2..."
+read controllerURL <&"${arvboot[0]}" || exit 1
+echo "Arvados up and running at ${controllerURL}"
+IFS='/' ; read -ra controllerHostPort <<< "${controllerURL}" ; unset IFS
+controllerHostPort=${controllerHostPort[2]}
+
+# Copy coproc's stdout to stderr, to ensure `arvados-server boot`
+# doesn't get blocked trying to write stdout.
+exec 7<&"${arvboot[0]}"; coproc consume_stdout (cat <&7 >&2)
+
+cd ${WB2_DIR}
+echo "Launching workbench2..."
WB2_PORT=`random_free_port`
-PORT=${WB2_PORT} REACT_APP_ARVADOS_API_HOST=localhost:${ARVADOS_PORT} \
- yarn start &
+coproc wb2 (PORT=${WB2_PORT} \
+ REACT_APP_ARVADOS_API_HOST=${controllerHostPort} \
+ yarn start)
+exec 8<&"${wb2[0]}"; coproc consume_wb2_stdout (cat <&8 >&2)
-# Wait for arvados & workbench2 to be up.
+# Wait for workbench2 to be up.
# Using https-get to avoid false positive 'ready' detection.
-yarn run wait-on https-get://localhost:${ARVADOS_PORT}/discovery/v1/apis/arvados/v1/rest
-yarn run wait-on https-get://localhost:${WB2_PORT}
+yarn run wait-on --timeout 300000 https-get://localhost:${WB2_PORT} || exit 1
echo "Running tests..."
CYPRESS_system_token=systemusertesttoken1234567890aoeuidhtnsqjkxbmwvzpy \
- CYPRESS_controller_url=https://localhost:${ARVADOS_PORT} \
+ CYPRESS_controller_url=${controllerURL} \
CYPRESS_BASE_URL=https://localhost:${WB2_PORT} \
- yarn run cypress run
-TEST_EXIT_CODE=$?
-
-# Cleanup
-rm -rf ${WORKDIR}
-
-exit ${TEST_EXIT_CODE}
\ No newline at end of file
+ yarn run cypress ${CYPRESS_MODE}