def getNext (self): # I don't like this but I also don't see a better way right now for (cb, entry) in self.cbs: action = self.devicetree.findActions(device=entry, type="migrate") if cb.get_active(): if action: # the migrate action has already been scheduled continue newfs = getFormat(entry.format.migrationTarget) if not newfs: log.warning("failed to get new filesystem type (%s)" % entry.format.migrationTarget) continue action = ActionMigrateFormat(entry) self.devicetree.registerAction(action) elif action: self.devicetree.cancelAction(action) return None
def testActionObsoletes(self, *args, **kwargs): """ Verify correct operation of DeviceAction.obsoletes. """ self.destroyAllDevices(disks=["sdc"]) sdc = self.storage.devicetree.getDeviceByName("sdc") self.assertNotEqual(sdc, None) sdc1 = self.newDevice(device_class=PartitionDevice, name="sdc1", parents=[sdc], size=40000) # ActionCreateDevice # # - obsoletes other ActionCreateDevice instances w/ lower id and same # device create_device_1 = ActionCreateDevice(sdc1) create_device_2 = ActionCreateDevice(sdc1) self.assertEqual(create_device_2.obsoletes(create_device_1), True) self.assertEqual(create_device_1.obsoletes(create_device_2), False) # ActionCreateFormat # # - obsoletes other ActionCreateFormat instances w/ lower id and same # device format_1 = self.newFormat("ext3", mountpoint="/home", device=sdc1.path) format_2 = self.newFormat("ext3", mountpoint="/opt", device=sdc1.path) create_format_1 = ActionCreateFormat(sdc1, format_1) create_format_2 = ActionCreateFormat(sdc1, format_2) self.assertEqual(create_format_2.obsoletes(create_format_1), True) self.assertEqual(create_format_1.obsoletes(create_format_2), False) # ActionMigrateFormat # # - obsoletes other ActionMigrateFormat instances w/ lower id and same # device sdc1.format = self.newFormat("ext2", mountpoint="/", device=sdc1.path, device_instance=sdc1, exists=True) migrate_1 = ActionMigrateFormat(sdc1) migrate_2 = ActionMigrateFormat(sdc1) self.assertEqual(migrate_2.obsoletes(migrate_1), True) self.assertEqual(migrate_1.obsoletes(migrate_2), False) # ActionResizeFormat # # - obsoletes other ActionResizeFormat instances w/ lower id and same # device resize_format_1 = ActionResizeFormat(sdc1, sdc1.size - 1000) resize_format_2 = ActionResizeFormat(sdc1, sdc1.size - 5000) self.assertEqual(resize_format_2.obsoletes(resize_format_1), True) self.assertEqual(resize_format_1.obsoletes(resize_format_2), False) # ActionCreateFormat # # - obsoletes migrate, resize format actions w/ lower id on same device new_format = self.newFormat("ext4", mountpoint="/foo", device=sdc1.path) create_format_3 = ActionCreateFormat(sdc1, new_format) self.assertEqual(create_format_3.obsoletes(resize_format_1), True) self.assertEqual(create_format_3.obsoletes(resize_format_2), True) self.assertEqual(create_format_3.obsoletes(migrate_1), True) self.assertEqual(create_format_3.obsoletes(migrate_2), True) # ActionResizeDevice # # - obsoletes other ActionResizeDevice instances w/ lower id and same # device sdc1.exists = True sdc1.format.exists = True resize_device_1 = ActionResizeDevice(sdc1, sdc1.size + 10000) resize_device_2 = ActionResizeDevice(sdc1, sdc1.size - 10000) self.assertEqual(resize_device_2.obsoletes(resize_device_1), True) self.assertEqual(resize_device_1.obsoletes(resize_device_2), False) sdc1.exists = False sdc1.format.exists = False # ActionDestroyFormat # # - obsoletes all format actions w/ lower id on same device (including # self if format does not exist) destroy_format_1 = ActionDestroyFormat(sdc1) self.assertEqual(destroy_format_1.obsoletes(create_format_1), True) self.assertEqual(destroy_format_1.obsoletes(migrate_2), True) self.assertEqual(destroy_format_1.obsoletes(resize_format_1), True) self.assertEqual(destroy_format_1.obsoletes(destroy_format_1), True) # ActionDestroyDevice # # - obsoletes all actions w/ lower id that act on the same non-existent # device (including self) # sdc1 does not exist destroy_sdc1 = ActionDestroyDevice(sdc1) self.assertEqual(destroy_sdc1.obsoletes(create_format_2), True) self.assertEqual(destroy_sdc1.obsoletes(migrate_1), True) self.assertEqual(destroy_sdc1.obsoletes(resize_format_2), True) self.assertEqual(destroy_sdc1.obsoletes(create_device_1), True) self.assertEqual(destroy_sdc1.obsoletes(resize_device_1), True) self.assertEqual(destroy_sdc1.obsoletes(destroy_sdc1), True) # ActionDestroyDevice # # - obsoletes all but ActionDestroyFormat actions w/ lower id on the # same existing device # sda1 exists sda1 = self.storage.devicetree.getDeviceByName("sda1") self.assertNotEqual(sda1, None) resize_sda1_format = ActionResizeFormat(sda1, sda1.size - 50) resize_sda1 = ActionResizeDevice(sda1, sda1.size - 50) destroy_sda1_format = ActionDestroyFormat(sda1) destroy_sda1 = ActionDestroyDevice(sda1) self.assertEqual(destroy_sda1.obsoletes(resize_sda1_format), True) self.assertEqual(destroy_sda1.obsoletes(resize_sda1), True) self.assertEqual(destroy_sda1.obsoletes(destroy_sda1), False) self.assertEqual(destroy_sda1.obsoletes(destroy_sda1_format), False)
def testActionRegistration(self, *args, **kwargs): """ Verify correct operation of action registration and cancelling. """ # self.setUp has just been run, so we should have something like # a preexisting autopart config in the devicetree. # registering a destroy action for a non-leaf device should fail vg = self.storage.devicetree.getDeviceByName("VolGroup") self.assertNotEqual(vg, None) self.assertEqual(vg.isleaf, False) a = storage.deviceaction.ActionDestroyDevice(vg) self.failUnlessRaises(ValueError, self.storage.devicetree.registerAction, a) # registering any action other than create for a device that's not in # the devicetree should fail sdc = self.storage.devicetree.getDeviceByName("sdc") self.assertNotEqual(sdc, None) sdc1 = self.newDevice(device_class=PartitionDevice, name="sdc1", size=100000, parents=[sdc], exists=True) sdc1_format = self.newFormat("ext2", device=sdc1.path, mountpoint="/") create_sdc1_format = ActionCreateFormat(sdc1, sdc1_format) self.failUnlessRaises(storage.errors.DeviceTreeError, self.storage.devicetree.registerAction, create_sdc1_format) sdc1_format.exists = True migrate_sdc1 = ActionMigrateFormat(sdc1) self.failUnlessRaises(storage.errors.DeviceTreeError, self.storage.devicetree.registerAction, migrate_sdc1) migrate_sdc1.cancel() resize_sdc1_format = ActionResizeFormat(sdc1, sdc1.size - 10000) self.failUnlessRaises(storage.errors.DeviceTreeError, self.storage.devicetree.registerAction, resize_sdc1_format) resize_sdc1 = ActionResizeDevice(sdc1, sdc1.size - 10000) self.failUnlessRaises(storage.errors.DeviceTreeError, self.storage.devicetree.registerAction, resize_sdc1) resize_sdc1.cancel() resize_sdc1_format.cancel() destroy_sdc1_format = ActionDestroyFormat(sdc1) self.failUnlessRaises(storage.errors.DeviceTreeError, self.storage.devicetree.registerAction, destroy_sdc1_format) destroy_sdc1 = ActionDestroyDevice(sdc1) self.failUnlessRaises(storage.errors.DeviceTreeError, self.storage.devicetree.registerAction, resize_sdc1) # registering a device destroy action should cause the device to be # removed from the devicetree lv_root = self.storage.devicetree.getDeviceByName("VolGroup-lv_root") self.assertNotEqual(lv_root, None) a = ActionDestroyDevice(lv_root) self.storage.devicetree.registerAction(a) lv_root = self.storage.devicetree.getDeviceByName("VolGroup-lv_root") self.assertEqual(lv_root, None) self.storage.devicetree.cancelAction(a) # registering a device create action should cause the device to be # added to the devicetree sdd = self.storage.devicetree.getDeviceByName("sdd") self.assertNotEqual(sdd, None) sdd1 = self.storage.devicetree.getDeviceByName("sdd1") self.assertEqual(sdd1, None) sdd1 = self.newDevice(device_class=PartitionDevice, name="sdd1", size=100000, parents=[sdd]) a = ActionCreateDevice(sdd1) self.storage.devicetree.registerAction(a) sdd1 = self.storage.devicetree.getDeviceByName("sdd1") self.assertNotEqual(sdd1, None)