129 lines
4.1 KiB
Python
129 lines
4.1 KiB
Python
|
#
|
||
|
# Formatting tasks
|
||
|
#
|
||
|
# Copyright (C) 2018 Red Hat, Inc.
|
||
|
#
|
||
|
# This copyrighted material is made available to anyone wishing to use,
|
||
|
# modify, copy, or redistribute it subject to the terms and conditions of
|
||
|
# the GNU General Public License v.2, or (at your option) any later version.
|
||
|
# This program is distributed in the hope that it will be useful, but WITHOUT
|
||
|
# ANY WARRANTY expressed or implied, including the implied warranties of
|
||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
||
|
# Public License for more details. You should have received a copy of the
|
||
|
# GNU General Public License along with this program; if not, write to the
|
||
|
# Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||
|
# 02110-1301, USA. Any Red Hat trademarks that are incorporated in the
|
||
|
# source code or documentation are not subject to the GNU General Public
|
||
|
# License and may only be used or replicated with the express permission of
|
||
|
# Red Hat, Inc.
|
||
|
#
|
||
|
from pyanaconda.modules.common.task import Task
|
||
|
from pyanaconda.anaconda_loggers import get_module_logger
|
||
|
|
||
|
from blivet import blockdev
|
||
|
|
||
|
log = get_module_logger(__name__)
|
||
|
|
||
|
__all__ = ["FindFormattableDASDTask", "DASDFormatTask"]
|
||
|
|
||
|
|
||
|
class FindFormattableDASDTask(Task):
|
||
|
"""A task for finding DASDs for formatting."""
|
||
|
|
||
|
def __init__(self, disks, can_format_unformatted=False, can_format_ldl=False):
|
||
|
"""Create a new task.
|
||
|
|
||
|
:param disks: a list of disks to search
|
||
|
:param can_format_unformatted: can we format unformatted?
|
||
|
:param can_format_ldl: can we format LDL?
|
||
|
"""
|
||
|
super().__init__()
|
||
|
self._disks = disks
|
||
|
self._can_format_unformatted = can_format_unformatted
|
||
|
self._can_format_ldl = can_format_ldl
|
||
|
|
||
|
@property
|
||
|
def name(self):
|
||
|
"""Name of the task."""
|
||
|
return "Finding DASDs for formatting"
|
||
|
|
||
|
def run(self):
|
||
|
"""Run the task."""
|
||
|
return list(set(
|
||
|
self._get_unformatted_dasds(self._disks)
|
||
|
+ self._get_ldl_dasds(self._disks)
|
||
|
))
|
||
|
|
||
|
def _get_unformatted_dasds(self, disks):
|
||
|
"""Returns a list of unformatted DASDs."""
|
||
|
result = []
|
||
|
|
||
|
if not self._can_format_unformatted:
|
||
|
log.debug("We are not allowed to format unformatted DASDs.")
|
||
|
return result
|
||
|
|
||
|
for disk in disks:
|
||
|
if self._is_unformatted_dasd(disk):
|
||
|
log.debug("Found unformatted DASD: %s (%s)", disk.path, disk.busid)
|
||
|
result.append(disk)
|
||
|
|
||
|
return result
|
||
|
|
||
|
def _is_unformatted_dasd(self, disk):
|
||
|
"""Is it an unformatted DASD?"""
|
||
|
return self._is_dasd(disk) \
|
||
|
and not blockdev.s390.dasd_is_fba(disk.name) \
|
||
|
and blockdev.s390.dasd_needs_format(disk.busid)
|
||
|
|
||
|
def _is_dasd(self, disk):
|
||
|
"""Is it a DASD disk?"""
|
||
|
return disk.type == "dasd"
|
||
|
|
||
|
def _get_ldl_dasds(self, disks):
|
||
|
"""Returns a list of LDL DASDs."""
|
||
|
result = []
|
||
|
|
||
|
if not self._can_format_ldl:
|
||
|
log.debug("We are not allowed to format LDL DASDs.")
|
||
|
return result
|
||
|
|
||
|
for disk in disks:
|
||
|
if self._is_ldl_dasd(disk):
|
||
|
log.debug("Found LDL DASD: %s (%s)", disk.path, disk.busid)
|
||
|
result.append(disk)
|
||
|
|
||
|
return result
|
||
|
|
||
|
def _is_ldl_dasd(self, disk):
|
||
|
"""Is it an LDL DASD?"""
|
||
|
return self._is_dasd(disk) and blockdev.s390.dasd_is_ldl(disk.name)
|
||
|
|
||
|
|
||
|
class DASDFormatTask(Task):
|
||
|
"""A task for formatting DASDs"""
|
||
|
|
||
|
def __init__(self, dasds):
|
||
|
"""Create a new task.
|
||
|
|
||
|
:param dasds: a list of names of DASDs to format
|
||
|
"""
|
||
|
super().__init__()
|
||
|
self._dasds = dasds
|
||
|
|
||
|
@property
|
||
|
def name(self):
|
||
|
return "Formatting DASDs"
|
||
|
|
||
|
def run(self):
|
||
|
for disk_name in self._dasds:
|
||
|
self._do_format(disk_name)
|
||
|
|
||
|
def _do_format(self, disk_name):
|
||
|
"""Format the specified DASD disk."""
|
||
|
try:
|
||
|
self.report_progress("Formatting {}".format(disk_name))
|
||
|
blockdev.s390.dasd_format(disk_name)
|
||
|
except blockdev.S390Error as err:
|
||
|
self.report_progress("Failed formatting {}".format(disk_name))
|
||
|
log.error(err)
|