#!/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