Revision 0ae0663d
b/tools/lvmstrap | ||
---|---|---|
45 | 45 |
import optparse |
46 | 46 |
import time |
47 | 47 |
import errno |
48 |
import re |
|
48 | 49 |
|
49 | 50 |
from ganeti.utils import RunCmd, ReadFile |
50 | 51 |
from ganeti import constants |
... | ... | |
78 | 79 |
"devpts", |
79 | 80 |
]) |
80 | 81 |
|
82 |
#: A regular expression that matches partitions (must be kept in sync |
|
83 |
# with L{SUPPORTED_TYPES} |
|
84 |
PART_RE = re.compile("^((?:h|s|m|ub)d[a-z]{1,2})[0-9]+$") |
|
85 |
|
|
81 | 86 |
#: Minimum partition size to be considered (1 GB) |
82 | 87 |
PART_MINSIZE = 1024 * 1024 * 1024 |
83 | 88 |
|
... | ... | |
200 | 205 |
Currently only md devices are used as is. |
201 | 206 |
|
202 | 207 |
""" |
203 |
return not disk.startswith('md')
|
|
208 |
return not (disk.startswith('md') or PART_RE.match(disk))
|
|
204 | 209 |
|
205 | 210 |
|
206 | 211 |
def DeviceName(disk): |
... | ... | |
217 | 222 |
return device |
218 | 223 |
|
219 | 224 |
|
225 |
def SysfsName(disk): |
|
226 |
"""Returns the sysfs name for a disk or partition. |
|
227 |
|
|
228 |
""" |
|
229 |
match = PART_RE.match(disk) |
|
230 |
if match: |
|
231 |
# this is a partition, which resides in /sys/block under a different name |
|
232 |
disk = "%s/%s" % (match.group(1), disk) |
|
233 |
return "/sys/block/%s" % disk |
|
234 |
|
|
235 |
|
|
220 | 236 |
def ExecCommand(command): |
221 | 237 |
"""Executes a command. |
222 | 238 |
|
... | ... | |
453 | 469 |
partsize = ReadSize(partsysfsname) |
454 | 470 |
if partsize >= PART_MINSIZE: |
455 | 471 |
CheckSysDev(partname, partdev) |
456 |
partitions.append((partname, partsize, partdev)) |
|
472 |
partinuse = InUse(partname) |
|
473 |
partitions.append((partname, partsize, partdev, partinuse)) |
|
457 | 474 |
partitions.sort() |
458 | 475 |
dlist.append((name, size, dev, partitions, inuse)) |
459 | 476 |
dlist.sort() |
... | ... | |
537 | 554 |
choice about which disks should be allocated to our volume group. |
538 | 555 |
|
539 | 556 |
""" |
557 |
def _inuse(inuse): |
|
558 |
if inuse: |
|
559 |
return "yes" |
|
560 |
else: |
|
561 |
return "no" |
|
562 |
|
|
540 | 563 |
mounts = GetMountInfo() |
541 | 564 |
dlist = GetDiskList(opts) |
542 | 565 |
|
... | ... | |
554 | 577 |
flatlist = [] |
555 | 578 |
# Flatten the [(disk, [partition,...]), ...] list |
556 | 579 |
for name, size, dev, parts, inuse in dlist: |
557 |
if inuse: |
|
558 |
str_inuse = "yes" |
|
559 |
else: |
|
560 |
str_inuse = "no" |
|
561 |
flatlist.append((name, size, dev, str_inuse)) |
|
562 |
for partname, partsize, partdev in parts: |
|
563 |
flatlist.append((partname, partsize, partdev, "")) |
|
580 |
flatlist.append((name, size, dev, _inuse(inuse))) |
|
581 |
for partname, partsize, partdev, partinuse in parts: |
|
582 |
flatlist.append((partname, partsize, partdev, _inuse(partinuse))) |
|
564 | 583 |
|
565 | 584 |
strlist = [] |
566 | 585 |
for name, size, dev, in_use in flatlist: |
... | ... | |
598 | 617 |
|
599 | 618 |
""" |
600 | 619 |
try: |
601 |
contents = os.listdir("/sys/block/%s/holders/" % name)
|
|
620 |
contents = os.listdir("%s/holders/" % SysfsName(name))
|
|
602 | 621 |
except OSError, err: |
603 | 622 |
if err.errno == errno.ENOENT: |
604 | 623 |
contents = [] |
... | ... | |
647 | 666 |
|
648 | 667 |
""" |
649 | 668 |
minfo = GetMountInfo() |
650 |
dev = ReadDev("/sys/block/%s" % name)
|
|
669 |
dev = ReadDev(SysfsName(name))
|
|
651 | 670 |
return dev not in minfo |
652 | 671 |
|
653 | 672 |
|
... | ... | |
786 | 805 |
" non-removable block devices).") |
787 | 806 |
sysd_free = [] |
788 | 807 |
sysd_used = [] |
789 |
for name, _, _, _, used in sysdisks:
|
|
808 |
for name, _, _, parts, used in sysdisks:
|
|
790 | 809 |
if used: |
791 | 810 |
sysd_used.append(name) |
811 |
for partname, _, _, partused in parts: |
|
812 |
if partused: |
|
813 |
sysd_used.append(partname) |
|
814 |
else: |
|
815 |
sysd_free.append(partname) |
|
792 | 816 |
else: |
793 | 817 |
sysd_free.append(name) |
794 | 818 |
|
Also available in: Unified diff