123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- #!/bin/bash
- # 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
- # shellcheck disable=SC1091
- . "../tools/integration/config.sh"
- WEAVE="./weave"
- SCOPE="../scope"
- scope_on() {
- local host=$1
- shift 1
- [ -z "$DEBUG" ] || greyly echo "Scope on $host: $*" >&2
- DOCKER_HOST=tcp://$host:$DOCKER_PORT CHECKPOINT_DISABLE=true "$SCOPE" "$@"
- }
- weave_on() {
- local host=$1
- shift 1
- [ -z "$DEBUG" ] || greyly echo "Weave on $host: $*" >&2
- DOCKER_HOST=tcp://$host:$DOCKER_PORT CHECKPOINT_DISABLE=true "$WEAVE" "$@"
- }
- weave_proxy_on() {
- local host=$1
- shift 1
- [ -z "$DEBUG" ] || greyly echo "Weave proxy on $host: $*" >&2
- DOCKER_PORT=12375 docker_on "$host" "$@"
- }
- server_on() {
- local host=$1
- local name=${2:-nginx}
- weave_proxy_on "$1" run -d --name "$name" nginx
- }
- client_on() {
- local host=$1
- local name=${2:-client}
- local server=${3:-nginx}
- weave_proxy_on "$1" run -d --name "$name" alpine /bin/sh -c "while true; do \
- wget http://$server.weave.local:80/ -O - >/dev/null || true; \
- sleep 1; \
- done"
- }
- scope_end_suite() {
- end_suite
- for host in $HOSTS; do
- docker_on "$host" rm -f "$(docker_on "$host" ps -a -q)" || true
- # Unfortunately, "docker rm" might not work: the CircleCI's Docker
- # client is unable to delete containers on GCE's Docker server. As a
- # workaround, restart the Docker daemon: at least the containers from
- # previous tests will not be running.
- run_on "$host" "sudo service docker restart"
- done
- }
- list_containers() {
- local host=$1
- echo "Listing containers on ${host}:"
- curl -s "http://${host}:4040/api/topology/containers?system=show" | jq -r '.nodes[] | select(has("metadata")) | { "image": .metadata[] | select(.id == "docker_image_name") | .value, "label": .label, "id": .id} | .id + " (" + .image + ", " + .label + ")"'
- echo
- }
- list_connections() {
- local host=$1
- echo "Listing connections on ${host}:"
- curl -s "http://${host}:4040/api/topology/containers?system=show" | jq -r '.nodes[] | select(has("adjacency")) | { "from_name": .label, "from_id": .id, "to": .adjacency[]} | .from_id + " (" + .from_name+ ") -> " + .to'
- echo
- }
- # this checks we have a named node in the given view
- has() {
- local view=$1
- local host=$2
- local name=$3
- local count=${4:-1}
- assert "curl -s http://${host}:4040/api/topology/${view}?system=show | jq -r '[.nodes[] | select(.label == \"${name}\")] | length'" "$count"
- }
- # this checks we have a named container
- has_container() {
- has containers "$@"
- }
- node_id() {
- local view="$1"
- local host="$2"
- local name="$3"
- curl -s "http://${host}:4040/api/topology/${view}?system=show" | jq -r ".nodes[] | select(.label == \"${name}\") | .id"
- }
- container_id() {
- node_id containers "$@"
- }
- # this checks we have an edge from container 1 to container 2
- has_connection_by_id() {
- local view="$1"
- local host="$2"
- local from_id="$3"
- local to_id="$4"
- local timeout="${5:-60}"
- local max_edges="$6:10"
- for i in $(seq "$timeout"); do
- local nodes
- local edge
- nodes=$(curl -s "http://$host:4040/api/topology/${view}?system=show" || true)
- edge=$(echo "$nodes" | (jq -r ".nodes[\"$from_id\"].adjacency | contains([\"$to_id\"])" || true) 2>/dev/null)
- if [ "$edge" = "true" ]; then
- echo "Found edge $from -> $to after $i secs"
- count=$(echo "$nodes" | jq -r ".nodes[\"$from_id\"].adjacency | length" 2>/dev/null)
- assert "[ $count -le $max_edges ]"
- return
- fi
- sleep 1
- done
- echo "Failed to find edge $from -> $to after $timeout secs"
- assert "curl -s http://$host:4040/api/topology/${view}?system=show | jq -r '.nodes[\"$from_id\"].adjacency | contains([\"$to_id\"])'" true
- }
- has_connection() {
- local view="$1"
- local host="$2"
- local from="$3"
- local to="$4"
- local timeout="${5:-60}"
- local from_id
- local to_id
- from_id="$(node_id "${view}" "${host}" "${from}")"
- to_id="$(node_id "${view}" "${host}" "${to}")"
- has_connection_by_id "${view}" "${host}" "${from_id}" "${to_id}" "${timeout}"
- }
- wait_for() {
- local view="$1"
- local host="$2"
- local timeout="$3"
- shift 3
- for i in $(seq "${timeout}"); do
- local nodes
- local found=0
- nodes=$(curl -s "http://$host:4040/api/topology/${view}?system=show" || true)
- for name in "$@"; do
- local count
- count=$(echo "${nodes}" | jq -r "[.nodes[] | select(.label == \"${name}\")] | length")
- if [ -n "${count}" ] && [ "${count}" -ge 1 ]; then
- found=$((found + 1))
- fi
- done
- if [ "${found}" -eq $# ]; then
- echo "Found ${found} nodes after $i secs"
- return
- fi
- sleep 1
- done
- echo "Failed to find nodes $* after $i secs"
- }
- wait_for_containers() {
- wait_for containers "$@"
- }
|