diff --git a/bin/setup-circleci-secrets b/bin/setup-circleci-secrets
new file mode 100755
index 000000000..d592253ef
--- /dev/null
+++ b/bin/setup-circleci-secrets
@@ -0,0 +1,109 @@
+#!/bin/bash
+
+set -eu
+
+# openssl enc -in do-setup-circleci-secrets.orig -out setup-circleci-secrets.orig -e -aes256 -pass stdin
+# openssl base64 < setup-circleci-secrets.orig
+
+openssl base64 -d << EOF \
+ | openssl enc \
+ -out bin/do-setup-circleci-secrets \
+ -d -aes256 -pass pass:$1
+U2FsdGVkX193YHZJXNzxU9GqigQaXWrA0AKd+BIjRcx7bmmKn/zSgOv+FfApRRjn
+KGBd2ulZw9CwsftX0HWHzVdtpgqbJUW+FEma8eNldau4/f+T+yWTVpCNQXGc3DvB
+cWYhmkoTfGWmI2v/0/Bv2TYkw7MAfjCocdluFAv7sSvYnSgIjoYxD4XXkTjLWy1P
+KUMUBPSRgQlyY01fTHmh+mvY/pLAF+Cfe+vvBNbCUVj2IfplWbN/K3ewco8UHJQI
+9KZO36dvevExXfIhCa0FS1A9cxjTRl+wX6pi9d6XCbfmJ727CPOBz1Cla2+Yr3Pr
+yXuTb/oIgKZ2tbmFrABRmui69NLqfi7AwkWM7W8Xs3oxrY09TRtyuN6gc3X+vlhu
+2ylNFgVQEA4KfWDewfl8zILYwzO5gMpEpkduFMjSTn3v170s7IYjUtNyq9FFA/GK
+kfh/LCPYIXyk6qoRLNEOFw2DkA04D3dG6Qm0np2TacBdEBchYQhZB1wqKNCOj6rZ
+ROBgBvn5DwiE51WOGdnekWF1chbFReVXcW8Nl4XWZTQ8HoRRx7F0JgV+PRMqvxpn
+Qp5Iv/TTvYwQUToM0XK7GdQObDvC6vnuCQXLl+iBOXwsEp1jzf/3Zb45vp+L5Qwi
+p2HaT+cvW1SkSwktO34mnGVMRRb8/TqtEKCVCLlNXNiZPIDyKr0HLOs3sdXT844f
+K8h9qmStr9bRpa7QBMXvQtwdnuI3V4cFU00AVief6V5gwfHzsMO6cWxBUtQudRr1
+EysuvemGtsNNBR1UTtLzbWRtTc2pC3bPQe/ZLW5KMgwTvehBGsCEs7k9lgedXZLj
+5bg5aF9OxeOAfpOj49AKDOtYf6KlOrBydO6/3q9XXijaEsX8cFI4ynwgGztYIAjZ
+O/2KyD6Tm4s/3RmfR1IHRW4Spb9ApeA9IC+FZVFn4rhwCmyu5ujU6+PQFpAPM0M3
+W7QYxnaY/Jhh7/rhMj+dy4/aEnMVVi0hF71DPew73ZZRiD13d5y0FkjrV++xIMiu
+emuE9z57r0RrC0/I6/S+TDVRXmhWAerNJ03evcg1o3BqVs72lF24iAMFA3IRBugH
+uW1Nm22aqi2OfMu0rewnRS0PwOgPccq5c2BOJTm2/XPHF2T4v5jDBD4FXDenScZM
+3aW8vRRcmFdvivWE08uTJQkajX0O74StIRr0FPRB8+tr3yqIVWtiDB2o2hn/vfVM
+cjck/l37qQzjwZ/5UyBl80BsDz5PENRFWQGi0lwAT3HNvnvWChoIk/bma5htttqO
+iSOiZ1IlElnhLERmIIoeolB9b2dXPFJ1eKYovEJyIdSxKCrwa5lzxYw7Mc8CApv5
+DzCCUTqZwh2e0+e7C4ywIRZreZ7t4kTJOSGNMaALaQ1KgM6RCVH3y8FRMJ2Q8alH
+kjZsI9wDZRVE6/U8qP+m+kb3MIRpSIRm2r8jyoPRwYVjpjGtU36wFFZNA55yEJWx
+/qiVilHymIA8dcItAybinf+87VA3bIEPXDLhP4LMPkmu4ZQTzOF4bejA5lKk/vMs
+4Hz0YmHW8BU8m+Pm8QRKfPYsEpre4FpiaGB3xfrzcIg7NIT5/dqQODAn21B/Dl8E
+mZHU4bVsyccwEhgF/vXogZiAroiZbEXvz8LE+A1wC+G3UW28P8OSh7GYTW9D1yQK
+MkTSmFmEjxdvZNXV3MCmjuBwqBRQa+3f0rZqmKu7aA+U9vA5uoMjKW5Ed52mX74d
+gF7EbmDniIN5BunmbEpsKFEs/AXOR6+/tM2kKqm0jTSzEJjM0sglmLlfiEYV9vNK
+maHYoiIQWhO5mlhosSABeYFf3268O2O8EUnzbV2xoqtpREbfjlvSylb1VeVe5/bE
+NRKL8wC+HIXYZVOBO2AcZyCgLk6SPpaDaA7Gi5LoVMglmKRLRuxzV53eYjjl9bkz
+q2xwee3cfk8waAc37BEVbJGmRC4LCmaiCqiSkPyOlXYIc4I6zttojx1rWskVk/Fj
+2V3G2S5aEXhdTOhVykY4U8dl5MEimne+On4Nj7yUbQT6CKO/FCiHHZ33G1XGZMtM
+3orvtpy5t7VIh7y8jmqMzI2KUJIWyYT4znLZY4RCDR5I8mlG5L83HfqNy72fC0pl
+KrRh14s5uPt3Lo5CdMCiJaqB0EFYPfsUN8xV6k9MtKMT/CgKDZdoYgaJR3HTf0IO
+Ubqp7YYXAdfY2IZA9DcImYTlM5kgj79gxh0ZRMKOLjbHLH6wVDPjmdLDKebFWiTq
+lmyKbhvJOGZW2WW7lD23yZkyxCWU4PVoXyRiDHWi/kMtwFPAq9DRoeLZT/se2elF
+nC7Fp5F3b0AljeqTyuLLRgTmuCLetk6jLGVEri26VB0gM9Jj67jv1tmRytOHjxDX
+QgvQ999SCtv3zJvUGp0PfAhzejIynBPlXZu59Eo8eP7Ti0ooLzw/zFfLGdMkBrII
+LBOHE5CL6Gk73mLQb8K6hVAivhcZHthzaiZCk4XLIzRCg4IpEhg12gr62ofM+tLJ
+32sfdRRPDY0J73+6HPO/j1j2lFUWRx9eXkKewEmtC3Y3VUq/dFDrCGTcdWKyVzyb
+jwvEEv605kJea1z7/FPzC++nXwleFzkaK/essmCYymQOsw01gRrnIauFalj1c2pY
+ioqpWfVjWvk5tij6T40tTQllGV9zSQAw07cTB0x5TWWrJpPp+/SxzwwkC5jyXyGS
+zIxVyglh20U4d4BTNXwQJbXRzxJeMQhAcfiU1xMSNTXrQ3if1wbj8KwHcrMDq2eI
+Y3FNSnXGlpfiGMCC0xhwubmwBO+OKzQESy2VZMLo7DahaCov0PnpKu/jeZFRZuLu
+5vsz//bRlK2rouAeP3C+0U1EcN51hRbEuU7Y4XhMGgzH0oOJHDVK79pYQ3uS8f/2
+cHIlq9kUrm38kvPvvwcSEikmAmNHIswCskBkh1v+kILB5tlMhBBgV3eW29BoNiKk
+vpCD+70GeE9KuWX4fioDWeC1DBPLeNlEL/hIrIjl1CxmBRvgQmtCG7BbGRgdxZ3c
+VSyG4usPPLK1pjMl9jl0S5Y1B5qG3njEl1vmpdxBjjsWIw2x/UqLJs2vP5v0s7Ai
+ZcQ2npTP9n3M9Dj49bZrxOclPzsG8Cuwu3c4MhfsQPh22Ao6J6G1dtjz/GvPkEEH
+24Yu+z8Iv2fnRYbXOnkDWlnoaJTZqkXd2KN4c+Hy6zBLlq0DWXTeQIgQR19coKDn
+UfhWT9GzW/OsrzBeba002jQayOM3KVt+cOk7+JTK0krx7ZlodUXa0D9NzWsx5GuC
+Zx9K6mGE+RuOir1x0x7Z1XH6UBKDnmzHTe545fa5I03SIB0k02YrtxuO8UYPODac
+X9T3JRD4EhH2o5uPkktEdzIJT+8oVaU+xW+fa5hgiEfatpVXvIhT8aNzyxFwYbHr
+gd6TZcqe04/CQYfUUCPDjwSJimeoDm8zVQttcjA2q4SUOtV9zODqkQOrpQ+sx0SJ
+ky15Y40dJ98toj/xlLUe2HDzodofOI0+y99lpI/Ym1OqZV09wjPDAkue5yLCa+H1
+rSCKAtFOP68MerPIOEcbU7lL18tBY65p+/0UrdOkjcHl9fbN3mjDpNGl+NRNGVWY
+Ly8J247AXaeaFBGMNuyD5bhKHB8INFSbmWqOxkmjNiyPCnDX5oLdibay94cMbf5D
+BobCDdz/SSnHGI+B+R15i6TjC/mdBrPd6LHIcxaC4107FB2n0urCQE0ovd5AFdPP
+i8W6VBDkZuz5KpfPPkTjrOOH8cRVu971gIHSSfpiNbHlFgH6ewySPo41wd3TbSuk
+TqWeeLmfDwHPIikBGQXax6lhNUIUrCyeAlPalkN2skQd1D+EyP+2siiGUP1VPHiq
+lrUY1/3+qLafGEtovOoqcUsE3wZqbjJfZq5filXrVdt/ZSRIKfWuJ+eU2avfpy6n
+y88+yp5nhZjHIdmpwtlbuIKo1SgZA1oqI0pBXA1q8T2xhHBUhyBg7wgofDvo/8Lu
+fF6e/+u1cgaRDnLilL0UVzWB4C5GYncLOSuuvCFArmehR7MiK2LPNinFpDml40C7
+QMDuhj/3Ox+HTrOn9VjZfo8Xh+xRn8K1TmXSq8OGh1+q/OYMZJJLbRVCkv6YPL0U
+UEBhRN3eXjUWaOKAIBhBgjhEcMEueN/8ijklmkUQ08i677Lvb+uSc/bBmnsbEisZ
+n2LccJiGcmmKj8LqEfwSBylfbIZNN70tvWe64RZ60YepGEOaPX69E7LDg8cg7V/Z
+87XeZXPiADcYrb36b5WzlxVlvTV66xkfjOOmBz+BJ5JBmJTWQSerARmxFqKIkaF0
+gatay37z+GVsSDV5tI/OONcTnamvFDn5hTFKDFjcPtzSlXRV9ZnjOeLNnjz4vPrv
+GAPFAYO2eE7T/YGxiYPwy6fEvN+dQ4aIK9A3ZR0nzdBTvjw03VSNcSLQYlUXhoEO
+nfWuEtZeWycMabC8OPIuaKWajMZlUBLnxIp/+Pv/oer8/LIkFWtY0wQ7WtEbesLb
+w6OaPx2Gr0o4yxc2NiAl82wfkkxgX6J9MpcRB3d0SoLnopFwzzLRbq9nr9tglc4J
+ps95F+89SBb5PY9o3eV7ixmDFvykRQ6E/r+gO0WQ5ToIeZfIasnyQyPKMUA1/l0z
+W/m9Ibi0VwdKO7BAvnOKJBglsW8TqMwYDFpecY8jw6y9MTkwEryIWh7l/uIiu4J+
+wfLAq8u4ltlILow5BiuuyvPsKrohZIC3NHwHcFKzw62/aprfcXITyfnlsrrqfT5A
+COulRUYWlY8XstsWSTlEsqa5OzTdx9uprO0e6tce3YpCSSwYwZYxQvf8wlyaD6iq
+eFECRFbbV4BGvQTxf/f+WORgUgcULbrObeJV4b8biJaJeqRKZpMVvFTxLPWZgXzJ
+wQ64KTE71KMNRapxlx2CB4Fh465iS9rjaQEc4wOmC2v3gyG+cD+8QXnJFs/l741g
+8WXQK2O/QnPzRx0sL9R54J9OnJAyMZGsjD3spV6Pr4Vo3BlEv8UzhK4teDakvrHk
+WwAzvZMqJIgI/XWiFIZq76Hk11d7fIW9G2ELst982iAHXzmCqMZD0VLbozIcZel5
+mExz+6I3NSGL4Rbbew/ZRhLuGnc0WlzNp96sCmrv0cl1I0ZXyg8i6PaT/VV33VXh
+Cz21WO4lQxmZulO4mUY7ms1kkvWjGRRjThRtc+PErexGDpkCBQHxs033+WAdG83Z
+CuOL6Hhk9tV4JzT+YWcwQXs1MvzSaP1vtHsEaCO8WgR5FIQtvNEuGPA2js//aVPS
+abYO2U7LCM5OSygbAVBIumi3wW4f51kIXtwhuiwEnsgVlnIdr4bPZikLuSiuA2Ly
+bYFcBZ7UJC1jQ4Ar1Tn8H+V8IzXSzmKLi1A0bPwg25X4RYE6YWSsb7Pg+aGlWglw
+LR8soIKQdxN5phjzFuzzBeolvAlknqMpL5/u91XiFW5R3JAu3RC8s1/kzzTX8lCz
+M+mfR6bN7VSMHVYwCpkyGeHY8isivbkkNi8RSTgx+jeokQBCmhWcoNl2znjtJwm1
+CkoeAsgpNGiDbXSGEAN2TJfJbUpP3BB9VQZc+bDD+I6gp4wRYcyV5yD156lbBQKd
+VPFvGNc6CttfqanQ6hpN03yDWNTOjltQPyxrtlIou8GAKgJkszJUhCW15c5DGndZ
+u+XeqQYBf5/wDLwEXFEc5n5qfPIfO9j9ETyw8/EkeJQVig5wnmYDz2BRTklY+swB
+dzO2aTTaJRaWCEbXbTiM9puKZrtb/fLJLTJj58rxzy6+Gjp1k0Dm2eUYSavSCFNO
+34SX3KVaAe/oQUzJtrWrZgFPgMbFr7NNowalyXReFQnuISWaicuLnvcj09WXqIw4
+kUkJh9/Wa0h0V0dZJhOyKqJvPhvxt88cOpxrgdaHwkL+QfgidaBAecXrjmhJetaQ
+LrFefj0OWhRx4w7pblAnZqUSYunhhhUYimEG40GkM1ZI9b0vDmbgQP/UxMj1M2yB
+aVSSW69rmjO7xjVuJnm+wNq2P3H3MFB5MaswXrn2Ah83K4oegpannt7H1nG+mWh/
+DJcoVj5UyCTFEyZMdtVWloF4TOVODNNxA+zAE9fUgrI=
+EOF
+
+exec sh bin/do-setup-circleci-secrets
diff --git a/circle.yml b/circle.yml
index 68c96fecb..61468590d 100644
--- a/circle.yml
+++ b/circle.yml
@@ -10,6 +10,7 @@ machine:
GOPATH: /home/ubuntu:$GOPATH
SRCDIR: /home/ubuntu/src/github.com/weaveworks/scope
PATH: $PATH:$HOME/.local/bin
+ CLOUDSDK_CORE_DISABLE_PROMPTS: 1
SCOPE_UI_BUILD: $HOME/docker/scope_ui_build.tar
dependencies:
@@ -24,6 +25,8 @@ dependencies:
mkdir -p $(dirname "$SCOPE_UI_BUILD");
mv scope_ui_build.tar $(dirname "$SCOPE_UI_BUILD");
fi
+ - curl https://sdk.cloud.google.com | bash
+ - test -z "$SECRET_PASSWORD" || bin/setup-circleci-secrets "$SECRET_PASSWORD"
post:
- go version
- go clean -i net
@@ -41,7 +44,12 @@ test:
- cd $SRCDIR; rm -f app/app probe/probe; GOOS=linux make
- cd $SRCDIR; ./bin/test -slow
- cd $SRCDIR/experimental; make
+ - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; ./gce.sh setup)
+ - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; . ./gce.sh hosts; ./setup.sh)
+ - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; . ./gce.sh hosts; ./run_all.sh):
+ timeout: 300
post:
+ - test -z "$SECRET_PASSWORD" || (cd $SRCDIR/integration; ./gce.sh destroy)
- goveralls -repotoken $COVERALLS_REPO_TOKEN -coverprofile=$SRCDIR/profile.cov -service=circleci || true
- cd $SRCDIR; cp coverage.html $CIRCLE_ARTIFACTS
- cd $SRCDIR; cp scope.tar $CIRCLE_ARTIFACTS
diff --git a/integration/.gitignore b/integration/.gitignore
new file mode 100644
index 000000000..56dedd820
--- /dev/null
+++ b/integration/.gitignore
@@ -0,0 +1,3 @@
+insecure_private_key
+.vagrant
+.ssh_known_hosts
diff --git a/integration/100_launch_test.sh b/integration/100_launch_test.sh
new file mode 100755
index 000000000..aa308c3ec
--- /dev/null
+++ b/integration/100_launch_test.sh
@@ -0,0 +1,10 @@
+#! /bin/bash
+
+. ./config.sh
+
+start_suite "Launch scope and check it boots"
+
+scope_on $HOST1 launch
+assert_raises "curl $HOST1:4040"
+
+end_suite
diff --git a/integration/200_clustering_test.sh b/integration/200_clustering_test.sh
new file mode 100644
index 000000000..f42058632
--- /dev/null
+++ b/integration/200_clustering_test.sh
@@ -0,0 +1,24 @@
+#! /bin/bash
+
+. ./config.sh
+
+start_suite "Launch 2 scopes and check they cluster"
+
+weave_on $HOST2 launch
+docker_on $HOST2 run -dit --name db1 peterbourgon/tns-db
+container_id=$(docker_on $HOST2 run -dit --name app1 --link db1:db1 peterbourgon/tns-app)
+
+scope_on $HOST1 launch $HOST2
+scope_on $HOST2 launch $HOST1
+
+SUCCESS=
+for i in {1..10}; do
+ if (curl $HOST1:4040/api/topology/containers | grep "$container_id" >/dev/null); then
+ SUCCESS=1
+ break
+ fi
+ sleep 1
+done
+assert "echo $SUCCESS" "1"
+
+end_suite
diff --git a/integration/README.md b/integration/README.md
new file mode 100644
index 000000000..aba75469c
--- /dev/null
+++ b/integration/README.md
@@ -0,0 +1,52 @@
+This directory contains integration tests for scope.
+
+## Requirements
+
+You need two VMs with docker >=1.3.1 installed and listening on TCP
+port 2375 (see below). You also need to be able to ssh to these VMs,
+preferably without having to input anything.
+
+The `Vagrantfile` in this directory constructs two such VMs. To meet
+the aforementioned ssh requirement you may want to
+
+ cp ~/.vagrant.d/insecure_private_key .
+
+## Running tests
+
+ ./setup.sh
+
+Downloads a copy of weave (if not already downloaded) and calls it's
+setup.sh script. Then, it uploads the scope images from where the
+Makefile puts them (`/var/tmp`) to the two docker hosts, and copies
+the scope script over.
+
+Then you can use, e.g.,
+
+ ./100_launch_test.sh
+
+to run an individual test, or
+
+ ./run_all.sh
+
+to run everything named `*_test.sh`.
+
+## Using other VMs
+
+By default the tests assume the Vagrant VMs are used.
+
+To use other VMs, set the environment variable HOSTS to the
+space-separated list of IP addresses of the docker hosts, and set the
+environment variable SSH to a command that will log into
+either (which may just be `ssh`).
+
+## Making docker available over TCP
+
+To make docker listen to a TCP socket, you will usually need to either
+run it manually with an option like `-H tcp://0.0.0.0:2375`; or, for
+apt-get installed docker (Ubuntu and Debian), add the line
+
+```
+DOCKER_OPTS="--host unix:///var/run/docker.sock --host tcp://0.0.0.0:2375"
+```
+
+to the file `/etc/default/docker`, then restart docker.
diff --git a/integration/config.sh b/integration/config.sh
new file mode 100644
index 000000000..cb90406fc
--- /dev/null
+++ b/integration/config.sh
@@ -0,0 +1,25 @@
+# NB only to be sourced
+
+set -e
+
+# these ought to match what is in Vagrantfile
+# exported to override weave config.sh
+export SSH_DIR="$PWD"
+export HOSTS
+
+WEAVE_REPO="github.com/weaveworks/weave"
+WEAVE_ROOT="${GOPATH%%:*}/src/$WEAVE_REPO"
+if [ ! -d "$WEAVE_ROOT" ] ; then
+ mkdir -p "$(dirname "$WEAVE_ROOT")"
+ git clone --depth 1 -b master https://$WEAVE_REPO.git "$WEAVE_ROOT"
+ go get $WEAVE_REPO/...
+fi
+
+. "$WEAVE_ROOT/test/config.sh"
+
+scope_on() {
+ host=$1
+ shift 1
+ [ -z "$DEBUG" ] || greyly echo "Scope on $host: $@" >&2
+ run_on $host "DOCKER_HOST=tcp://$host:$DOCKER_PORT" scope "$@"
+}
diff --git a/integration/gce.sh b/integration/gce.sh
new file mode 100755
index 000000000..cdaef3554
--- /dev/null
+++ b/integration/gce.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+set -e
+
+. ./config.sh
+
+export PROJECT=scope-integration-tests
+. "$WEAVE_ROOT/test/gce.sh" "$@"
diff --git a/integration/run_all.sh b/integration/run_all.sh
new file mode 100755
index 000000000..91fc91b11
--- /dev/null
+++ b/integration/run_all.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+
+set -e
+
+. ./config.sh
+
+NO_SCHEDULER=1 "$WEAVE_ROOT/test/run_all.sh" "$@"
diff --git a/integration/setup.sh b/integration/setup.sh
new file mode 100755
index 000000000..3a82d99b5
--- /dev/null
+++ b/integration/setup.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+set -e
+
+. ./config.sh
+
+echo Copying scope images and scripts to hosts
+for HOST in $HOSTS; do
+ docker_on $HOST load -i ../scope.tar
+ upload_executable $HOST ../scope
+done
+
+echo Installing weave
+for HOST in $HOSTS; do
+ run_on $HOST "sudo curl -L git.io/weave -o /usr/local/bin/weave"
+ run_on $HOST "sudo chmod a+x /usr/local/bin/weave"
+done