diff options
| author | Rick Harris <rick.harris@rackspace.com> | 2011-02-28 17:40:14 +0000 |
|---|---|---|
| committer | Tarmac <> | 2011-02-28 17:40:14 +0000 |
| commit | 4aa2ffe87744d3653c741d4d3e019114e3e9e5bf (patch) | |
| tree | 211ee849cddca17f4eebf0bf1ee151b4b0bbd1cc /nova/api | |
| parent | edf5da85648659b1a7ad105248d69ef9f8c977e4 (diff) | |
| parent | d6215666fa28a1dd7368aa32bc1ae9f3ca872fab (diff) | |
| download | nova-4aa2ffe87744d3653c741d4d3e019114e3e9e5bf.tar.gz nova-4aa2ffe87744d3653c741d4d3e019114e3e9e5bf.tar.xz nova-4aa2ffe87744d3653c741d4d3e019114e3e9e5bf.zip | |
Adds VHD build support for XenServer driver.
* Adds new ImageType DISK_VHD
* Adds determine_disk_image_type which uses Glance `type` to figure out whether an image is a VHD or not
* Adds code to Glance XenServer plugin to handle downloading a VHD and depositing it into the Storage Repository
* Modifies the remove_kernel_ramdisk code to account for RAW and VHD images
* Adds to unit tests for determine_disk_image_type and basic test for spawning a VHD image
Notes:
Currently Nova'a Compute-API makes use of FLAGS.null_kernel ('nokernel') to determine whether an image is "RAW/VHD"-ish. I've left that requirement in for now; however, I plan on adding a bug to make that optional.
Requires Glance patch https://code.launchpad.net/~rconradharris/glance/bug720459/+merge/50098
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/ec2/cloud.py | 1 | ||||
| -rw-r--r-- | nova/api/openstack/servers.py | 56 |
2 files changed, 36 insertions, 21 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py index 7458d307a..844ccbe5e 100644 --- a/nova/api/ec2/cloud.py +++ b/nova/api/ec2/cloud.py @@ -890,7 +890,6 @@ class CloudController(object): raise exception.ApiError(_('attribute not supported: %s') % attribute) try: - image = self.image_service.show(context, image_id) image = self._format_image(context, self.image_service.show(context, image_id)) diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 73c7bfe17..f7ad0b8ae 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -50,7 +50,8 @@ def _translate_detail_keys(inst): power_state.PAUSED: 'paused', power_state.SHUTDOWN: 'active', power_state.SHUTOFF: 'active', - power_state.CRASHED: 'error'} + power_state.CRASHED: 'error', + power_state.FAILED: 'error'} inst_dict = {} mapped_keys = dict(status='state', imageId='image_id', @@ -135,25 +136,6 @@ class Controller(wsgi.Controller): return faults.Fault(exc.HTTPNotFound()) return exc.HTTPAccepted() - def _get_kernel_ramdisk_from_image(self, req, image_id): - """ - Machine images are associated with Kernels and Ramdisk images via - metadata stored in Glance as 'image_properties' - """ - def lookup(param): - _image_id = image_id - try: - return image['properties'][param] - except KeyError: - LOG.debug( - _("%(param)s property not found for image %(_image_id)s") % - locals()) - return None - - image_id = str(image_id) - image = self._image_service.show(req.environ['nova.context'], image_id) - return lookup('kernel_id'), lookup('ramdisk_id') - def create(self, req): """ Creates a new server for a given user """ env = self._deserialize(req.body, req) @@ -377,3 +359,37 @@ class Controller(wsgi.Controller): action=item.action, error=item.error)) return dict(actions=actions) + + def _get_kernel_ramdisk_from_image(self, req, image_id): + """Retrevies kernel and ramdisk IDs from Glance + + Only 'machine' (ami) type use kernel and ramdisk outside of the + image. + """ + # FIXME(sirp): Since we're retrieving the kernel_id from an + # image_property, this means only Glance is supported. + # The BaseImageService needs to expose a consistent way of accessing + # kernel_id and ramdisk_id + image = self._image_service.show(req.environ['nova.context'], image_id) + + if image['status'] != 'active': + raise exception.Invalid( + _("Cannot build from image %(image_id)s, status not active") % + locals()) + + if image['type'] != 'machine': + return None, None + + try: + kernel_id = image['properties']['kernel_id'] + except KeyError: + raise exception.NotFound( + _("Kernel not found for image %(image_id)s") % locals()) + + try: + ramdisk_id = image['properties']['ramdisk_id'] + except KeyError: + raise exception.NotFound( + _("Ramdisk not found for image %(image_id)s") % locals()) + + return kernel_id, ramdisk_id |
