From bc65346ba7c701a095fbebf5975e95a14d707b72 Mon Sep 17 00:00:00 2001 From: Richard Maw Date: Fri, 27 Feb 2015 09:20:21 +0000 Subject: Rejigger networking so the bridge has the MAC of the external interface This allows the subsequent DHCP request to get the same IP address back, which means it only needs one address for first boot, and the address can be pre-allocated by the DHCP server before deployment. This is needed for the floating address range to be allocated in some set-ups, such as our local one at the office, where a subnet in a different class is routed to the server. --- ...tack-neutron-network-configuration-for-one-node | 29 +++++++++++++++------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/openstack/usr/share/openstack/openstack-neutron-network-configuration-for-one-node b/openstack/usr/share/openstack/openstack-neutron-network-configuration-for-one-node index 68106fac..dadbaaa6 100644 --- a/openstack/usr/share/openstack/openstack-neutron-network-configuration-for-one-node +++ b/openstack/usr/share/openstack/openstack-neutron-network-configuration-for-one-node @@ -20,6 +20,7 @@ set -xe # Get the first ethernet driver and its ip eth_dev="$(ip addr | perl -pe 'if (/^\d+: ([^:]+)/) { $iface=$1; } if (m@^\s*inet ([^/]+)/@) { print "$iface $1\n"; } $_=undef;' | grep "^e" | head -1 | awk '{ print $1 } ')" eth_ip="$(ip addr | perl -pe 'if (/^\d+: ([^:]+)/) { $iface=$1; } if (m@^\s*inet ([^/]+)/@) { print "$iface $1\n"; } $_=undef;' | grep "^e" | head -1 | awk '{ print $2 } ')" +eth_mac="$(ip link show $eth_dev | tr -s '[:space:]' '\n' | sed -n '/link\/ether/{n;p}')" ip link add proxy-br-eth1 type veth peer name eth1-br-proxy ip link add proxy-br-ex type veth peer name ex-br-proxy @@ -42,8 +43,24 @@ Name=$devname EOF done +# restart networkd so it understands to not bring up these interfaces +systemctl restart systemd-networkd.service + +# Deallocate ip address for external interface so we don't try to route +# connections out of an interface that no longer works +ip addr del $eth_ip dev $eth_dev + +# Create our external bridge +ovs-vsctl add-br br-eth0 +# Bind our external device to the bridge +ovs-vsctl add-port br-eth0 $eth_dev +# Tell the bridge that it has the mac address of the external device now +ovs-vsctl set bridge br-eth0 other-config:hwaddr=$eth_mac +ip link set br-eth0 promisc on -# DHCP on the Open vSwitch device that replaces our external interface +# restart networkd again so it will DHCP on the Open vSwitch device that +# replaces our external interface, but with the mac address of the external +# interface, so it ought to get the same address back install -D -m 644 /proc/self/fd/0 <