DHCP Agent Balancing
The snippet can be accessed without any authentication.
Authored by
David Ivey
This script will compare the amount of networks each dhcp agent has and balance them accross each dhcp agent.
#!/bin/bash
# Comment this out or set it to 'false' to actually make the changes
debugRun='true'
# Change this to how far you'd like to diminish the difference to
acceptableVariance=50
# Some public variable assignments
highAgent=''
lowAgent=''
declare -A counts
echo "Building network and agent lists..."
# Retrieve all the DHCP agent GUIDs
agents="$(neutron agent-list | awk '/dhcp-agent/ { print $2 }')"
agentCount=$(echo "$agents" | wc -l)
# Retrieve all the network GUIDs
networks="$(openstack network list | tail -n +4 | head -n -1 | awk ' { print $2 } ')"
while : ; do
echo "Checking current DHCP network/agent assignments..."
# Parse our network GUID counts from our DHCP agents, store them
# in $counts as $count[guid]=count
for agent in $agents; do
counts[$agent]=$(neutron agent-show $agent | grep -o '"networks": [^ ]*' | cut -d' ' -f2)
done
# Iterate through identified servers
for server in ${!counts[@]}; do
# assign the name of the one with the highest count to highAgent
if [[ -z "$highAgent" ]] || [[ ${counts[$server]} -gt ${counts[$highAgent]} ]]; then
highAgent=$server
fi
# and similarly, lowest to lowAgent
if [[ -z "$lowAgent" ]] || [[ ${counts[$server]} -lt ${counts[$lowAgent]} ]]; then
lowAgent=$server
fi
done
# Identify the difference
diff=$(( ${counts[$highAgent]} - ${counts[$lowAgent]} ))
# Some helpful output
echo "High agent: $highAgent - ${counts[$highAgent]}"
echo "Low agent: $lowAgent - ${counts[$lowAgent]}"
echo "Difference: $diff"
echo "Acceptable Variance: $acceptableVariance"
if [[ $diff -gt $acceptableVariance ]]; then
echo "Reassigning networks from $highAgent"
echo
# A variable to keep us from going crazy on reassignments
thisRun=0
# Iterate through all networks
for network in $networks; do
# If we haven't reassigned more than we need
# (note: split the difference in half to prevent overlevelling, this
# may result in more runs, but we're less likely to overshoot on
# just one run)
if [[ $thisRun -lt $(( $diff / 2 )) ]]; then
# If the network is assigned to the highAgent
if neutron dhcp-agent-list-hosting-net $network | grep -q $highAgent; then
# Increment our run count
let "thisRun+=1"
# Pick a random agent to assign it to
newAgent=$(echo "$agents" | head -$(( $RANDOM % $agentCount + 1 )) | tail -1)
# Don't bother assigning it to itself
if [[ $newAgent != $highAgent ]]; then
echo "Reassigning $network from $highAgent to $newAgent."
# Skip actual assignments if we're on a debug run
if [[ -z $debugRun ]] || [[ $debugRun == 'false' ]]; then
neutron dhcp-agent-network-remove $highAgent $network >/dev/null
neutron dhcp-agent-network-add $newAgent $network >/dev/null
fi
fi
fi
else
continue
fi
done
else
# If the difference is within the acceptable variance, break our loop.
echo "No reassignment necessary!"
break
fi
if [[ $debugRun == 'true' ]]; then
echo "Aborting successive runs for debug"
break
fi
done
Please register or sign in to comment