From 31155d60eed6d14d25979c41c031f746e51d3c7d Mon Sep 17 00:00:00 2001 From: Balazs Lecz <leczb@google.com> Date: Mon, 12 Jul 2010 17:54:47 +0100 Subject: [PATCH] Add ParseCpuMask() utility function Also adds a generic ParseError exception. Signed-off-by: Balazs Lecz <leczb@google.com> Reviewed-by: Michael Hanselmann <hansmi@google.com> --- lib/errors.py | 8 +++++++ lib/utils.py | 39 +++++++++++++++++++++++++++++++++++ test/ganeti.utils_unittest.py | 22 ++++++++++++++++++++ 3 files changed, 69 insertions(+) diff --git a/lib/errors.py b/lib/errors.py index 8618be2be..f03d65903 100644 --- a/lib/errors.py +++ b/lib/errors.py @@ -228,6 +228,14 @@ class UnitParseError(GenericError): """ +class ParseError(GenericError): + """Generic parse error. + + Raised when unable to parse user input. + + """ + + class TypeEnforcementError(GenericError): """Unable to enforce data type. diff --git a/lib/utils.py b/lib/utils.py index 6caa0fef5..f846f3b26 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -1299,6 +1299,45 @@ def ParseUnit(input_string): return value +def ParseCpuMask(cpu_mask): + """Parse a CPU mask definition and return the list of CPU IDs. + + CPU mask format: comma-separated list of CPU IDs + or dash-separated ID ranges + Example: "0-2,5" -> "0,1,2,5" + + @type cpu_mask: str + @param cpu_mask: CPU mask definition + @rtype: list of int + @return: list of CPU IDs + + """ + if not cpu_mask: + return [] + cpu_list = [] + for range_def in cpu_mask.split(","): + boundaries = range_def.split("-") + n_elements = len(boundaries) + if n_elements > 2: + raise errors.ParseError("Invalid CPU ID range definition" + " (only one hyphen allowed): %s" % range_def) + try: + lower = int(boundaries[0]) + except (ValueError, TypeError), err: + raise errors.ParseError("Invalid CPU ID value for lower boundary of" + " CPU ID range: %s" % str(err)) + try: + higher = int(boundaries[-1]) + except (ValueError, TypeError), err: + raise errors.ParseError("Invalid CPU ID value for higher boundary of" + " CPU ID range: %s" % str(err)) + if lower > higher: + raise errors.ParseError("Invalid CPU ID range definition" + " (%d > %d): %s" % (lower, higher, range_def)) + cpu_list.extend(range(lower, higher + 1)) + return cpu_list + + def AddAuthorizedKey(file_name, key): """Adds an SSH public key to an authorized_keys file. diff --git a/test/ganeti.utils_unittest.py b/test/ganeti.utils_unittest.py index 5ff5fc9f7..839838e86 100755 --- a/test/ganeti.utils_unittest.py +++ b/test/ganeti.utils_unittest.py @@ -996,6 +996,28 @@ class TestParseUnit(unittest.TestCase): self.assertRaises(errors.UnitParseError, ParseUnit, '1,3' + suffix) +class TestParseCpuMask(unittest.TestCase): + """Test case for the ParseCpuMask function.""" + + def testWellFormed(self): + self.assertEqual(utils.ParseCpuMask(""), []) + self.assertEqual(utils.ParseCpuMask("1"), [1]) + self.assertEqual(utils.ParseCpuMask("0-2,4,5-5"), [0,1,2,4,5]) + + def testInvalidInput(self): + self.assertRaises(errors.ParseError, + utils.ParseCpuMask, + "garbage") + self.assertRaises(errors.ParseError, + utils.ParseCpuMask, + "0,") + self.assertRaises(errors.ParseError, + utils.ParseCpuMask, + "0-1-2") + self.assertRaises(errors.ParseError, + utils.ParseCpuMask, + "2-1") + class TestSshKeys(testutils.GanetiTestCase): """Test case for the AddAuthorizedKey function""" -- GitLab