OpenStack Migrate Routers and DHCP

Migrate OpenStack L3 routers and DHCP agents between nodes using CLI commands or an automated drain script.

OpenStack Migrate Routers and DHCP

Move agent assignments from a source node to a target node using the OpenStack CLI.

Prerequisites

Ensure admin access (source openrc admin admin) and that target agents are UP.

Migrating L3 Routers

1. Identify Agents

SOURCE_L3_ID=$(openstack network agent list --agent-type l3 --host network-node-01 -f value -c ID)
TARGET_L3_ID=$(openstack network agent list --agent-type l3 --host network-node-02 -f value -c ID)

2. Migrate Routers

ROUTERS=$(openstack router list --agent $SOURCE_L3_ID -f value -c ID)
for ROUTER_ID in $ROUTERS; do
  openstack network agent remove router $SOURCE_L3_ID $ROUTER_ID
  openstack network agent add router $TARGET_L3_ID $ROUTER_ID
  echo "Migrated router: $ROUTER_ID"
done

3. Verify

openstack network agent list --router <router-id>

Migrating DHCP Agents

1. Identify Agents

SOURCE_DHCP_ID=$(openstack network agent list --agent-type dhcp --host network-node-01 -f value -c ID)
TARGET_DHCP_ID=$(openstack network agent list --agent-type dhcp --host network-node-02 -f value -c ID)

2. Migrate Networks

NETWORKS=$(openstack network list --agent $SOURCE_DHCP_ID -f value -c ID)
for NET_ID in $NETWORKS; do
  openstack network agent remove network $SOURCE_DHCP_ID $NET_ID
  openstack network agent add network $TARGET_DHCP_ID $NET_ID
  echo "Migrated network: $NET_ID"
done

3. Verify

openstack network agent list --network <network-id>

Automated Drain Script

#!/bin/bash
SOURCE_HOST=$1
TARGET_HOST=$2
if [ -z "$SOURCE_HOST" ] || [ -z "$TARGET_HOST" ]; then
    echo "Usage: $0 <source-host> <target-host>"
    exit 1
fi
SRC_L3=$(openstack network agent list --agent-type l3 --host $SOURCE_HOST -f value -c ID)
TGT_L3=$(openstack network agent list --agent-type l3 --host $TARGET_HOST -f value -c ID)
if [ -z "$SRC_L3" ] || [ -z "$TGT_L3" ]; then
    echo "Error: Could not find L3 agents for hosts."
    exit 1
fi
for R in $(openstack router list --agent $SRC_L3 -f value -c ID); do
    openstack network agent remove router $SRC_L3 $R
    openstack network agent add router $TGT_L3 $R
done
SRC_DHCP=$(openstack network agent list --agent-type dhcp --host $SOURCE_HOST -f value -c ID)
TGT_DHCP=$(openstack network agent list --agent-type dhcp --host $TARGET_HOST -f value -c ID)
if [ -z "$SRC_DHCP" ] || [ -z "$TGT_DHCP" ]; then
    echo "Error: Could not find DHCP agents for hosts."
    exit 1
fi
for N in $(openstack network list --agent $SRC_DHCP -f value -c ID); do
    openstack network agent remove network $SRC_DHCP $N
    openstack network agent add network $TGT_DHCP $N
done
openstack network agent set --disable $SRC_L3
openstack network agent set --disable $SRC_DHCP
echo "Drain complete. Host $SOURCE_HOST is safe to reboot."

Usage:

chmod +x drain-network-node.sh
./drain-network-node.sh network-node-01 network-node-02

High Availability (HA)

Edit /etc/neutron/neutron.conf:

[DEFAULT]
l3_ha = true
max_l3_agents_per_router = 2
dhcp_agents_per_network = 2

Create HA router:

openstack router create --ha ha-router

Troubleshooting

  • Agent not found: Check systemctl status neutron-l3-agent.
  • DHCP leases lost: VMs renew automatically.
  • HA failover fails: Check keepalived and /var/log/syslog.
  • Agent status DOWN: Run systemctl restart neutron-l3-agent.
  • Target overloaded: Verify CPU/RAM availability.