From 1dea34fa1ab15ef2bef9811ef585c8b3bf5c0d22 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Fri, 29 Jun 2012 21:26:42 +0000 Subject: 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 --- .../rpmbuild/SPECS/openstack-xen-plugins.spec | 1 + plugins/xenserver/xenapi/etc/xapi.d/plugins/glance | 86 +------------- plugins/xenserver/xenapi/etc/xapi.d/plugins/kernel | 123 +++++++++++++++++++++ 3 files changed, 125 insertions(+), 85 deletions(-) create mode 100755 plugins/xenserver/xenapi/etc/xapi.d/plugins/kernel (limited to 'plugins') 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}) -- cgit