summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Maw <richard.maw@codethink.co.uk>2015-02-27 09:20:21 +0000
committerRichard Maw <richard.maw@codethink.co.uk>2015-03-02 14:52:50 +0000
commit2ba2025cf9ff4c0312fffaf3d0a7469a43d66acb (patch)
tree69dd70bfefe66033b1270d20d63e53d136877a1b
parent6c38caebfdf2cb3b0e4e00870a7a83fed9957dc0 (diff)
downloaddefinitions-baserock/richardmaw/openstack-v3-unrebased.tar.gz
Rejigger networking so the bridge has the MAC of the external interfacebaserock/richardmaw/openstack-v3-unrebased
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.
-rw-r--r--openstack/usr/share/openstack/openstack-neutron-network-configuration-for-one-node29
1 files 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..ccd0000b 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 | sed -r 's/\s+/\n/g' | 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 <<EOF /etc/systemd/network/10-br-ex-dhcp.network
[Match]
Name=br-eth0
@@ -51,16 +68,10 @@ Name=br-eth0
[Network]
DHCP=yes
EOF
-
-# restart networkd so it understands the new config
systemctl restart systemd-networkd.service
-ovs-vsctl add-br br-eth0
-ovs-vsctl add-port br-eth0 $eth_dev
-ip link set br-eth0 promisc on
-# 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
+
+# Add the rest of the bridges
ovs-vsctl add-br br-eth1
ovs-vsctl add-br br-ex
ovs-vsctl add-port br-eth1 eth1-br-proxy