diff options
-rw-r--r-- | iw/partition_gui.py | 35 | ||||
-rw-r--r-- | iw/raid_dialog_gui.py | 294 | ||||
-rw-r--r-- | ui/create-storage.glade | 43 |
3 files changed, 5 insertions, 367 deletions
diff --git a/iw/partition_gui.py b/iw/partition_gui.py index 7ce4df2ea..9496e4eac 100644 --- a/iw/partition_gui.py +++ b/iw/partition_gui.py @@ -1335,18 +1335,11 @@ class PartitionWindow(InstallWindow): and availraidparts > 1): activate_create_raid_dev = True - # FIXME: Why do I need availraidparts to clone? - activate_create_raid_clone = False - if (len(self.storage.partitioned) > 1 - and availraidparts > 0): - activate_create_raid_clone = True - # Must check if all the possibilities are False. In this case tell the # user that he can't create anything and the reasons. if (not activate_create_partition and not activate_create_vg - and not activate_create_raid_dev - and not activate_create_raid_clone): + and not activate_create_raid_dev): self.intf.messageWindow(_("Cannot perform any creation action"), _("Note that the creation action requires one of the " "following:\n\n" @@ -1433,12 +1426,6 @@ class PartitionWindow(InstallWindow): if activate_create_raid_dev: rd_rb.set_sensitive(True) - # Activate RAID clone if needed. - # rc_rb -> RAID clone - rc_rb = create_storage_xml.get_widget("create_storage_rb_raid_clone") - if activate_create_raid_clone: - rc_rb.set_sensitive(True) - # Before drawing lets select the first radio button that is sensitive: # How can I get sensitivity from gtk.radiobutton? if activate_create_partition: @@ -1450,9 +1437,6 @@ class PartitionWindow(InstallWindow): elif activate_create_raid_dev: rd_rb.set_active(True) rd_rb.grab_focus() - elif activate_create_raid_clone: - rc_rb.set_active(True) - rc_rb.grab_focus() gui.addFrame(self.dialog) self.dialog.show_all() @@ -1525,23 +1509,6 @@ class PartitionWindow(InstallWindow): self.editPartition(member, isNew = True, restrictfs=["mdmember"]) return - elif rc_rb.get_active(): - # r_d_g -> raid_dialog_gui - cloneDialog = r_d_g.RaidCloneDialog(self.storage, self.intf, - self.parent) - if cloneDialog is None: - self.intf.messageWindow(_("Couldn't Create Drive Clone Editor"), - _("The drive clone editor could not " - "be created for some reason."), - custom_icon="error") - return - - if cloneDialog.run(): - self.refresh() - - cloneDialog.destroy() - return - elif rd_rb.get_active(): array = self.storage.newMDArray(fmt_type=self.storage.defaultFSType) self.editRaidArray(array, isNew = True) diff --git a/iw/raid_dialog_gui.py b/iw/raid_dialog_gui.py index 9b633d6d8..22558155f 100644 --- a/iw/raid_dialog_gui.py +++ b/iw/raid_dialog_gui.py @@ -613,297 +613,3 @@ class RaidEditor: self.allow_ok_button(path) return 1 -class RaidCloneDialog: - def createDriveList(self, disks): - - store = gtk.ListStore(gobject.TYPE_STRING) - view = gtk.TreeView(store) - - sw = gtk.ScrolledWindow() - sw.add(view) - sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) - sw.set_shadow_type(gtk.SHADOW_IN) - - for disk in disks: - iter = store.append() - store.set_value(iter, 0, disk.name) - - view.set_property("headers-visible", False) - - col = gtk.TreeViewColumn("", gtk.CellRendererText(), text=0) - view.append_column(col) - - return (sw, view) - - def getInterestingRequestsForDrive(self, drive): - disk = self.storage.devicetree.getDeviceByName(drive) - allrequests = self.storage.devicetree.getDependentDevices(disk) - - if not allrequests: - return allrequests - - # remove extended partitions - requests = [] - for req in allrequests: - if req.type == "partition" and req.isExtended: - continue - elif req.type != "partition": - continue - - requests.append(req) - - return requests - - def sanityCheckSourceDrive(self): - # first see if it has any non-software RAID partitions - requests = self.getInterestingRequestsForDrive(self.sourceDrive) - - errmsg1 = _("The source drive has no partitions to be cloned. " - "You must first define partitions of type " - "'software RAID' on this drive before it can be cloned.") - if requests is None or len(requests) == 0: - self.intf.messageWindow(_("Source Drive Error"), errmsg1, - custom_icon="error") - return 1 - - for req in requests: - if req.format.type != "mdmember": - self.intf.messageWindow(_("Source Drive Error"), - _("The source drive you selected has " - "partitions which are not of " - "type 'software RAID'.\n\n" - "You must remove these " - "partitions " - "before this drive can be cloned. "), - custom_icon="error") - return 1 - - sourceDev = self.storage.devicetree.getDeviceByName(self.sourceDrive) - for req in requests: - if not req.req_disks or len(req.req_disks) > 1 or \ - req.req_disks[0] != self.sourceDrive: - self.intf.messageWindow(_("Source Drive Error"), - _("The source drive you selected has " - "partitions which are not " - "constrained to the drive %s.\n\n" - "You must remove these partitions " - "or restrict them to this " - "drive " - "before this drive can be cloned. ") - %(sourceDev.path,), custom_icon="error") - return 1 - - for req in requests: - if req not in self.storage.unusedMDMembers(): - self.intf.messageWindow(_("Source Drive Error"), - _("The source drive you selected has " - "software RAID partition(s) which " - "are members of an active " - "software RAID device.\n\n" - "You must remove these partitions " - "before this drive " - "can be cloned."), custom_icon="error") - return 1 - - return 0 - - def sanityCheckTargetDrives(self): - sourceDev = self.storage.devicetree.getDeviceByName(self.sourceDrive) - if self.targetDrives is None or len(self.targetDrives) < 1: - self.intf.messageWindow(_("Target Drive Error"), - _("Please select the target drives " - "for the clone operation."), custom_icon="error") - return 1 - - if self.sourceDrive in self.targetDrives: - self.intf.messageWindow(_("Target Drive Error"), - _("The source drive %s cannot be " - "selected as a target drive as well.") - % (sourceDev.path,), - custom_icon="error") - return 1 - - for drive in self.targetDrives: - requests = self.getInterestingRequestsForDrive(drive) - if requests is None: - continue - - targetDev = self.storage.devicetree.getDeviceByName(drive) - for req in requests: - rc = self.storage.deviceImmutable(req) - if rc: - self.intf.messageWindow(_("Target Drive Error"), - _("The target drive %(path)s " - "has a partition which cannot " - "be removed for the following " - "reason:\n\n\"%(rc)s\"\n\n" - "You must remove this partition " - "before " - "this drive can be a target.") % - {'path': targetDev.path, 'rc': rc}, - custom_icon="error") - return 1 - - return 0 - - - def cloneDrive(self): - # first create list of interesting partitions on the source drive - requests = self.getInterestingRequestsForDrive(self.sourceDrive) - - # no requests to clone, bail out - if not requests: - return 0 - - # now try to clear the target drives - for devname in self.targetDrives: - device = self.storage.devicetree.getDeviceByName(devname) - doClearPartitionedDevice(self.intf, self.storage, - device, confirm=0, quiet=1) - - # now clone! - for req in requests: - for drive in self.targetDrives: - # this feels really dirty - device = self.storage.devicetree.getDeviceByName(drive) - newdev = copy.deepcopy(req) - newdev.req_disks = [device] - newdev.exists = False - newdev.format.exists = False - newdev.format.device = None - self.storage.createDevice(newdev) - - return - - - def targetSelectFunc(self, model, path, iter): - self.targetDrives.append(model.get_value(iter,0)) - - def run(self): - if self.dialog is None: - return None - - while 1: - rc = self.dialog.run() - - # user hit cancel, do nothing - if rc in [gtk.RESPONSE_CANCEL, gtk.RESPONSE_DELETE_EVENT]: - self.destroy() - return None - - # see what drive they selected as the source - selection = self.sourceView.get_selection() - (model, iter) = selection.get_selected() - if iter is None: - self.intf.messageWindow(_("Error"), - _("Please select a source drive."), - custom_icon="error") - continue - - self.sourceDrive = model.get_value(iter, 0) - - # sanity check it - if self.sanityCheckSourceDrive(): - continue - - # now get target drive(s) - self.targetDrives = [] - selection = self.targetView.get_selection() - selection.selected_foreach(self.targetSelectFunc) - - # sanity check it - if self.sanityCheckTargetDrives(): - continue - - # now give them last chance to bail - msgtxt = _("The drive %s will now be cloned to the " - "following drives:\n\n" % (self.sourceDrive,)) - for drive in self.targetDrives: - msgtxt = msgtxt + "\t" + "%s" % (drive,) - - msgtxt = msgtxt + _("\n\nWARNING! ALL DATA ON THE TARGET DRIVES " - "WILL BE DESTROYED.") - - rc = self.intf.messageWindow(_("Final Warning"), - msgtxt, type="custom", - custom_buttons = ["gtk-cancel", _("Clone Drives")], custom_icon="warning") - if not rc: - return 0 - - # try to clone now - ret = self.cloneDrive() - - if ret: - self.intf.messageWindow(_("Error"), - _("There was an error clearing the " - "target drives. Cloning failed."), - custom_icon="error") - return 0 - - # if everything ok, break out - if not ret: - break - - return 1 - - def destroy(self): - if self.dialog: - self.dialog.destroy() - - self.dialog = None - - def __init__(self, storage, intf, parent): - self.storage = storage - self.intf = intf - self.parent = parent - - self.dialog = None - self.dialog = gtk.Dialog(_("Clone Drive Tool"), self.parent) - self.dialog.set_default_size(500, 200) - gui.addFrame(self.dialog) - self.dialog.add_button('gtk-cancel', gtk.RESPONSE_CANCEL) - self.dialog.add_button('gtk-ok', 1) - self.dialog.set_position(gtk.WIN_POS_CENTER) - - # present list of drives as source - vbox = gtk.VBox() - clnmessage = _("This tool clones the layout from a partitioned source " - "onto other similar sized drives. The source must have " - "partitions which are restricted to that drive and must " - "ONLY contain unused software RAID partitions. " - "EVERYTHING on the target drive(s) will be destroyed.\n") - - lbl = gui.WrappingLabel(clnmessage) - vbox.pack_start(lbl) - - box = gtk.HBox() - - lbl = gtk.Label(_("Source Drive:")) - lbl.set_alignment(0.0, 0.0) - box.pack_start(lbl, padding=5) - (sw, self.sourceView) = self.createDriveList(storage.partitioned) - selection = self.sourceView.get_selection() - selection.set_mode(gtk.SELECTION_SINGLE) - box.pack_start(sw, padding=5) - - lbl = gtk.Label(_("Target Drive(s):")) - lbl.set_alignment(0.0, 0.0) - box.pack_start(lbl, padding=5) - (sw, self.targetView) = self.createDriveList(storage.partitioned) - selection = self.targetView.get_selection() - selection.set_mode(gtk.SELECTION_MULTIPLE) - box.pack_start(sw, padding=5) - - frame = gtk.Frame(_("Drives")) - frame.add(box) - vbox.pack_start(frame) - - # put contents into dialog - self.dialog.vbox.pack_start(vbox) - - self.dialog.show_all() - - return - - - diff --git a/ui/create-storage.glade b/ui/create-storage.glade index b9e246c2e..98db7d796 100644 --- a/ui/create-storage.glade +++ b/ui/create-storage.glade @@ -179,41 +179,6 @@ </packing> </child> <child> - <widget class="GtkVBox" id="vbox5"> - <property name="visible">True</property> - <property name="orientation">vertical</property> - <child> - <widget class="GtkRadioButton" id="create_storage_rb_raid_clone"> - <property name="label" translatable="yes">RAID Clone</property> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="receives_default">False</property> - <property name="draw_indicator">True</property> - <property name="group">create_storage_rb_standard_part</property> - </widget> - <packing> - <property name="position">0</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label7"> - <property name="visible">True</property> - <property name="xalign">0</property> - <property name="xpad">20</property> - <property name="label" translatable="yes"><span size="small" color="gray">Facilitates RAID device creation</span></property> - <property name="use_markup">True</property> - </widget> - <packing> - <property name="position">1</property> - </packing> - </child> - </widget> - <packing> - <property name="position">5</property> - </packing> - </child> - <child> <widget class="GtkHBox" id="hbox3"> <property name="visible">True</property> <child> @@ -245,7 +210,7 @@ </child> </widget> <packing> - <property name="position">6</property> + <property name="position">5</property> </packing> </child> <child> @@ -280,7 +245,7 @@ </child> </widget> <packing> - <property name="position">7</property> + <property name="position">6</property> </packing> </child> <child> @@ -326,7 +291,7 @@ </child> </widget> <packing> - <property name="position">8</property> + <property name="position">7</property> </packing> </child> <child> @@ -361,7 +326,7 @@ </child> </widget> <packing> - <property name="position">9</property> + <property name="position">8</property> </packing> </child> </widget> |