[blivet][master/rhel7-branch] Re-write the DASD storage code (#1001070)

Vratislav Podzimek vpodzime at redhat.com
Wed Feb 26 09:11:58 UTC 2014


> diff --git a/blivet/devicelibs/dasd.py b/blivet/devicelibs/dasd.py
> new file mode 100644
> index 0000000..8281a04
> --- /dev/null
> +++ b/blivet/devicelibs/dasd.py
> @@ -0,0 +1,123 @@
> +#
> +# dasd.py - DASD functions
> +#
> +# Copyright (C) 2013 Red Hat, Inc.  All rights reserved.
> +#
> +# This program is free software; you can redistribute it and/or modify
> +# it under the terms of the GNU General Public License as published by
> +# the Free Software Foundation; either version 2 of the License, or
> +# (at your option) any later version.
> +#
> +# This program is distributed in the hope that it will be useful,
> +# but WITHOUT ANY WARRANTY; without even the implied warranty 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, see <http://www.gnu.org/licenses/>.
> +#
> +# Red Hat Author(s): Samantha N. Bueno
> +#
> +
> +import os
> +from blivet.errors import DasdFormatError
> +from blivet.devices import deviceNameToDiskByPath
> +from blivet import util
> +from blivet import arch
> +
> +import logging
> +log = logging.getLogger("blivet")
> +
> +import gettext
> +_ = lambda x: gettext.ldgettext("blivet", x)
> +P_ = lambda x, y, z: gettext.ldngettext("blivet", x, y, z)
> +
> +def get_dasd_ports():
> +    """ Return comma delimited string of valid DASD ports. """
> +    ports = []
> +
> +    with open("/proc/dasd/devices", "r") as f:
> +        lines = (line.strip() for line in f.readlines())
> +
> +    for line in lines:
> +        if "unknown" in line:
> +            continue
> +
> +        if "(FBA )" in line or "(ECKD)" in line:
> +            ports.append(line.split('(')[0])
> +
> +    return ','.join(ports)
> +
> +def format_dasd(dasd):
> +    """ Run dasdfmt on a DASD. Aside from one type of device noted below, this
> +        function _does not_ check if a DASD needs to be formatted, but rather,
> +        assumes the list passed needs formatting.
> +
> +        We don't need to show or update any progress bars, since disk actions
> +        will be taking place all in the progress hub, which is just one big
> +        progress bar.
> +    """
> +    try:
> +        rc = util.run_program(["/sbin/dasdfmt", "-y", "-d", "cdl", "-b", "4096", "/dev/" + dasd])
> +    except Exception as err:
> +        raise DasdFormatError(err)
> +
> +    if rc:
> +        raise DasdFormatError("dasdfmt failed: %s" % rc)
> +
> +def make_dasd_list(dasds, disks):
> +    """ Create a list of DASDs recognized by the system. """
> +    if not arch.isS390():
> +        return
> +
> +    log.info("Generating DASD list...")
> +    for dev in (d for d in disks if d.type == "dasd"):
> +        if dev not in dasds:
> +            dasds.append(dev)
> +
> +    return dasds
> +
> +def make_unformatted_dasd_list(dasds):
> +    """ Return a list of DASDS which are not formatted. """
> +    unformatted = []
> +
> +    for dasd in dasds:
> +        if dasd_needs_format(dasd):
> +            unformatted.append(dasd)
> +
> +    return unformatted
> +
> +def dasd_needs_format(dasd):
> +    """ Check if a DASD needs to have dasdfmt run against it or not.
> +        Return True if we do need dasdfmt, False if not.
> +    """
> +    statusfile = "/sys/block/%s/device/status" % (dasd,)
> +    if not os.path.isfile(statusfile):
> +        return False
> +
> +    with open(statusfile, "r") as f:
> +        status = f.read().strip()
> +
> +    if status in ["unformatted"]:
> +        bypath = deviceNameToDiskByPath(dasd)
> +        if not bypath:
> +            bypath = "/dev/" + dasd
> +
> +        log.info("  %s (%s) status is %s, needs dasdfmt" % (dasd, bypath,
> +                                                            status,))
> +        return True
> +
> +    return False
> +
> +
> +def write_dasd_conf(disks, ROOT_PATH):
> +    """ Write /etc/dasd.conf to target system for all DASD devices
> +        configured during installation.
> +    """
> +    if disks == {}:
> +        return
> +
> +    with open(os.path.realpath(ROOT_PATH + "/etc/dasd.conf"), "w") as f:
> +        for dasd in sorted(disks, key=lambda d: d.name):
> +            fields = [dasd.busid] + dasd.getOpts()
> +            f.write("%s\n" % (" ".join(fields),))
No need for the extra brackets and comma around the " ".join(fields).

-- 
Vratislav Podzimek

Anaconda Rider | Red Hat, Inc. | Brno - Czech Republic



More information about the anaconda-patches mailing list