From 0e5084eeb39f75fc5910e1d4d4ad2449e471d603 Mon Sep 17 00:00:00 2001
From: Michael Hanselmann <hansmi@google.com>
Date: Thu, 4 Aug 2011 18:38:38 +0200
Subject: [PATCH] utils.ReadFile: Add pre-read callback

This will be used by the watcher to store the file's fstat(2). It must
be done from the filehandle.

Signed-off-by: Michael Hanselmann <hansmi@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 lib/utils/io.py                  | 7 ++++++-
 test/ganeti.utils.io_unittest.py | 6 ++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/lib/utils/io.py b/lib/utils/io.py
index 4c1df6c17..413a119c7 100644
--- a/lib/utils/io.py
+++ b/lib/utils/io.py
@@ -38,17 +38,22 @@ from ganeti.utils import filelock
 _RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
 
 
-def ReadFile(file_name, size=-1):
+def ReadFile(file_name, size=-1, preread=None):
   """Reads a file.
 
   @type size: int
   @param size: Read at most size bytes (if negative, entire file)
+  @type preread: callable receiving file handle as single parameter
+  @param preread: Function called before file is read
   @rtype: str
   @return: the (possibly partial) content of the file
 
   """
   f = open(file_name, "r")
   try:
+    if preread:
+      preread(f)
+
     return f.read(size)
   finally:
     f.close()
diff --git a/test/ganeti.utils.io_unittest.py b/test/ganeti.utils.io_unittest.py
index ed67f6898..be1b4abb6 100755
--- a/test/ganeti.utils.io_unittest.py
+++ b/test/ganeti.utils.io_unittest.py
@@ -55,6 +55,12 @@ class TestReadFile(testutils.GanetiTestCase):
     h.update(data)
     self.assertEqual(h.hexdigest(), "893772354e4e690b9efd073eed433ce7")
 
+  def testCallback(self):
+    def _Cb(fh):
+      self.assertEqual(fh.tell(), 0)
+    data = utils.ReadFile(self._TestDataFilename("cert1.pem"), preread=_Cb)
+    self.assertEqual(len(data), 814)
+
   def testError(self):
     self.assertRaises(EnvironmentError, utils.ReadFile,
                       "/dev/null/does-not-exist")
-- 
GitLab