diff options
-rw-r--r-- | nova/network/quantumv2/api.py | 19 | ||||
-rw-r--r-- | nova/tests/test_libvirt_vif.py | 4 | ||||
-rw-r--r-- | nova/virt/libvirt/vif.py | 45 |
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) |