[anaconda][master/rhel7-branch][PATCH 3/3] Add GUI and TUI logic to handle unformatted DASDs. (#1064423)
Vratislav Podzimek
vpodzime at redhat.com
Wed Feb 26 09:30:18 UTC 2014
On Wed, 2014-02-26 at 00:07 -0500, Samantha N. Bueno wrote:
> In both graphical and text, if a user selects unformatted DASDs
> from the local disk store, they are formatted when the user opts
> to proceed (either by clicking 'Done' in the GUI or 'c' to
> continue in the TUI).
>
> Following dasdfmt, storage initialization is run again in order
> to properly add the new DASDs to the devicetree and seen by the
> installer.
>
> Resolves:rhbz#1064423
> ---
> pyanaconda/constants.py | 1 +
> pyanaconda/ui/gui/spokes/storage.py | 81 ++++++++++++++++++++++++++++++++++++-
> pyanaconda/ui/tui/spokes/storage.py | 50 +++++++++++++++++++++--
> 3 files changed, 127 insertions(+), 5 deletions(-)
>
> diff --git a/pyanaconda/constants.py b/pyanaconda/constants.py
> index cf8a8ea..8de29a9 100644
> --- a/pyanaconda/constants.py
> +++ b/pyanaconda/constants.py
> @@ -131,6 +131,7 @@ THREAD_ISCSI_LOGIN = "AnaIscsiLoginThread"
> THREAD_GEOLOCATION_REFRESH = "AnaGeolocationRefreshThread"
> THREAD_DATE_TIME = "AnaDateTimeThread"
> THREAD_TIME_INIT = "AnaTimeInitThread"
> +THREAD_DASDFMT = "AnaDasdfmtThread"
>
> # Geolocation constants
>
> diff --git a/pyanaconda/ui/gui/spokes/storage.py b/pyanaconda/ui/gui/spokes/storage.py
> index bdd48ef..e565b16 100644
> --- a/pyanaconda/ui/gui/spokes/storage.py
> +++ b/pyanaconda/ui/gui/spokes/storage.py
> @@ -50,17 +50,20 @@ from pyanaconda.ui.gui.spokes.lib.cart import SelectedDisksDialog
> from pyanaconda.ui.gui.spokes.lib.passphrase import PassphraseDialog
> from pyanaconda.ui.gui.spokes.lib.detailederror import DetailedErrorDialog
> from pyanaconda.ui.gui.spokes.lib.resize import ResizeDialog
> +from pyanaconda.ui.gui.spokes.lib.dasdfmt import DasdFormatDialog
> from pyanaconda.ui.gui.categories.system import SystemCategory
> -from pyanaconda.ui.gui.utils import enlightbox, gtk_call_once, gtk_action_wait
> +from pyanaconda.ui.gui.utils import enlightbox, gtk_call_once, gtk_action_wait, ignoreEscape
>
> from pyanaconda.kickstart import doKickstartStorage, getAvailableDiskSpace
> +from blivet import storageInitialize, arch
> from blivet.size import Size
> from blivet.devices import MultipathDevice
> -from blivet.errors import StorageError
> +from blivet.errors import StorageError, DasdFormatError
> from blivet.errors import SanityError
> from blivet.errors import SanityWarning
> from blivet.platform import platform
> from blivet.devicelibs import swap as swap_lib
> +from blivet.devicelibs.dasd import make_unformatted_dasd_list, format_dasd
> from pyanaconda.threads import threadMgr, AnacondaThread
> from pyanaconda.product import productName
> from pyanaconda.flags import flags
> @@ -292,6 +295,11 @@ class StorageSpoke(NormalSpoke, StorageChecker):
> self.autoPartType = None
> self.clearPartType = CLEARPART_TYPE_NONE
>
> + if self.data.zerombr.zerombr and arch.isS390():
> + # run dasdfmt on any unformatted DASDs automatically
> + threadMgr.add(AnacondaThread(name=constants.THREAD_DASDFMT,
> + target=self.run_dasdfmt))
> +
> self._previous_autopart = False
>
> self._last_clicked_overview = None
> @@ -357,6 +365,10 @@ class StorageSpoke(NormalSpoke, StorageChecker):
> def _doExecute(self):
> self._ready = False
> hubQ.send_not_ready(self.__class__.__name__)
> + # ugly and stupid, but on the off-chance dasdfmt is running, we can't
> + # proceed further with this
> + while threadMgr.get(constants.THREAD_DASDFMT):
> + continue
> hubQ.send_message(self.__class__.__name__, _("Saving storage configuration..."))
> try:
> doKickstartStorage(self.storage, self.data, self.instclass)
> @@ -409,6 +421,8 @@ class StorageSpoke(NormalSpoke, StorageChecker):
>
> if not self._confirmed:
> msg = _("Not configured")
> + elif threadMgr.get(constants.THREAD_DASDFMT):
> + msg = _("Formatting DASDs")
> elif flags.automatedInstall and not self.storage.rootDevice:
> return msg
> elif self.data.ignoredisk.onlyuse:
> @@ -681,6 +695,41 @@ class StorageSpoke(NormalSpoke, StorageChecker):
> if not selected and name in self.selected_disks:
> self.selected_disks.remove(name)
>
> + def run_dasdfmt(self):
> + """
> + Though the same function exists in pyanaconda.ui.gui.spokes.lib.dasdfmt,
> + this instance doesn't include any of the UI pieces and should only
> + really be getting called on ks installations with "zerombr".
> + """
> + # wait for the initial storage thread to complete before taking any new
> + # actions on storage devices
> + threadMgr.wait(constants.THREAD_STORAGE)
> +
> + to_format = make_unformatted_dasd_list(self.selected_disks)
> + if not to_format:
> + # nothing to do here; bail
> + return
> +
> + hubQ.send_message(self.__class__.__name__, _("Formatting DASDs"))
> + for disk in to_format:
> + try:
> + format_dasd(disk)
> + except DasdFormatError as err:
> + # Log errors if formatting fails, but don't halt the installer
> + log.error(str(err))
> + continue
> +
> + # now re-initialize storage to pick up the newly formatted disks
> + protectedNames = [d.name for d in self.storage.protectedDevices]
> + threadMgr.add(AnacondaThread(name=constants.THREAD_STORAGE,
> + target=storageInitialize,
> + args=(self.storage, self.data, protectedNames)))
> + threadMgr.wait(constants.THREAD_STORAGE)
One more thing, sorry. I believe that adding a thread and waiting for it
to finish right after that is the same as calling the function directly.
--
Vratislav Podzimek
Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic
More information about the anaconda-patches
mailing list