summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorSalvatore Orlando <salvatore.orlando@eu.citrix.com>2011-01-10 18:26:40 +0000
committerSalvatore Orlando <salvatore.orlando@eu.citrix.com>2011-01-10 18:26:40 +0000
commit97ff39bd1d83f3cfa412f291087e025a91d147cd (patch)
treea785d75de80662fe4da0fc04dfee08c2dad3512e /plugins
parented84e51475471c5ae37eacdd4d5c93ef91ebcf10 (diff)
downloadnova-97ff39bd1d83f3cfa412f291087e025a91d147cd.tar.gz
nova-97ff39bd1d83f3cfa412f291087e025a91d147cd.tar.xz
nova-97ff39bd1d83f3cfa412f291087e025a91d147cd.zip
Can now correctly launch images with external kernels through glance.
Further tests and Pep8 fixes to come.
Diffstat (limited to 'plugins')
-rw-r--r--plugins/xenserver/xenapi/etc/xapi.d/plugins/glance30
-rwxr-xr-xplugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py4
2 files changed, 31 insertions, 3 deletions
diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance b/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
index 5e648b970..7f0b375e1 100644
--- a/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
+++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
@@ -40,8 +40,35 @@ from pluginlib_nova import *
configure_logging('glance')
CHUNK_SIZE = 8192
+KERNEL_DIR = '/boot/guest'
FILE_SR_PATH = '/var/run/sr-mount'
+def copy_kernel_vdi(session,args):
+ vdi = exists(args, 'vdi-ref')
+ size = exists(args,'image-size')
+ #Use the uuid as a filename
+ vdi_uuid=session.xenapi.VDI.get_uuid(vdi)
+ copy_args={'vdi_uuid':vdi_uuid,'vdi_size':int(size)}
+ filename=with_vdi_in_dom0(session, vdi, False,
+ lambda dev:
+ _copy_kernel_vdi('/dev/%s' % dev,copy_args))
+ return filename
+
+def _copy_kernel_vdi(dest,copy_args):
+ vdi_uuid=copy_args['vdi_uuid']
+ vdi_size=copy_args['vdi_size']
+ logging.debug("copying kernel/ramdisk file from %s to /boot/guest/%s",dest,vdi_uuid)
+ filename=KERNEL_DIR + '/' + vdi_uuid
+ #read data from /dev/ and write into a file on /boot/guest
+ of=open(filename,'wb')
+ f=open(dest,'rb')
+ data=f.read(vdi_size)
+ of.write(data)
+ f.close()
+ of.close()
+ logging.debug("Done. Filename: %s",filename)
+ return filename
+
def put_vdis(session, args):
params = pickle.loads(exists(args, 'params'))
vdi_uuids = params["vdi_uuids"]
@@ -129,4 +156,5 @@ def find_sr(session):
if __name__ == '__main__':
- XenAPIPlugin.dispatch({'put_vdis': put_vdis})
+ XenAPIPlugin.dispatch({'put_vdis': put_vdis,
+ 'copy_kernel_vdi': copy_kernel_vdi})
diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py b/plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py
index 8e7a829d5..17fcd474e 100755
--- a/plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py
+++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/pluginlib_nova.py
@@ -154,7 +154,7 @@ def create_vdi(session, sr_ref, name_label, virtual_size, read_only):
return vdi_ref
-def with_vdi_in_dom0(session, vdi, read_only, f):
+def with_vdi_in_dom0(session, vdi, read_only, f,args=None):
dom0 = get_domain_0(session)
vbd_rec = {}
vbd_rec['VM'] = dom0
@@ -176,7 +176,7 @@ def with_vdi_in_dom0(session, vdi, read_only, f):
logging.debug('Plugging VBD %s ... ', vbd)
session.xenapi.VBD.plug(vbd)
logging.debug('Plugging VBD %s done.', vbd)
- return f(session.xenapi.VBD.get_device(vbd))
+ return f(session.xenapi.VBD.get_device(vbd),args)
finally:
logging.debug('Destroying VBD for VDI %s ... ', vdi)
vbd_unplug_with_retry(session, vbd)