#!/bin/bash # Root directory of the repository. SWARM_ROOT=${BATS_TEST_DIRNAME}/../.. # Docker image and version to use for integration tests. DOCKER_IMAGE=${DOCKER_IMAGE:-aluzzardi/docker} DOCKER_VERSION=${DOCKER_VERSION:-1.5} # Host on which the manager will listen to (random port between 6000 and 7000). SWARM_HOST=127.0.0.1:$(( ( RANDOM % 1000 ) + 6000 )) # Use a random base port (for engines) between 5000 and 6000. BASE_PORT=$(( ( RANDOM % 1000 ) + 5000 )) # Join an array with a given separator. function join() { local IFS="$1" shift echo "$*" } # Run the swarm binary. function swarm() { ${SWARM_ROOT}/swarm "$@" } # Waits until the given docker engine API becomes reachable. function wait_until_reachable() { local attempts=0 local max_attempts=5 until docker -H $1 info || [ $attempts -ge $max_attempts ]; do echo "Attempt to connect to ${HOSTS[$i]} failed for the $((++attempts)) time" >&2 sleep 0.5 done [[ $attempts -lt $max_attempts ]] } # Start the swarm manager in background. function start_manager() { ${SWARM_ROOT}/swarm manage -H $SWARM_HOST "$@" `join , ${HOSTS[@]}` & SWARM_PID=$! wait_until_reachable $SWARM_HOST } # Stops the manager. function stop_manager() { kill $SWARM_PID } # Run the docker CLI against swarm. function docker_swarm() { docker -H $SWARM_HOST "$@" } # Start N docker engines. function start_docker() { local current=${#DOCKER_CONTAINERS[@]} local instances="$1" shift local i # Start the engines. for ((i=current; i < (current + instances); i++)); do local port=$(($BASE_PORT + $i)) HOSTS[$i]=127.0.0.1:$port DOCKER_CONTAINERS[$i]=$(docker run -d --name node-$i -h node-$i --privileged -p 127.0.0.1:$port:$port -it ${DOCKER_IMAGE}:${DOCKER_VERSION} docker -d -H 0.0.0.0:$port "$@") done # Wait for the engines to be reachable. for ((i=current; i < (current + instances); i++)); do wait_until_reachable ${HOSTS[$i]} done } # Stop all engines. function stop_docker() { for id in ${DOCKER_CONTAINERS[@]}; do echo "Stopping $id" docker rm -f -v $id > /dev/null; done }