The _VerifyNodeDrbd method produces a map of minor numbers -> ganeti
relevant information, which can be tested and documented in
isolation.
This was a regression on a development branch and this test catches
the problem.

Signed-off-by: Aaron Karper <[email protected]>
---
 lib/cmdlib/cluster/verify.py       | 37 +++++++++++++++++++++++++++----------
 test/py/cmdlib/cluster_unittest.py | 13 +++++++++++++
 2 files changed, 40 insertions(+), 10 deletions(-)

diff --git a/lib/cmdlib/cluster/verify.py b/lib/cmdlib/cluster/verify.py
index 5d381be..5e8ca86 100644
--- a/lib/cmdlib/cluster/verify.py
+++ b/lib/cmdlib/cluster/verify.py
@@ -1179,28 +1179,24 @@ class LUClusterVerifyGroup(LogicalUnit, _VerifyErrors):
         self._ErrorIf(test, constants.CV_ENODEDRBDHELPER, ninfo.name,
                       "wrong drbd usermode helper: %s", payload)
 
-  def _VerifyNodeDrbd(self, ninfo, nresult, instanceinfo, disks_info,
-                      drbd_helper, drbd_map):
-    """Verifies and the node DRBD status.
+  @staticmethod
+  def _ComputeDrbdMinors(ninfo, instanceinfo, disks_info, drbd_map, error_if):
+    """Gives the DRBD information in a map for a node.
 
     @type ninfo: L{objects.Node}
     @param ninfo: the node to check
-    @param nresult: the remote results for the node
     @param instanceinfo: the dict of instances
     @param disks_info: the dict of disks
-    @param drbd_helper: the configured DRBD usermode helper
     @param drbd_map: the DRBD map as returned by
         L{ganeti.config.ConfigWriter.ComputeDRBDMap}
+    @return: dict from minor number to (disk_uuid, instance_uuid, active)
 
     """
-    self._VerifyNodeDrbdHelper(ninfo, nresult, drbd_helper)
-
-    # compute the DRBD minors
     node_drbd = {}
     for minor, disk_uuid in drbd_map[ninfo.uuid].items():
       test = disk_uuid not in disks_info
-      self._ErrorIf(test, constants.CV_ECLUSTERCFG, None,
-                    "ghost disk '%s' in temporary DRBD map", disk_uuid)
+      error_if(test, constants.CV_ECLUSTERCFG, None,
+               "ghost disk '%s' in temporary DRBD map", disk_uuid)
         # ghost disk should not be active, but otherwise we
         # don't give double warnings (both ghost disk and
         # unallocated minor in use)
@@ -1215,6 +1211,27 @@ class LUClusterVerifyGroup(LogicalUnit, _VerifyErrors):
             disk_instance = inst_uuid
             break
         node_drbd[minor] = (disk_uuid, disk_instance, disk_active)
+    return node_drbd
+
+  def _VerifyNodeDrbd(self, ninfo, nresult, instanceinfo, disks_info,
+                      drbd_helper, drbd_map):
+    """Verifies and the node DRBD status.
+
+    @type ninfo: L{objects.Node}
+    @param ninfo: the node to check
+    @param nresult: the remote results for the node
+    @param instanceinfo: the dict of instances
+    @param disks_info: the dict of disks
+    @param drbd_helper: the configured DRBD usermode helper
+    @param drbd_map: the DRBD map as returned by
+        L{ganeti.config.ConfigWriter.ComputeDRBDMap}
+
+    """
+    self._VerifyNodeDrbdHelper(ninfo, nresult, drbd_helper)
+
+    # compute the DRBD minors
+    node_drbd = self._ComputeDrbdMinors(ninfo, instanceinfo, disks_info,
+                                        drbd_map, self._ErrorIf)
 
     # and now check them
     used_minors = nresult.get(constants.NV_DRBDLIST, [])
diff --git a/test/py/cmdlib/cluster_unittest.py 
b/test/py/cmdlib/cluster_unittest.py
index 136b7ed..f9016f5 100644
--- a/test/py/cmdlib/cluster_unittest.py
+++ b/test/py/cmdlib/cluster_unittest.py
@@ -1165,6 +1165,19 @@ class TestLUClusterVerifyGroup(CmdlibTestCase):
 
     self.ExecOpCode(op)
 
+  def testVerifyNodeDrbdSuccess(self):
+    ninfo = self.cfg.AddNewNode()
+    disk = self.cfg.CreateDisk(dev_type=constants.DT_DRBD8,
+                                primary_node=self.master,
+                                secondary_node=ninfo)
+    instance = self.cfg.AddNewInstance(disks=[disk])
+    instanceinfo = self.cfg.GetAllInstancesInfo()
+    disks_info = self.cfg.GetAllDisksInfo()
+    drbd_map = {ninfo.uuid: {0: disk.uuid}}
+    minors = verify.LUClusterVerifyGroup._ComputeDrbdMinors(
+      ninfo, instanceinfo, disks_info, drbd_map, lambda *args: None)
+    self.assertEquals(minors, {0: (disk.uuid, instance.uuid, False)})
+
 
 class TestLUClusterVerifyClientCerts(CmdlibTestCase):
 
-- 
2.2.0.rc0.207.ga3a616c

Reply via email to