Last active
October 2, 2019 13:50
-
-
Save dosaboy/8ce9540e669975fb4807ee1ab376ff3a to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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