summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/tests/glance/stubs.py12
-rw-r--r--nova/virt/xenapi/vm_utils.py68
-rw-r--r--nova/virt/xenapi/vmops.py9
-rw-r--r--plugins/xenserver/xenapi/etc/xapi.d/plugins/glance3
4 files changed, 49 insertions, 43 deletions
diff --git a/nova/tests/glance/stubs.py b/nova/tests/glance/stubs.py
index c58357962..1a5fb7ffb 100644
--- a/nova/tests/glance/stubs.py
+++ b/nova/tests/glance/stubs.py
@@ -28,16 +28,16 @@ def stubout_glance_client(stubs, cls):
class FakeGlance(object):
IMAGE_FIXTURES = {
1: {'image_meta': {'name': 'fakemachine', 'size': 0,
- 'properties': {}},
+ 'type': 'machine'},
'image_data': StringIO.StringIO('')},
2: {'image_meta': {'name': 'fakekernel', 'size': 0,
- 'properties': {}},
+ 'type': 'kernel'},
'image_data': StringIO.StringIO('')},
- 3: {'image_meta': {'name': 'fakekernel', 'size': 0,
- 'properties': {}},
+ 3: {'image_meta': {'name': 'fakeramdisk', 'size': 0,
+ 'type': 'ramdisk'},
'image_data': StringIO.StringIO('')},
- 4: {'image_meta': {'name': 'fakekernel', 'size': 0,
- 'properties': {'disk_format': 'vhd'}},
+ 4: {'image_meta': {'name': 'fakevhd', 'size': 0,
+ 'type': 'vhd'},
'image_data': StringIO.StringIO('')},
}
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index 33945aca3..278e52211 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -413,47 +413,51 @@ class VMHelper(HelperBase):
within an image. To figure out which type we're dealing with, we use
the following rules:
- 1. If the instance is specifying a kernel explicitly, we must be using
- a 'disk' image (kernel outside of the image)
+ 1. If we're using Glance, we can use the image_type field to
+ determine the image_type
- 2. If the kernel isn't specified, then we have two different
- scenarios:
-
- a) If the image is in Glance, then we can use the 'disk_format'
- property to determine if the image is really a VHD-style image
- or if it's a RAW image
-
- b) If the image is not in Glance, then it must be a RAW image
- (since we don't have a way of identifying VHD images...yet)
+ 2. If we're not using Glance, then we need to deduce this based on
+ whether a kernel_id is specified.
"""
- def log_disk_format(disk_format):
- disk_format = disk_format.upper()
+ def log_disk_format(image_type):
+ pretty_format = {ImageType.KERNEL_RAMDISK: 'KERNEL_RAMDISK',
+ ImageType.DISK: 'DISK',
+ ImageType.DISK_RAW: 'DISK_RAW',
+ ImageType.DISK_VHD: 'DISK_VHD'}
+ disk_format = pretty_format[image_type]
image_id = instance.image_id
instance_id = instance.id
LOG.debug(_("Detected %(disk_format)s format for image "
"%(image_id)s, instance %(instance_id)s") % locals())
- if instance.kernel_id:
- # 1. DISK
- log_disk_format('disk')
- return ImageType.DISK
- elif FLAGS.xenapi_image_service == 'glance':
- # if using glance, then we could be VHD format
+ def determine_from_glance():
+ glance_type2nova_type = {'machine': ImageType.DISK,
+ 'raw': ImageType.DISK_RAW,
+ 'vhd': ImageType.DISK_VHD,
+ 'kernel': ImageType.KERNEL_RAMDISK,
+ 'ramdisk': ImageType.KERNEL_RAMDISK}
client = glance.client.Client(FLAGS.glance_host, FLAGS.glance_port)
meta = client.get_image_meta(instance.image_id)
- properties = meta['properties']
- disk_format = properties.get('disk_format', None)
- # TODO(sirp): When Glance treats disk_format as a first class
- # attribute, we should start using that rather than an
- # image-property
- if disk_format == 'vhd':
- # 2a. DISK_VHD
- log_disk_format('disk_vhd')
- return ImageType.DISK_VHD
-
- # 2b. DISK_RAW
- log_disk_format('disk_raw')
- return ImageType.DISK_RAW
+ type_ = meta['type']
+ try:
+ return glance_type2nova_type[type_]
+ except KeyError:
+ raise exception.NotFound(
+ _("Unrecognized image type '%(type_)s'") % locals())
+
+ def determine_from_instance():
+ if instance.kernel_id:
+ return ImageType.DISK
+ else:
+ return ImageType.DISK_RAW
+
+ if FLAGS.xenapi_image_service == 'glance':
+ image_type = determine_from_glance()
+ else:
+ image_type = determine_from_instance()
+
+ log_disk_format(image_type)
+ return image_type
@classmethod
def _fetch_image_glance(cls, session, instance_id, image, access, type):
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index 943d74da3..961d589d5 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -224,7 +224,8 @@ class VMOps(object):
VMHelper.upload_image(
self._session, instance.id, template_vdi_uuids, image_id)
finally:
- self._destroy(instance, template_vm_ref, shutdown=False)
+ self._destroy(instance, template_vm_ref, shutdown=False,
+ destroy_kernel_ramdisk=False)
logging.debug(_("Finished snapshot and upload for VM %s"), instance)
@@ -368,7 +369,8 @@ class VMOps(object):
vm = VMHelper.lookup(self._session, instance.name)
return self._destroy(instance, vm, shutdown=True)
- def _destroy(self, instance, vm, shutdown=True):
+ def _destroy(self, instance, vm, shutdown=True,
+ destroy_kernel_ramdisk=True):
"""
Destroys VM instance by performing:
@@ -385,7 +387,8 @@ class VMOps(object):
self._shutdown(instance, vm)
self._destroy_vdis(instance, vm)
- self._destroy_kernel_ramdisk(instance, vm)
+ if destroy_kernel_ramdisk:
+ self._destroy_kernel_ramdisk(instance, vm)
self._destroy_vm(instance, vm)
def _wait_with_callback(self, instance_id, task, callback):
diff --git a/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance b/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
index c3f793ddd..a91f8a7c1 100644
--- a/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
+++ b/plugins/xenserver/xenapi/etc/xapi.d/plugins/glance
@@ -211,8 +211,7 @@ def _upload_tarball(staging_path, image_id, glance_host, glance_port):
headers = {
'x-image-meta-store': 'file',
'x-image-meta-is_public': 'True',
- 'x-image-meta-type': 'raw',
- 'x-image-meta-property-disk-format': 'vhd',
+ 'x-image-meta-type': 'vhd',
'x-image-meta-property-kernel-id': 'nokernel',
'x-image-meta-property-ramdisk-id': 'noramdisk',
'x-image-meta-property-container-format': 'tarball',