def test_destroy_active_snapshot(self): self.assertEqual( elastio_snap.setup(self.minor, self.device, self.cow_full_path), 0) self.assertEqual(elastio_snap.destroy(self.minor), 0) self.assertFalse(os.path.exists(self.snap_device)) self.assertIsNone(elastio_snap.info(self.minor))
def test_destroy_unverified_incremental(self): util.unmount(self.mount) self.addCleanup(util.mount, self.device, self.mount) self.assertEqual( elastio_snap.reload_incremental(self.minor, self.device, self.cow_reload_path), 0) self.assertEqual(elastio_snap.destroy(self.minor), 0) self.assertFalse(os.path.exists(self.snap_device)) self.assertIsNone(elastio_snap.info(self.minor))
def test_destroy_dormant_snapshot(self): self.assertEqual( elastio_snap.setup(self.minor, self.device, self.cow_full_path), 0) util.unmount(self.mount) self.addCleanup(os.remove, self.cow_full_path) self.addCleanup(util.mount, self.device, self.mount) self.assertEqual(elastio_snap.destroy(self.minor), 0) self.assertFalse(os.path.exists(self.snap_device)) self.assertIsNone(elastio_snap.info(self.minor))
def test_track_writes(self): testfile = "{}/testfile".format(self.mount) self.assertEqual( elastio_snap.setup(self.minor, self.device, self.cow_full_path), 0) self.addCleanup(elastio_snap.destroy, self.minor) os.sync() info = elastio_snap.info(self.minor) start_nr = info["nr_changed_blocks"] self.assertNotEqual(start_nr, 0) with open(testfile, "w") as f: f.write("The quick brown fox") self.addCleanup(os.remove, testfile) os.sync() info = elastio_snap.info(self.minor) end_nr = info["nr_changed_blocks"] self.assertGreater(end_nr, start_nr)
def test_transition_fs_sync_cow_full(self): scratch = "{}/scratch".format(self.mount) falloc = 50 self.assertEqual(elastio_snap.setup(self.minor, self.device, self.cow_full_path, fallocated_space=falloc), 0) self.addCleanup(elastio_snap.destroy, self.minor) util.dd("/dev/zero", scratch, falloc + 10, bs="1M") self.addCleanup(os.remove, scratch) # Possible errors doing this: # * EINVAL: The file system already performed the sync # * EFBIG: The module performed the sync # We want the former to happen, so make the OS sync everything. os.sync() self.assertEqual(elastio_snap.transition_to_incremental(self.minor), errno.EINVAL) snapdev = elastio_snap.info(self.minor) self.assertIsNotNone(snapdev) self.assertEqual(snapdev["error"], -errno.EFBIG) self.assertEqual(snapdev["state"], 3)
def test_transition_mod_sync_cow_full(self): scratch = "{}/scratch".format(self.mount) falloc = 50 self.assertEqual(elastio_snap.setup(self.minor, self.device, self.cow_full_path, fallocated_space=falloc), 0) self.addCleanup(elastio_snap.destroy, self.minor) util.dd("/dev/zero", scratch, falloc + 10, bs="1M") self.addCleanup(os.remove, scratch) # Possible errors doing this: # * EINVAL: The file system already performed the sync # * EFBIG: The module performed the sync # We want the later to happen, so try to transition without calling sync. err = elastio_snap.transition_to_incremental(self.minor) if (err != errno.EFBIG): self.skipTest("Kernel flushed before module") snapdev = elastio_snap.info(self.minor) self.assertIsNotNone(snapdev) self.assertEqual(snapdev["error"], -errno.EFBIG) self.assertEqual(snapdev["state"], 2)
def test_transition_nonexistent_snapshot(self): self.assertIsNone(elastio_snap.info(self.minor)) self.assertEqual(elastio_snap.transition_to_incremental(self.minor), errno.ENOENT)