diff --git a/nova/tests/fake_network.py b/nova/tests/fake_network.py index cc1e724c5eea..5761dd3bc3d1 100644 --- a/nova/tests/fake_network.py +++ b/nova/tests/fake_network.py @@ -60,7 +60,8 @@ class FakeVIFDriver(object): def setattr(self, key, val): self.__setattr__(key, val) - def get_config(self, instance, vif, image_meta, inst_type): + def get_config(self, instance, vif, image_meta, + inst_type, virt_type): conf = libvirt_config.LibvirtConfigGuestInterface() for attr, val in conf.__dict__.iteritems(): diff --git a/nova/tests/virt/libvirt/test_driver.py b/nova/tests/virt/libvirt/test_driver.py index 674fdabcb5b5..c217f9e688fc 100644 --- a/nova/tests/virt/libvirt/test_driver.py +++ b/nova/tests/virt/libvirt/test_driver.py @@ -7480,11 +7480,13 @@ Active: 8381604 kB self.context, test_instance['instance_type_id']) expected = conn.vif_driver.get_config(test_instance, network_info[0], fake_image_meta, - fake_flavor) + fake_flavor, + CONF.libvirt.virt_type) self.mox.StubOutWithMock(conn.vif_driver, 'get_config') conn.vif_driver.get_config(test_instance, network_info[0], fake_image_meta, - mox.IsA(objects.Flavor)).\ + mox.IsA(objects.Flavor), + CONF.libvirt.virt_type).\ AndReturn(expected) self.mox.ReplayAll() @@ -9979,14 +9981,16 @@ class LibvirtDriverTestCase(test.TestCase): elif method == 'detach_interface': fake_image_meta = None expected = self.libvirtconnection.vif_driver.get_config( - instance, network_info[0], fake_image_meta, fake_flavor) + instance, network_info[0], fake_image_meta, fake_flavor, + CONF.libvirt.virt_type) self.mox.StubOutWithMock(self.libvirtconnection.vif_driver, 'get_config') self.libvirtconnection.vif_driver.get_config( instance, network_info[0], fake_image_meta, - mox.IsA(objects.Flavor)).AndReturn(expected) + mox.IsA(objects.Flavor), + CONF.libvirt.virt_type).AndReturn(expected) domain.info().AndReturn([power_state]) if method == 'attach_interface': domain.attachDeviceFlags(expected.to_xml(), expected_flags) diff --git a/nova/tests/virt/libvirt/test_vif.py b/nova/tests/virt/libvirt/test_vif.py index d36fef6e0b8d..3c4e409c5c5e 100644 --- a/nova/tests/virt/libvirt/test_vif.py +++ b/nova/tests/virt/libvirt/test_vif.py @@ -326,7 +326,7 @@ class LibvirtVifTestCase(test.TestCase): default_inst_type['extra_specs'] = dict(extra_specs + quota_bandwidth) conf = self._get_conf() nic = driver.get_config(self.instance, vif, image_meta, - default_inst_type) + default_inst_type, CONF.libvirt.virt_type) conf.add_device(nic) return conf.to_xml() diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index 47d670b6a476..eed81932534f 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -1426,7 +1426,7 @@ class LibvirtDriver(driver.ComputeDriver): self.vif_driver.plug(instance, vif) self.firewall_driver.setup_basic_filtering(instance, [vif]) cfg = self.vif_driver.get_config(instance, vif, image_meta, - flavor) + flavor, CONF.libvirt.virt_type) try: flags = libvirt.VIR_DOMAIN_AFFECT_CONFIG state = LIBVIRT_POWER_STATE[virt_dom.info()[0]] @@ -1444,7 +1444,8 @@ class LibvirtDriver(driver.ComputeDriver): flavor = objects.Flavor.get_by_id( nova_context.get_admin_context(read_deleted='yes'), instance['instance_type_id']) - cfg = self.vif_driver.get_config(instance, vif, None, flavor) + cfg = self.vif_driver.get_config(instance, vif, None, flavor, + CONF.libvirt.virt_type) try: self.vif_driver.unplug(instance, vif) flags = libvirt.VIR_DOMAIN_AFFECT_CONFIG @@ -3327,10 +3328,9 @@ class LibvirtDriver(driver.ComputeDriver): guest.add_device(config) for vif in network_info: - config = self.vif_driver.get_config(instance, - vif, - image_meta, - flavor) + config = self.vif_driver.get_config( + instance, vif, image_meta, + flavor, CONF.libvirt.virt_type) guest.add_device(config) if ((CONF.libvirt.virt_type == "qemu" or diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py index 727a4474b6dd..8f517ccedd2e 100644 --- a/nova/virt/libvirt/vif.py +++ b/nova/virt/libvirt/vif.py @@ -42,7 +42,6 @@ libvirt_vif_opts = [ CONF = cfg.CONF CONF.register_opts(libvirt_vif_opts, 'libvirt') -CONF.import_opt('virt_type', 'nova.virt.libvirt.driver', group='libvirt') CONF.import_opt('use_ipv6', 'nova.netconf') DEV_PREFIX_ETH = 'eth' @@ -97,7 +96,7 @@ class LibvirtBaseVIFDriver(object): devname = self.get_vif_devname(vif) return prefix + devname[3:] - def get_config(self, instance, vif, image_meta, inst_type): + def get_config(self, instance, vif, image_meta, inst_type, virt_type): conf = vconfig.LibvirtConfigGuestInterface() # Default to letting libvirt / the hypervisor choose the model model = None @@ -114,20 +113,20 @@ class LibvirtBaseVIFDriver(object): # Else if the virt type is KVM/QEMU, use virtio according # to the global config parameter if (model is None and - CONF.libvirt.virt_type in ('kvm', 'qemu') and + virt_type in ('kvm', 'qemu') and CONF.libvirt.use_virtio_for_bridges): model = network_model.VIF_MODEL_VIRTIO # Workaround libvirt bug, where it mistakenly # enables vhost mode, even for non-KVM guests if (model == network_model.VIF_MODEL_VIRTIO and - CONF.libvirt.virt_type == "qemu"): + virt_type == "qemu"): driver = "qemu" - if not is_vif_model_valid_for_virt(CONF.libvirt.virt_type, + if not is_vif_model_valid_for_virt(virt_type, model): raise exception.UnsupportedHardware(model=model, - virt=CONF.libvirt.virt_type) + virt=virt_type) designer.set_vif_guest_frontend_config( conf, vif['address'], model, driver) @@ -164,11 +163,12 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return True return False - def get_config_bridge(self, instance, vif, image_meta, inst_type): + def get_config_bridge(self, instance, vif, image_meta, + inst_type, virt_type): """Get VIF configurations for bridge type.""" conf = super(LibvirtGenericVIFDriver, - self).get_config(instance, vif, - image_meta, inst_type) + self).get_config(instance, vif, image_meta, + inst_type, virt_type) designer.set_vif_host_backend_bridge_config( conf, self.get_bridge_name(vif), @@ -183,10 +183,10 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf def get_config_ovs_bridge(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): conf = super(LibvirtGenericVIFDriver, - self).get_config(instance, vif, - image_meta, inst_type) + self).get_config(instance, vif, image_meta, + inst_type, virt_type) designer.set_vif_host_backend_ovs_config( conf, self.get_bridge_name(vif), @@ -198,59 +198,67 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf def get_config_ovs_hybrid(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): newvif = copy.deepcopy(vif) newvif['network']['bridge'] = self.get_br_name(vif['id']) - return self.get_config_bridge(instance, newvif, - image_meta, inst_type) + return self.get_config_bridge(instance, newvif, image_meta, + inst_type, virt_type) - def get_config_ovs(self, instance, vif, image_meta, inst_type): + def get_config_ovs(self, instance, vif, image_meta, + inst_type, virt_type): if self.get_firewall_required(vif) or vif.is_hybrid_plug_enabled(): return self.get_config_ovs_hybrid(instance, vif, image_meta, - inst_type) + inst_type, + virt_type) else: return self.get_config_ovs_bridge(instance, vif, image_meta, - inst_type) + inst_type, + virt_type) def get_config_ivs_hybrid(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): newvif = copy.deepcopy(vif) newvif['network']['bridge'] = self.get_br_name(vif['id']) return self.get_config_bridge(instance, newvif, image_meta, - inst_type) + inst_type, + virt_type) def get_config_ivs_ethernet(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): conf = super(LibvirtGenericVIFDriver, self).get_config(instance, vif, image_meta, - inst_type) + inst_type, + virt_type) dev = self.get_vif_devname(vif) designer.set_vif_host_backend_ethernet_config(conf, dev) return conf - def get_config_ivs(self, instance, vif, image_meta, inst_type): + def get_config_ivs(self, instance, vif, image_meta, + inst_type, virt_type): if self.get_firewall_required(vif) or vif.is_hybrid_plug_enabled(): return self.get_config_ivs_hybrid(instance, vif, image_meta, - inst_type) + inst_type, + virt_type) else: return self.get_config_ivs_ethernet(instance, vif, image_meta, - inst_type) + inst_type, + virt_type) def get_config_802qbg(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): conf = super(LibvirtGenericVIFDriver, - self).get_config(instance, vif, - image_meta, inst_type) + self).get_config(instance, vif, image_meta, + inst_type, virt_type) params = vif["qbg_params"] designer.set_vif_host_backend_802qbg_config( @@ -265,10 +273,10 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf def get_config_802qbh(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): conf = super(LibvirtGenericVIFDriver, - self).get_config(instance, vif, - image_meta, inst_type) + self).get_config(instance, vif, image_meta, + inst_type, virt_type) params = vif["qbh_params"] designer.set_vif_host_backend_802qbh_config( @@ -280,10 +288,10 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf def get_config_iovisor(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): conf = super(LibvirtGenericVIFDriver, - self).get_config(instance, vif, - image_meta, inst_type) + self).get_config(instance, vif, image_meta, + inst_type, virt_type) dev = self.get_vif_devname(vif) designer.set_vif_host_backend_ethernet_config(conf, dev) @@ -293,10 +301,10 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf def get_config_midonet(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): conf = super(LibvirtGenericVIFDriver, - self).get_config(instance, vif, - image_meta, inst_type) + self).get_config(instance, vif, image_meta, + inst_type, virt_type) dev = self.get_vif_devname(vif) designer.set_vif_host_backend_ethernet_config(conf, dev) @@ -304,10 +312,10 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf def get_config_mlnx_direct(self, instance, vif, image_meta, - inst_type): + inst_type, virt_type): conf = super(LibvirtGenericVIFDriver, - self).get_config(instance, vif, - image_meta, inst_type) + self).get_config(instance, vif, image_meta, + inst_type, virt_type) devname = self.get_vif_devname_with_prefix(vif, DEV_PREFIX_ETH) designer.set_vif_host_backend_direct_config(conf, devname) @@ -316,13 +324,14 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): return conf - def get_config(self, instance, vif, image_meta, inst_type): + def get_config(self, instance, vif, image_meta, + inst_type, virt_type): vif_type = vif['type'] LOG.debug('vif_type=%(vif_type)s instance=%(instance)s ' - 'vif=%(vif)s', + 'vif=%(vif)s virt_type%(virt_type)s', {'vif_type': vif_type, 'instance': instance, - 'vif': vif}) + 'vif': vif, 'virt_type': virt_type}) if vif_type is None: raise exception.NovaException( @@ -333,7 +342,8 @@ class LibvirtGenericVIFDriver(LibvirtBaseVIFDriver): if not func: raise exception.NovaException( _("Unexpected vif_type=%s") % vif_type) - return func(instance, vif, image_meta, inst_type) + return func(instance, vif, image_meta, + inst_type, virt_type) def plug_bridge(self, instance, vif): """Ensure that the bridge exists, and add VIF to it."""