From 110641554798bc687a9fabe67e46a74cd05328ee Mon Sep 17 00:00:00 2001
From: Bernardo Dal Seno <bdalseno@google.com>
Date: Tue, 8 Jan 2013 21:54:29 +0100
Subject: [PATCH] utils.LvmExclusiveCheckNodePvs() returns more info

utils.LvmExclusiveCheckNodePvs() now returns the size of the smallest and
biggest PVs of a node. They will be used for cross-node consistency checks.

Signed-off-by: Bernardo Dal Seno <bdalseno@google.com>
Reviewed-by: Michael Hanselmann <hansmi@google.com>
---
 lib/bdev.py                          |  2 +-
 lib/utils/lvm.py                     | 10 ++++---
 test/py/ganeti.utils.lvm_unittest.py | 44 ++++++++++++++++++++++------
 3 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/lib/bdev.py b/lib/bdev.py
index 561325860..c0e5cf4a3 100644
--- a/lib/bdev.py
+++ b/lib/bdev.py
@@ -592,7 +592,7 @@ class LogicalVolume(BlockDev):
     stripes = min(current_pvs, desired_stripes)
 
     if excl_stor:
-      err_msgs = utils.LvmExclusiveCheckNodePvs(pvs_info)
+      (err_msgs, _) = utils.LvmExclusiveCheckNodePvs(pvs_info)
       if err_msgs:
         for m in err_msgs:
           logging.warning(m)
diff --git a/lib/utils/lvm.py b/lib/utils/lvm.py
index 3989795de..b1f6ff877 100644
--- a/lib/utils/lvm.py
+++ b/lib/utils/lvm.py
@@ -55,9 +55,11 @@ def LvmExclusiveCheckNodePvs(pvs_info):
 
   @type pvs_info: list
   @param pvs_info: list of L{LvmPvInfo} objects
-  @rtype: list
-  @return: A list of error strings described the violation found, or an empty
-      list if everything is ok
+  @rtype: tuple
+  @return: A pair composed of: 1. a list of error strings describing the
+    violations found, or an empty list if everything is ok; 2. a pair
+    containing the sizes of the smallest and biggest PVs, in MiB.
+
   """
   errmsgs = []
   sizes = [pv.size for pv in pvs_info]
@@ -67,7 +69,7 @@ def LvmExclusiveCheckNodePvs(pvs_info):
   if LvmExclusiveTestBadPvSizes(small, big):
     m = ("Sizes of PVs are too different: min=%d max=%d" % (small, big))
     errmsgs.append(m)
-  return errmsgs
+  return (errmsgs, (small, big))
 
 
 def LvmExclusiveTestBadPvSizes(small, big):
diff --git a/test/py/ganeti.utils.lvm_unittest.py b/test/py/ganeti.utils.lvm_unittest.py
index b8412af47..eb85b6faf 100755
--- a/test/py/ganeti.utils.lvm_unittest.py
+++ b/test/py/ganeti.utils.lvm_unittest.py
@@ -43,40 +43,66 @@ class TestLvmExclusiveCheckNodePvs(unittest.TestCase):
   _EPS = 1e-4
 
   def testOnePv(self):
-    errmsgs = utils.LvmExclusiveCheckNodePvs([self._MED_PV])
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs([self._MED_PV])
     self.assertFalse(errmsgs)
+    self.assertEqual(small, self._MED_PV.size)
+    self.assertEqual(big, self._MED_PV.size)
 
   def testEqualPvs(self):
-    errmsgs = utils.LvmExclusiveCheckNodePvs([self._MED_PV] * 2)
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs(
+      [self._MED_PV] * 2)
     self.assertFalse(errmsgs)
-    errmsgs = utils.LvmExclusiveCheckNodePvs([self._SMALL_PV] * 3)
+    self.assertEqual(small, self._MED_PV.size)
+    self.assertEqual(big, self._MED_PV.size)
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs(
+      [self._SMALL_PV] * 3)
     self.assertFalse(errmsgs)
+    self.assertEqual(small, self._SMALL_PV.size)
+    self.assertEqual(big, self._SMALL_PV.size)
 
   def testTooDifferentPvs(self):
-    errmsgs = utils.LvmExclusiveCheckNodePvs([self._MED_PV, self._BIG_PV])
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs(
+      [self._MED_PV, self._BIG_PV])
     self.assertEqual(len(errmsgs), 1)
-    errmsgs = utils.LvmExclusiveCheckNodePvs([self._MED_PV, self._SMALL_PV])
+    self.assertEqual(small, self._MED_PV.size)
+    self.assertEqual(big, self._BIG_PV.size)
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs(
+      [self._MED_PV, self._SMALL_PV])
     self.assertEqual(len(errmsgs), 1)
+    self.assertEqual(small, self._SMALL_PV.size)
+    self.assertEqual(big, self._MED_PV.size)
 
   def testBoundarySizeCases(self):
     medpv1 = self._MED_PV.Copy()
     medpv2 = self._MED_PV.Copy()
-    errmsgs = utils.LvmExclusiveCheckNodePvs([medpv1, medpv2, self._MED_PV])
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs(
+      [medpv1, medpv2, self._MED_PV])
     self.assertFalse(errmsgs)
+    self.assertEqual(small, self._MED_PV.size)
+    self.assertEqual(big, self._MED_PV.size)
     # Just within the margins
     medpv1.size = self._MED_PV.size * (1 - constants.PART_MARGIN + self._EPS)
     medpv2.size = self._MED_PV.size * (1 + constants.PART_MARGIN - self._EPS)
-    errmsgs = utils.LvmExclusiveCheckNodePvs([medpv1, medpv2, self._MED_PV])
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs(
+      [medpv1, medpv2, self._MED_PV])
     self.assertFalse(errmsgs)
+    self.assertEqual(small, medpv1.size)
+    self.assertEqual(big, medpv2.size)
     # Just outside the margins
     medpv1.size = self._MED_PV.size * (1 - constants.PART_MARGIN - self._EPS)
     medpv2.size = self._MED_PV.size * (1 + constants.PART_MARGIN)
-    errmsgs = utils.LvmExclusiveCheckNodePvs([medpv1, medpv2, self._MED_PV])
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs(
+      [medpv1, medpv2, self._MED_PV])
     self.assertTrue(errmsgs)
+    self.assertEqual(small, medpv1.size)
+    self.assertEqual(big, medpv2.size)
     medpv1.size = self._MED_PV.size * (1 - constants.PART_MARGIN)
     medpv2.size = self._MED_PV.size * (1 + constants.PART_MARGIN + self._EPS)
-    errmsgs = utils.LvmExclusiveCheckNodePvs([medpv1, medpv2, self._MED_PV])
+    (errmsgs, (small, big)) = utils.LvmExclusiveCheckNodePvs(
+      [medpv1, medpv2, self._MED_PV])
     self.assertTrue(errmsgs)
+    self.assertEqual(small, medpv1.size)
+    self.assertEqual(big, medpv2.size)
 
 
 if __name__ == "__main__":
-- 
GitLab