diff --git a/lib/utils.py b/lib/utils.py index beee428357d0bffa2c903546a19aa7a50d59dd83..479e267caab585164156b1e835ebb1a4eec9d476 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -1161,6 +1161,34 @@ def CheckVolumeGroupSize(vglist, vgname, minsize): return None +def SplitTime(seconds): + """Splits time as floating point number into a tuple. + + @param seconds: Time in seconds + @type seconds: int or float + @return: Tuple containing (seconds, milliseconds) + + """ + (seconds, fraction) = divmod(seconds, 1.0) + return (int(seconds), int(round(fraction * 1000, 0))) + + +def MergeTime(timetuple): + """Merges a tuple into time as a floating point number. + + @param timetuple: Time as tuple, (seconds, milliseconds) + @type timetuple: tuple + @return: Time as a floating point number expressed in seconds + + """ + (seconds, milliseconds) = timetuple + + assert 0 <= seconds, "Seconds must be larger than 0" + assert 0 <= milliseconds <= 999, "Milliseconds must be 0-999" + + return float(seconds) + (float(1) / 1000 * milliseconds) + + def LockedMethod(fn): """Synchronized object access decorator. diff --git a/test/ganeti.utils_unittest.py b/test/ganeti.utils_unittest.py index c1e3531e515910de329ff658b0780732fdbdb5c8..9ebcebc5233e33d3743b8dcd8d4a9702460cd4b9 100755 --- a/test/ganeti.utils_unittest.py +++ b/test/ganeti.utils_unittest.py @@ -778,5 +778,27 @@ class TestFileLock(unittest.TestCase): self.assertRaises(AssertionError, self.lock.Unlock, blocking=False) +class TestTimeFunctions(unittest.TestCase): + """Test case for time functions""" + + def runTest(self): + self.assertEqual(utils.SplitTime(1), (1, 0)) + self.assertEqual(utils.SplitTime(1.5), (1, 500)) + self.assertEqual(utils.SplitTime(1218448917.4809151), (1218448917, 481)) + + self.assertEqual(utils.MergeTime((1, 0)), 1.0) + self.assertEqual(utils.MergeTime((1, 500)), 1.5) + self.assertEqual(utils.MergeTime((1218448917, 500)), 1218448917.5) + + self.assertEqual(round(utils.MergeTime((1218448917, 481)), 3), 1218448917.481) + self.assertEqual(round(utils.MergeTime((1, 801)), 3), 1.801) + + self.assertRaises(AssertionError, utils.MergeTime, (0, -1)) + self.assertRaises(AssertionError, utils.MergeTime, (0, 1000)) + self.assertRaises(AssertionError, utils.MergeTime, (0, 9999)) + self.assertRaises(AssertionError, utils.MergeTime, (-1, 0)) + self.assertRaises(AssertionError, utils.MergeTime, (-9999, 0)) + + if __name__ == '__main__': unittest.main()