summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordanwent <danwent@dan-xs3-cs>2011-07-20 00:41:26 -0700
committerdanwent <danwent@dan-xs3-cs>2011-07-20 00:41:26 -0700
commit979282fba8b9dc20bc6345a3b3c017d6339662fa (patch)
tree7ad3c286d50834f85ad187df672b2018bdad09ab
parentf8a562edf819085820c1d6b4639f2331330cc454 (diff)
first cut of xenserver vif-plugging, some minor tweaks to libvirt plugging
-rw-r--r--nova/virt/libvirt/connection.py8
-rw-r--r--nova/virt/libvirt/vif.py5
-rw-r--r--nova/virt/xenapi/vm_utils.py22
-rw-r--r--nova/virt/xenapi/vmops.py34
-rw-r--r--nova/virt/xenapi_conn.py3
5 files changed, 33 insertions, 39 deletions
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py
index 936e1b171..1fa6e5c2f 100644
--- a/nova/virt/libvirt/connection.py
+++ b/nova/virt/libvirt/connection.py
@@ -261,11 +261,9 @@ class LibvirtConnection(driver.ComputeDriver):
def setup_vif_network(self, ctxt, instance_id):
"""Set up VIF networking on the host."""
- # FIXME: this is dying because DB has no networks for instances
- #networks = db.network_get_all_by_instance(ctxt, instance_id)
- #for network in networks:
- # self.vif_driver.plug(network)
- pass
+ networks = db.network_get_all_by_instance(ctxt, instance_id)
+ for network in networks:
+ self.vif_driver.plug(network)
def destroy(self, instance, network_info, cleanup=True):
instance_name = instance['name']
diff --git a/nova/virt/libvirt/vif.py b/nova/virt/libvirt/vif.py
index 4f7bb0b4d..2188251f0 100644
--- a/nova/virt/libvirt/vif.py
+++ b/nova/virt/libvirt/vif.py
@@ -28,6 +28,8 @@ FLAGS = flags.FLAGS
flags.DEFINE_bool('allow_project_net_traffic',
True,
'Whether to allow in project network traffic')
+flags.DEFINE_string('libvirt_ovs_integration_bridge', 'br-int',
+ 'Name of Integration Bridge used by Open vSwitch')
class LibvirtVIF(object):
@@ -110,7 +112,7 @@ class LibvirtOpenVswitchDriver(VIFDriver):
utils.execute('sudo', 'ip', 'tuntap', 'add', dev, 'mode', 'tap')
utils.execute('sudo', 'ip', 'link', 'set', dev, 'up')
utils.execute('sudo', 'ovs-vsctl', '--', '--may-exist', 'add-port',
- FLAGS.flat_network_bridge, dev,
+ FLAGS.libvirt_ovs_integration_bridge, dev,
'--', 'set', 'Interface', dev, "external-ids:iface-id=%s" % vif_id,
'--', 'set', 'Interface', dev, "external-ids:iface-status=active",
'--', 'set', 'Interface', dev, "external-ids:attached-mac=%s" % \
@@ -120,7 +122,6 @@ class LibvirtOpenVswitchDriver(VIFDriver):
'script': '',
'name': dev,
'mac_address': mapping['mac']}
- print "using result = %s" % str(result)
return result
def plug(self, network):
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index 71107aff4..e63582b54 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -282,27 +282,6 @@ class VMHelper(HelperBase):
LOG.exception(exc)
raise StorageError(_('Unable to destroy VDI %s') % vdi_ref)
- @classmethod
- def create_vif(cls, session, vm_ref, network_ref, mac_address,
- dev, rxtx_cap=0):
- """Create a VIF record. Returns a Deferred that gives the new
- VIF reference."""
- vif_rec = {}
- vif_rec['device'] = str(dev)
- vif_rec['network'] = network_ref
- vif_rec['VM'] = vm_ref
- vif_rec['MAC'] = mac_address
- vif_rec['MTU'] = '1500'
- vif_rec['other_config'] = {}
- vif_rec['qos_algorithm_type'] = "ratelimit" if rxtx_cap else ''
- vif_rec['qos_algorithm_params'] = \
- {"kbps": str(rxtx_cap * 1024)} if rxtx_cap else {}
- LOG.debug(_('Creating VIF for VM %(vm_ref)s,'
- ' network %(network_ref)s.') % locals())
- vif_ref = session.call_xenapi('VIF.create', vif_rec)
- LOG.debug(_('Created VIF %(vif_ref)s for VM %(vm_ref)s,'
- ' network %(network_ref)s.') % locals())
- return vif_ref
@classmethod
def create_vdi(cls, session, sr_ref, name_label, virtual_size, read_only):
@@ -1116,7 +1095,6 @@ def _stream_disk(dev, image_type, virtual_size, image_file):
for chunk in image_file:
f.write(chunk)
-
def _write_partition(virtual_size, dev):
dest = '/dev/%s' % dev
primary_first = MBR_SIZE_SECTORS
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index c332c27b0..26f90fedd 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -52,6 +52,9 @@ FLAGS = flags.FLAGS
flags.DEFINE_integer('windows_version_timeout', 300,
'number of seconds to wait for windows agent to be '
'fully operational')
+flags.DEFINE_string('xenapi_vif_driver',
+ 'nova.virt.xenapi.vif.XenAPIBridgeDriver',
+ 'The XenAPI VIF driver using XenServer Network APIs.')
def cmp_version(a, b):
@@ -78,6 +81,7 @@ class VMOps(object):
self._session = session
self.poll_rescue_last_ran = None
VMHelper.XenAPI = self.XenAPI
+ self.vif_driver = utils.import_object(FLAGS.xenapi_vif_driver)
def list_instances(self):
"""List VM instances."""
@@ -255,7 +259,7 @@ class VMOps(object):
VMHelper.preconfigure_instance(self._session, instance,
first_vdi_ref, network_info)
- self.create_vifs(vm_ref, network_info)
+ self.create_vifs(vm_ref, instance, network_info)
self.inject_network_info(instance, network_info, vm_ref)
return vm_ref
@@ -873,6 +877,11 @@ class VMOps(object):
self._destroy_kernel_ramdisk(instance, vm_ref)
self._destroy_vm(instance, vm_ref)
+ networks = db.network_get_all_by_instance(ctxt, instance['id'])
+ for network in networks:
+ self.vif_driver.unplug(network)
+
+
def _wait_with_callback(self, instance_id, task, callback):
ret = None
try:
@@ -1068,7 +1077,7 @@ class VMOps(object):
# catch KeyError for domid if instance isn't running
pass
- def create_vifs(self, vm_ref, network_info):
+ def create_vifs(self, vm_ref, instance, network_info):
"""Creates vifs for an instance."""
logging.debug(_("creating vif(s) for vm: |%s|"), vm_ref)
@@ -1077,14 +1086,19 @@ class VMOps(object):
self._session.get_xenapi().VM.get_record(vm_ref)
for device, (network, info) in enumerate(network_info):
- mac_address = info['mac']
- bridge = network['bridge']
- rxtx_cap = info.pop('rxtx_cap')
- network_ref = \
- NetworkHelper.find_network_with_bridge(self._session,
- bridge)
- VMHelper.create_vif(self._session, vm_ref, network_ref,
- mac_address, device, rxtx_cap)
+ vif_rec = self.vif_driver.get_vif_rec(self._session,
+ vm_ref, instance, device, network, info)
+ LOG.debug(_('Creating VIF for VM %(vm_ref)s,' \
+ ' network %(network_ref)s.') % locals())
+ vif_ref = session.call_xenapi('VIF.create', vif_rec)
+ LOG.debug(_('Created VIF %(vif_ref)s for VM %(vm_ref)s,'
+ ' network %(network_ref)s.') % locals())
+
+ def setup_vif_network(self, ctxt, instance_id):
+ """Set up VIF networking on the host."""
+ networks = db.network_get_all_by_instance(ctxt, instance_id)
+ for network in networks:
+ self.vif_driver.plug(network)
def reset_network(self, instance, vm_ref=None):
"""Creates uuid arg to pass to make_agent_call and calls it."""
diff --git a/nova/virt/xenapi_conn.py b/nova/virt/xenapi_conn.py
index 032ab7345..ae39ecab4 100644
--- a/nova/virt/xenapi_conn.py
+++ b/nova/virt/xenapi_conn.py
@@ -269,6 +269,9 @@ class XenAPIConnection(driver.ComputeDriver):
"""inject network info for specified instance"""
self._vmops.inject_network_info(instance, network_info)
+ def setup_vif_network(self, ctxt, instance_id):
+ self._vmops.setup_vif_network(ctxt, instance_id)
+
def get_info(self, instance_id):
"""Return data about VM instance"""
return self._vmops.get_info(instance_id)