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