Revision 0ae0663d tools/lvmstrap

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