from ganeti import vcluster
from ganeti import ht
from ganeti.block.base import BlockDev
+from ganeti.block.drbd_info import DRBD8Info
from ganeti import hooksmaster
hyper = hypervisor.GetHypervisor(what[constants.NV_HVINFO])
result[constants.NV_HVINFO] = hyper.GetNodeInfo()
+ if constants.NV_DRBDVERSION in what and vm_capable:
+ try:
+ drbd_version = DRBD8Info.CreateFromFile().GetVersionString()
+ except errors.BlockDeviceError, err:
+ logging.warning("Can't get DRBD version", exc_info=True)
+ drbd_version = str(err)
+ result[constants.NV_DRBDVERSION] = drbd_version
+
if constants.NV_DRBDLIST in what and vm_capable:
try:
used_minors = drbd.DRBD8.GetUsedDevs()
"""
- _VERSION_RE = re.compile(r"^version: (\d+)\.(\d+)\.(\d+)(?:\.\d+)?"
+ _VERSION_RE = re.compile(r"^version: (\d+)\.(\d+)\.(\d+)(?:\.(\d+))?"
r" \(api:(\d+)/proto:(\d+)(?:-(\d+))?\)")
_VALID_LINE_RE = re.compile("^ *([0-9]+): cs:([^ ]+).*$")
- k_major
- k_minor
- k_point
+ - k_fix (only on some drbd versions)
- api
- proto
- proto2 (only on drbd > 8.2.X)
"""
return self._version
+ def GetVersionString(self):
+ """Return the DRBD version as a single string.
+
+ """
+ version = self.GetVersion()
+ retval = "%d.%d.%d" % \
+ (version["k_major"], version["k_minor"], version["k_point"])
+ if "k_fix" in version:
+ retval += ".%s" % version["k_fix"]
+
+ retval += " (api:%d/proto:%d" % (version["api"], version["proto"])
+ if "proto2" in version:
+ retval += "-%s" % version["proto2"]
+ retval += ")"
+ return retval
+
def GetMinors(self):
"""Return a list of minor for which information is available.
"k_major": int(values[0]),
"k_minor": int(values[1]),
"k_point": int(values[2]),
- "api": int(values[3]),
- "proto": int(values[4]),
+ "api": int(values[4]),
+ "proto": int(values[5]),
}
- if values[5] is not None:
- retval["proto2"] = values[5]
+ if values[3] is not None:
+ retval["k_fix"] = values[3]
+ if values[6] is not None:
+ retval["proto2"] = values[6]
return retval
# Node verify constants
NV_BRIDGES = "bridges"
NV_DRBDHELPER = "drbd-helper"
+NV_DRBDVERSION = "drbd-version"
NV_DRBDLIST = "drbd-list"
NV_EXCLUSIVEPVS = "exclusive-pvs"
NV_FILELIST = "filelist"
class TestDRBD8(testutils.GanetiTestCase):
def testGetVersion(self):
data = [
- ["version: 8.0.12 (api:76/proto:86-91)"],
- ["version: 8.2.7 (api:88/proto:0-100)"],
- ["version: 8.3.7.49 (api:188/proto:13-191)"],
+ "version: 8.0.0 (api:76/proto:80)",
+ "version: 8.0.12 (api:76/proto:86-91)",
+ "version: 8.2.7 (api:88/proto:0-100)",
+ "version: 8.3.7.49 (api:188/proto:13-191)",
]
result = [
{
"k_major": 8,
"k_minor": 0,
+ "k_point": 0,
+ "api": 76,
+ "proto": 80,
+ },
+ {
+ "k_major": 8,
+ "k_minor": 0,
"k_point": 12,
"api": 76,
"proto": 86,
"k_major": 8,
"k_minor": 3,
"k_point": 7,
+ "k_fix": "49",
"api": 188,
"proto": 13,
"proto2": "191",
}
]
for d, r in zip(data, result):
- info = drbd.DRBD8Info.CreateFromLines(d)
+ info = drbd.DRBD8Info.CreateFromLines([d])
self.assertEqual(info.GetVersion(), r)
+ self.assertEqual(info.GetVersionString(), d.replace("version: ", ""))
class TestDRBD8Runner(testutils.GanetiTestCase):