summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/network/quantumv2/api.py19
-rw-r--r--nova/tests/test_libvirt_vif.py4
-rw-r--r--nova/virt/libvirt/vif.py45
3 files changed, 41 insertions, 27 deletions
diff --git a/nova/network/quantumv2/api.py b/nova/network/quantumv2/api.py
index 51386b4fd..e04d10edb 100644
--- a/nova/network/quantumv2/api.py
+++ b/nova/network/quantumv2/api.py
@@ -48,6 +48,11 @@ quantum_opts = [
default='keystone',
help='auth strategy for connecting to '
'quantum in admin context'),
+ # TODO(berrange) temporary hack until Quantum can pass over the
+ # name of the OVS bridge it is configured with
+ cfg.StrOpt('quantum_ovs_bridge',
+ default='br-int',
+ help='Name of Integration Bridge used by Open vSwitch'),
]
CONF = cfg.CONF
@@ -570,9 +575,21 @@ class API(base.Base):
subnet['ips'] = [fixed_ip for fixed_ip in network_IPs
if fixed_ip.is_in_subnet(subnet)]
+ bridge = None
+ vif_type = port.get('binding:vif_type')
+ # TODO(berrange) Quantum should pass the bridge name
+ # in another binding metadata field
+ if vif_type == network_model.VIF_TYPE_OVS:
+ bridge = CONF.quantum_ovs_bridge
+ elif vif_type == network_model.VIF_TYPE_BRIDGE:
+ bridge = "brq" + port['network_id']
+
+ if bridge is not None:
+ bridge = bridge[:network_model.BRIDGE_NAME_LEN]
+
network = network_model.Network(
id=port['network_id'],
- bridge='', # Quantum ignores this field
+ bridge=bridge,
injected=CONF.flat_injected,
label=network_name,
tenant_id=net['tenant_id']
diff --git a/nova/tests/test_libvirt_vif.py b/nova/tests/test_libvirt_vif.py
index aeebb5742..9271afb13 100644
--- a/nova/tests/test_libvirt_vif.py
+++ b/nova/tests/test_libvirt_vif.py
@@ -229,7 +229,7 @@ class LibvirtVifTestCase(test.TestCase):
self.assertEqual(node.get("type"), "bridge")
br_name = node.find("source").get("bridge")
- self.assertEqual(br_name, CONF.libvirt_ovs_bridge)
+ self.assertEqual(br_name, "br0")
mac = node.find("mac").get("address")
self.assertEqual(mac, self.mapping['mac'])
vp = node.find("virtualport")
@@ -257,7 +257,7 @@ class LibvirtVifTestCase(test.TestCase):
mac = node.find("mac").get("address")
self.assertEqual(mac, self.mapping['mac'])
br_name = node.find("source").get("bridge")
- self.assertTrue(br_name.startswith("brq"))
+ self.assertEqual(br_name, "br0")
def test_quantum_hybrid_driver(self):
d = vif.LibvirtHybridOVSBridgeDriver()
diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py
index 0cf1b1658..29bf2d09d 100644
--- a/nova/virt/libvirt/vif.py
+++ b/nova/virt/libvirt/vif.py
@@ -31,9 +31,6 @@ from nova.virt import netutils
LOG = logging.getLogger(__name__)
libvirt_vif_opts = [
- cfg.StrOpt('libvirt_ovs_bridge',
- default='br-int',
- help='Name of Integration Bridge used by Open vSwitch'),
cfg.BoolOpt('libvirt_use_virtio_for_bridges',
default=True,
help='Use virtio for bridge interfaces with KVM/QEMU'),
@@ -152,19 +149,19 @@ class LibvirtOpenVswitchDriver(LibvirtBaseVIFDriver):
return conf
- def create_ovs_vif_port(self, dev, iface_id, mac, instance_id):
+ def create_ovs_vif_port(self, bridge, dev, iface_id, mac, instance_id):
utils.execute('ovs-vsctl', '--', '--may-exist', 'add-port',
- CONF.libvirt_ovs_bridge, dev,
- '--', 'set', 'Interface', dev,
- 'external-ids:iface-id=%s' % iface_id,
- 'external-ids:iface-status=active',
- 'external-ids:attached-mac=%s' % mac,
- 'external-ids:vm-uuid=%s' % instance_id,
- run_as_root=True)
-
- def delete_ovs_vif_port(self, dev):
- utils.execute('ovs-vsctl', 'del-port', CONF.libvirt_ovs_bridge,
- dev, run_as_root=True)
+ bridge, dev,
+ '--', 'set', 'Interface', dev,
+ 'external-ids:iface-id=%s' % iface_id,
+ 'external-ids:iface-status=active',
+ 'external-ids:attached-mac=%s' % mac,
+ 'external-ids:vm-uuid=%s' % instance_id,
+ run_as_root=True)
+
+ def delete_ovs_vif_port(self, bridge, dev):
+ utils.execute('ovs-vsctl', 'del-port', bridge, dev,
+ run_as_root=True)
utils.execute('ip', 'link', 'delete', dev, run_as_root=True)
def plug(self, instance, vif):
@@ -185,14 +182,16 @@ class LibvirtOpenVswitchDriver(LibvirtBaseVIFDriver):
utils.execute('tunctl', '-b', '-t', dev, run_as_root=True)
utils.execute('ip', 'link', 'set', dev, 'up', run_as_root=True)
- self.create_ovs_vif_port(dev, iface_id, mapping['mac'],
+ self.create_ovs_vif_port(network['bridge'],
+ dev, iface_id, mapping['mac'],
instance['uuid'])
def unplug(self, instance, vif):
"""Unplug the VIF by deleting the port from the bridge."""
try:
network, mapping = vif
- self.delete_ovs_vif_port(self.get_dev_name(mapping['vif_uuid']))
+ self.delete_ovs_vif_port(network['bridge'],
+ self.get_dev_name(mapping['vif_uuid']))
except exception.ProcessExecutionError:
LOG.exception(_("Failed while unplugging vif"), instance=instance)
@@ -243,7 +242,8 @@ class LibvirtHybridOVSBridgeDriver(LibvirtBridgeDriver,
linux_net._create_veth_pair(v1_name, v2_name)
utils.execute('ip', 'link', 'set', br_name, 'up', run_as_root=True)
utils.execute('brctl', 'addif', br_name, v1_name, run_as_root=True)
- self.create_ovs_vif_port(v2_name, iface_id, mapping['mac'],
+ self.create_ovs_vif_port(network['bridge'],
+ v2_name, iface_id, mapping['mac'],
instance['uuid'])
def unplug(self, instance, vif):
@@ -263,7 +263,7 @@ class LibvirtHybridOVSBridgeDriver(LibvirtBridgeDriver,
run_as_root=True)
utils.execute('brctl', 'delbr', br_name, run_as_root=True)
- self.delete_ovs_vif_port(v2_name)
+ self.delete_ovs_vif_port(network['bridge'], v2_name)
except exception.ProcessExecutionError:
LOG.exception(_("Failed while unplugging vif"), instance=instance)
@@ -280,7 +280,7 @@ class LibvirtOpenVswitchVirtualPortDriver(LibvirtBaseVIFDriver):
mapping)
designer.set_vif_host_backend_ovs_config(
- conf, CONF.libvirt_ovs_bridge, mapping['vif_uuid'])
+ conf, network['bridge'], mapping['vif_uuid'])
return conf
@@ -295,9 +295,6 @@ class LibvirtOpenVswitchVirtualPortDriver(LibvirtBaseVIFDriver):
class QuantumLinuxBridgeVIFDriver(LibvirtBaseVIFDriver):
"""VIF driver for Linux Bridge when running Quantum."""
- def get_bridge_name(self, network_id):
- return ("brq" + network_id)[:LINUX_DEV_LEN]
-
def get_dev_name(self, iface_id):
return ("tap" + iface_id)[:LINUX_DEV_LEN]
@@ -305,7 +302,7 @@ class QuantumLinuxBridgeVIFDriver(LibvirtBaseVIFDriver):
iface_id = mapping['vif_uuid']
dev = self.get_dev_name(iface_id)
- bridge = self.get_bridge_name(network['id'])
+ bridge = network['bridge']
linux_net.LinuxBridgeInterfaceDriver.ensure_bridge(bridge, None,
filtering=False)