--- dmraid.py | 305 ------------------------------------------------------------- 1 files changed, 0 insertions(+), 305 deletions(-) delete mode 100644 dmraid.py diff --git a/dmraid.py b/dmraid.py deleted file mode 100644 index 8d07116..0000000 --- a/dmraid.py +++ /dev/null @@ -1,305 +0,0 @@ -# -# dmraid.py - dmraid probing control -# -# Copyright (C) 2005 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/>. -# -# Author(s): Peter Jones <pjones@xxxxxxxxxx> -# - -"""DMRaid probing control.""" -# XXX dmraid and md raid should be abstracted from the same thing. -pj -# XXX dmraid and lvm should use a common control mechanism (such as block.dm) -# for device-mapper. -pj - -import sys -import string - -_bdModulePath = "/tmp/updates/bdevid/:" -import block -oldPath = block.getBdevidPath() -if not _bdModulePath in oldPath: - block.setBdevidPath(_bdModulePath + oldPath) -del oldPath - -import raid -from flags import flags - -import logging -from anaconda_log import logger, logFile - -logger.addLogger ("anaconda.dmraid", minLevel=logging.DEBUG) -log = logging.getLogger("anaconda.dmraid") -logger.addFileHandler (logFile, log) - -import isys - -# these arches can have their /boot on DMRAID and not have their -# boot loader blow up -# XXX This needs to be functional so it can test if drives sit on particular -# controlers. -pj -dmraidBootArches = [ "i386", "x86_64" ] - -dmNameUpdates = {} - -class DmDriveCache: - def __init__(self): - self.cache = {} - - def _addMapDevs(self, name, devs, obj): - isys.cachedDrives["mapper/" + name] = obj - log.debug("adding %s to isys cache" % ("mapper/" + name,)) - for dev in devs: - disk = dev.split('/')[-1] - if isys.cachedDrives.has_key(disk): - self.cache.setdefault(obj.name, {}) - self.cache[obj.name][obj.name] = obj - log.debug("adding %s to dm cache" % (disk,)) - self.cache[obj.name][disk] = isys.cachedDrives[disk] - log.debug("removing %s from isys cache" % (disk,)) - del isys.cachedDrives[disk] - - def add(self, obj): - if isinstance(obj, block.MultiPath): - return self._addMapDevs(obj.name, obj.bdevs, obj) - else: - members = [] - for m in obj.members: - if isinstance(m, block.RaidDev): - members.append(m.rd.device.path) - return self._addMapDevs(obj.name, members, obj) - - def remove(self, name): - objname = "mapper/" + name - if isys.cachedDrives.has_key(objname): - obj = isys.cachedDrives[objname] - log.debug("removing %s from isys cache" % (objname,)) - del isys.cachedDrives[objname] - if self.cache.has_key(obj.name): - del self.cache[obj.name][obj.name] - for k,v in self.cache[obj.name].items(): - log.debug("adding %s to isys cache" % (name,)) - isys.cachedDrives[k] = v - log.debug("removing %s from dm cache" % (obj,)) - del self.cache[obj.name] - - def rename(self, obj, newname): - oldname = 'mapper/' + obj.name - if isys.cachedDrives.has_key(oldname): - dmNameUpdates[obj.name] = newname - self.remove(oldname) - # XXX why doesn't setting the property work? - obj.set_name(newname) - self.add(obj) - - def __contains__(self, name): - return self.cache.has_key(name) - -cacheDrives = DmDriveCache() - -class DegradedRaidWarning(Warning): - def __init__(self, *args): - self.args = args - def __str__(self): - return self.args and ('%s' % self.args[0]) or repr(self) - -def scanForRaid(drives, degradedOk=False): - """Scans for dmraid devices on drives. - - drives is a list of device names. - Returns a list of (raidSet, parentRaidSet, devices, level, totalDisks) - tuples. - """ - - log.debug("scanning for dmraid on drives %s" % (drives,)) - - probeDrives = [] - for d in drives: - probeDrives.append("/dev/%s" % (d,)) - - dmsets = [] - def nonDegraded(rs): - log.debug("got raidset %s (%s)" % (rs, string.join(rs.member_devpaths))) - log.debug(" valid: %s found_devs: %s total_devs: %s" % (rs.valid, rs.rs.found_devs, rs.rs.total_devs)) - - if not rs.valid and not degradedOk: - log.warning("raid %s (%s) is degraded" % (rs, rs.name)) - #raise DegradedRaidWarning, rs - return False - return True - - raidsets = filter(nonDegraded, block.getRaidSets(probeDrives) or []) - def updateName(rs): - if dmNameUpdates.has_key(rs.name): - rs.set_name(dmNameUpdates[rs.name]) - cacheDrives.add(rs) - return rs - - return reduce(lambda x,y: x + [updateName(y),], raidsets, []) - -def renameRaidSet(rs, name): - cacheDrives.rename(rs, name) - -def startAllRaid(driveList): - """Do a raid start on raid devices.""" - - if not flags.dmraid: - return [] - log.debug("starting all dmraids on drives %s" % (driveList,)) - - try: - dmList = scanForRaid(driveList) - except Exception, e: - log.error("error scanning dmraid, disabling: %s" %(e,)) - flags.dmraid = 0 - dmList = [] - - newDmList = [] - for rs in dmList: - rs.prefix = '/dev/mapper/' - log.debug("starting raid %s with mknod=True" % (rs,)) - try: - rs.activate(mknod=True) - newDmList.append(rs) - except Exception, e: - log.error("Activating raid %s failed: " % (rs.rs,)) - log.error(" table: %s" % (rs.rs.table,)) - log.error(" exception: %s" % (e,)) - try: - rs.deactivate() - del rs - except: - pass - - return newDmList - -def stopAllRaid(dmList): - """Do a raid stop on each of the raid device tuples given.""" - - if not flags.dmraid: - return - log.debug("stopping all dmraids") - for rs in dmList: - log.debug("stopping raid %s" % (rs,)) - if rs.name in cacheDrives: - cacheDrives.remove(rs.name) - - rs.deactivate() - #block.removeDeviceMap(map) - -def isRaid6(raidlevel): - """Return whether raidlevel is a valid descriptor of RAID6.""" - return False - -def isRaid5(raidlevel): - """Return whether raidlevel is a valid descriptor of RAID5.""" - return False - -def isRaid1(raidlevel): - """Return whether raidlevel is a valid descriptor of RAID1.""" - return raid.isRaid1(raidlevel) - -def isRaid0(raidlevel): - """Return whether raidlevel is a valid descriptor of RAID1.""" - return raid.isRaid0(raidlevel) - -def get_raid_min_members(raidlevel): - """Return the minimum number of raid members required for raid level""" - return raid.get_raid_min_members(raidlevel) - -def get_raid_max_spares(raidlevel, nummembers): - """Return the maximum number of raid spares for raidlevel.""" - return raid.get_raid_max_spares(raidlevel, nummembers) - -def register_raid_device(dmname, newdevices, newlevel, newnumActive): - """Register a new RAID device in the dmlist.""" - raise NotImplementedError - -def scanForMPath(drives): - log.debug("scanning for multipath on drives %s" % (drives,)) - mpaths = [] - - probeDrives = [] - for d in drives: - probeDrives.append("/dev/%s" % (d,)) - - import block as _block - oldPath = _block.getBdevidPath() - if not _bdModulePath in oldPath: - _block.setBdevidPath(_bdModulePath + oldPath) - del oldPath - - log.debug("loading bdevid modules from: '%s'" % (_block.getBdevidPath(),)) - - _block.load("scsi") - mpaths = _block.getMPaths(probeDrives) - log.debug("mpaths: %s" % (mpaths,)) - - def updateName(mp): - if dmNameUpdates.has_key(mp.name): - mp.set_name(dmNameUpdates[mp.name]) - cacheDrives.add(mp) - return mp - - return reduce(lambda x,y: x + [updateName(y),], mpaths, []) - -def renameMPath(mpath, name): - cacheDrives.rename(mpath, name) - -def startMPath(mpath): - if flags.mpath == 0: - return - mpath.prefix = '/dev/mapper/' - log.debug("starting mpath %s with mknod=True" % (mpath,)) - mpath.activate(mknod=True) - -def startAllMPath(driveList): - """Start all of the MPaths of the specified drives.""" - - if not flags.mpath: - return [] - log.debug("starting all mpaths on drives %s" % (driveList,)) - - try: - mpList = scanForMPath(driveList) - except Exception, e: - log.error("error scanning mpaths, disabling: %s" %(e,)) - flags.mpath = 0 - mpList = [] - - for mp in mpList: - startMPath(mp) - return mpList - -def stopMPath(mp): - if flags.mpath == 0: - return - - log.debug("stopping mpath %s" % (mp,)) - if mp.name in cacheDrives: - cacheDrives.remove(mp.name) - - mp.deactivate() - #block.removeDeviceMap(map) - -def stopAllMPath(mpList): - """Do a mpath stop on each of the mpath device tuples given.""" - - if not flags.mpath: - return - log.debug("stopping all mpaths") - for mp in mpList: - stopMPath(mp) - -- 1.6.1.3 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list