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