Many years ago I built and demoed a prototype of a simple web ui with a slider, and as you moved it left and right, it started up or shutdown some number of virtual machines. The webui was standalone code, but the rough idea of having events from a high-level overview flow into mgmt, was what I wanted to test out. At this stage, I didn't even have the language built yet. This prototype helped convince me of the way a web ui would fit into everything. Years later, I build an autogrouping prototype which looks quite similar to what we have today. I recently picked it back up to polish it a bit more. It's certainly not perfect, and might even be buggy, but it's useful enough that it's worth sharing. If I had more cycles, I'd probably consider removing the "store" mode, and replace it with the normal "value" system, but we would need the resource "mutate" API if we wanted this. This would allow us to directly change the "value" field, without triggering a graph swap, which would be a lot less clunky than the "store" situation. Of course I'd love to see a GTK version of this concept, but I figured it would be more practical to have a web ui over HTTP. One notable missing feature, is that if the "web ui" changes (rather than just a value changing) we need to offer to the user to reload it. It currently doesn't get an event for that, and so don't confuse your users. We also need to be better at validating "untrusted" input here. There's also no major reason to use the "gin" framework, we should probably redo this with the standard library alone, but it was easier for me to push out something quick this way. We can optimize that later. Lastly, this is all quite ugly since I'm not a very good web dev, so if you want to make this polished, please do! The wasm code is also quite terrible due to limitations in the compiler, and maybe one day when that works better and doesn't constantly deadlock, we can improve it.
91 lines
2.6 KiB
Bash
Executable File
91 lines
2.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
echo running "$0" "$@"
|
|
|
|
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
|
|
ROOT=$(dirname "${BASH_SOURCE}")/..
|
|
cd "${ROOT}"
|
|
. test/util.sh
|
|
|
|
# travis is slow for some reason
|
|
if in_env travis; then
|
|
export GO_TEST_TIMEOUT_SCALE=3
|
|
fi
|
|
|
|
# if we want to run this test as root, use build tag -root to ask each test...
|
|
XSUDO=''
|
|
XTAGS=()
|
|
if [[ "$@" = *"--root"* ]]; then
|
|
if ! timeout 1s sudo -A true; then
|
|
echo "sudo disabled: can't run as root"
|
|
exit 1
|
|
fi
|
|
XSUDO='sudo -E'
|
|
XTAGS+=('root')
|
|
fi
|
|
|
|
# As per https://github.com/travis-ci/docs-travis-ci-com/blob/master/user/docker.md
|
|
# Docker is not supported on Travis macOS test instances.
|
|
if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then
|
|
XTAGS+=('nodocker')
|
|
fi
|
|
|
|
failures=''
|
|
function run-test()
|
|
{
|
|
$XSUDO $@ -tags="${XTAGS[*]}" || failures=$( [ -n "$failures" ] && echo "$failures\\n$@" || echo "$@" )
|
|
}
|
|
|
|
# NOTE: you can run `go test` with the -tags flag to skip certain tests, eg:
|
|
# go test -tags nodocker github.com/purpleidea/mgmt/engine/resources -v
|
|
base=$(go list .)
|
|
if [[ "$@" = *"--integration"* ]]; then
|
|
if [[ "$@" = *"--race"* ]]; then
|
|
# adding -count=1 replaces the GOCACHE=off fix that was removed
|
|
run-test go test -count=1 -race "${base}/integration" -v
|
|
else
|
|
run-test go test -count=1 "${base}/integration" -v
|
|
fi
|
|
else
|
|
for pkg in `go list -e ./... | grep -v "^${base}/vendor/" | grep -v "^${base}/examples/" | grep -v "^${base}/test/" | grep -v "^${base}/old" | grep -v "^${base}/old/" | grep -v "^${base}/tmp" | grep -v "^${base}/tmp/" | grep -v "^${base}/integration"`; do
|
|
echo -e "\ttesting: $pkg"
|
|
|
|
if [ "$pkg" = "github.com/purpleidea/mgmt/engine/resources/http_ui" ]; then
|
|
continue # skip this special main package
|
|
fi
|
|
|
|
if [[ "$@" = *"--race"* ]]; then
|
|
# split up long tests to avoid CI timeouts
|
|
if [ "$pkg" = "${base}/lang" ]; then # pkg lang is big!
|
|
for sub in `go test "${base}/lang" -list Test`; do
|
|
if [ "$sub" = "ok" ]; then break; fi # skip go test output artifact
|
|
echo -e "\t\tsub-testing: $sub"
|
|
run-test go test -count=1 -race "$pkg" -run "$sub"
|
|
done
|
|
else
|
|
run-test go test -count=1 -race "$pkg"
|
|
fi
|
|
else
|
|
# split up long tests to avoid CI timeouts
|
|
if [ "$pkg" = "${base}/lang" ]; then # pkg lang is big!
|
|
for sub in `go test "${base}/lang" -list Test`; do
|
|
if [ "$sub" = "ok" ]; then break; fi # skip go test output artifact
|
|
echo -e "\t\tsub-testing: $sub"
|
|
run-test go test -count=1 "$pkg" -run "$sub"
|
|
done
|
|
else
|
|
run-test go test -count=1 "$pkg"
|
|
fi
|
|
fi
|
|
done
|
|
fi
|
|
|
|
if [[ -n "$failures" ]]; then
|
|
echo 'FAIL'
|
|
echo 'The following `go test` runs have failed:'
|
|
echo -e "$failures"
|
|
echo
|
|
exit 1
|
|
fi
|
|
echo 'PASS'
|