#!/bin/bash # This script has a bunch of GCE-related functions: # ./gce.sh setup - starts two VMs on GCE and configures them to run our integration tests # . ./gce.sh; ./run_all.sh - set a bunch of environment variables for the tests # ./gce.sh destroy - tear down the VMs # ./gce.sh make_template - make a fresh VM template; update TEMPLATE_NAME first! set -ex KEY_FILE=/tmp/gce_private_key.json SSH_KEY_FILE=$HOME/.ssh/gce_ssh_key PROJECT=${PROJECT:-positive-cocoa-90213} IMAGE=ubuntu-14-04 ZONE=us-central1-a NUM_HOSTS=2 # Setup authentication gcloud auth activate-service-account --key-file $KEY_FILE gcloud config set project $PROJECT function vm_names { local names= for i in $(seq 1 $NUM_HOSTS); do names="twilkie-test-$i $names" done echo "$names" } # Delete all vms in this account function destroy { names="$(vm_names)" for i in {0..10}; do # gcloud instances delete can sometimes hang. case $(set +e; timeout 60s /bin/bash -c "gcloud compute instances delete --zone $ZONE -q $names >/dev/null 2>&1 || true"; echo $?) in 0) return 0 ;; 124) # 124 means it timed out break ;; *) return 1 esac done } function external_ip { gcloud compute instances list $1 --format=yaml | grep "^ natIP\:" | cut -d: -f2 | tr -d ' ' } function internal_ip { gcloud compute instances list $1 --format=yaml | grep "^ networkIP\:" | cut -d: -f2 | tr -d ' ' } function try_connect { for i in {0..10}; do ssh -t $1 true && return sleep 2 done } function install_on { name=$1 otherpeers=$2 ssh -t $name sudo bash -x -s < /etc/apt/sources.list.d/docker.list; apt-get update -qq; apt-get install -q -y --force-yes --no-install-recommends lxc-docker ethtool emacs23-nox git make binutils mercurial libpcap-dev gcc; usermod -a -G docker vagrant; echo 'DOCKER_OPTS="-H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375"' >> /etc/default/docker; service docker restart; wget -q https://storage.googleapis.com/golang/go1.4.2.linux-amd64.tar.gz; tar -C /usr/local -xzf go1.4.2.linux-amd64.tar.gz; /usr/local/go/bin/go clean -i net /usr/local/go/bin/go install -tags netgo std EOF ssh -t $name bash -x -s <>~/.profile echo "export GOPATH=$HOME" >>~/.profile . ~/.profile mkdir -p ~/src/github.com/weaveworks cd ~/src/github.com/weaveworks git clone http://github.com/weaveworks/weave.git cd weave make cp weave ~/bin weave launch $otherpeers EOF } # Create new set of VMS function setup { destroy names="$(vm_names)" gcloud compute instances create $names --image $IMAGE --zone $ZONE gcloud compute config-ssh --ssh-key-file $SSH_KEY_FILE for name in $names; do hostname="$name.$ZONE.$PROJECT" # Add the remote ip to the local /etc/hosts sudo -- sh -c "echo \"$(external_ip $name) $hostname\" >>/etc/hosts" try_connect $hostname # Add the local ips to the remote /etc/hosts otherpeers="" for othername in $names; do otherip="$(internal_ip $othername)" otherpeers="$otherip $otherpeers" entry="$otherip $othername.$ZONE.$PROJECT" ssh -t "$hostname" "sudo -- sh -c \"echo \\\"$entry\\\" >>/etc/hosts\"" done install_on $hostname "$otherpeers" done for name in $names; do hostname="$name.$ZONE.$PROJECT" ssh -t $hostname bash -x -s <