LGTM, thanks

On Tue, Apr 30, 2013 at 11:38 AM, Thomas Thrainer <[email protected]>wrote:

> gnt-cluster verify should issue a warning if there are multiple DRBD
> versions present in a node group. In order to do so, the DRBD version
> has to be queryable from noded.
>
> Signed-off-by: Thomas Thrainer <[email protected]>
> ---
>  lib/backend.py                        |  9 +++++++++
>  lib/block/drbd_info.py                | 29 ++++++++++++++++++++++++-----
>  lib/constants.py                      |  1 +
>  test/py/ganeti.block.drbd_unittest.py | 18 ++++++++++++++----
>  4 files changed, 48 insertions(+), 9 deletions(-)
>
> diff --git a/lib/backend.py b/lib/backend.py
> index 509e5e4..a4f1e71 100644
> --- a/lib/backend.py
> +++ b/lib/backend.py
> @@ -66,6 +66,7 @@ from ganeti import pathutils
>  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
>
>
> @@ -830,6 +831,14 @@ def VerifyNode(what, cluster_name):
>      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()
> diff --git a/lib/block/drbd_info.py b/lib/block/drbd_info.py
> index 991494c..ef6eda2 100644
> --- a/lib/block/drbd_info.py
> +++ b/lib/block/drbd_info.py
> @@ -149,7 +149,7 @@ class DRBD8Info(object):
>
>    """
>
> -  _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:([^ ]+).*$")
>
> @@ -164,6 +164,7 @@ class DRBD8Info(object):
>        - k_major
>        - k_minor
>        - k_point
> +      - k_fix (only on some drbd versions)
>        - api
>        - proto
>        - proto2 (only on drbd > 8.2.X)
> @@ -171,6 +172,22 @@ class DRBD8Info(object):
>      """
>      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.
>
> @@ -198,11 +215,13 @@ class DRBD8Info(object):
>        "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
>
> diff --git a/lib/constants.py b/lib/constants.py
> index 5e29b10..7054615 100644
> --- a/lib/constants.py
> +++ b/lib/constants.py
> @@ -1658,6 +1658,7 @@ CV_ALL_ECODES_STRINGS = \
>  # 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"
> diff --git a/test/py/ganeti.block.drbd_unittest.py b/test/py/
> ganeti.block.drbd_unittest.py
> index 112f5b1..757a286 100755
> --- a/test/py/ganeti.block.drbd_unittest.py
> +++ b/test/py/ganeti.block.drbd_unittest.py
> @@ -36,14 +36,22 @@ import testutils
>  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,
> @@ -61,14 +69,16 @@ class TestDRBD8(testutils.GanetiTestCase):
>          "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):
> --
> 1.8.2.1
>
>

Reply via email to