libvirt: remove use of CONF.libvirt.virt_type in vif.py

The vif.py class imports the CONF.libvirt.virt_type parameter
from the main driver.py file. This sets up a circular dependency
which prevents driver.py importing vif.py in the top of the file,
since the CONF.libvirt.virt_type parameter won't have been
registered yet.

It is generally bad design practice to rely on global variables,
which is effectively what the CONF.* parameters are, so change
the VIF driver get_config() API to accept 'virt_type' as a
parameter instead.

Related-bug: #1302796
Change-Id: I023851df96640eeeb54124add8cc5c725b8d13be
This commit is contained in:
Daniel P. Berrange 2014-07-24 12:27:46 +01:00
parent 79b38e2aee
commit 7a206bc58d
5 changed files with 71 additions and 56 deletions

View File

@ -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():

View File

@ -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)

View File

@ -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()

View File

@ -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

View File

@ -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."""