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