示例#1
0
 def test_create_instance_non_bootable_volume_fails(self, fake_bdm_meta):
     params = {block_device_mapping.ATTRIBUTE_NAME: self.bdm}
     fake_bdm_meta.side_effect = exception.InvalidBDMVolumeNotBootable(id=1)
     self.assertRaises(exc.HTTPBadRequest,
                       self._test_create,
                       params,
                       no_image=True)
示例#2
0
 def test_create_instance_non_bootable_volume_fails(self, fake_bdm_meta):
     bdm = [{'volume_id': self.volume_id, 'device_name': 'vda'}]
     params = {'block_device_mapping': bdm}
     fake_bdm_meta.side_effect = exception.InvalidBDMVolumeNotBootable(id=1)
     self.assertRaises(exc.HTTPBadRequest,
                       self._test_create,
                       params,
                       no_image=True)
示例#3
0
def get_bdm_image_metadata(context,
                           image_api,
                           volume_api,
                           block_device_mapping,
                           legacy_bdm=True):
    """Attempt to retrive image metadata from a given block_device_mapping.

    If we are booting from a volume, we need to get the volume details from
    Cinder and make sure we pass the metadata back accordingly.

    :param context: request context
    :param image_api: Image API
    :param volume_api: Volume API
    :param block_device_mapping:
    :param legacy_bdm:
    """
    if not block_device_mapping:
        return {}

    for bdm in block_device_mapping:
        if (legacy_bdm
                and get_device_letter(bdm.get('device_name', '')) != 'a'):
            continue
        elif not legacy_bdm and bdm.get('boot_index') != 0:
            continue

        volume_id = bdm.get('volume_id')
        snapshot_id = bdm.get('snapshot_id')
        if snapshot_id:
            # NOTE(alaski): A volume snapshot inherits metadata from the
            # originating volume, but the API does not expose metadata
            # on the snapshot itself.  So we query the volume for it below.
            snapshot = volume_api.get_snapshot(context, snapshot_id)
            volume_id = snapshot['volume_id']

        if bdm.get('image_id'):
            try:
                image_id = bdm['image_id']
                image_meta = image_api.get(context, image_id)
                return image_meta
            except Exception:
                raise exception.InvalidBDMImage(id=image_id)
        elif volume_id:
            try:
                volume = volume_api.get(context, volume_id)
            except exception.CinderConnectionFailed:
                raise
            except Exception:
                raise exception.InvalidBDMVolume(id=volume_id)

            if not volume.get('bootable', True):
                raise exception.InvalidBDMVolumeNotBootable(id=volume_id)

            return get_image_metadata_from_volume(volume)
    return {}