Skip to content

Instantly share code, notes, and snippets.

@dosaboy
Last active October 2, 2019 13:50
Show Gist options
  • Save dosaboy/8ce9540e669975fb4807ee1ab376ff3a to your computer and use it in GitHub Desktop.
Save dosaboy/8ce9540e669975fb4807ee1ab376ff3a to your computer and use it in GitHub Desktop.
#!/bin/bash -eu
#
# Author: [email protected]
# Origin: https://gist.github.com/dosaboy/8ce9540e669975fb4807ee1ab376ff3a
#
# Description:
# Test throughput between Openstack vm instances using various combinations
# of routed and unrouted networks and between vms that are located on
# the same hypervisor and remote hypervisors.
#
# Pre-requisites:
# * Deploy Openstack (>= Queens) and set default tenant network type to gre
# or vxlan.
# * Create an external network called "ext_net"
#
declare -A cidrs=(
[net1]="192.168.21.0/24"
[net2]="192.168.22.0/24"
)
for net in net1 net2; do
openstack network show $net || \
openstack network create $net # default i.e. gre/vxlan
openstack subnet show ${net}sub || \
openstack subnet create --subnet-range ${cidrs[$net]} --network $net ${net}sub
done
./tools/sec_groups.sh &>/dev/null &
for router in r1 r2; do
openstack router show $router || \
openstack router create $router
openstack router set --external-gateway ext_net $router
done
openstack router add subnet r1 net1sub # net1
openstack router add subnet r2 net2sub # net2
# Now add port from net2 to r1 and add route to net2 for net1
openstack port create --network net2 r1sub2port
r1sub2port=`openstack port show -c id -f value r1sub2port`
openstack router add port r1 $r1sub2port
addr=`openstack port list --router r1| grep r1sub2port| sed -r "s/.+ip_address='([0-9\.]+)',.+/\1/g"`
# ensure net1 traffic uses net1 gateway
openstack subnet set --host-route="destination=${cidrs[net1]},gateway=$addr" net2sub
readarray -t hosts<<<"`openstack compute service list --service nova-compute -c Host -f value`"
((${#hosts[@]}>=2)) || { echo "ERROR: num of compute hosts must be at least 2 (got ${#hosts[@]})"; exit 1; }
# generate keypair
mkdir -p ~/credentials
openstack keypair show testkey ||\
{ openstack keypair create testkey > ~/credentials/testkey_${OS_PROJECT_NAME}.pem;
chmod 600 ~/credentials/testkey_${OS_PROJECT_NAME}.pem; }
# Create VMs
d_tmp=`mktemp -d`
# Compute host A
openstack server create --image bionic --flavor m1.small \
--key-name testkey --nic net-id=net1 \
--availability-zone nova:${hosts[0]} --wait SourceNet1 &> $d_tmp/1 &
openstack server create --image bionic --flavor m1.small \
--key-name testkey --nic net-id=net1 \
--availability-zone nova:${hosts[0]} --wait TargetNet1VM1 &> $d_tmp/2 &
openstack server create --image bionic --flavor m1.small \
--key-name testkey --nic net-id=net2 \
--availability-zone nova:${hosts[0]} --wait TargetNet2VM1 &> $d_tmp/3 &
# Compute host B
openstack server create --image bionic --flavor m1.small \
--key-name testkey --nic net-id=net1 \
--availability-zone nova:${hosts[1]} --wait TargetNet1VM2 &> $d_tmp/4 &
openstack server create --image bionic --flavor m1.small \
--key-name testkey --nic net-id=net2 \
--availability-zone nova:${hosts[1]} --wait TargetNet2VM2 &> $d_tmp/5 &
echo "Waiting..."
wait
cat $d_tmp/*
rm -rf $d_tmp
# Check progress
openstack server list --long
readarray -t fips<<<"`openstack floating ip list -c 'Floating IP Address' -f value`"
if ((${#fips[@]}==0)) || [ -z "${fips[0]}" ]; then
fips=( `openstack floating ip create ext_net -c floating_ip_address -f value` )
fi
fip=${fips[0]}
ssh-keygen -f "/home/ubuntu/.ssh/known_hosts" -R $fip
openstack server add floating ip SourceNet1 $fip
openstack server list -c Name -c Host -c Networks --long > netinfo > netinfo
scp -i ~/credentials/testkey_${OS_PROJECT_NAME}.pem netinfo $fip:
scp -i ~/credentials/testkey_${OS_PROJECT_NAME}.pem ~/credentials/testkey_${OS_PROJECT_NAME}.pem $fip:.ssh/id_rsa
cat << EOF | ssh -i ~/credentials/testkey_${OS_PROJECT_NAME}.pem $fip
sudo apt update
sudo apt install iperf3 -y
EOF
cat << 'EOF' > /tmp/script
readarray -t targets<<<"`sed -r 's/.+Target.+net[[:digit:]]+=([[:digit:]\.]+)\s+.*/\1/g;t;d' netinfo`"
src_addr=`ip r get 192.168.21.1| sed -r 's/.+src\s+([[:digit:]\.]+).+/\1/g;t;d'`
echo -n "Installing iperf3 on all vms..."
for t in "${targets[@]}"; do
ssh -oStrictHostKeyChecking=no $t -- 'sudo apt update &>/dev/null; sudo apt install iperf3 -y &>/dev/null' &
done
wait
echo "done."
echo "Starting local iperf server"
iperf3 -s &>iperf3.out &
echo -e "\nRunning iperf3 between all vms"
for t in "${targets[@]}"; do
echo -e "\nRunning client from $t"
ssh -oStrictHostKeyChecking=no $t -- iperf3 -c $src_addr
done
EOF
chmod +x /tmp/script
scp -i ~/credentials/testkey_${OS_PROJECT_NAME}.pem /tmp/script $fip:exec_iperf_tests.sh
ssh -i ~/credentials/testkey_${OS_PROJECT_NAME}.pem $fip -- ./exec_iperf_tests.sh
echo "Done."
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment