from image_creator.util import get_command
from image_creator.util import FatalError
+from image_creator.util import try_fail_repeat
from image_creator.gpt import GPTPartitionTable
from image_creator.bundle_volume import BundleVolume
import re
import sys
import guestfs
-import time
from sendfile import sendfile
def __init__(self, source, output):
"""Create a new Disk instance out of a source media. The source
- media can be an image file, a block device or a directory."""
+ media can be an image file, a block device or a directory.
+ """
self._cleanup_jobs = []
self._devices = []
self.source = source
def _losetup(self, fname):
loop = losetup('-f', '--show', fname)
loop = loop.strip() # remove the new-line char
- self._add_cleanup(losetup, '-d', loop)
+ self._add_cleanup(try_fail_repeat, losetup, '-d', loop)
return loop
def _dir_to_disk(self):
if self.source == '/':
bundle = BundleVolume(self.out, self.meta)
- image = bundle.create_image()
- self._add_cleanup(os.unlink, image)
+ image = '/var/tmp/%s.diskdump' % uuid.uuid4().hex
+
+ def check_unlink(path):
+ if os.path.exists(path):
+ os.unlink(path)
+
+ self._add_cleanup(check_unlink, image)
+ bundle.create_image(image)
return self._losetup(image)
raise FatalError("Using a directory as media source is supported")
os.write(tablefd, "0 %d snapshot %s %s n 8" %
(int(size), sourcedev, cowdev))
dmsetup('create', snapshot, table)
- self._add_cleanup(dmsetup, 'remove', snapshot)
- # Sometimes dmsetup remove fails with Device or resource busy,
- # although everything is cleaned up and the snapshot is not
- # used by anyone. Add a 2 seconds delay to be on the safe side.
- self._add_cleanup(time.sleep, 2)
+ self._add_cleanup(try_fail_repeat, dmsetup, 'remove', snapshot)
finally:
os.unlink(table)