def get_image(self, media, **kwargs): """Returns a newly created Image instance.""" info = image_info(media) image = Image(media, self.out, format=info['format'], **kwargs) self._images.append(image) image.enable() return image
def snapshot(self): """Creates a snapshot of the original source media of the Disk instance. """ if self.source == '/': self.out.warn("Snapshotting ignored for host bundling mode.") return self.file # Examine media file info = image_info(self.file) self.out.info("Snapshotting media source ...", False) # Create a qcow2 snapshot for image files that are not raw if info['format'] != 'raw': snapshot = create_snapshot(self.file, self.tmp) self._add_cleanup(os.unlink, snapshot) self.out.success('done') return snapshot # Create a device-mapper snapshot for raw image files and block devices mode = os.stat(self.file).st_mode device = self.file if stat.S_ISBLK(mode) else self._losetup(self.file) size = int(blockdev('--getsz', device)) cowfd, cow = tempfile.mkstemp(dir=self.tmp) os.close(cowfd) self._add_cleanup(os.unlink, cow) # Create cow sparse file dd('if=/dev/null', 'of=%s' % cow, 'bs=512', 'seek=%d' % size) cowdev = self._losetup(cow) snapshot = 'snf-image-creator-snapshot-%s' % uuid.uuid4().hex tablefd, table = tempfile.mkstemp() try: try: os.write(tablefd, "0 %d snapshot %s %s n 8\n" % (size, device, cowdev)) finally: os.close(tablefd) dmsetup('create', snapshot, table) self._add_cleanup(try_fail_repeat, dmsetup, 'remove', snapshot) finally: os.unlink(table) self.out.success('done') return "/dev/mapper/%s" % snapshot