Revision 767d52d3

b/lib/bdev.py
540 540
  Note that this doesn't support unconfigured devices (cs:Unconfigured).
541 541

  
542 542
  """
543
  UNCONF_RE = re.compile(r"\s*[0-9]+:\s*cs:Unconfigured$")
543 544
  LINE_RE = re.compile(r"\s*[0-9]+:\s*cs:(\S+)\s+st:([^/]+)/(\S+)"
544 545
                       "\s+ds:([^/]+)/(\S+)\s+.*$")
545 546
  SYNC_RE = re.compile(r"^.*\ssync'ed:\s*([0-9.]+)%.*"
546 547
                       "\sfinish: ([0-9]+):([0-9]+):([0-9]+)\s.*$")
547 548

  
548 549
  def __init__(self, procline):
549
    m = self.LINE_RE.match(procline)
550
    if not m:
551
      raise errors.BlockDeviceError("Can't parse input data '%s'" % procline)
552
    self.cstatus = m.group(1)
553
    self.lrole = m.group(2)
554
    self.rrole = m.group(3)
555
    self.ldisk = m.group(4)
556
    self.rdisk = m.group(5)
550
    u = self.UNCONF_RE.match(procline)
551
    if u:
552
      self.cstatus = "Unconfigured"
553
      self.lrole = self.rrole = self.ldisk = self.rdisk = None
554
    else:
555
      m = self.LINE_RE.match(procline)
556
      if not m:
557
        raise errors.BlockDeviceError("Can't parse input data '%s'" % procline)
558
      self.cstatus = m.group(1)
559
      self.lrole = m.group(2)
560
      self.rrole = m.group(3)
561
      self.ldisk = m.group(4)
562
      self.rdisk = m.group(5)
563

  
564
    # end reading of data from the LINE_RE or UNCONF_RE
557 565

  
558 566
    self.is_standalone = self.cstatus == "StandAlone"
559 567
    self.is_wfconn = self.cstatus == "WFConnection"
......
568 576
    self.is_diskless = self.ldisk == "Diskless"
569 577
    self.is_disk_uptodate = self.ldisk == "UpToDate"
570 578

  
571
    self.is_in_resync = self.cstatus in ('SyncSource', 'SyncTarget')
579
    self.is_in_resync = self.cstatus in ("SyncSource", "SyncTarget")
580
    self.is_in_use = self.cstatus != "Unconfigured"
572 581

  
573 582
    m = self.SYNC_RE.match(procline)
574 583
    if m:
......
1525 1534
    """
1526 1535
    if len(children) != 2:
1527 1536
      raise errors.ProgrammerError("Invalid setup for the drbd device")
1537
    # check that the minor is unused
1538
    aminor = unique_id[4]
1539
    proc_info = cls._MassageProcData(cls._GetProcData())
1540
    if aminor in proc_info:
1541
      status = DRBD8Status(proc_info[aminor])
1542
      in_use = status.is_in_use
1543
    else:
1544
      in_use = False
1545
    if in_use:
1546
      raise errors.BlockDeviceError("DRBD minor %d already in use at"
1547
                                    " Create() time" % aminor)
1528 1548
    meta = children[1]
1529 1549
    meta.Assemble()
1530 1550
    if not meta.Attach():
b/test/ganeti.bdev_unittest.py
117 117
  def testMinor0(self):
118 118
    """Test connected, primary device"""
119 119
    stats = bdev.DRBD8Status(self.mass_data[0])
120
    self.failUnless(stats.is_in_use)
120 121
    self.failUnless(stats.is_connected and stats.is_primary and
121 122
                    stats.peer_secondary and stats.is_disk_uptodate)
122 123

  
123 124
  def testMinor1(self):
124 125
    """Test connected, secondary device"""
125 126
    stats = bdev.DRBD8Status(self.mass_data[1])
127
    self.failUnless(stats.is_in_use)
126 128
    self.failUnless(stats.is_connected and stats.is_secondary and
127 129
                    stats.peer_primary and stats.is_disk_uptodate)
128 130

  
131
  def testMinor2(self):
132
    """Test unconfigured device"""
133
    stats = bdev.DRBD8Status(self.mass_data[2])
134
    self.failIf(stats.is_in_use)
135

  
129 136
  def testMinor4(self):
130 137
    """Test WFconn device"""
131 138
    stats = bdev.DRBD8Status(self.mass_data[4])
139
    self.failUnless(stats.is_in_use)
132 140
    self.failUnless(stats.is_wfconn and stats.is_primary and
133 141
                    stats.rrole == 'Unknown' and
134 142
                    stats.is_disk_uptodate)
......
136 144
  def testMinor6(self):
137 145
    """Test diskless device"""
138 146
    stats = bdev.DRBD8Status(self.mass_data[6])
147
    self.failUnless(stats.is_in_use)
139 148
    self.failUnless(stats.is_connected and stats.is_secondary and
140 149
                    stats.peer_primary and stats.is_diskless)
141 150

  
142 151
  def testMinor8(self):
143 152
    """Test standalone device"""
144 153
    stats = bdev.DRBD8Status(self.mass_data[8])
154
    self.failUnless(stats.is_in_use)
145 155
    self.failUnless(stats.is_standalone and
146 156
                    stats.rrole == 'Unknown' and
147 157
                    stats.is_disk_uptodate)

Also available in: Unified diff