[PATCH 3/5] Fix up device dialogs' handling of preexisting formatting.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Fixes display of original fstype, original fslabel. Also fixes
handling for when users initially specify that a device be re-
formatted, then later change it back to use what's already there.
---
 iw/lvm_dialog_gui.py           |  105 +++++++++++++++++++++++++++++----------
 iw/partition_dialog_gui.py     |   58 +++++++++++++++++-----
 iw/partition_ui_helpers_gui.py |    2 +
 iw/raid_dialog_gui.py          |   52 ++++++++++++++++----
 4 files changed, 169 insertions(+), 48 deletions(-)

diff --git a/iw/lvm_dialog_gui.py b/iw/lvm_dialog_gui.py
index 7a98d99..6ea54ab 100644
--- a/iw/lvm_dialog_gui.py
+++ b/iw/lvm_dialog_gui.py
@@ -46,11 +46,12 @@ class VolumeGroupEditor:
         vg = LVMVolumeGroupDevice('tmp-%s' % self.vg.name,
                                   parents=pvs, peSize=self.peSize)
         for lv in self.lvs.values():
-            LVMLogicalVolumeDevice(lv['name'], vg, format=lv['format'],
+            _l = LVMLogicalVolumeDevice(lv['name'], vg, format=lv['format'],
                                    size=lv['size'], exists=lv['exists'],
                                    stripes=lv['stripes'],
                                    logSize=lv['logSize'],
                                    snapshotSpace=lv['snapshotSpace'])
+            _l.originalFormat = lv['originalFormat']
 
         return vg
 
@@ -405,23 +406,31 @@ class VolumeGroupEditor:
         # appear.  Note that if the format is swap or Raiddevice, the mount
         # point is none-sense.
         templuks = None
-        usedev = None
-        for _lv in tempvg.lvs:
-            if _lv.lvname == lv['name']:
-                templv = _lv
-                usedev = templv
-                if templv.format.type == "luks":
-                    templuks = LUKSDevice("luks-%s" % lv['name'],
-                                          parents=[templv],
-                                          format=self.luks[lv['name']],
-                                          exists=templv.format.exists)
-                    usedev = templuks
-                break
+        templv = self.getLVByName(lv['name'], vg=tempvg)
+        usedev = templv
+        if templv.format.type == "luks":
+            templuks = LUKSDevice("luks-%s" % lv['name'],
+                                  parents=[templv],
+                                  format=self.luks[lv['name']],
+                                  exists=templv.format.exists)
+            usedev = templuks
 
         if lv['format'].type == "luks":
             format = self.luks[lv['name']]
         else:
             format = lv['format']
+
+        if lv['exists']:
+            _origlv = self.getLVByName(lv['name'])
+            originalFormat = _origlv.originalFormat
+            if originalFormat.type == "luks":
+                try:
+                    _origluks = self.storage.devicetree.getChildren(_origlv)[0]
+                except IndexError:
+                    pass
+                else:
+                    originalFormat = _origluks.originalFormat
+
         mountCombo = createMountPointCombo(usedev, excludeMountPoints=["/boot"])
 
 
@@ -467,16 +476,13 @@ class VolumeGroupEditor:
         else:
             # File system type lable & combo
             newfstypelabel = createAlignedLabel(_("Original File System Type:"))
-            if format.type:
-                newfstypeCombo = gtk.Label(format.name)
-            else:
-                newfstypeCombo = gtk.Label(_("Unknown"))
+            newfstypeCombo = gtk.Label(originalFormat.name)
 
             # File system label label & combo
-            if getattr(format, "label", None):
+            if getattr(originalFormat, "label", None):
                 newfslabellabel = createAlignedLabel(_("Original File System "
                                                       "Label:"))
-                newfslableCombo = gtk.Label(format.label)
+                newfslableCombo = gtk.Label(originalFormat.label)
 
             # Logical Volume name label & entry
             lvnamelabel = createAlignedLabel(_("Logical Volume Name:"))
@@ -737,7 +743,12 @@ class VolumeGroupEditor:
                         format = templv.format
 
                     templv.format = format
-                elif format.mountable:
+                elif self.fsoptionsDict.has_key("formatcb") and \
+                     not self.fsoptionsDict["formatcb"].get_active():
+                    templv.format = templv.originalFormat
+                    format = templv.format
+
+                if format.mountable:
                     format.mountpoint = mountpoint
 
                 if self.fsoptionsDict.has_key("migratecb") and \
@@ -770,6 +781,7 @@ class VolumeGroupEditor:
         self.lvs[templv.lvname] = {'name': templv.lvname,
                                    'size': templv.size,
                                    'format': templv.format,
+                                   'originalFormat': templv.originalFormat,
                                    'stripes': templv.stripes,
                                    'logSize': templv.logSize,
                                    'snapshotSpace': templv.snapshotSpace,
@@ -817,9 +829,11 @@ class VolumeGroupEditor:
 
         tempvg = self.getTempVG()
         name = self.storage.createSuggestedLVName(tempvg)
+        format = getFormat(self.storage.defaultFSType)
         self.lvs[name] = {'name': name,
                           'size': free,
-                          'format': getFormat(self.storage.defaultFSType),
+                          'format': format,
+                          'originalFormat': format,
                           'stripes': 1,
                           'logSize': 0,
                           'snapshotSpace': 0,
@@ -1073,12 +1087,7 @@ class VolumeGroupEditor:
                 log.debug("lv %s already exists" % lv.lvname)
                 # this lv is preexisting. check for resize and reformat.
                 # first, get the real/original lv
-                origlv = None
-                for _lv in self.vg.lvs:
-                    if _lv.lvname == lv.lvname:
-                        origlv = _lv
-                        break
-
+                origlv = self.getLVByName(lv.lvname)
                 if lv.resizable and lv.targetSize != origlv.size:
                     actions.append(ActionResizeDevice(origlv, lv.targetSize))
 
@@ -1100,6 +1109,39 @@ class VolumeGroupEditor:
                         usedev = origlv
                         format = lv.format
 
+                    # no formatting action requested, meaning we should
+                    # cancel all format create/destroy actions
+                    if format == usedev.originalFormat:
+                        devicetree = self.storage.devicetree
+                        cancel = []
+                        if origlv.originalFormat.type == "luks":
+                            path = "/dev/mapper/luks-%s" % origlv.originalFormat.uuid
+                            cancel.extend(devicetree.findActions(path=path))
+
+                        cancel.extend(devicetree.findActions(type="create",
+                                                             object="format",
+                                                             devid=origlv.id))
+                        cancel.extend(devicetree.findActions(type="destroy",
+                                                             object="format",
+                                                             devid=origlv.id))
+                        for action in cancel:
+                            devicetree.cancelAction(action)
+
+                        # even though we cancelled a bunch of actions, it's
+                        # pretty much impossible to be sure we cancelled them
+                        # in the correct order. make sure things are back to
+                        # their original state.
+                        origlv.format = request.originalFormat
+                        if origlv.format.type == "luks":
+                            try:
+                                usedev = devicetree.getChildren(origlv)[0]
+                            except IndexError:
+                                usedev = origlv
+                            else:
+                                usedev.format = usedev.originalFormat
+                        else:
+                            usedev = origlv
+
                     if hasattr(format, "mountpoint"):
                         usedev.format.mountpoint = format.mountpoint
 
@@ -1164,6 +1206,14 @@ class VolumeGroupEditor:
 	    self.dialog.destroy()
 	self.dialog = None
 
+    def getLVByName(self, name, vg=None):
+        if vg is None:
+            vg = self.vg
+
+        for lv in vg.lvs:
+            if lv.lvname == name or lv.name == name:
+                return lv
+
     def __init__(self, anaconda, intf, parent, vg, isNew = 0):
         self.storage = anaconda.storage
 
@@ -1192,6 +1242,7 @@ class VolumeGroupEditor:
             self.lvs[lv.lvname] = {"name": lv.lvname,
                                    "size": lv.size,
                                    "format": copy.copy(lv.format),
+                                   "originalFormat": lv.originalFormat,
                                    "stripes": lv.stripes,
                                    "logSize": lv.logSize,
                                    "snapshotSpace": lv.snapshotSpace,
diff --git a/iw/partition_dialog_gui.py b/iw/partition_dialog_gui.py
index 52e06d5..b621087 100644
--- a/iw/partition_dialog_gui.py
+++ b/iw/partition_dialog_gui.py
@@ -287,12 +287,39 @@ class PartitionEditor:
                             actions.append(ActionCreateDevice(luksdev))
                             actions.append(ActionCreateFormat(luksdev))
                     elif not self.fsoptionsDict["formatcb"].get_active():
-                        creates = devicetree.findActions(type="create",
-                                                         object="format",
-                                                         devid=usedev.id)
-                        for action in creates:
+                        # if the format checkbutton is inactive, cancel all
+                        # actions on this device that create or destroy
+                        # formats
+                        cancel = []
+                        if request.originalFormat.type == "luks":
+                            path = "/dev/mapper/luks-%s" % request.originalFormat.uuid
+                            cancel.extend(devicetree.findActions(path=path))
+
+                        cancel.extend(devicetree.findActions(type="destroy",
+                                                             object="format",
+                                                             devid=request.id))
+                        cancel.extend(devicetree.findActions(type="create",
+                                                             object="format",
+                                                             devid=request.id))
+                        cancel.reverse()
+                        for action in cancel:
                             devicetree.cancelAction(action)
 
+                        # even though we cancelled a bunch of actions, it's
+                        # pretty much impossible to be sure we cancelled them
+                        # in the correct order. make sure things are back to
+                        # their original state.
+                        request.format = request.originalFormat
+                        if request.format.type == "luks":
+                            try:
+                                usedev = devicetree.getChildren(request)[0]
+                            except IndexError:
+                                usedev = request
+                            else:
+                                usedev.format = usedev.originalFormat
+                        else:
+                            usedev = request
+
                         if usedev.format.mountable:
                             usedev.format.mountpoint = mountpoint
                 elif self.origrequest.protected and usedev.format.mountable:
@@ -416,15 +443,22 @@ class PartitionEditor:
 
             row = row + 1
 
-        # original fs label
-        if usereq.format.exists and \
-           getattr(usereq.format, "label", None):
-            maintable.attach(createAlignedLabel(_("Original File System "
-                                                  "Label:")),
+        # original fs type and label
+        if self.origrequest.exists:
+            maintable.attach(createAlignedLabel(_("Original File System Type:")),
                              0, 1, row, row + 1)
-            fslabel = gtk.Label(usereq.format.label)
-            maintable.attach(fslabel, 1, 2, row, row + 1)
-            row = row + 1
+            self.fstypeCombo = gtk.Label(usereq.originalFormat.name)
+
+            maintable.attach(self.fstypeCombo, 1, 2, row, row + 1)
+            row += 1
+
+            if getattr(usereq.originalFormat, "label", None):
+                maintable.attach(createAlignedLabel(_("Original File System "
+                                                      "Label:")),
+                                 0, 1, row, row + 1)
+                fslabel = gtk.Label(usereq.originalFormat.label)
+                maintable.attach(fslabel, 1, 2, row, row + 1)
+                row = row + 1
 
         # size
         if not self.origrequest.exists:
diff --git a/iw/partition_ui_helpers_gui.py b/iw/partition_ui_helpers_gui.py
index 46e2efb..ec8d236 100644
--- a/iw/partition_ui_helpers_gui.py
+++ b/iw/partition_ui_helpers_gui.py
@@ -401,6 +401,8 @@ def createPreExistFSOptionSection(origrequest, maintable, row, mountCombo,
 
     if luksdev:
         lukscb.set_active(1)
+
+    if origrequest.originalFormat.type == "luks":
         lukscb.set_data("encrypted", 1)
     else:
         lukscb.set_data("encrypted", 0)
diff --git a/iw/raid_dialog_gui.py b/iw/raid_dialog_gui.py
index 086c562..8e31767 100644
--- a/iw/raid_dialog_gui.py
+++ b/iw/raid_dialog_gui.py
@@ -279,7 +279,45 @@ class RaidEditor:
                             luksdev = None
 
                         actions.append(ActionDestroyFormat(self.origrequest))
-                elif self.origrequest.format.mountable:
+                elif self.fsoptionsDict.has_key("formatcb") and \
+                     not self.fsoptionsDict["formatcb"].get_active():
+                    # if the format checkbutton is inactive, cancel all
+                    # actions on this device that create or destroy formats
+                    devicetree = self.storage.devicetree
+                    request = self.origrequest
+                    cancel = []
+                    if request.originalFormat.type == "luks":
+                        path = "/dev/mapper/luks-%s" % request.originalFormat.uuid
+                        cancel.extend(devicetree.findActions(path=path))
+
+                    cancel.extend(devicetree.findActions(type="destroy",
+                                                         object="format",
+                                                         devid=request.id))
+                    cancel.extend(devicetree.findActions(type="create",
+                                                         object="format",
+                                                         devid=request.id))
+                    for action in cancel:
+                        devicetree.cancelAction(action)
+
+                    # even though we cancelled a bunch of actions, it's
+                    # pretty much impossible to be sure we cancelled them
+                    # in the correct order. make sure things are back to
+                    # their original state.
+                    request.format = request.originalFormat
+                    if request.format.type == "luks":
+                        try:
+                            usedev = devicetree.getChildren(request)[0]
+                        except IndexError:
+                            usedev = request
+                        else:
+                            usedev.format = usedev.originalFormat
+                    else:
+                        usedev = request
+
+                    if usedev.format.mountable:
+                        usedev.format.mountpoint = mountpoint
+
+                if self.origrequest.format.mountable:
                     self.origrequest.format.mountpoint = mountpoint
 
 		if self.fsoptionsDict.has_key("migratecb") and \
@@ -408,22 +446,18 @@ class RaidEditor:
 	    lbl.set_mnemonic_widget(self.fstypeCombo)
             maintable.attach(self.fstypeCombo, 1, 2, row, row + 1)
             row += 1
-        elif format.exists:
+        else:
             maintable.attach(createAlignedLabel(_("Original File System Type:")),
                              0, 1, row, row + 1)
-            if format.type:
-                self.fstypeCombo = gtk.Label(format.name)
-            else:
-                self.fstypeCombo = gtk.Label(_("Unknown"))
-
+            self.fstypeCombo = gtk.Label(usedev.originalFormat.name)
             maintable.attach(self.fstypeCombo, 1, 2, row, row + 1)
             row += 1
 
-            if getattr(format, "label", None):
+            if getattr(usedev.originalFormat, "label", None):
                 maintable.attach(createAlignedLabel(_("Original File System "
                                                       "Label:")),
                                  0, 1, row, row + 1)
-                maintable.attach(gtk.Label(format.label),
+                maintable.attach(gtk.Label(usedev.originalFormat.label),
                                  1, 2, row, row + 1)
                 row += 1
 
-- 
1.6.6

_______________________________________________
Anaconda-devel-list mailing list
Anaconda-devel-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/anaconda-devel-list

[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux