From 5bd2c24d83025448000e8b56f8db8002013a9501 Mon Sep 17 00:00:00 2001 From: Jeremy Katz Date: Thu, 7 Feb 2002 20:25:30 +0000 Subject: stage2 of the partitioning.py cleanup * move the following functions from partitioning.py -> raid.py isRaid5, isRaid1, isRaid0, get_raid_min_members, get_raid_max_spares * update other sources accordingly --- iw/partition_gui.py | 23 ++++++++-------- kickstart.py | 7 ++--- partitioning.py | 75 ++++++++++------------------------------------------- raid.py | 63 +++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 92 insertions(+), 76 deletions(-) diff --git a/iw/partition_gui.py b/iw/partition_gui.py index dcf37b838..871d4f600 100644 --- a/iw/partition_gui.py +++ b/iw/partition_gui.py @@ -25,6 +25,7 @@ import string import copy import types import checklist +import raid from iw_gui import * from translate import _, N_ from partitioning import * @@ -661,7 +662,7 @@ def createFSTypeMenu(fstype, fstypechangeCB, mountCombo, def raidlevelchangeCB(widget, sparesb): raidlevel = widget.get_data("level") numparts = sparesb.get_data("numparts") - maxspares = get_raid_max_spares(raidlevel, numparts) + maxspares = raid.get_raid_max_spares(raidlevel, numparts) if maxspares > 0 and raidlevel != "RAID0": sparesb.set_sensitive(1) adj = sparesb.get_adjustment() @@ -821,9 +822,9 @@ class PartitionWindow(InstallWindow): # XXX this breaks when we try to refresh tree after a refresh # # XXX - this breaks self.refresh calls!!! - lvmparent = self.tree.append(None) - self.tree[lvmparent]['Device'] = _("LVM Physical Volumes") -# lvmparent = None +# lvmparent = self.tree.append(None) +# self.tree[lvmparent]['Device'] = _("LVM Physical Volumes") + lvmparent = None for vgname in lvmrequests.keys(): vgparent = self.tree.append(lvmparent) self.tree[vgparent]['Device'] = _("LVM: %s") % (vgname,) @@ -858,9 +859,9 @@ class PartitionWindow(InstallWindow): raidrequests = self.partitions.getRaidRequests() if raidrequests: # XXX - this breaks self.refresh calls!!! - raidparent = self.tree.append(None) - self.tree[raidparent]['Device'] = _("RAID Devices") -# raidparent = None +# raidparent = self.tree.append(None) +# self.tree[raidparent]['Device'] = _("RAID Devices") + raidparent = None for request in raidrequests: iter = self.tree.append(raidparent) @@ -890,9 +891,9 @@ class PartitionWindow(InstallWindow): # now normal partitions # XXX - this breaks self.refresh calls!!! - drvparent = self.tree.append(None) - self.tree[drvparent]['Device'] = _("Hard Drives") -# drvparent=None +# drvparent = self.tree.append(None) +# self.tree[drvparent]['Device'] = _("Hard Drives") + drvparent=None for drive in drives: disk = self.diskset.disks[drive] @@ -1650,7 +1651,7 @@ class PartitionWindow(InstallWindow): nspares = 0 if raidrequest.raidlevel: - maxspares = get_raid_max_spares(raidrequest.raidlevel, numparts) + maxspares = raid.get_raid_max_spares(raidrequest.raidlevel, numparts) else: maxspares = 0 diff --git a/kickstart.py b/kickstart.py index 24de479f0..c18b3fd3a 100644 --- a/kickstart.py +++ b/kickstart.py @@ -7,6 +7,7 @@ from autopart import * from fsset import * from flags import flags import sys +import raid import string class Script: @@ -647,11 +648,11 @@ class KickstartBase(BaseInstallClass): raidmems.append(self.ksRaidMapping[member]) # XXX this shouldn't have to happen =\ - if isRaid0(level): + if raid.isRaid0(level): level = "RAID0" - elif isRaid1(level): + elif raid.isRaid1(level): level = "RAID1" - elif isRaid5(level): + elif raid.isRaid5(level): level = "RAID5" if not level: diff --git a/partitioning.py b/partitioning.py index d502e361a..2b50ed155 100644 --- a/partitioning.py +++ b/partitioning.py @@ -30,6 +30,7 @@ import sys import string import iutil import partedUtils +import raid from translate import _ from log import log from constants import * @@ -125,9 +126,9 @@ def get_available_raid_partitions(diskset, requests, request): break if not used: - rc.append((partname, getPartSizeMB(part), 0)) + rc.append((partname, partedUtils.getPartSizeMB(part), 0)) elif used == 2: - rc.append((partname, getPartSizeMB(part), 1)) + rc.append((partname, partedUtils.getPartSizeMB(part), 1)) return rc # returns a list of tuples of lvm partitions which can be used or are used @@ -155,9 +156,9 @@ def get_available_lvm_partitions(diskset, requests, request): break if used == 0: - rc.append((partname, getPartSizeMB(part), 0)) + rc.append((partname, partedUtils.getPartSizeMB(part), 0)) elif used == 2: - rc.append((partname, getPartSizeMB(part), 1)) + rc.append((partname, partedUtils.getPartSizeMB(part), 1)) return rc def get_lvm_volume_group_size(request, requests, diskset): @@ -173,54 +174,6 @@ def get_lvm_volume_group_size(request, requests, diskset): return totalspace -# set of functions to determine if the given level is RAIDX or X -def isRaid5(raidlevel): - if raidlevel == "RAID5": - return 1 - elif raidlevel == 5: - return 1 - elif raidlevel == "5": - return 1 - return 0 - -def isRaid1(raidlevel): - if raidlevel == "RAID1": - return 1 - elif raidlevel == 1: - return 1 - elif raidlevel == "1": - return 1 - return 0 - -def isRaid0(raidlevel): - if raidlevel == "RAID0": - return 1 - elif raidlevel == 0: - return 1 - elif raidlevel == "0": - return 1 - return 0 - - -# return minimum numer of raid members required for a raid level -def get_raid_min_members(raidlevel): - if isRaid0(raidlevel): - return 2 - elif isRaid1(raidlevel): - return 2 - elif isRaid5(raidlevel): - return 3 - else: - raise ValueError, "invalid raidlevel in get_raid_min_members" - -# return max num of spares available for raidlevel and total num of members -def get_raid_max_spares(raidlevel, nummembers): - if isRaid0(raidlevel): - return 0 - elif isRaid1(raidlevel) or isRaid5(raidlevel): - return max(0, nummembers - get_raid_min_members(raidlevel)) - else: - raise ValueError, "invalid raidlevel in get_raid_max_spares" def get_raid_device_size(raidrequest, partitions, diskset): if not raidrequest.raidmembers or not raidrequest.raidlevel: @@ -236,7 +189,7 @@ def get_raid_device_size(raidrequest, partitions, diskset): part = partedUtils.get_partition_by_name(diskset.disks, device) partsize = part.geom.length * part.geom.disk.dev.sector_size - if isRaid0(raidlevel): + if raid.isRaid0(raidlevel): sum = sum + partsize else: if not smallest: @@ -244,11 +197,11 @@ def get_raid_device_size(raidrequest, partitions, diskset): elif partsize < smallest: smallest = partsize - if isRaid0(raidlevel): + if raid.isRaid0(raidlevel): return sum - elif isRaid1(raidlevel): + elif raid.isRaid1(raidlevel): return smallest - elif isRaid5(raidlevel): + elif raid.isRaid5(raidlevel): return (nummembers-1) * smallest else: raise ValueError, "Invalid raidlevel in get_raid_device_size()" @@ -503,10 +456,10 @@ def sanityCheckRaidRequest(reqpartitions, newraid, doPartitionCheck = 1): if not bootreq and newraid.mountpoint: # XXX 390 can't have boot on raid if ((newraid.mountpoint == "/boot" or newraid.mountpoint == "/") - and not isRaid1(newraid.raidlevel)): + and not raid.isRaid1(newraid.raidlevel)): return _("Bootable partitions can only be on RAID1 devices.") - minmembers = get_raid_min_members(newraid.raidlevel) + minmembers = raid.get_raid_min_members(newraid.raidlevel) if len(newraid.raidmembers) < minmembers: return _("A RAID device of type %s " "requires at least %s members.") % (newraid.raidlevel, @@ -599,7 +552,7 @@ def sanityCheckAllRequests(requests, diskset, baseChecks = 0): bootreq = requests.getBootableRequest() # XXX 390 can't have boot on RAID if (bootreq and (bootreq.type == REQUEST_RAID) and - (not isRaid1(bootreq.raidlevel))): + (not raid.isRaid1(bootreq.raidlevel))): errors.append(_("Bootable partitions can only be on RAID1 devices.")) # can't have bootable partition on LV @@ -664,7 +617,7 @@ def deleteAllLogicalPartitions(part, requests): request = requests.getRequestByDeviceName(partedUtils.get_partition_name(partition)) requests.removeRequest(request) if request.type == REQUEST_PREEXIST: - drive = get_partition_drive(partition) + drive = partedUtils.get_partition_drive(partition) delete = DeleteSpec(drive, partition.geom.start, partition.geom.end) requests.addDelete(delete) @@ -1879,7 +1832,7 @@ def doDeletePartitionByRequest(intf, requestlist, partition): return 0 if iutil.getArch() == "s390" and type(partition) != type("RAID"): - self.intf.messageWindow(_("Error"), + intf.messageWindow(_("Error"), _("DASD partitions can only be deleted " "with fdasd")) return diff --git a/raid.py b/raid.py index 949cff3cc..aa2a4c1c4 100644 --- a/raid.py +++ b/raid.py @@ -4,7 +4,7 @@ # # Erik Troan # -# Copyright 2001 Red Hat, Inc. +# Copyright 2001-2002 Red Hat, Inc. # # This software may be freely redistributed under the terms of the GNU # library public license. @@ -13,6 +13,7 @@ # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # +"""Raid probing control.""" import parted import isys @@ -22,6 +23,12 @@ import partedUtils from log import log def scanForRaid(drives): + """Scans for raid devices on drives. + + drives is a list of device names. + Returns a list of (mdMinor, devices, level, totalDisks) tuples. + """ + raidSets = {} raidDevices = {} @@ -88,6 +95,7 @@ def scanForRaid(drives): return raidList def startAllRaid(driveList): + """Do a raid start on raid devices and return a list like scanForRaid.""" rc = [] mdList = scanForRaid(driveList) for mdDevice, deviceList, level, numActive in mdList: @@ -97,5 +105,58 @@ def startAllRaid(driveList): return rc def stopAllRaid(mdList): + """Do a raid stop on each of the raid device tuples given.""" for dev, devices, level, numActive in mdList: isys.raidstop(dev) + + +def isRaid5(raidlevel): + """Return whether raidlevel is a valid descriptor of RAID5.""" + if raidlevel == "RAID5": + return 1 + elif raidlevel == 5: + return 1 + elif raidlevel == "5": + return 1 + return 0 + +def isRaid1(raidlevel): + """Return whether raidlevel is a valid descriptor of RAID1.""" + if raidlevel == "RAID1": + return 1 + elif raidlevel == 1: + return 1 + elif raidlevel == "1": + return 1 + return 0 + +def isRaid0(raidlevel): + """Return whether raidlevel is a valid descriptor of RAID0.""" + if raidlevel == "RAID0": + return 1 + elif raidlevel == 0: + return 1 + elif raidlevel == "0": + return 1 + return 0 + +def get_raid_min_members(raidlevel): + """Return the minimum number of raid members required for raid level""" + if isRaid0(raidlevel): + return 2 + elif isRaid1(raidlevel): + return 2 + elif isRaid5(raidlevel): + return 3 + else: + raise ValueError, "invalid raidlevel in get_raid_min_members" + +def get_raid_max_spares(raidlevel, nummembers): + """Return the maximum number of raid spares for raidlevel.""" + if isRaid0(raidlevel): + return 0 + elif isRaid1(raidlevel) or isRaid5(raidlevel): + return max(0, nummembers - get_raid_min_members(raidlevel)) + else: + raise ValueError, "invalid raidlevel in get_raid_max_spares" + -- cgit