#!/bin/bash

#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#


#
# Distributed perftest.
# Runs perftest clients on multiple hosts using ssh.
# 

set -e
usage() {
cat <<EOF
usage: $0 <perftest-args> -- <client-hosts ...> [ --- <broker hosts...> ]
Client & broker hosts can also be set in env vars CLIENTS and BROKERS.

Run perftest clients on the client hosts against brokers on the broker
hosts Clients are assigned to client hosts round robin: publishers
first, then subscribers. If there are multiple brokers (for cluster
tests) clients connect to them round robin.

Broker hosts can be listed with -b in perftest-args or after ---
at the end of the arguments.

Error: $*
EOF
exit 1
}

TESTDIR=${TESTDIR:-$PWD}	# Absolute path to test exes on all hosts.

collect() { eval $COLLECT=\""\$$COLLECT $*"\"; }
NPUBS=1
NSUBS=1
COLLECT=ARGS
while test $# -gt 0; do
    case $1 in
	--publish|--subscribe|--setup|--control) usage "Don't pass perftest action flags: $1" ;;
	--npubs) collect $1 $2; NPUBS=$2; shift 2 ;;
	--nsubs) collect $1 $2; NSUBS=$2; shift 2 ;;
	-s|--summary) collect $1; QUIET=yes; shift 1 ;;
	-b|--broker) BROKERS="$BROKERS $2"; shift 2;;
	--) COLLECT=CLIENTARG; shift ;;
	---) COLLECT=BROKERARG; shift;;
	*) collect $1; shift ;;
    esac
done

CLIENTS=${CLIENTARG:-$CLIENTS}
if [ -z "$CLIENTS" ]; then usage "No client hosts listed after --"; fi
BROKERS=${BROKERARG:-$BROKERS}
if [ -z "$BROKERS" ]; then usage "No brokers specified"; fi

PERFTEST="$TESTDIR/perftest $ARGS"

CLIENTS=($CLIENTS)
BROKERS=($BROKERS)
start() {
    CLIENT=${CLIENTS[i % ${#CLIENTS[*]}]}
    BROKER=${BROKERS[i % ${#BROKERS[*]}]}
    ARGS="$* --broker $BROKER"
    cmd="ssh -n $CLIENT $PERFTEST $ARGS"
    test -z "$QUIET" && echo "Client $i: $cmd"
    $cmd &
}

$PERFTEST --setup -b ${BROKERS[0]}
for (( i=0 ; i < $NPUBS ; ++i)); do start --publish; done
for (( ; i < $NPUBS+$NSUBS ; ++i)); do start --subscribe; done
$PERFTEST --control  -b ${BROKERS[0]}
