summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Harris <rick.harris@rackspace.com>2011-02-15 01:37:54 +0000
committerRick Harris <rick.harris@rackspace.com>2011-02-15 01:37:54 +0000
commitfe6efb38ee30c5a3e532cd19faef0fec063b7446 (patch)
treeb48ccd5f45da5f0b4b4e8b1b6fa1730251bba1dc
parent238ae2b5a8c559acc362a3b44160404771f1259f (diff)
downloadnova-fe6efb38ee30c5a3e532cd19faef0fec063b7446.tar.gz
nova-fe6efb38ee30c5a3e532cd19faef0fec063b7446.tar.xz
nova-fe6efb38ee30c5a3e532cd19faef0fec063b7446.zip
Adding DISK_VHD to ImageTypes
-rw-r--r--nova/virt/xenapi/vm_utils.py38
-rw-r--r--nova/virt/xenapi/vmops.py22
2 files changed, 45 insertions, 15 deletions
diff --git a/nova/virt/xenapi/vm_utils.py b/nova/virt/xenapi/vm_utils.py
index 6d6067da5..a6312d00c 100644
--- a/nova/virt/xenapi/vm_utils.py
+++ b/nova/virt/xenapi/vm_utils.py
@@ -63,11 +63,14 @@ class ImageType:
0 - kernel/ramdisk image (goes on dom0's filesystem)
1 - disk image (local SR, partitioned by objectstore plugin)
2 - raw disk image (local SR, NOT partitioned by plugin)
+ 3 - vhd disk image (local SR, NOT inspected by XS, PV assumed for
+ linux, HVM assumed for Windows)
"""
KERNEL_RAMDISK = 0
DISK = 1
DISK_RAW = 2
+ DISK_VHD = 3
class VMHelper(HelperBase):
@@ -368,15 +371,34 @@ class VMHelper(HelperBase):
return session.get_xenapi().VDI.get_uuid(vdi)
@classmethod
- def _fetch_image_glance(cls, session, instance_id, image, access, type):
- client = glance.client.Client(FLAGS.glance_host, FLAGS.glance_port)
- meta = client.get_image_meta(image)
- properties = meta['properties']
- disk_format = properties.get('disk_format', None)
+ def determine_disk_image_type(cls, instance):
+ instance_id = instance.id
+ if instance.kernel_id:
+ #if kernel is not present we must download a raw disk
+ LOG.debug(_("Instance %(instance_id)s will use DISK format") %
+ locals())
+ return ImageType.DISK
- # 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':
+ if FLAGS.xenapi_image_service == 'glance':
+ # if using glance, then we could be VHD format
+ 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':
+ LOG.debug(_("Instance %(instance_id)s will use DISK_VHD format") %
+ locals())
+ return ImageType.DISK_VHD
+
+ LOG.debug(_("Instance %(instance_id)s will use DISK_RAW format") %
+ locals())
+ return ImageType.DISK_RAW
+
+ @classmethod
+ def _fetch_image_glance(cls, session, instance_id, image, access, type):
+ if type == ImageType.DISK_VHD:
return cls._fetch_image_glance_vhd(
session, instance_id, image, access, type)
else:
diff --git a/nova/virt/xenapi/vmops.py b/nova/virt/xenapi/vmops.py
index e84ce20c4..34ceea358 100644
--- a/nova/virt/xenapi/vmops.py
+++ b/nova/virt/xenapi/vmops.py
@@ -74,27 +74,34 @@ class VMOps(object):
user = AuthManager().get_user(instance.user_id)
project = AuthManager().get_project(instance.project_id)
- #if kernel is not present we must download a raw disk
- if instance.kernel_id:
- disk_image_type = ImageType.DISK
- else:
- disk_image_type = ImageType.DISK_RAW
+
+ disk_image_type = VMHelper.determine_disk_image_type(instance)
+
vdi_uuid = VMHelper.fetch_image(self._session, instance.id,
instance.image_id, user, project, disk_image_type)
+
vdi_ref = self._session.call_xenapi('VDI.get_by_uuid', vdi_uuid)
- #Have a look at the VDI and see if it has a PV kernel
+
pv_kernel = False
- if not instance.kernel_id:
+ if disk_image_type == ImageType.DISK_RAW:
+ #Have a look at the VDI and see if it has a PV kernel
pv_kernel = VMHelper.lookup_image(self._session, instance.id,
vdi_ref)
+ elif disk_image_type == ImageType.DISK_VHD:
+ # TODO(sirp): Assuming PV for now; this will need to be
+ # configurable as Windows will use HVM.
+ pv_kernel = True
+
kernel = None
if instance.kernel_id:
kernel = VMHelper.fetch_image(self._session, instance.id,
instance.kernel_id, user, project, ImageType.KERNEL_RAMDISK)
+
ramdisk = None
if instance.ramdisk_id:
ramdisk = VMHelper.fetch_image(self._session, instance.id,
instance.ramdisk_id, user, project, ImageType.KERNEL_RAMDISK)
+
vm_ref = VMHelper.create_vm(self._session,
instance, kernel, ramdisk, pv_kernel)
VMHelper.create_vbd(self._session, vm_ref, vdi_ref, 0, True)
@@ -102,6 +109,7 @@ class VMOps(object):
if network_ref:
VMHelper.create_vif(self._session, vm_ref,
network_ref, instance.mac_address)
+
LOG.debug(_('Starting VM %s...'), vm_ref)
self._session.call_xenapi('VM.start', vm_ref, False, False)
instance_name = instance.name