From 59072e7ee8eda9f26140265bd4b36ee1c87e5547 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Thu, 11 Oct 2007 12:04:44 +0000
Subject: [PATCH] Use the kernel's ability to generate UUIDs.

This removes the dependency on either the uuid module or e2fsprogs' uuidgen.

Reviewed-by: iustinp
---
 lib/config.py                 | 19 +------------------
 lib/utils.py                  | 11 +++++++++++
 test/ganeti.utils_unittest.py | 12 ++++++++++++
 3 files changed, 24 insertions(+), 18 deletions(-)

diff --git a/lib/config.py b/lib/config.py
index f4e1ab2a1..b5d16bcc9 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 7038ac780..fc7dcdbe9 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 40e9d7987..4de493a32 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()
-- 
GitLab