On Thu, 2014-11-06 at 09:11 -0600, David Lehman wrote:
On 11/06/2014 01:40 AM, Vratislav Podzimek wrote:
> On Wed, 2014-11-05 at 09:49 -0600, David Lehman wrote:
>> In the event that blivet finds a setup it cannot handle with any
>> reasonable expectation of success it will raise ConfigurationError.
>> The user then has the option to resolve the issue and retry the
>> storage scan or exit the installer.
>> ---
>> pyanaconda/errors.py | 15 +++++++++++++++
>> pyanaconda/storage_utils.py | 14 ++++++++++++--
>> 2 files changed, 27 insertions(+), 2 deletions(-)
>>
>> diff --git a/pyanaconda/errors.py b/pyanaconda/errors.py
>> index 29c15a9..124db04 100644
>> --- a/pyanaconda/errors.py
>> +++ b/pyanaconda/errors.py
>> @@ -118,6 +118,20 @@ class ErrorHandler(object):
>> self.ui.showError(message)
>> return ERROR_RAISE
>>
>> + def _storageResetHandler(self, exn):
>> + message = (_("An error has occurred while scanning your existing
"
>> + "storage configuration:\n\n%(errortxt)s\n\nYou must
"
>> + "resolve this matter before the installation can
proceed. "
>> + "There is a shell available for use which you can
access "
>> + "by pressing ctrl-alt-f1 and then ctrl-b 2. Once you
have "
>> + "resolved the issue you can either retry the storage
scan "
>> + "or you can exit the installer. Would you like to
retry?")
>> + % {"errortxt": exn})
>> + if self.ui.showYesNoQuestion(message):
>> + return ERROR_RETRY
>> + else:
>> + return ERROR_RAISE
>> +
>> def _noDisksHandler(self, exn):
>> message = _("An error has occurred - no valid devices were found
on "
>> "which to create new file systems. Please check your
"
>> @@ -285,6 +299,7 @@ class ErrorHandler(object):
>>
>> _map = {"PartitioningError": self._partitionErrorHandler,
>> "FSResizeError": self._fsResizeHandler,
>> + "ConfigurationError": self._storageResetHandler,
>> "NoDisksError": self._noDisksHandler,
>> "DirtyFSError": self._dirtyFSHandler,
>> "FSTabTypeMismatchError":
self._fstabTypeMismatchHandler,
>> diff --git a/pyanaconda/storage_utils.py b/pyanaconda/storage_utils.py
>> index bb3a5ee..bf59954 100644
>> --- a/pyanaconda/storage_utils.py
>> +++ b/pyanaconda/storage_utils.py
>> @@ -35,11 +35,12 @@ from blivet.devicefactory import DEVICE_TYPE_BTRFS
>> from blivet.devicefactory import DEVICE_TYPE_MD
>> from blivet.devicefactory import DEVICE_TYPE_PARTITION
>> from blivet.devicefactory import DEVICE_TYPE_DISK
>> +from blivet.errors import StorageError
>>
>> from pyanaconda.i18n import _, N_
>> from pyanaconda import isys
>> from pyanaconda.constants import productName
>> -from pyanaconda.errors import UnknownSourceDeviceError
>> +from pyanaconda.errors import errorHandler, UnknownSourceDeviceError,
ERROR_RETRY
>> from pyanaconda.flags import flags
>>
>> from pykickstart.constants import AUTOPART_TYPE_PLAIN, AUTOPART_TYPE_BTRFS
>> @@ -110,7 +111,16 @@ def storageInitialize(storage, ksdata, protected):
>> if protected:
>> storage.config.protectedDevSpecs.extend(protected)
>>
>> - storage.reset()
>> + while True:
>> + try:
>> + storage.reset()
>> + except StorageError as e:
>> + if errorHandler.cb(e) == ERROR_RETRY:
>> + continue
>> + else:
>> + raise
>> + else:
>> + break
> Is this valid for all StorageError subclasses or should we work here
> explicitly with the ConfigurationError?
>
This will handle all StorageError subclasses, but the only one we have a
handler installed for that could arise from a reset is this new one. I
could be more explicit if that makes people feel better.
I'm okay with it as it
is. Thanks for the explanation!
--
Vratislav Podzimek
Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic