Index: n/nova/virt/libvirt/driver.py =================================================================== --- n.orig/nova/virt/libvirt/driver.py +++ n/nova/virt/libvirt/driver.py @@ -2343,7 +2343,8 @@ class LibvirtDriver(driver.ComputeDriver disk_mapping, suffix='', disk_images=None, network_info=None, block_device_info=None, files=None, - admin_pass=None, inject_files=True): + admin_pass=None, inject_files=True, + fallback_from_host=None): if not suffix: suffix = '' @@ -2413,14 +2414,31 @@ class LibvirtDriver(driver.ComputeDriver if size == 0 or suffix == '.rescue': size = None - - image('disk').cache(fetch_func=libvirt_utils.fetch_image, - context=context, - filename=root_fname, - size=size, - image_id=disk_images['image_id'], - user_id=instance['user_id'], - project_id=instance['project_id']) + try: + image('disk').cache(fetch_func=libvirt_utils.fetch_image, + context=context, + filename=root_fname, + size=size, + image_id=disk_images['image_id'], + user_id=instance['user_id'], + project_id=instance['project_id']) + except exception.ImageNotFound: + if not fallback_from_host: + raise + LOG.debug("Image %(image_id)s doesn't exist anymore " + "on image service, attempting to copy %(root_fname)%" + "image from %(host)s", + dict(image_id=instance['image_ref'], + root_fname=root_fname, + host=fallback_from_host)) + + def copy_from_host(target, max_size): + libvirt_utils.copy_image(src=target, + dest=target, + host=fallback_from_host, + receive=True) + image('disk').cache(fetch_func=copy_from_host, + filename=root_fname) # Lookup the filesystem type if required os_type_with_default = disk.get_fs_type_for_os_type( @@ -4641,7 +4659,8 @@ class LibvirtDriver(driver.ComputeDriver self._create_image(context, instance, disk_mapping=disk_info['mapping'], network_info=network_info, - block_device_info=None, inject_files=False) + block_device_info=None, inject_files=False, + fallback_from_host=instance.host) xml = self.to_xml(context, instance, network_info, disk_info, block_device_info=block_device_info, write_to_disk=True) Index: n/nova/tests/virt/libvirt/test_libvirt.py =================================================================== --- n.orig/nova/tests/virt/libvirt/test_libvirt.py +++ n/nova/tests/virt/libvirt/test_libvirt.py @@ -7146,7 +7146,8 @@ class LibvirtDriverTestCase(test.TestCas def fake_create_image(context, inst, disk_mapping, suffix='', disk_images=None, network_info=None, - block_device_info=None, inject_files=True): + block_device_info=None, inject_files=True, + fallback_from_host=None): self.assertFalse(inject_files) def fake_create_domain(xml, instance=None, power_on=True):