summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEwan Mellor <ewan.mellor@citrix.com>2010-08-03 15:41:35 +0100
committerEwan Mellor <ewan.mellor@citrix.com>2010-08-03 15:41:35 +0100
commit89e057cf2f008ebb7ec1c99605ff99f5849d9b40 (patch)
tree7694025cbffa9ce696674b9154ceb09725671bf0
parentb31d4f795dbd94bae2c3d8f01aea3b15ed9684b2 (diff)
downloadnova-89e057cf2f008ebb7ec1c99605ff99f5849d9b40.tar.gz
nova-89e057cf2f008ebb7ec1c99605ff99f5849d9b40.tar.xz
nova-89e057cf2f008ebb7ec1c99605ff99f5849d9b40.zip
Implement VIF creation.
-rw-r--r--nova/virt/xenapi.py57
1 files changed, 50 insertions, 7 deletions
diff --git a/nova/virt/xenapi.py b/nova/virt/xenapi.py
index b84e55138..b4768cffa 100644
--- a/nova/virt/xenapi.py
+++ b/nova/virt/xenapi.py
@@ -79,6 +79,18 @@ class XenAPIConnection(object):
raise Exception('Attempted to create non-unique name %s' %
instance.name)
+ if 'bridge_name' in instance.datamodel:
+ network_ref = \
+ yield self._find_network_with_bridge(
+ instance.datamodel['bridge_name'])
+ else:
+ network_ref = None
+
+ if 'mac_address' in instance.datamodel:
+ mac_address = instance.datamodel['mac_address']
+ else:
+ mac_address = ''
+
user = AuthManager().get_user(instance.datamodel['user_id'])
vdi_uuid = yield self.fetch_image(
instance.datamodel['image_id'], user, True)
@@ -90,6 +102,8 @@ class XenAPIConnection(object):
vm_ref = yield self.create_vm(instance, kernel, ramdisk)
yield self.create_vbd(vm_ref, vdi_ref, 0, True)
+ if network_ref:
+ yield self._create_vif(vm_ref, network_ref, mac_address)
yield self._conn.xenapi.VM.start(vm_ref, False, False)
@@ -152,6 +166,35 @@ class XenAPIConnection(object):
return vbd_ref
+ def _create_vif(self, vm_ref, network_ref, mac_address):
+ vif_rec = {}
+ vif_rec['device'] = '0'
+ 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'] = ''
+ vif_rec['qos_algorithm_params'] = {}
+ logging.debug('Creating VIF for VM %s, network %s ... ', vm_ref,
+ network_ref)
+ vif_ref = self._conn.xenapi.VIF.create(vif_rec)
+ logging.debug('Created VIF %s for VM %s, network %s.', vif_ref,
+ vm_ref, network_ref)
+ return vif_ref
+
+
+ def _find_network_with_bridge(self, bridge):
+ expr = 'field "bridge" = "%s"' % bridge
+ networks = self._conn.xenapi.network.get_all_records_where(expr)
+ if len(networks) == 1:
+ return networks.keys()[0]
+ elif len(networks) > 1:
+ raise Exception('Found non-unique network for bridge %s' % bridge)
+ else:
+ raise Exception('Found no network for bridge %s' % bridge)
+
+
def fetch_image(self, image, user, use_sr):
"""use_sr: True to put the image as a VDI in an SR, False to place
it on dom0's filesystem. The former is for VM disks, the latter for
@@ -213,13 +256,13 @@ class XenAPIConnection(object):
return self._conn.xenapi.session.get_this_host(self._conn.handle)
- power_state_from_xenapi = {
- 'Halted' : power_state.SHUTDOWN,
- 'Running' : power_state.RUNNING,
- 'Paused' : power_state.PAUSED,
- 'Suspended': power_state.SHUTDOWN, # FIXME
- 'Crashed' : power_state.CRASHED
- }
+power_state_from_xenapi = {
+ 'Halted' : power_state.SHUTDOWN,
+ 'Running' : power_state.RUNNING,
+ 'Paused' : power_state.PAUSED,
+ 'Suspended': power_state.SHUTDOWN, # FIXME
+ 'Crashed' : power_state.CRASHED
+}
def _unwrap_plugin_exceptions(func, *args, **kwargs):