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-23 22:58:55 +0000
commitbc65346ba7c701a095fbebf5975e95a14d707b72 (patch)
treea13cbfe0d43eb389d8a0545d2269979e54b52001
parent22746c6ec8fd37ae73a4998f76f2a8996527ee4a (diff)
downloaddefinitions-bc65346ba7c701a095fbebf5975e95a14d707b72.tar.gz
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.
-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..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 <<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