summaryrefslogtreecommitdiffstats
path: root/plugins/xenserver
diff options
context:
space:
mode:
authorRick Harris <rconradharris@gmail.com>2012-06-29 21:26:42 +0000
committerRick Harris <rconradharris@gmail.com>2012-06-29 21:36:54 +0000
commit1dea34fa1ab15ef2bef9811ef585c8b3bf5c0d22 (patch)
tree6f323f72f5c5f8c6e78851601c09b4ea9cccc08b /plugins/xenserver
parent019d953ef5b4bed7c53401375bfd7aa890fc0c1d (diff)
downloadnova-1dea34fa1ab15ef2bef9811ef585c8b3bf5c0d22.tar.gz
nova-1dea34fa1ab15ef2bef9811ef585c8b3bf5c0d22.tar.xz
nova-1dea34fa1ab15ef2bef9811ef585c8b3bf5c0d22.zip
Refactoring code to kernel Dom0 plugin.
The kernel and ramdisk VDI manipulation code really has nothing to do with Glance so it doesn't make a lot of sense for it to exist in the Glance Dom0 plugin. This patch refactors the code out to its own plugin and then applies a few misc cleanups. Change-Id: I363d54ea3c2d51aa6a6c1635b4fb59ebb9ce1fc0
Diffstat (limited to 'plugins/xenserver')
-rw-r--r--plugins/xenserver/xenapi/contrib/rpmbuild/SPECS/openstack-xen-plugins.spec1
-rwxr-xr-xplugins/xenserver/xenapi/etc/xapi.d/plugins/glance86
-rwxr-xr-xplugins/xenserver/xenapi/etc/xapi.d/plugins/kernel123
3 files changed, 125 insertions, 85 deletions
diff --git a/plugins/xenserver/xenapi/contrib/rpmbuild/SPECS/openstack-xen-plugins.spec b/plugins/xenserver/xenapi/contrib/rpmbuild/SPECS/openstack-xen-plugins.spec
index 505d42fe2..8f4415311 100644
--- a/plugins/xenserver/xenapi/contrib/rpmbuild/SPECS/openstack-xen-plugins.spec
+++ b/plugins/xenserver/xenapi/contrib/rpmbuild/SPECS/openstack-xen-plugins.spec
@@ -30,6 +30,7 @@ rm -rf $RPM_BUILD_ROOT
%defattr(-,root,root,-)
/etc/xapi.d/plugins/agent
/etc/xapi.d/plugins/glance
+/etc/xapi.d/plugins/kernel
/etc/xapi.d/plugins/migration
/etc/xapi.d/plugins/pluginlib_nova.py
/etc/xapi.d/plugins/xenhost
diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance b/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
index 58de40a01..6fbd14714 100755
--- a/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
+++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
@@ -28,7 +28,6 @@ except ImportError:
import simplejson as json
import md5
import os
-import os.path
import shutil
import urllib2
@@ -40,47 +39,11 @@ import utils
from pluginlib_nova import *
configure_logging('glance')
-KERNEL_DIR = '/boot/guest'
-
class RetryableError(Exception):
pass
-def _copy_kernel_vdi(dest, copy_args):
- vdi_uuid = copy_args['vdi_uuid']
- vdi_size = copy_args['vdi_size']
- cached_image = copy_args['cached-image']
- logging.debug("copying kernel/ramdisk file from %s to /boot/guest/%s",
- dest, vdi_uuid)
- filename = KERNEL_DIR + '/' + vdi_uuid
- #make sure KERNEL_DIR exists, otherwise create it
- if not os.path.isdir(KERNEL_DIR):
- logging.debug("Creating directory %s", KERNEL_DIR)
- os.makedirs(KERNEL_DIR)
- #read data from /dev/ and write into a file on /boot/guest
- of = open(filename, 'wb')
- f = open(dest, 'rb')
- #copy only vdi_size bytes
- data = f.read(vdi_size)
- of.write(data)
- if cached_image:
- #create a cache file. If caching is enabled, kernel images do not have
- #to be fetched from glance.
- cached_image = KERNEL_DIR + '/' + cached_image
- logging.debug("copying kernel/ramdisk file from %s to /boot/guest/%s",
- dest, cached_image)
- cache_file = open(cached_image, 'wb')
- cache_file.write(data)
- cache_file.close()
- logging.debug("Done. Filename: %s", cached_image)
-
- f.close()
- of.close()
- logging.debug("Done. Filename: %s", filename)
- return filename
-
-
def _download_tarball_and_verify(request, staging_path):
try:
response = urllib2.urlopen(request)
@@ -225,24 +188,6 @@ def _upload_tarball(staging_path, image_id, glance_host, glance_port,
conn.close()
-def create_kernel_ramdisk(session, args):
- """Creates a copy of the kernel/ramdisk image if it is present in the
- cache. If the image is not present in the cache, it does nothing.
- """
- cached_image = exists(args, 'cached-image')
- image_uuid = exists(args, 'new-image-uuid')
- cached_image_filename = KERNEL_DIR + '/' + cached_image
- filename = KERNEL_DIR + '/' + image_uuid
-
- if os.path.isfile(cached_image_filename):
- shutil.copyfile(cached_image_filename, filename)
- logging.debug("Done. Filename: %s", filename)
- else:
- filename = ""
- logging.debug("Cached kernel/ramdisk image not found")
- return filename
-
-
def download_vhd(session, args):
"""Download an image from Glance, unbundle it, and then deposit the VHDs
into the storage repository
@@ -295,35 +240,6 @@ def upload_vhd(session, args):
return "" # Nothing useful to return on an upload
-def copy_kernel_vdi(session, args):
- vdi = exists(args, 'vdi-ref')
- size = exists(args, 'image-size')
- cached_image = optional(args, 'cached-image')
- #Use the uuid as a filename
- vdi_uuid = session.xenapi.VDI.get_uuid(vdi)
- copy_args = {'vdi_uuid': vdi_uuid,
- 'vdi_size': int(size),
- 'cached-image': cached_image}
- filename = with_vdi_in_dom0(session, vdi, False,
- lambda dev:
- _copy_kernel_vdi('/dev/%s' % dev, copy_args))
- return filename
-
-
-def remove_kernel_ramdisk(session, args):
- """Removes kernel and/or ramdisk from dom0's file system"""
- kernel_file = optional(args, 'kernel-file')
- ramdisk_file = optional(args, 'ramdisk-file')
- if kernel_file:
- os.remove(kernel_file)
- if ramdisk_file:
- os.remove(ramdisk_file)
- return "ok"
-
-
if __name__ == '__main__':
XenAPIPlugin.dispatch({'upload_vhd': upload_vhd,
- 'download_vhd': download_vhd,
- 'copy_kernel_vdi': copy_kernel_vdi,
- 'create_kernel_ramdisk': create_kernel_ramdisk,
- 'remove_kernel_ramdisk': remove_kernel_ramdisk})
+ 'download_vhd': download_vhd})
diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/kernel b/plugins/xenserver/xenapi/etc/xapi.d/plugins/kernel
new file mode 100755
index 000000000..a0ca7badc
--- /dev/null
+++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/kernel
@@ -0,0 +1,123 @@
+#!/usr/bin/env python
+
+# Copyright (c) 2012 Openstack, LLC
+# Copyright (c) 2010 Citrix Systems, Inc.
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# All Rights Reserved.
+#
+# Licensed under the Apache License, Version 2.0 (the "License"); you may
+# not use this file except in compliance with the License. You may obtain
+# a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+"""Handle the manipulation of kernel images."""
+
+import os
+import shutil
+
+import XenAPIPlugin
+
+#FIXME(sirp): should this use pluginlib from 5.6?
+from pluginlib_nova import *
+configure_logging('kernel')
+
+KERNEL_DIR = '/boot/guest'
+
+
+def _copy_vdi(dest, copy_args):
+ vdi_uuid = copy_args['vdi_uuid']
+ vdi_size = copy_args['vdi_size']
+ cached_image = copy_args['cached-image']
+
+ logging.debug("copying kernel/ramdisk file from %s to /boot/guest/%s",
+ dest, vdi_uuid)
+ filename = KERNEL_DIR + '/' + vdi_uuid
+
+ # Make sure KERNEL_DIR exists, otherwise create it
+ if not os.path.isdir(KERNEL_DIR):
+ logging.debug("Creating directory %s", KERNEL_DIR)
+ os.makedirs(KERNEL_DIR)
+
+ # Read data from /dev/ and write into a file on /boot/guest
+ of = open(filename, 'wb')
+ f = open(dest, 'rb')
+
+ # Copy only vdi_size bytes
+ data = f.read(vdi_size)
+ of.write(data)
+
+ if cached_image:
+ # Create a cache file. If caching is enabled, kernel images do not have
+ # to be fetched from glance.
+ cached_image = KERNEL_DIR + '/' + cached_image
+ logging.debug("copying kernel/ramdisk file from %s to /boot/guest/%s",
+ dest, cached_image)
+ cache_file = open(cached_image, 'wb')
+ cache_file.write(data)
+ cache_file.close()
+ logging.debug("Done. Filename: %s", cached_image)
+
+ f.close()
+ of.close()
+ logging.debug("Done. Filename: %s", filename)
+ return filename
+
+
+def copy_vdi(session, args):
+ vdi = exists(args, 'vdi-ref')
+ size = exists(args, 'image-size')
+ cached_image = optional(args, 'cached-image')
+
+ # Use the uuid as a filename
+ vdi_uuid = session.xenapi.VDI.get_uuid(vdi)
+ copy_args = {'vdi_uuid': vdi_uuid,
+ 'vdi_size': int(size),
+ 'cached-image': cached_image}
+
+ filename = with_vdi_in_dom0(session, vdi, False,
+ lambda dev:
+ _copy_vdi('/dev/%s' % dev, copy_args))
+ return filename
+
+
+def create_kernel_ramdisk(session, args):
+ """Creates a copy of the kernel/ramdisk image if it is present in the
+ cache. If the image is not present in the cache, it does nothing.
+ """
+ cached_image = exists(args, 'cached-image')
+ image_uuid = exists(args, 'new-image-uuid')
+ cached_image_filename = KERNEL_DIR + '/' + cached_image
+ filename = KERNEL_DIR + '/' + image_uuid
+
+ if os.path.isfile(cached_image_filename):
+ shutil.copyfile(cached_image_filename, filename)
+ logging.debug("Done. Filename: %s", filename)
+ else:
+ filename = ""
+ logging.debug("Cached kernel/ramdisk image not found")
+ return filename
+
+
+def remove_kernel_ramdisk(session, args):
+ """Removes kernel and/or ramdisk from dom0's file system"""
+ kernel_file = optional(args, 'kernel-file')
+ ramdisk_file = optional(args, 'ramdisk-file')
+ if kernel_file:
+ os.remove(kernel_file)
+ if ramdisk_file:
+ os.remove(ramdisk_file)
+ return "ok"
+
+
+if __name__ == '__main__':
+ XenAPIPlugin.dispatch({'copy_vdi': copy_vdi,
+ 'create_kernel_ramdisk': create_kernel_ramdisk,
+ 'remove_kernel_ramdisk': remove_kernel_ramdisk})