summaryrefslogtreecommitdiffstats
path: root/pyanaconda/storage/devicelibs/mdraid.py
diff options
context:
space:
mode:
Diffstat (limited to 'pyanaconda/storage/devicelibs/mdraid.py')
-rw-r--r--pyanaconda/storage/devicelibs/mdraid.py280
1 files changed, 0 insertions, 280 deletions
diff --git a/pyanaconda/storage/devicelibs/mdraid.py b/pyanaconda/storage/devicelibs/mdraid.py
deleted file mode 100644
index ab18641ac..000000000
--- a/pyanaconda/storage/devicelibs/mdraid.py
+++ /dev/null
@@ -1,280 +0,0 @@
-#
-# mdraid.py
-# mdraid functions
-#
-# Copyright (C) 2009 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): Dave Lehman <dlehman@redhat.com>
-#
-
-import os
-
-from .. import util
-from ..errors import *
-
-import gettext
-_ = lambda x: gettext.ldgettext("anaconda", x)
-
-import logging
-log = logging.getLogger("storage")
-
-# these defaults were determined empirically
-MD_SUPERBLOCK_SIZE = 2.0 # MB
-MD_CHUNK_SIZE = 0.5 # MB
-
-# raidlevels constants
-RAID10 = 10
-RAID6 = 6
-RAID5 = 5
-RAID4 = 4
-RAID1 = 1
-RAID0 = 0
-
-def getRaidLevels():
- mdstat_descriptors = {
- RAID10: ("[RAID10]", "[raid10]"),
- RAID6: ("[RAID6]", "[raid6]"),
- RAID5: ("[RAID5]", "[raid5]"),
- RAID4: ("[RAID4]", "[raid4]"),
- RAID1: ("[RAID1]", "[raid1]"),
- RAID0: ("[RAID0]", "[raid0]"),
- }
- avail = []
- try:
- f = open("/proc/mdstat", "r")
- except IOError:
- pass
- else:
- for l in f.readlines():
- if not l.startswith("Personalities"):
- continue
-
- lst = l.split()
-
- for level in mdstat_descriptors:
- for d in mdstat_descriptors[level]:
- if d in lst:
- avail.append(level)
- break
-
- f.close()
-
- avail.sort()
- return avail
-
-raid_levels = getRaidLevels()
-
-raid_descriptors = {RAID10: ("raid10", "RAID10", "10", 10),
- RAID6: ("raid6", "RAID6", "6", 6),
- RAID5: ("raid5", "RAID5", "5", 5),
- RAID4: ("raid4", "RAID4", "4", 4),
- RAID1: ("raid1", "mirror", "RAID1", "1", 1),
- RAID0: ("raid0", "stripe", "RAID0", "0", 0)}
-
-def raidLevel(descriptor):
- for level in raid_levels:
- if isRaid(level, descriptor):
- return level
- else:
- raise MDRaidError("invalid raid level descriptor %s" % descriptor)
-
-def raidLevelString(level):
- if level in raid_descriptors.keys():
- return raid_descriptors[level][0]
- else:
- raise MDRaidError("invalid raid level constant %s" % level)
-
-def isRaid(raid, raidlevel):
- """Return whether raidlevel is a valid descriptor of raid"""
- if raid in raid_descriptors:
- return raidlevel in raid_descriptors[raid]
- else:
- raise MDRaidError("invalid raid level %d" % raid)
-
-def get_raid_min_members(raidlevel):
- """Return the minimum number of raid members required for raid level"""
- raid_min_members = {RAID10: 2,
- RAID6: 4,
- RAID5: 3,
- RAID4: 3,
- RAID1: 2,
- RAID0: 2}
-
- for raid, min_members in raid_min_members.items():
- if isRaid(raid, raidlevel):
- return min_members
-
- raise MDRaidError("invalid raid level %d" % raidlevel)
-
-def get_raid_max_spares(raidlevel, nummembers):
- """Return the maximum number of raid spares for raidlevel."""
- raid_max_spares = {RAID10: lambda: max(0, nummembers - get_raid_min_members(RAID10)),
- RAID6: lambda: max(0, nummembers - get_raid_min_members(RAID6)),
- RAID5: lambda: max(0, nummembers - get_raid_min_members(RAID5)),
- RAID4: lambda: max(0, nummembers - get_raid_min_members(RAID4)),
- RAID1: lambda: max(0, nummembers - get_raid_min_members(RAID1)),
- RAID0: lambda: 0}
-
- for raid, max_spares_func in raid_max_spares.items():
- if isRaid(raid, raidlevel):
- return max_spares_func()
-
- raise MDRaidError("invalid raid level %d" % raidlevel)
-
-def get_member_space(size, disks, level=None):
- space = 0 # size of *each* member device
-
- if isinstance(level, str):
- level = raidLevel(level)
-
- min_members = get_raid_min_members(level)
- if disks < min_members:
- raise MDRaidError("raid%d requires at least %d disks"
- % (level, min_members))
-
- if level == RAID0:
- # you need the sum of the member sizes to equal your desired capacity
- space = size / disks
- elif level == RAID1:
- # you need each member's size to equal your desired capacity
- space = size
- elif level in (RAID4, RAID5):
- # you need the sum of all but one members' sizes to equal your desired
- # capacity
- space = size / (disks - 1)
- elif level == RAID6:
- # you need the sum of all but two members' sizes to equal your desired
- # capacity
- space = size / (disks - 2)
- elif level == RAID10:
- # you need the sum of the member sizes to equal twice your desired
- # capacity
- space = size / (disks / 2.0)
-
- space += MD_SUPERBLOCK_SIZE
-
- return space * disks
-
-def mdadm(args):
- ret = util.run_program(["mdadm"] + args)
- if ret:
- raise MDRaidError("running mdadm " + " ".join(args) + " failed")
-
-def mdcreate(device, level, disks, spares=0, metadataVer=None, bitmap=False):
- argv = ["--create", device, "--run", "--level=%s" % level]
- raid_devs = len(disks) - spares
- argv.append("--raid-devices=%d" % raid_devs)
- if spares:
- argv.append("--spare-devices=%d" % spares)
- if metadataVer:
- argv.append("--metadata=%s" % metadataVer)
- if bitmap:
- argv.append("--bitmap=internal")
- argv.extend(disks)
-
- try:
- mdadm(argv)
- except MDRaidError as msg:
- raise MDRaidError("mdcreate failed for %s: %s" % (device, msg))
-
-def mddestroy(device):
- args = ["--zero-superblock", device]
-
- try:
- mdadm(args)
- except MDRaidError as msg:
- raise MDRaidError("mddestroy failed for %s: %s" % (device, msg))
-
-def mdadd(device):
- args = ["--incremental", "--quiet"]
- args.append(device)
-
- try:
- mdadm(args)
- except MDRaidError as msg:
- raise MDRaidError("mdadd failed for %s: %s" % (device, msg))
-
-def mdactivate(device, members=[], super_minor=None, uuid=None):
- if super_minor is None and not uuid:
- raise MDRaidError("mdactivate requires either a uuid or a super-minor")
-
- if uuid:
- identifier = "--uuid=%s" % uuid
- else:
- identifier = ""
-
- args = ["--assemble", device, identifier, "--run"]
- args += members
-
- try:
- mdadm(args)
- except MDRaidError as msg:
- raise MDRaidError("mdactivate failed for %s: %s" % (device, msg))
-
-def mddeactivate(device):
- args = ["--stop", device]
-
- try:
- mdadm(args)
- except MDRaidError as msg:
- raise MDRaidError("mddeactivate failed for %s: %s" % (device, msg))
-
-def mdexamine(device):
- _vars = util.capture_output(["mdadm",
- "--examine", "--brief", device]).split()
-
- info = {}
- if len(_vars) > 1 and _vars[1].startswith("/dev/md"):
- info["device"] = _vars[1]
- _vars = _vars[2:]
- elif len(_vars) > 1:
- _vars = _vars[1:]
-
- for var in _vars:
- (name, equals, value) = var.partition("=")
- if not equals:
- continue
-
- info[name.lower()] = value.strip()
-
- return info
-
-def md_node_from_name(name):
- named_path = "/dev/md/" + name
- try:
- node = os.path.basename(os.readlink(named_path))
- except OSError as e:
- raise MDRaidError("md_node_from_name failed: %s" % e)
- else:
- return node
-
-def name_from_md_node(node):
- md_dir = "/dev/md"
- name = None
- # It's sad, but it's what we've got.
- for link in os.listdir(md_dir):
- full_path = "%s/%s" % (md_dir, link)
- md_name = os.path.basename(os.readlink(full_path))
- log.debug("link: %s -> %s" % (link, os.readlink(full_path)))
- if md_name == node:
- name = link
- break
-
- if not name:
- raise MDRaidError("name_from_md_node(%s) failed" % node)
-
- log.debug("returning %s" % name)
- return name