#!/bin/bash
#
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
HELP="This is a script to bootstrap a localhost shard cluster for testing.\n\
The following defaults are preconfigured but modifyable:\n\
SHARD_NAME: Name of the shard to register with master\n\
NUM_HOSTS_MASTER/SHARD: Number of hosts to add to the master/shard.\n\
MASTER/SHARD_BOARD: Boards to add to the master/shard\n\
POOL: Pool to use for the hosts."
# Invalidate (delete) the hosts/labels/shard instead of adding them.
# Typically used to refresh a botched cluster.
INVALIDATE_ALL=0
AT_DIR=/usr/local/autotest
# See VagrantFile for details on how these afes are setup.
AFE=localhost:8001
SHARD_NAME=localhost:8004
# Number of hosts on master and shard. They will
# get autoassigned generic names like test_hostX.
NUM_HOSTS_MASTER=10
NUM_HOSTS_SHARD=5
NUM_FREON_HOSTS_SHARD=5
# A host can only have a single board. Jobs are sent
# to the shard based on the board.
MASTER_BOARD=board:link
SHARD_BOARD=board:stumpy
SHARD_FREON_BOARD=board:stumpy_freon
# All hosts need to be in a pool.
POOL=pool:bot
y_n_prompt() {
read -r -p "Are you sure? [y/N] " response
if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]; then
return 0
else
return 1
fi
}
while getopts ":h" opt; do
case $opt in
h)
echo -e "${HELP}" >&2
exit 0
;;
esac
done
atest_hosts() {
hosts=("${!1}")
labels="${2}"
hostnames=''
for H in ${hosts[*]}; do
if [ "$hostnames" ]; then
hostnames="$hostnames,$H"
else
hostnames=$H
fi
done
if [ $INVALIDATE_ALL -eq 1 ]; then
$AT_DIR/cli/atest host delete $hostnames --web $AFE
$AT_DIR/cli/atest label delete $labels --web $AFE
else
$AT_DIR/cli/atest host create $hostnames --web $AFE
$AT_DIR/cli/atest label add -m $hostnames $labels --web $AFE
fi
}
MASTER_HOSTS=()
s=1
e=$NUM_HOSTS_MASTER
for i in $(seq $s $e); do
MASTER_HOSTS[$i]=test_host$i;
done
SHARD_HOSTS=()
s=$(($e+1))
e=$(($NUM_HOSTS_SHARD+$e))
for i in $(seq $s $e); do
SHARD_HOSTS[$i]=test_host$i;
done
SHARD_FREON_HOSTS=()
s=$(($e+1))
e=$(($NUM_FREON_HOSTS_SHARD+$e))
for i in $(seq $s $e); do
SHARD_FREON_HOSTS[$i]=test_host$i;
done
operation='Adding: '
if [ $INVALIDATE_ALL -eq 1 ]; then
operation='Removing '
fi
printf '%s following hosts to master \n' $operation
echo ${MASTER_HOSTS[*]}
if $(y_n_prompt); then
atest_hosts MASTER_HOSTS[*] $POOL,$MASTER_BOARD
fi
printf '\n\n%s following hosts to shard \n' $operation
echo ${SHARD_HOSTS[*]}
if $(y_n_prompt); then
atest_hosts SHARD_HOSTS[*] $POOL,$SHARD_BOARD
fi
printf '\n\n%s following hosts to shard \n' $operation
echo ${SHARD_FREON_HOSTS[*]}
if $(y_n_prompt); then
atest_hosts SHARD_FREON_HOSTS[*] $POOL,$SHARD_FREON_BOARD
fi
printf '\n\n%s shard \n' $operation
echo $SHARD_NAME
if $(y_n_prompt); then
if [ $INVALIDATE_ALL -eq 1 ]; then
$AT_DIR/cli/atest shard delete $SHARD_NAME --web $AFE
else
$AT_DIR/cli/atest shard create $SHARD_NAME -l $SHARD_BOARD --web $AFE
fi
fi