Merge branch 'main' from workbench2.git
authorTom Clegg <tom@curii.com>
Mon, 30 Oct 2023 14:17:55 +0000 (10:17 -0400)
committerTom Clegg <tom@curii.com>
Mon, 30 Oct 2023 14:17:55 +0000 (10:17 -0400)
refs #18874

Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

146 files changed:
1  2 
services/workbench2/Makefile
services/workbench2/cypress/fixtures/workflow_directory_array.yaml
services/workbench2/cypress/integration/banner-tooltip.spec.js
services/workbench2/cypress/integration/collection.spec.js
services/workbench2/cypress/integration/create-workflow.spec.js
services/workbench2/cypress/integration/process.spec.js
services/workbench2/cypress/integration/project.spec.js
services/workbench2/cypress/integration/search.spec.js
services/workbench2/cypress/integration/virtual-machine-admin.spec.js
services/workbench2/cypress/support/commands.js
services/workbench2/package.json
services/workbench2/src/common/html-sanitize.ts
services/workbench2/src/components/collection-panel-files/collection-panel-files.tsx
services/workbench2/src/components/copy-to-clipboard-snackbar/copy-to-clipboard-snackbar.tsx
services/workbench2/src/components/data-explorer/data-explorer.test.tsx
services/workbench2/src/components/data-explorer/data-explorer.tsx
services/workbench2/src/components/data-table-filters/data-table-filters-popover.tsx
services/workbench2/src/components/data-table-filters/data-table-filters-tree.tsx
services/workbench2/src/components/data-table-multiselect-popover/data-table-multiselect-popover.tsx
services/workbench2/src/components/data-table/data-table.test.tsx
services/workbench2/src/components/data-table/data-table.tsx
services/workbench2/src/components/icon/icon.tsx
services/workbench2/src/components/multiselect-toolbar/MultiselectToolbar.tsx
services/workbench2/src/components/multiselect-toolbar/ms-kind-action-differentiator.ts
services/workbench2/src/components/multiselect-toolbar/ms-toolbar-action-filters.ts
services/workbench2/src/components/select-field/select-field.tsx
services/workbench2/src/index.tsx
services/workbench2/src/models/tree.test.ts
services/workbench2/src/models/tree.ts
services/workbench2/src/services/collection-service/collection-service-files-response.ts
services/workbench2/src/services/collection-service/collection-service.ts
services/workbench2/src/services/common-service/trashable-resource-service.ts
services/workbench2/src/store/all-processes-panel/all-processes-panel-middleware-service.ts
services/workbench2/src/store/breadcrumbs/breadcrumbs-actions.ts
services/workbench2/src/store/collection-panel/collection-panel-action.ts
services/workbench2/src/store/collections/collection-copy-actions.ts
services/workbench2/src/store/collections/collection-move-actions.ts
services/workbench2/src/store/collections/collection-partial-copy-actions.ts
services/workbench2/src/store/collections/collection-partial-move-actions.ts
services/workbench2/src/store/context-menu/context-menu-actions.ts
services/workbench2/src/store/copy-dialog/copy-dialog.ts
services/workbench2/src/store/data-explorer/data-explorer-action.ts
services/workbench2/src/store/data-explorer/data-explorer-middleware-service.ts
services/workbench2/src/store/data-explorer/data-explorer-middleware.ts
services/workbench2/src/store/dialog/dialog-reducer.ts
services/workbench2/src/store/dialog/with-dialog.ts
services/workbench2/src/store/group-details-panel/group-details-panel-members-middleware-service.ts
services/workbench2/src/store/link-panel/link-panel-middleware-service.ts
services/workbench2/src/store/move-to-dialog/move-to-dialog.ts
services/workbench2/src/store/multiselect/multiselect-actions.tsx
services/workbench2/src/store/multiselect/multiselect-reducer.tsx
services/workbench2/src/store/navigation/navigation-action.ts
services/workbench2/src/store/open-in-new-tab/open-in-new-tab.actions.ts
services/workbench2/src/store/process-panel/process-panel-actions.ts
services/workbench2/src/store/process-panel/process-panel-reducer.ts
services/workbench2/src/store/processes/process-copy-actions.ts
services/workbench2/src/store/processes/process-move-actions.ts
services/workbench2/src/store/processes/process-update-actions.ts
services/workbench2/src/store/processes/process.ts
services/workbench2/src/store/processes/processes-actions.ts
services/workbench2/src/store/project-panel/project-panel-action-bind.ts
services/workbench2/src/store/project-panel/project-panel-action.ts
services/workbench2/src/store/project-panel/project-panel-middleware-service.ts
services/workbench2/src/store/projects/project-lock-actions.ts
services/workbench2/src/store/projects/project-move-actions.ts
services/workbench2/src/store/projects/project-update-actions.ts
services/workbench2/src/store/resource-type-filters/resource-type-filters.test.ts
services/workbench2/src/store/resources/resources-actions.ts
services/workbench2/src/store/resources/resources-reducer.ts
services/workbench2/src/store/resources/resources.ts
services/workbench2/src/store/run-process-panel/run-process-panel-actions.ts
services/workbench2/src/store/search-results-panel/search-results-middleware-service.ts
services/workbench2/src/store/shared-with-me-panel/shared-with-me-middleware-service.ts
services/workbench2/src/store/store.ts
services/workbench2/src/store/subprocess-panel/subprocess-panel-middleware-service.ts
services/workbench2/src/store/trash-panel/trash-panel-middleware-service.ts
services/workbench2/src/store/trash/trash-actions.ts
services/workbench2/src/store/tree-picker/picker-id.tsx
services/workbench2/src/store/tree-picker/tree-picker-actions.test.ts
services/workbench2/src/store/tree-picker/tree-picker-actions.ts
services/workbench2/src/store/tree-picker/tree-picker-reducer.test.ts
services/workbench2/src/store/tree-picker/tree-picker-reducer.ts
services/workbench2/src/store/users/user-panel-middleware-service.ts
services/workbench2/src/store/virtual-machines/virtual-machines-actions.ts
services/workbench2/src/store/workbench/workbench-actions.ts
services/workbench2/src/store/workflow-panel/workflow-panel-actions.ts
services/workbench2/src/views-components/baner/banner.tsx
services/workbench2/src/views-components/context-menu/action-sets/api-client-authorization-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/collection-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/collection-files-item-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/favorite-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/group-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/group-member-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/keep-service-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/link-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/permission-edit-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/process-resource-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/project-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/project-admin-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/repository-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/resource-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/root-project-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/search-results-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/ssh-key-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/trash-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/trashed-collection-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/user-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/virtual-machine-action-set.ts
services/workbench2/src/views-components/context-menu/action-sets/workflow-action-set.ts
services/workbench2/src/views-components/context-menu/context-menu-action-set.ts
services/workbench2/src/views-components/context-menu/context-menu.tsx
services/workbench2/src/views-components/data-explorer/data-explorer.tsx
services/workbench2/src/views-components/data-explorer/renderers.tsx
services/workbench2/src/views-components/dialog-copy/dialog-copy.tsx
services/workbench2/src/views-components/dialog-copy/dialog-process-rerun.tsx
services/workbench2/src/views-components/dialog-forms/copy-collection-dialog.ts
services/workbench2/src/views-components/dialog-forms/copy-process-dialog.ts
services/workbench2/src/views-components/dialog-forms/move-project-dialog.ts
services/workbench2/src/views-components/form-fields/collection-form-fields.tsx
services/workbench2/src/views-components/main-app-bar/account-menu.tsx
services/workbench2/src/views-components/main-app-bar/main-app-bar.tsx
services/workbench2/src/views-components/multiselect-toolbar/ms-collection-action-set.ts
services/workbench2/src/views-components/multiselect-toolbar/ms-process-action-set.ts
services/workbench2/src/views-components/multiselect-toolbar/ms-project-action-set.ts
services/workbench2/src/views-components/projects-tree-picker/generic-projects-tree-picker.tsx
services/workbench2/src/views-components/projects-tree-picker/projects-tree-picker.tsx
services/workbench2/src/views-components/projects-tree-picker/tree-picker-field.tsx
services/workbench2/src/views-components/search-bar/search-bar-view.tsx
services/workbench2/src/views/all-processes-panel/all-processes-panel.tsx
services/workbench2/src/views/inactive-panel/inactive-panel.tsx
services/workbench2/src/views/login-panel/login-panel.tsx
services/workbench2/src/views/process-panel/process-io-card.tsx
services/workbench2/src/views/process-panel/process-panel-root.tsx
services/workbench2/src/views/process-panel/process-panel.tsx
services/workbench2/src/views/project-panel/project-panel.tsx
services/workbench2/src/views/run-process-panel/inputs/directory-array-input.tsx
services/workbench2/src/views/run-process-panel/inputs/directory-input.tsx
services/workbench2/src/views/run-process-panel/inputs/file-array-input.tsx
services/workbench2/src/views/run-process-panel/inputs/file-input.tsx
services/workbench2/src/views/run-process-panel/inputs/project-input.tsx
services/workbench2/src/views/subprocess-panel/subprocess-panel.tsx
services/workbench2/src/views/virtual-machine-panel/virtual-machine-user-panel.tsx
services/workbench2/src/views/workbench/workbench.tsx
services/workbench2/src/websocket/websocket.ts
services/workbench2/tools/run-integration-tests.sh
services/workbench2/yarn.lock

index d621eb3e2f8842f07518db73c1416b20c45efd0f,0000000000000000000000000000000000000000..4d94661b33d22eaff0e98e742a58a61d8c4f50d6
mode 100644,000000..100644
--- /dev/null
@@@ -1,158 -1,0 +1,163 @@@
-       go install
 +# Copyright (C) The Arvados Authors. All rights reserved.
 +#
 +# SPDX-License-Identifier: Apache-2.0
 +
 +# Use bash, and run all lines in each recipe as one shell command
 +SHELL := /bin/bash
 +.ONESHELL:
 +
 +GOPATH?=~/go
 +APP_NAME?=arvados-workbench2
 +
 +# VERSION uses all the above to produce X.Y.Z.timestamp
 +# something in the lines of 1.2.0.20180612145021, this will be the package version
 +# it can be overwritten when invoking make as in make packages VERSION=1.2.0
 +VERSION?=$(shell ./version-at-commit.sh HEAD)
 +# We don't use BUILD_NUMBER at the moment, but it needs to be defined
 +BUILD_NUMBER?=0
 +GIT_COMMIT?=$(shell git rev-parse --short HEAD)
 +
 +# ITERATION is the package iteration, intended for manual change if anything non-code related
 +# changes in the package. (i.e. example config files externally added
 +ITERATION?=1
 +
 +TARGETS?=centos7 rocky8 debian10 debian11 ubuntu1804 ubuntu2004
 +
 +ARVADOS_DIRECTORY?=unset
 +
 +DESCRIPTION=Arvados Workbench2 - Arvados is a free and open source platform for big data science.
 +MAINTAINER=Arvados Package Maintainers <packaging@arvados.org>
 +
 +# DEST_DIR will have the build package copied.
 +DEST_DIR=/var/www/$(APP_NAME)/workbench2/
 +
 +# Debian package file
 +DEB_FILE=$(APP_NAME)_$(VERSION)-$(ITERATION)_amd64.deb
 +
 +# redHat package file
 +RPM_FILE=$(APP_NAME)-$(VERSION)-$(ITERATION).x86_64.rpm
 +
++GOPATH=$(shell go env GOPATH)
 +export WORKSPACE?=$(shell pwd)
 +
 +.PHONY: help clean* yarn-install test build packages packages-with-version integration-tests-in-docker
 +
 +help:
 +      @echo >&2
 +      @echo >&2 "There is no default make target here.  Did you mean 'make test'?"
 +      @echo >&2
 +      @echo >&2 "More info:"
 +      @echo >&2 "  Installing              --> http://doc.arvados.org/install"
 +      @echo >&2 "  Developing/contributing --> https://dev.arvados.org"
 +      @echo >&2 "  Project home            --> https://arvados.org"
 +      @echo >&2
 +      @false
 +
 +clean-deb:
 +      rm -f $(WORKSPACE)/*.deb
 +
 +clean-rpm:
 +      rm -f $(WORKSPACE)/*.rpm
 +
 +clean-node-modules:
 +      rm -rf $(WORKSPACE)/node_modules
 +
 +clean: clean-rpm clean-deb clean-node-modules
 +
 +arvados-server-install: check-arvados-directory
 +      cd $(ARVADOS_DIRECTORY)
 +      go mod download
 +      cd cmd/arvados-server
++      echo GOPATH is $(GOPATH)
++      GOFLAGS=-buildvcs=false go install
 +      cd -
 +      ls -l $(GOPATH)/bin/arvados-server
 +      $(GOPATH)/bin/arvados-server install -type test
 +
 +yarn-install:
 +      yarn install
 +
 +unit-tests: yarn-install
 +      yarn test --no-watchAll --bail --ci
 +
 +integration-tests: yarn-install check-arvados-directory
 +      yarn run cypress install
 +      $(WORKSPACE)/tools/run-integration-tests.sh -a $(ARVADOS_DIRECTORY)
 +
 +integration-tests-in-docker: workbench2-build-image check-arvados-directory
 +      docker run -ti -v$(PWD):/usr/src/workbench2 -v$(ARVADOS_DIRECTORY):/usr/src/arvados -w /usr/src/workbench2 -e ARVADOS_DIRECTORY=/usr/src/arvados workbench2-build make arvados-server-install integration-tests
 +
 +unit-tests-in-docker: workbench2-build-image check-arvados-directory
 +      docker run -ti -v$(PWD):/usr/src/workbench2 -v$(ARVADOS_DIRECTORY):/usr/src/arvados -w /usr/src/workbench2 -e ARVADOS_DIRECTORY=/usr/src/arvados workbench2-build make arvados-server-install unit-tests
 +
++tests-in-docker: workbench2-build-image check-arvados-directory
++      docker run -t -v$(PWD):/usr/src/workbench2 -v$(ARVADOS_DIRECTORY):/usr/src/arvados -w /usr/src/workbench2 -e ARVADOS_DIRECTORY=/usr/src/arvados -e ci="${ci}" workbench2-build make test
++
 +test: unit-tests integration-tests
 +
 +build: yarn-install
 +      VERSION=$(VERSION) BUILD_NUMBER=$(BUILD_NUMBER) GIT_COMMIT=$(GIT_COMMIT) yarn build
 +
 +$(DEB_FILE): build
 +      fpm \
 +       -s dir \
 +       -t deb \
 +       -n "$(APP_NAME)" \
 +       -v "$(VERSION)" \
 +       --iteration "$(ITERATION)" \
 +       --vendor="The Arvados Authors" \
 +       --maintainer="$(MAINTAINER)" \
 +       --url="https://arvados.org" \
 +       --license="GNU Affero General Public License, version 3.0" \
 +       --description="$(DESCRIPTION)" \
 +       --config-files="etc/arvados/$(APP_NAME)/workbench2.example.json" \
 +      $(WORKSPACE)/build/=$(DEST_DIR) \
 +      etc/arvados/workbench2/workbench2.example.json=/etc/arvados/$(APP_NAME)/workbench2.example.json
 +
 +$(RPM_FILE): build
 +      fpm \
 +       -s dir \
 +       -t rpm \
 +       -n "$(APP_NAME)" \
 +       -v "$(VERSION)" \
 +       --iteration "$(ITERATION)" \
 +       --vendor="The Arvados Authors" \
 +       --maintainer="$(MAINTAINER)" \
 +       --url="https://arvados.org" \
 +       --license="GNU Affero General Public License, version 3.0" \
 +       --description="$(DESCRIPTION)" \
 +       --config-files="etc/arvados/$(APP_NAME)/workbench2.example.json" \
 +       $(WORKSPACE)/build/=$(DEST_DIR) \
 +      etc/arvados/workbench2/workbench2.example.json=/etc/arvados/$(APP_NAME)/workbench2.example.json
 +
 +copy: $(DEB_FILE) $(RPM_FILE)
 +      for target in $(TARGETS); do \
 +              mkdir -p "packages/$$target" && \
 +              case "$$target" in \
 +                      centos*|rocky*) cp -p "$(RPM_FILE)" "packages/$$target" ;; \
 +                      debian*|ubuntu*) cp -p "$(DEB_FILE)" "packages/$$target" ;; \
 +                      *) echo "Unknown copy target $$target"; exit 1 ;; \
 +              esac ; \
 +      done ; \
 +      rm -f "$(DEB_FILE)" "$(RPM_FILE)"
 +
 +# use FPM to create DEB and RPM
 +packages: copy
 +
 +check-arvados-directory:
 +      @if test "${ARVADOS_DIRECTORY}" == "unset"; then echo "the environment variable ARVADOS_DIRECTORY must be set to the path of an arvados git checkout"; exit 1; fi
 +      @if ! test -d "${ARVADOS_DIRECTORY}"; then echo "the environment variable ARVADOS_DIRECTORY does not point at a directory"; exit 1; fi
 +
 +packages-in-docker: check-arvados-directory workbench2-build-image
 +      docker run --env ci="true" \
 +              --env ARVADOS_DIRECTORY=/tmp/arvados \
 +              --env APP_NAME=${APP_NAME} \
 +              --env ITERATION=${ITERATION} \
 +              --env TARGETS="${TARGETS}" \
 +              -w="/tmp/workbench2" \
 +              -t -v ${WORKSPACE}:/tmp/workbench2 \
 +              -v ${ARVADOS_DIRECTORY}:/tmp/arvados workbench2-build:latest \
 +              make packages
 +
 +workbench2-build-image:
 +      (cd docker && docker build -t workbench2-build .)
index 0000000000000000000000000000000000000000,fbdbd32c6d27cf6495b920067aa394d76c2f9033..fbdbd32c6d27cf6495b920067aa394d76c2f9033
mode 000000,100644..100644
--- /dev/null
Simple merge
index 0000000000000000000000000000000000000000,e7c66f11e78dce595286e8cddada6666969d43df..e7c66f11e78dce595286e8cddada6666969d43df
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,0248c8267d9201455d7c558d3815ac5a4b2eaf81..0248c8267d9201455d7c558d3815ac5a4b2eaf81
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,3d8ae0c3d315435958f71cf683826dbec6a5c827..3d8ae0c3d315435958f71cf683826dbec6a5c827
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,e2f643b6870e76d8f9e56b4e77ce49e679f29f80..e2f643b6870e76d8f9e56b4e77ce49e679f29f80
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9145a820694c7196c2676209e47cff43e327ae2d..9145a820694c7196c2676209e47cff43e327ae2d
mode 000000,100644..100644
--- /dev/null
Simple merge
index 0000000000000000000000000000000000000000,1c329a9e90496bb87b168e55b8302c9808f6c555..1c329a9e90496bb87b168e55b8302c9808f6c555
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,75c4b1f99388d5567b98cf7955c59db297355fd1..75c4b1f99388d5567b98cf7955c59db297355fd1
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,31a5f8d6b60677d7dbdef4a07982b074b564f859..31a5f8d6b60677d7dbdef4a07982b074b564f859
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,9622282c4fcb02414401006eb3e357b9b2569d22..9622282c4fcb02414401006eb3e357b9b2569d22
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,b0a2a1b024793aafc8e86d269f468c7a49324862..b0a2a1b024793aafc8e86d269f468c7a49324862
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,820fc7999eeb0595c22fba64a7f64cccfd8e61f0..820fc7999eeb0595c22fba64a7f64cccfd8e61f0
mode 000000,100644..100644
--- /dev/null
index 0000000000000000000000000000000000000000,2b5dfa22a5d9a0c16fd1f8fdf07534c91c87ce6f..2b5dfa22a5d9a0c16fd1f8fdf07534c91c87ce6f
mode 000000,100644..100644
--- /dev/null
index ece13cae1837dbaac61211ea3ceaf5b2a928d85f,0000000000000000000000000000000000000000..a9d7e8fc647d7d8f234744f6f3a84af63913af99
mode 100755,000000..100755
--- /dev/null
@@@ -1,151 -1,0 +1,151 @@@
-     go mod download || exit 1
 +#!/bin/bash
 +# Copyright (C) The Arvados Authors. All rights reserved.
 +#
 +# SPDX-License-Identifier: AGPL-3.0
 +
 +set -e -o pipefail
 +
 +cleanup() {
 +    set -x
 +    set +e +o pipefail
 +    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
 +        continue
 +    done
 +    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
 +
 +ARVADOS_DIR="unset"
 +CLEANUP_ARVADOS_DIR=0
 +CYPRESS_MODE="run"
 +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))
 +
 +if [ "${ARVADOS_DIR}" = "unset" ]; then
 +  echo "ARVADOS_DIR is unset, creating a temporary directory for new checkout"
 +  ARVADOS_DIR=`mktemp -d`
 +fi
 +
 +echo "ARVADOS_DIR is ${ARVADOS_DIR}"
 +
 +ARVADOS_LOG=${ARVADOS_DIR}/arvados.log
 +ARVADOS_CONF=${WB2_DIR}/tools/arvados_config.yml
 +VOCABULARY_CONF=${WB2_DIR}/tools/example-vocabulary.json
 +
 +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 [ -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 ${ARVADOS_DIR} || exit 1
 +fi
 +
 +if [ ! -x ${GOPATH:-${HOME}/go}/bin/arvados-server ]; then
 +    echo "Building & installing arvados-server..."
 +    cd ${ARVADOS_DIR}
-     go install
++    GOFLAGS=-buildvcs=false go mod download || exit 1
 +    cd cmd/arvados-server
++    GOFLAGS=-buildvcs=false go install
 +    cd -
 +
 +    echo "Installing dev dependencies..."
 +    ${GOPATH:-${HOME}/go}/bin/arvados-server install -type test || exit 1
 +fi
 +
 +echo "Launching arvados in test mode..."
 +TMPSUBDIR=$(mktemp -d -p /tmp | cut -d \/ -f3) # Removes the /tmp/ part for the regex below
 +TMPDIR=/tmp/${TMPSUBDIR}
 +cp ${VOCABULARY_CONF} ${TMPDIR}/voc.json
 +cp ${ARVADOS_CONF} ${TMPDIR}/arvados.yml
 +sed -i "s/VocabularyPath: \".*\"/VocabularyPath: \"\/tmp\/${TMPSUBDIR}\/voc.json\"/" ${TMPDIR}/arvados.yml
 +coproc arvboot (${GOPATH:-${HOME}/go}/bin/arvados-server boot \
 +    -type test \
 +    -source "${ARVADOS_DIR}" \
 +    -config ${TMPDIR}/arvados.yml \
 +    -no-workbench1 \
 +    -no-workbench2 \
 +    -own-temporary-database \
 +    -timeout 20m 2> ${ARVADOS_LOG})
 +trap cleanup ERR EXIT
 +
 +read controllerInfo <&"${arvboot[0]}" || exit 1
 +controllerURL=`echo "$controllerInfo" | awk '{print $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`
 +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 workbench2 to be up.
 +# Using https-get to avoid false positive 'ready' detection.
 +yarn run wait-on --timeout 300000 https-get://127.0.0.1:${WB2_PORT} || exit 1
 +
 +echo "Running tests..."
 +CYPRESS_system_token=systemusertesttoken1234567890aoeuidhtnsqjkxbmwvzpy \
 +    CYPRESS_controller_url=${controllerURL} \
 +    CYPRESS_BASE_URL=https://127.0.0.1:${WB2_PORT} \
 +    yarn run cypress ${CYPRESS_MODE}
Simple merge