summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2012-12-18 23:09:59 +0000
committerDaniel P. Berrange <berrange@redhat.com>2012-12-21 10:16:07 +0000
commite84dc2603532f4577bd42846191a530f3abd2e48 (patch)
treea6171fe55e720787bde849285da32719cede57bf
parenta359b644c1f28b9a2e24aecc9f6f8d6581354f0f (diff)
downloadnova-e84dc2603532f4577bd42846191a530f3abd2e48.tar.gz
nova-e84dc2603532f4577bd42846191a530f3abd2e48.tar.xz
nova-e84dc2603532f4577bd42846191a530f3abd2e48.zip
Refactor libvirt VIF classes to reduce duplicate code
Irrespective of the VIF driver used, some config parameters are always identical (mac addr, NIC model). Move creation of the vconfig.LibvirtConfigGuestInterface instance into a base class, so VIF driver impls only need to provide their custom data. Change-Id: I7c9d5357c8ceff6d5eb2c982a7420bc93a7266bf Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
-rw-r--r--nova/virt/libvirt/vif.py56
1 files changed, 35 insertions, 21 deletions
diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py
index c5f3e6fa1..16a80b937 100644
--- a/nova/virt/libvirt/vif.py
+++ b/nova/virt/libvirt/vif.py
@@ -48,7 +48,18 @@ CONF.import_opt('use_ipv6', 'nova.config')
LINUX_DEV_LEN = 14
-class LibvirtBridgeDriver(vif.VIFDriver):
+class LibvirtBaseVIFDriver(vif.VIFDriver):
+
+ def get_config(self, instance, network, mapping):
+ conf = vconfig.LibvirtConfigGuestInterface()
+ conf.mac_addr = mapping['mac']
+ if CONF.libvirt_use_virtio_for_bridges:
+ conf.model = "virtio"
+
+ return conf
+
+
+class LibvirtBridgeDriver(LibvirtBaseVIFDriver):
"""VIF driver for Linux bridge."""
def get_config(self, instance, network, mapping):
@@ -56,13 +67,13 @@ class LibvirtBridgeDriver(vif.VIFDriver):
mac_id = mapping['mac'].replace(':', '')
- conf = vconfig.LibvirtConfigGuestInterface()
+ conf = super(LibvirtBridgeDriver,
+ self).get_config(instance,
+ network,
+ mapping)
conf.net_type = "bridge"
- conf.mac_addr = mapping['mac']
conf.source_dev = network['bridge']
conf.script = ""
- if CONF.libvirt_use_virtio_for_bridges:
- conf.model = "virtio"
conf.filtername = "nova-instance-" + instance['name'] + "-" + mac_id
conf.add_filter_param("IP", mapping['ips'][0]['ip'])
@@ -113,7 +124,7 @@ class LibvirtBridgeDriver(vif.VIFDriver):
pass
-class LibvirtOpenVswitchDriver(vif.VIFDriver):
+class LibvirtOpenVswitchDriver(LibvirtBaseVIFDriver):
"""VIF driver for Open vSwitch that uses libivrt type='ethernet'
Used for libvirt versions that do not support
@@ -126,14 +137,14 @@ class LibvirtOpenVswitchDriver(vif.VIFDriver):
def get_config(self, instance, network, mapping):
dev = self.get_dev_name(mapping['vif_uuid'])
- conf = vconfig.LibvirtConfigGuestInterface()
+ conf = super(LibvirtOpenVswitchDriver,
+ self).get_config(instance,
+ network,
+ mapping)
- if CONF.libvirt_use_virtio_for_bridges:
- conf.model = "virtio"
conf.net_type = "ethernet"
conf.target_dev = dev
conf.script = ""
- conf.mac_addr = mapping['mac']
return conf
@@ -203,7 +214,9 @@ class LibvirtHybridOVSBridgeDriver(LibvirtBridgeDriver,
br_name = self.get_br_name(mapping['vif_uuid'])
network['bridge'] = br_name
return super(LibvirtHybridOVSBridgeDriver,
- self).get_config(instance, network, mapping)
+ self).get_config(instance,
+ network,
+ mapping)
def plug(self, instance, vif):
"""Plug using hybrid strategy
@@ -251,19 +264,19 @@ class LibvirtHybridOVSBridgeDriver(LibvirtBridgeDriver,
LOG.exception(_("Failed while unplugging vif"), instance=instance)
-class LibvirtOpenVswitchVirtualPortDriver(vif.VIFDriver):
+class LibvirtOpenVswitchVirtualPortDriver(LibvirtBaseVIFDriver):
"""VIF driver for Open vSwitch that uses integrated libvirt
OVS virtual port XML (introduced in libvirt 0.9.11)."""
def get_config(self, instance, network, mapping):
""" Pass data required to create OVS virtual port element"""
- conf = vconfig.LibvirtConfigGuestInterface()
+ conf = super(LibvirtOpenVswitchVirtualPortDriver,
+ self).get_config(instance,
+ network,
+ mapping)
conf.net_type = "bridge"
conf.source_dev = CONF.libvirt_ovs_bridge
- conf.mac_addr = mapping['mac']
- if CONF.libvirt_use_virtio_for_bridges:
- conf.model = "virtio"
conf.vporttype = "openvswitch"
conf.add_vport_param("interfaceid", mapping['vif_uuid'])
@@ -277,7 +290,7 @@ class LibvirtOpenVswitchVirtualPortDriver(vif.VIFDriver):
pass
-class QuantumLinuxBridgeVIFDriver(vif.VIFDriver):
+class QuantumLinuxBridgeVIFDriver(LibvirtBaseVIFDriver):
"""VIF driver for Linux Bridge when running Quantum."""
def get_bridge_name(self, network_id):
@@ -294,13 +307,14 @@ class QuantumLinuxBridgeVIFDriver(vif.VIFDriver):
linux_net.LinuxBridgeInterfaceDriver.ensure_bridge(bridge, None,
filtering=False)
- conf = vconfig.LibvirtConfigGuestInterface()
+ conf = super(QuantumLinuxBridgeVIFDriver,
+ self).get_config(instance,
+ network,
+ mapping)
+
conf.target_dev = dev
conf.net_type = "bridge"
- conf.mac_addr = mapping['mac']
conf.source_dev = bridge
- if CONF.libvirt_use_virtio_for_bridges:
- conf.model = "virtio"
return conf