diff --git a/lib/config.py b/lib/config.py index f4e1ab2a14d213e318c850613e6c87ee235f974c..b5d16bcc9fc53f4b2c769e4b580a68ffb012e153 100644 --- a/lib/config.py +++ b/lib/config.py @@ -43,23 +43,6 @@ from ganeti import rpc from ganeti import objects -def _my_uuidgen(): - """Poor-man's uuidgen using the uuidgen binary. - - """ - result = utils.RunCmd(["uuidgen", "-r"]) - if result.failed: - return None - return result.stdout.rstrip('\n') - - -try: - import uuid - _uuidgen = uuid.uuid4 -except ImportError: - _uuidgen = _my_uuidgen - - class ConfigWriter: """The interface to the cluster configuration. @@ -149,7 +132,7 @@ class ConfigWriter: existing.update(exceptions) retries = 64 while retries > 0: - unique_id = _uuidgen() + unique_id = utils.GetUUID() if unique_id not in existing and unique_id is not None: break else: diff --git a/lib/utils.py b/lib/utils.py index 7038ac78066dd6a4a7ad8990fad16de915ab4d92..fc7dcdbe9598d1e393bac2a18dfa1563a4faa941 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -834,3 +834,14 @@ def GetHomeDir(uid, default=None): except KeyError: return default return result.pw_dir + + +def GetUUID(): + """Returns a random UUID. + + """ + f = open("/proc/sys/kernel/random/uuid", "r") + try: + return f.read(128).rstrip("\n") + finally: + f.close() diff --git a/test/ganeti.utils_unittest.py b/test/ganeti.utils_unittest.py index 40e9d79874c6c938dc110e3103c7ee20a6cc617f..4de493a32a0a183259b0d7422e1a1ced230c3d99 100755 --- a/test/ganeti.utils_unittest.py +++ b/test/ganeti.utils_unittest.py @@ -29,9 +29,11 @@ import os.path import md5 import socket import shutil +import re import ganeti from ganeti import constants +from ganeti import utils from ganeti.utils import IsProcessAlive, Lock, Unlock, RunCmd, \ RemoveFile, CheckDict, MatchNameComponent, FormatUnit, \ ParseUnit, AddAuthorizedKey, RemoveAuthorizedKey, \ @@ -539,5 +541,15 @@ class TestListVisibleFiles(unittest.TestCase): self._test(files, expected) +class TestGetUUID(unittest.TestCase): + """Test case for GetUUID""" + + _re_uuid = re.compile('^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-' + '[a-f0-9]{4}-[a-f0-9]{12}$') + + def runTest(self): + self.failUnless(self._re_uuid.match(utils.GetUUID())) + + if __name__ == '__main__': unittest.main()