UNCLASSIFIED

Skip to content
Snippets Groups Projects

DHCP Agent Balancing

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    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.

    Edited
    dhcp_balancer.sh 3.51 KiB
    #!/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
    0% or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment