def image_to_raw(image_href, path, path_tmp): with fileutils.remove_path_on_error(path_tmp): data = qemu_img_info(path_tmp) fmt = data.file_format if fmt is None: raise exception.ImageUnacceptable( reason=_("'qemu-img info' parsing failed."), image_id=image_href) backing_file = data.backing_file if backing_file is not None: raise exception.ImageUnacceptable(image_id=image_href, reason=_("fmt=%(fmt)s backed by: %(backing_file)s") % {'fmt': fmt, 'backing_file': backing_file}) if fmt != "raw" and CONF.force_raw_images: staged = "%s.converted" % path LOG.debug(_("%(image)s was %(format)s, converting to raw") % {'image': image_href, 'format': fmt}) with fileutils.remove_path_on_error(staged): convert_image(path_tmp, staged, 'raw') os.unlink(path_tmp) data = qemu_img_info(staged) if data.file_format != "raw": raise exception.ImageConvertFailed(image_id=image_href, reason=_("Converted to raw, but format is now %s") % data.file_format) os.rename(staged, path) else: os.rename(path_tmp, path)
def image_to_raw(image_href, path, path_tmp): with fileutils.remove_path_on_error(path_tmp): data = qemu_img_info(path_tmp) fmt = data.file_format if fmt is None: raise exception.ImageUnacceptable( reason=_("'qemu-img info' parsing failed."), image_id=image_href) backing_file = data.backing_file if backing_file is not None: raise exception.ImageUnacceptable(image_id=image_href, reason=_("fmt=%(fmt)s backed by: %(backing_file)s") % {'fmt': fmt, 'backing_file': backing_file}) if fmt != "raw": staged = "%s.converted" % path LOG.debug("%(image)s was %(format)s, converting to raw" % {'image': image_href, 'format': fmt}) with fileutils.remove_path_on_error(staged): convert_image(path_tmp, staged, 'raw') os.unlink(path_tmp) data = qemu_img_info(staged) if data.file_format != "raw": raise exception.ImageConvertFailed(image_id=image_href, reason=_("Converted to raw, but format is now %s") % data.file_format) os.rename(staged, path) else: os.rename(path_tmp, path)
def fetch(context, image_href, path, image_service=None): # TODO(vish): Improve context handling and add owner and auth data # when it is added to glance. Right now there is no # auth checking in glance, so we assume that access was # checked before we got here. if not image_service: image_service = service.Service(version=1, context=context) with fileutils.remove_path_on_error(path): with open(path, "wb") as image_file: image_service.download(image_href, image_file)
def fetch(context, image_href, path, image_service=None): # TODO(vish): Improve context handling and add owner and auth data # when it is added to glance. Right now there is no # auth checking in glance, so we assume that access was # checked before we got here. if not image_service: image_service = service.Service(version=1, context=context) with fileutils.remove_path_on_error(path): with open(path, "wb") as image_file: image_service.download(image_href, image_file)
def fetch(context, image_href, path, force_raw=False): # TODO(vish): Improve context handling and add owner and auth data # when it is added to glance. Right now there is no # auth checking in glance, so we assume that access was # checked before we got here. image_service = service.get_image_service(image_href, context=context) LOG.debug("Using %(image_service)s to download image %(image_href)s." % {'image_service': image_service.__class__, 'image_href': image_href}) with fileutils.remove_path_on_error(path): with open(path, "wb") as image_file: image_service.download(image_href, image_file) if force_raw: image_to_raw(image_href, path, "%s.part" % path)
def fetch(context, image_href, path, image_service=None, force_raw=False): # TODO(vish): Improve context handling and add owner and auth data # when it is added to glance. Right now there is no # auth checking in glance, so we assume that access was # checked before we got here. if not image_service: image_service = service.get_image_service(image_href, context=context) LOG.debug("Using %(image_service)s to download image %(image_href)s." % { 'image_service': image_service.__class__, 'image_href': image_href }) with fileutils.remove_path_on_error(path): with open(path, "wb") as image_file: image_service.download(image_href, image_file) if force_raw: image_to_raw(image_href, path, "%s.part" % path)
def _get_image(ctx, path, uuid, master_path=None, image_service=None): #TODO(ghe): Revise this logic and cdocument process Bug #1199665 # When master_path defined, we save the images in this dir using the iamge # uuid as the file name. Deployments that use this images, creates a hard # link to keep track of this. When the link count of a master image is # equal to 1, can be deleted. #TODO(ghe): have hard links and count links the same behaviour in all fs #TODO(ghe): timeout and retry for downloads def _wait_for_download(): if not os.path.exists(lock_file): raise loopingcall.LoopingCallDone() # If the download of the image needed is in progress (lock file present) # we wait until the locks disappears and create the link. if master_path is None: #NOTE(ghe): We don't share images between instances/hosts images.fetch_to_raw(ctx, uuid, path, image_service) else: master_uuid = os.path.join(master_path, service_utils.parse_image_ref(uuid)[0]) lock_file = os.path.join(master_path, master_uuid + '.lock') _link_master_image(master_uuid, path) if not os.path.exists(path): fileutils.ensure_tree(master_path) if not _download_in_progress(lock_file): with fileutils.remove_path_on_error(lock_file): #TODO(ghe): logging when image cannot be created fd, tmp_path = tempfile.mkstemp(dir=master_path) os.close(fd) images.fetch_to_raw(ctx, uuid, tmp_path, image_service) _create_master_image(tmp_path, master_uuid, path) _remove_download_in_progress_lock(lock_file) else: #TODO(ghe): expiration time timer = loopingcall.FixedIntervalLoopingCall( _wait_for_download) timer.start(interval=1).wait() _link_master_image(master_uuid, path)
def _get_image(ctx, path, uuid, master_path=None, image_service=None): #TODO(ghe): Revise this logic and cdocument process Bug #1199665 # When master_path defined, we save the images in this dir using the iamge # uuid as the file name. Deployments that use this images, creates a hard # link to keep track of this. When the link count of a master image is # equal to 1, can be deleted. #TODO(ghe): have hard links and count links the same behaviour in all fs #TODO(ghe): timeout and retry for downloads def _wait_for_download(): if not os.path.exists(lock_file): raise loopingcall.LoopingCallDone() # If the download of the image needed is in progress (lock file present) # we wait until the locks disappears and create the link. if master_path is None: #NOTE(ghe): We don't share images between instances/hosts images.fetch_to_raw(ctx, uuid, path, image_service) else: master_uuid = os.path.join(master_path, service_utils.parse_image_ref(uuid)[0]) lock_file = os.path.join(master_path, master_uuid + '.lock') _link_master_image(master_uuid, path) if not os.path.exists(path): fileutils.ensure_tree(master_path) if not _download_in_progress(lock_file): with fileutils.remove_path_on_error(lock_file): #TODO(ghe): logging when image cannot be created fd, tmp_path = tempfile.mkstemp(dir=master_path) os.close(fd) images.fetch_to_raw(ctx, uuid, tmp_path, image_service) _create_master_image(tmp_path, master_uuid, path) _remove_download_in_progress_lock(lock_file) else: #TODO(ghe): expiration time timer = loopingcall.FixedIntervalLoopingCall( _wait_for_download) timer.start(interval=1).wait() _link_master_image(master_uuid, path)