lang: Initial implementation of the mgmt language

This is an initial implementation of the mgmt language. It is a
declarative (immutable) functional, reactive, domain specific
programming language. It is intended to be a language that is:

* safe
* powerful
* easy to reason about

With these properties, we hope this language, and the mgmt engine will
allow you to model the real-time systems that you'd like to automate.

This also includes a number of other associated changes. Sorry for the
large size of this patch.
This commit is contained in:
James Shubin
2018-01-20 08:09:29 -05:00
parent 1c8c0b2915
commit b19583e7d3
237 changed files with 25256 additions and 743 deletions

View File

@@ -2,7 +2,7 @@
# should take 15 seconds for longest resources plus startup time to shutdown
# we don't want the ^C to allow the rest of the graph to continue executing!
$timeout --kill-after=35s 25s ./mgmt run --yaml graph-exit.yaml --no-watch --no-pgp --tmp-prefix &
$timeout --kill-after=65s 55s ./mgmt run --yaml graph-exit1.yaml --no-watch --no-pgp --tmp-prefix &
pid=$!
sleep 5s # let the initial resources start to run...
killall -SIGINT mgmt # send ^C to exit mgmt

View File

@@ -2,7 +2,7 @@
# should take 15 seconds for longest resources plus startup time to shutdown
# we don't want the ^C to allow the rest of the graph to continue executing!
$timeout --kill-after=45s 35s ./mgmt run --yaml graph-exit.yaml --no-watch --no-pgp --tmp-prefix &
$timeout --kill-after=65s 55s ./mgmt run --yaml graph-exit2.yaml --no-watch --no-pgp --tmp-prefix &
pid=$!
sleep 10s # let the initial resources start to run...
killall -SIGINT mgmt # send ^C to exit mgmt

View File

@@ -1,5 +1,8 @@
#!/bin/bash -e
# XXX: this has not been updated to latest GAPI/Deploy API. Patches welcome!
exit 0
go build -i -o libmgmt libmgmt-change1.go
# this example should change graphs frequently, and then shutdown...
$timeout --kill-after=30s 20s ./libmgmt &

View File

@@ -1,5 +1,8 @@
#!/bin/bash -e
# XXX: this has not been updated to latest GAPI/Deploy API. Patches welcome!
exit 0
go build -i -o libmgmt libmgmt-change2.go
# this example should change graphs frequently, and then shutdown...
$timeout --kill-after=30s 20s ./libmgmt &

View File

@@ -1,5 +1,7 @@
#!/bin/bash -e
exit 0 # TODO: this test needs to be update to use deploys instead
#if env | grep -q -e '^TRAVIS=true$'; then
# # inotify doesn't seem to work properly on travis
# echo "Travis and Jenkins give wonky results here, skipping test!"

View File

@@ -2,16 +2,15 @@
# check for any bash files that aren't properly formatted
# TODO: this is hardly exhaustive
. test/util.sh
echo running test-bashfmt.sh
set -o errexit
set -o nounset
set -o pipefail
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
find_files() {
git ls-files | grep -e '\.sh$' -e '\.bash$' | grep -v 'misc/delta-cpu.sh'

View File

@@ -1,18 +1,20 @@
#!/bin/bash
# check that our examples still build, even if we don't run them here
. test/util.sh
echo running test-examples.sh
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
failures=''
function run-test()
{
$@ || failures=$( [ -n "$failures" ] && echo "$failures\\n$@" || echo "$@" )
}
ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
cd "${ROOT}"
make build
buildout='test-examples.out'
# make symlink to outside of package
@@ -34,6 +36,7 @@ rm `basename "$linkto"`
cd ..
rmdir "$tmpdir" # cleanup
make clean
if [[ -n "$failures" ]]; then
echo 'FAIL'
echo "The following tests (in: ${linkto}) have failed:"

View File

@@ -1,14 +1,15 @@
#!/bin/bash
# original version of this script from kubernetes project, under ALv2 license
. test/util.sh
echo running test-gofmt.sh
set -o errexit
set -o nounset
set -o pipefail
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
#GO_VERSION=($(go version))
#
@@ -16,8 +17,6 @@ ROOT=$(dirname "${BASH_SOURCE}")/..
# fail_test "Unknown go version '${GO_VERSION[2]}', failing gofmt."
#fi
cd "${ROOT}"
find_files() {
git ls-files | grep '\.go$'
}

View File

@@ -1,18 +1,20 @@
#!/bin/bash
# check that go lint passes or doesn't get worse by some threshold
echo running test-golint.sh
ORIGPWD=`pwd`
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
echo running test-golint.sh
# TODO: replace with gometalinter instead of plain golint
# TODO: output a diff of what has changed in the golint output
# FIXME: test a range of commits, since only the last patch is checked here
PREVIOUS='HEAD^'
CURRENT='HEAD'
THRESHOLD=1 # percent problems per new LOC
XPWD=`pwd`
ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
cd "${ROOT}" >/dev/null
# if this branch has more than one commit as compared to master, diff to that
# note: this is a cheap way to avoid doing a fancy succession of golint's...
@@ -55,7 +57,7 @@ LINT1=`find . -maxdepth 3 -iname '*.go' -not -path './old/*' -not -path './tmp/*
COUNT1=`echo -e "$LINT1" | wc -l` # number of golint problems in older branch
# clean up
cd "$XPWD" >/dev/null
cd "$ORIGPWD" >/dev/null
rm -rf "$T"
DELTA=$(printf "%.0f\n" `echo - | awk "{ print (($COUNT - $COUNT1) / $DIFF1) * 100 }"`)

View File

@@ -2,19 +2,19 @@
# check a bunch of linters with the gometalinter
# TODO: run this from the test-golint.sh file instead to check for deltas
. test/util.sh
echo running test-gometalinter.sh
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
failures=''
function run-test()
{
$@ || failures=$( [ -n "$failures" ] && echo "$failures\\n$@" || echo "$@" )
}
ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
cd "${ROOT}"
# TODO: run more linters here if we're brave...
gml='gometalinter --disable-all'
#gml="$gml --enable=aligncheck"

View File

@@ -1,17 +1,19 @@
#!/bin/bash
. test/util.sh
echo "running test-gotest.sh $1"
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
failures=''
function run-test()
{
$@ || failures=$( [ -n "$failures" ] && echo "$failures\\n$@" || echo "$@" )
}
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
make build
base=$(go list .)
for pkg in `go list ./... | grep -v "^${base}/vendor/" | grep -v "^${base}/examples/" | grep -v "^${base}/test/" | grep -v "^${base}/old/" | grep -v "^${base}/tmp/"`; do
@@ -23,6 +25,7 @@ for pkg in `go list ./... | grep -v "^${base}/vendor/" | grep -v "^${base}/examp
fi
done
make clean
if [[ -n "$failures" ]]; then
echo 'FAIL'
echo 'The following `go test` runs have failed:'

View File

@@ -1,19 +1,19 @@
#!/bin/bash
# check that go vet passes
. test/util.sh
echo running test-govet.sh
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
failures=''
function run-test()
{
$@ || failures=$( [ -n "$failures" ] && echo "$failures\\n$@" || echo "$@" )
}
ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
cd "${ROOT}"
GO_VERSION=($(go version))
function simplify-gocase() {

View File

@@ -1,20 +1,22 @@
#!/bin/bash
# check that headers are properly formatted
echo running test-headerfmt.sh
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
echo running test-headerfmt.sh
ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
FILE="${ROOT}/main.go" # file headers should match main.go
FILE="main.go" # file headers should match main.go
COUNT=0
while IFS='' read -r line; do # find what header should look like
echo "$line" | grep -q '^//' || break
COUNT=`expr $COUNT + 1`
done < "$FILE"
cd "${ROOT}"
find_files() {
git ls-files | grep '\.go$' | grep -v '^bindata/' | grep -v '^examples/' | grep -v '^test/'
git ls-files | grep '\.go$' | grep -v '^examples/' | grep -v '^test/'
}
bad_files=$(

View File

@@ -2,7 +2,15 @@
# simple test harness for testing mgmt
# NOTE: this will rm -rf /tmp/mgmt/
echo running test-shell.sh
set -o errexit
set -o pipefail
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
cd - >/dev/null
if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
echo -e "usage: ./"`basename $0`" [[--help] | <test>]"
@@ -10,10 +18,6 @@ if [ "$1" == "--help" ] || [ "$1" == "-h" ]; then
exit 1
fi
echo running test-shell.sh
set -o errexit
set -o pipefail
LINE=$(printf '=%.0s' `seq -s ' ' $(tput cols)`) # a terminal width string
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
cd "$DIR" >/dev/null # work from main mgmt directory

View File

@@ -3,20 +3,21 @@
exit 0 # i give up, we're skipping this entirely, help wanted to fix this
. test/util.sh
echo running test-yamlfmt.sh
set -o errexit
set -o nounset
set -o pipefail
#ROOT="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )" # dir!
ROOT=$(dirname "${BASH_SOURCE}")/..
cd "${ROOT}"
. test/util.sh
#if env | grep -q -e '^TRAVIS=true$' -e '^JENKINS_URL=' -e '^BUILD_TAG=jenkins'; then
# echo "Travis and Jenkins give wonky results here, skipping test!"
# exit 0
#fi
ROOT=$(dirname "${BASH_SOURCE}")/..
RUBY=`command -v ruby 2>/dev/null`
if [ -z $RUBY ]; then
fail_test "The 'ruby' utility can't be found."
@@ -46,8 +47,6 @@ if [ "$major" -eq 2 ] && [ "$minor" -lt 1 ] ; then
exit 0
fi
cd "${ROOT}"
find_files() {
git ls-files | grep '\.yaml$'
}