diff options
Diffstat (limited to 'nova/virt')
| -rw-r--r-- | nova/virt/libvirt/driver.py | 6 | ||||
| -rw-r--r-- | nova/virt/libvirt/vif.py | 83 |
2 files changed, 65 insertions, 24 deletions
diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index fdf37fe31..666eb66f3 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -285,7 +285,9 @@ class LibvirtDriver(driver.ComputeDriver): DEFAULT_FIREWALL_DRIVER, self.virtapi, get_connection=self._get_connection) - self.vif_driver = importutils.import_object(CONF.libvirt_vif_driver) + + vif_class = importutils.import_class(CONF.libvirt_vif_driver) + self.vif_driver = vif_class(self._get_connection) self.volume_drivers = driver.driver_dict_from_config( CONF.libvirt_volume_drivers, self) @@ -1880,7 +1882,7 @@ class LibvirtDriver(driver.ComputeDriver): for (network, mapping) in network_info: self.vif_driver.plug(instance, (network, mapping)) cfg = self.vif_driver.get_config(instance, - network, mapping) + network, mapping) guest.add_device(cfg) if CONF.libvirt_type == "qemu" or CONF.libvirt_type == "kvm": diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index 131fb10e9..1110d356e 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -47,9 +47,26 @@ CONF.register_opts(libvirt_vif_opts) CONF.import_opt('libvirt_type', 'nova.virt.libvirt.driver') CONF.import_opt('use_ipv6', 'nova.netconf') +# Since libvirt 0.9.11, <interface type='bridge'> +# supports OpenVSwitch natively. +LIBVIRT_OVS_VPORT_VERSION = 9011 + class LibvirtBaseVIFDriver(object): + def __init__(self, get_connection): + self.get_connection = get_connection + self.libvirt_version = None + + def has_libvirt_version(self, want): + if self.libvirt_version is None: + conn = self.get_connection() + self.libvirt_version = conn.getLibVersion() + + if self.libvirt_version >= want: + return True + return False + def get_vif_devname(self, mapping): if 'vif_devname' in mapping: return mapping['vif_devname'] @@ -130,9 +147,26 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf + def get_config_ovs_bridge(self, instance, network, mapping): + conf = super(LibvirtGenericVIFDriver, + self).get_config(instance, + network, + mapping) + + designer.set_vif_host_backend_ovs_config( + conf, self.get_bridge_name(network), + self.get_ovs_interfaceid(mapping), + self.get_vif_devname(mapping)) + + return conf + def get_config_ovs(self, instance, network, mapping): - return self.get_config_ovs_ethernet(instance, network, - mapping) + if self.has_libvirt_version(LIBVIRT_OVS_VPORT_VERSION): + return self.get_config_ovs_bridge(instance, network, + mapping) + else: + return self.get_config_ovs_ethernet(instance, network, + mapping) def get_config(self, instance, network, mapping): vif_type = mapping.get('vif_type') @@ -192,8 +226,16 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): dev, iface_id, mapping['mac'], instance['uuid']) + def plug_ovs_bridge(self, instance, vif): + """No manual plugging required.""" + super(LibvirtGenericVIFDriver, + self).plug(instance, vif) + def plug_ovs(self, instance, vif): - self.plug_ovs_ethernet(instance, vif) + if self.has_libvirt_version(LIBVIRT_OVS_VPORT_VERSION): + self.plug_ovs_bridge(instance, vif) + else: + self.plug_ovs_ethernet(instance, vif) def plug(self, instance, vif): network, mapping = vif @@ -233,8 +275,16 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): except exception.ProcessExecutionError: LOG.exception(_("Failed while unplugging vif"), instance=instance) + def unplug_ovs_bridge(self, instance, vif): + """No manual unplugging required.""" + super(LibvirtGenericVIFDriver, + self).unplug(instance, vif) + def unplug_ovs(self, instance, vif): - return self.unplug_ovs_ethernet(instance, vif) + if self.has_libvirt_version(LIBVIRT_OVS_VPORT_VERSION): + self.unplug_ovs_bridge(instance, vif) + else: + self.unplug_ovs_ethernet(instance, vif) def unplug(self, instance, vif): network, mapping = vif @@ -371,9 +421,10 @@ class LibvirtHybridOVSBridgeDriver(LibvirtBridgeDriver): LOG.exception(_("Failed while unplugging vif"), instance=instance) -class LibvirtOpenVswitchVirtualPortDriver(LibvirtBaseVIFDriver): - """VIF driver for Open vSwitch that uses integrated libvirt - OVS virtual port XML (introduced in libvirt 0.9.11).""" +class LibvirtOpenVswitchVirtualPortDriver(LibvirtGenericVIFDriver): + """Retained in Grizzly for compatibility with Quantum + drivers which do not yet report 'vif_type' port binding. + Will be deprecated in Havana, and removed in Ixxxx.""" def get_bridge_name(self, network): return network.get('bridge') or CONF.libvirt_ovs_bridge @@ -382,25 +433,13 @@ class LibvirtOpenVswitchVirtualPortDriver(LibvirtBaseVIFDriver): return mapping.get('ovs_interfaceid') or mapping['vif_uuid'] def get_config(self, instance, network, mapping): - """Pass data required to create OVS virtual port element.""" - conf = super(LibvirtOpenVswitchVirtualPortDriver, - self).get_config(instance, - network, - mapping) - - designer.set_vif_host_backend_ovs_config( - conf, self.get_bridge_name(network), - self.get_ovs_interfaceid(mapping), - self.get_vif_devname(mapping)) - - return conf + return self.get_config_ovs_bridge(instance, network, mapping) def plug(self, instance, vif): - pass + return self.plug_ovs_bridge(instance, vif) def unplug(self, instance, vif): - """No action needed. Libvirt takes care of cleanup.""" - pass + return self.unplug_ovs_bridge(instance, vif) class QuantumLinuxBridgeVIFDriver(LibvirtGenericVIFDriver): |
