def test_create_and_query_volume_two_devs(self): """Verify that btrfs volume creation with two devices and raid (meta)data works""" # two devices, raid1 data succ = BlockDev.btrfs_create_volume([self.loop_dev, self.loop_dev2], "myShinyBtrfs", "raid1", None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 2) wipefs(self.loop_dev) wipefs(self.loop_dev2) # two devices, raid1 metadata succ = BlockDev.btrfs_create_volume([self.loop_dev, self.loop_dev2], "myShinyBtrfs", None, "raid1") self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 2) wipefs(self.loop_dev) wipefs(self.loop_dev2) # two devices, raid1 data and metadata succ = BlockDev.btrfs_create_volume([self.loop_dev, self.loop_dev2], "myShinyBtrfs", "raid1", "raid1") self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 2)
def test_create_too_small(self): """Verify that an attempt to create BTRFS on a too small device fails""" # even one small devices is enough for the fail with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([self.loop_dev, self.loop_dev2], None, None, None)
def test_set_default_subvolume(self): """Verify that setting default subvolume works as expected""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT) self.assertEqual(ret, 5) succ = BlockDev.btrfs_create_subvolume(TEST_MNT, "subvol1") self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, False) self.assertEqual(len(subvols), 1) new_id = next((subvol.id for subvol in subvols), None) self.assertIsNot(new_id, None) succ = BlockDev.btrfs_set_default_subvolume(TEST_MNT, new_id) self.assertTrue(succ) ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT) self.assertEquals(ret, new_id) succ = BlockDev.btrfs_set_default_subvolume(TEST_MNT, 5) self.assertTrue(succ) ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT) self.assertEquals(ret, 5)
def test_repair(self): """Verify that it's possible to repair the btrfs filesystem""" succ = BlockDev.btrfs_create_volume([self.loop_dev], None, None, None) self.assertTrue(succ) succ = BlockDev.btrfs_repair(self.loop_dev) self.assertTrue(succ)
def test_create_and_query_volume_label(self): """Verify that btrfs volume creation with label works""" # one device, with label succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 1)
def test_create_and_query_volume_two_devs(self): """Verify that btrfs volume creation with two devices works""" # two devices, no specific data/metadata layout succ = BlockDev.btrfs_create_volume([self.loop_dev, self.loop_dev2], "myShinyBtrfs", None, None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 2)
def test_resize(self): """Verify that is is possible to resize a btrfs filesystem""" succ = BlockDev.btrfs_create_volume([self.loop_dev], None, None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) succ = BlockDev.btrfs_resize(TEST_MNT, 500 * 1024**2) self.assertTrue(succ)
def test_create_delete_subvolume(self): """Verify that it is possible to create/delete subvolume""" btrfs_version = self._get_btrfs_version() if btrfs_version >= LooseVersion('4.13.2'): self.skipTest('subvolumes list is broken with btrfs-progs v4.13.2') succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, False) self.assertEqual(len(subvols), 0) succ = BlockDev.btrfs_create_subvolume(TEST_MNT, "subvol1", None) self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, False) self.assertEqual(len(subvols), 1) # already there with self.assertRaises(GLib.GError): BlockDev.btrfs_create_subvolume(TEST_MNT, "subvol1", None) succ = BlockDev.btrfs_delete_subvolume(TEST_MNT, "subvol1", None) self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, False) self.assertEqual(len(subvols), 0) # already removed with self.assertRaises(GLib.GError): BlockDev.btrfs_delete_subvolume(TEST_MNT, "subvol1", None) succ = BlockDev.btrfs_create_subvolume(TEST_MNT, "subvol1", None) self.assertTrue(succ) # add it back subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, False) self.assertEqual(len(subvols), 1) # and create another subvolume in it succ = BlockDev.btrfs_create_subvolume(os.path.join(TEST_MNT, "subvol1"), "subvol1.1", None) self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, False) self.assertEqual(len(subvols), 2) # make sure subvolumes are sorted properly (parents before children) seen = set() for subvol in subvols: seen.add(subvol) self.assertTrue(subvol.parent_id == BlockDev.BTRFS_MAIN_VOLUME_ID or any(subvol.parent_id == other.id for other in seen))
def test_filesystem_info(self): """Verify that it is possible to get filesystem info""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) info = BlockDev.btrfs_filesystem_info(TEST_MNT) self.assertEqual(info.label, "myShinyBtrfs") self.assertTrue(info.uuid) self.assertEqual(info.num_devices, 1) self.assertTrue(info.used >= 0)
def test_change_label(self): """Verify that it's possible to change btrfs filesystem's label""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) succ = BlockDev.btrfs_change_label(TEST_MNT, "newLabel") self.assertTrue(succ) info = BlockDev.btrfs_filesystem_info(TEST_MNT) self.assertEqual(info.label, "newLabel")
def test_get_default_subvolume_id(self): """Verify that getting default subvolume ID works as expected""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None) self.assertTrue(succ) # not mounted yet, should fail with self.assertRaisesRegexp(GLib.GError, r".*can't access.*"): ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT) mount(self.loop_dev, TEST_MNT) ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT) self.assertEqual(ret, 5)
def test_get_default_subvolume_id(self): """Verify that getting default subvolume ID works as expected""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None, None) self.assertTrue(succ) # not mounted yet, should fail with six.assertRaisesRegex(self, GLib.GError, r".*(can't|cannot) access.*"): ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT) mount(self.loop_dev, TEST_MNT) ret = BlockDev.btrfs_get_default_subvolume_id(TEST_MNT) self.assertEqual(ret, 5)
def test_list_devices(self): """Verify that it is possible to get info about devices""" succ = BlockDev.btrfs_create_volume([self.loop_dev, self.loop_dev2], "myShinyBtrfs", None, None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 2) self.assertEqual(devs[0].id, 1) self.assertEqual(devs[1].id, 2) self.assertEqual(devs[0].path, self.loop_dev) self.assertEqual(devs[1].path, self.loop_dev2) self.assertTrue(devs[0].size >= 0) self.assertTrue(devs[1].size >= 0) self.assertTrue(devs[0].used >= 0) self.assertTrue(devs[1].used >= 0)
def test_filesystem_info(self): """Verify that it is possible to get filesystem info""" label = "My 'Shiny' Btrfs" succ = BlockDev.btrfs_create_volume([self.loop_dev], label, None, None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) info = BlockDev.btrfs_filesystem_info(TEST_MNT) self.assertTrue(info) self.assertEqual(info.label, label) self.assertTrue(info.uuid) self.assertEqual(info.num_devices, 1) self.assertTrue(info.used >= 0)
def test_list_devices(self): """Verify that it is possible to get info about devices""" succ = BlockDev.btrfs_create_volume([self.loop_dev, self.loop_dev2], "myShinyBtrfs", None, None, None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 2) self.assertEqual(devs[0].id, 1) self.assertEqual(devs[1].id, 2) self.assertEqual(devs[0].path, self.loop_dev) self.assertEqual(devs[1].path, self.loop_dev2) self.assertTrue(devs[0].size >= 0) self.assertTrue(devs[1].size >= 0) self.assertTrue(devs[0].used >= 0) self.assertTrue(devs[1].used >= 0)
def test_list_subvolumes(self): """Verify that it is possible to get info about subvolumes""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, True) self.assertEqual(len(subvols), 0) succ = BlockDev.btrfs_create_subvolume(TEST_MNT, "subvol1", None) self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, False) self.assertEqual(len(subvols), 1) self.assertEqual(subvols[0].parent_id, 5) self.assertEqual(subvols[0].path, "subvol1")
def test_list_subvolumes(self): """Verify that it is possible to get info about subvolumes""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, True) self.assertEqual(len(subvols), 0) succ = BlockDev.btrfs_create_subvolume(TEST_MNT, "subvol1") self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, False) self.assertEqual(len(subvols), 1) self.assertEqual(subvols[0].parent_id, 5) self.assertEqual(subvols[0].path, "subvol1")
def test_add_remove_device(self): """Verify that it is possible to add/remove device to a btrfs volume""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None, None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 1) mount(self.loop_dev, TEST_MNT) succ = BlockDev.btrfs_add_device(TEST_MNT, self.loop_dev2, None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 2) succ = BlockDev.btrfs_remove_device(TEST_MNT, self.loop_dev2, None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 1)
def test_create_snapshot(self): succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, True) self.assertEqual(len(subvols), 0) # R/W snapshot succ = BlockDev.btrfs_create_snapshot(TEST_MNT, TEST_MNT + "/snap1", False, None) self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, True) self.assertEqual(len(subvols), 1) # RO snapshot succ = BlockDev.btrfs_create_snapshot(TEST_MNT, TEST_MNT + "/snap2", True, None) self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, True) self.assertEqual(len(subvols), 2)
def test_add_remove_device(self): """Verify that it is possible to add/remove device to a btrfs volume""" succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 1) mount(self.loop_dev, TEST_MNT) succ = BlockDev.btrfs_add_device(TEST_MNT, self.loop_dev2) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 2) succ = BlockDev.btrfs_remove_device(TEST_MNT, self.loop_dev2) self.assertTrue(succ) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 1)
def test_create_snapshot(self): succ = BlockDev.btrfs_create_volume([self.loop_dev], "myShinyBtrfs", None, None) self.assertTrue(succ) mount(self.loop_dev, TEST_MNT) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, True) self.assertEqual(len(subvols), 0) # R/W snapshot succ = BlockDev.btrfs_create_snapshot(TEST_MNT, TEST_MNT + "/snap1", False) self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, True) self.assertEqual(len(subvols), 1) # RO snapshot succ = BlockDev.btrfs_create_snapshot(TEST_MNT, TEST_MNT + "/snap2", True) self.assertTrue(succ) subvols = BlockDev.btrfs_list_subvolumes(TEST_MNT, True) self.assertEqual(len(subvols), 2)
def test_create_and_query_volume(self): """Verify that btrfs volume creation and querying works""" with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([], None, None, None) with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume(["/non/existing/device"], None, None, None) with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([self.loop_dev], None, "RaID7", None) with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([self.loop_dev], None, None, "RaID7") # one device, no label succ = BlockDev.btrfs_create_volume([self.loop_dev], None, None, None) self.assertTrue(succ) # already created with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([self.loop_dev], None, None, None) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 1)
def test_create_just_enough(self): """Verify that creating BTRFS on a just big enough devices works""" succ = BlockDev.btrfs_create_volume([self.loop_dev, self.loop_dev2], None, None, None) self.assertTrue(succ)
def test_create_and_query_volume(self): """Verify that btrfs volume creation and querying works""" with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([], None, None, None, None) with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume(["/non/existing/device"], None, None, None, None) with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([self.loop_dev], None, "RaID7", None, None) with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([self.loop_dev], None, None, "RaID7", None) # one device, no label succ = BlockDev.btrfs_create_volume([self.loop_dev], None, None, None, None) self.assertTrue(succ) # already created with self.assertRaises(GLib.GError): BlockDev.btrfs_create_volume([self.loop_dev], None, None, None, None) devs = BlockDev.btrfs_list_devices(self.loop_dev) self.assertEqual(len(devs), 1)