Bump version to 0.2.1
[snf-image-creator] / image_creator / bundle_volume.py
index e86d613..c099daa 100644 (file)
@@ -42,6 +42,7 @@ from image_creator.rsync import Rsync
 from image_creator.util import get_command
 from image_creator.util import FatalError
 from image_creator.util import try_fail_repeat
+from image_creator.util import free_space
 
 findfs = get_command('findfs')
 dd = get_command('dd')
@@ -67,10 +68,11 @@ MKFS_OPTS = {'ext2': ['-F'],
 class BundleVolume(object):
     """This class can be used to create an image out of the running system"""
 
-    def __init__(self, out, meta):
+    def __init__(self, out, meta, tmp=None):
         """Create an instance of the BundleVolume class."""
         self.out = out
         self.meta = meta
+        self.tmp = tmp
 
         self.out.output('Searching for root device ...', False)
         root = self._get_root_partition()
@@ -211,7 +213,7 @@ class BundleVolume(object):
 
             # Add 10% just to be on the safe side
             part_end = last.start + (new_size * 11) // 10
-            # Alighn to 2048
+            # Align to 2048
             part_end = ((part_end + 2047) // 2048) * 2048
 
             image_disk.setPartitionGeometry(
@@ -279,6 +281,8 @@ class BundleVolume(object):
 
     def _to_exclude(self):
         excluded = ['/tmp', '/var/tmp']
+        if self.tmp is not None:
+            excluded.append(self.tmp)
         local_filesystems = MKFS_OPTS.keys() + ['rootfs']
         for entry in self._read_fstable('/proc/mounts'):
             if entry.fs in local_filesystems:
@@ -385,7 +389,7 @@ class BundleVolume(object):
                     rsync.exclude(excl)
 
                 rsync.archive().hard_links().xattrs().sparse().acls()
-                rsync.run('/', target, 'host', 'tmp image')
+                rsync.run('/', target, 'host', 'temporary image')
 
                 # We need to replace the old UUID referencies with the new
                 # ones in grub configuration files and /etc/fstab for file
@@ -418,28 +422,25 @@ class BundleVolume(object):
 
         end_sector = self._shrink_partitions(image)
 
-        # Check if the available space is enough to host the image
-        dirname = os.path.dirname(image)
         size = (end_sector + 1) * self.disk.device.sectorSize
-        self.out.output("Examining available space in %s ..." % dirname, False)
-        stat = os.statvfs(dirname)
-        available = stat.f_bavail * stat.f_frsize
-        if available <= size:
-            raise FatalError('Not enough space in %s to host the image' %
-                             dirname)
-        self.out.success("sufficient")
 
-        self._create_filesystems(image)
-
-        # Truncate image to the new size. I counldn't find a better way to do
-        # this. It seems that python's high level functions work in a different
-        # way.
+        # Truncate image to the new size.
         fd = os.open(image, os.O_RDWR)
         try:
             os.ftruncate(fd, size)
         finally:
             os.close(fd)
 
+        # Check if the available space is enough to host the image
+        dirname = os.path.dirname(image)
+        self.out.output("Examining available space ...", False)
+        if free_space(dirname) <= size:
+            raise FatalError('Not enough space under %s to host the image' %
+                             dirname)
+        self.out.success("sufficient")
+
+        self._create_filesystems(image)
+
         return image
 
 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :