]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Correct unwatch_log to support python <= 2.7.5
authorCedric Brandily <zzelle@gmail.com>
Thu, 26 Nov 2015 15:21:30 +0000 (15:21 +0000)
committerCedric Brandily <zzelle@gmail.com>
Thu, 26 Nov 2015 17:22:30 +0000 (17:22 +0000)
Currently unwatch_log[1] uses WatchedFileHandler.delay attribute to
build a FileHandler instance from a WatchedFileHandler instance but
this attribute doesn't exist before 2.7.6.

This change removes WatchedFileHandler.delay usage and uses default
FileHandler delay (it also ensures we open immediately the log file).

[1] neutron.agent.linux.daemon

Closes-Bug: #1520271
Change-Id: I70a156c4aeeda8a3adcc1036d670732c21ffa335

neutron/agent/linux/daemon.py
neutron/tests/unit/agent/linux/test_daemon.py

index 7f786e24158fee7f70337db479672aaeb8cb3d3f..f043920a7ad268b0d19f5553603e66e19a9cc70d 100644 (file)
@@ -81,10 +81,11 @@ def unwatch_log():
     to_replace = [h for h in log_root.handlers
                   if isinstance(h, handlers.WatchedFileHandler)]
     for handler in to_replace:
+        # NOTE(cbrandily): we use default delay(=False) to ensure the log file
+        # is opened before privileges drop.
         new_handler = std_logging.FileHandler(handler.baseFilename,
                                               mode=handler.mode,
-                                              encoding=handler.encoding,
-                                              delay=handler.delay)
+                                              encoding=handler.encoding)
         log_root.removeHandler(handler)
         log_root.addHandler(new_handler)
 
index 749b1e264d6b846ae9bcea257841c8e484eb9d6d..c093909f05a68a0f1c99b71adcb9320fd4c61994 100644 (file)
@@ -13,7 +13,8 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-
+import logging
+from logging import handlers
 import os
 import sys
 
@@ -33,6 +34,23 @@ class FakeEntry(object):
         setattr(self, name, value)
 
 
+class TestUnwatchLog(base.BaseTestCase):
+
+    def test_unwatch_log(self):
+        stream_handler = logging.StreamHandler()
+        logger = logging.Logger('fake')
+        logger.addHandler(stream_handler)
+        logger.addHandler(handlers.WatchedFileHandler('/tmp/filename1'))
+
+        with mock.patch('logging.getLogger', return_value=logger):
+            daemon.unwatch_log()
+            self.assertEqual(2, len(logger.handlers))
+            logger.handlers.remove(stream_handler)
+            observed = logger.handlers[0]
+            self.assertEqual(logging.FileHandler, type(observed))
+            self.assertEqual('/tmp/filename1', observed.baseFilename)
+
+
 class TestPrivileges(base.BaseTestCase):
     def test_setuid_with_name(self):
         with mock.patch('pwd.getpwnam', return_value=FakeEntry('pw_uid', 123)):