From 46fbdd04c5e1666c3cac69ef2fdeb5129fb3f5be Mon Sep 17 00:00:00 2001
From: Iustin Pop <iustin@google.com>
Date: Mon, 20 Oct 2008 12:33:15 +0000
Subject: [PATCH] Convert cli.py to logging

We also add two function for printing messages, so that scripts won't
have to import logger to get these. They are a simple extension over the
logger ones, as they accept the call style from logging:
 ToStdout("Message: %s", msg)
(instead of requiring formatting by the client.

Reviewed-by: imsnah
---
 lib/cli.py                  | 53 ++++++++++++++++++++++++++++++++++---
 test/ganeti.cli_unittest.py | 26 ++++++++++++++++++
 2 files changed, 75 insertions(+), 4 deletions(-)

diff --git a/lib/cli.py b/lib/cli.py
index 956be3d1e..4de1c297b 100644
--- a/lib/cli.py
+++ b/lib/cli.py
@@ -27,6 +27,7 @@ import textwrap
 import os.path
 import copy
 import time
+import logging
 from cStringIO import StringIO
 
 from ganeti import utils
@@ -50,6 +51,7 @@ __all__ = ["DEBUG_OPT", "NOHDR_OPT", "SEP_OPT", "GenericMain",
            "FormatError", "SplitNodeOption", "SubmitOrSend",
            "JobSubmittedException", "FormatTimestamp", "ParseTimespec",
            "ValidateBeParams",
+           "ToStderr", "ToStdout",
            ]
 
 
@@ -626,7 +628,7 @@ def FormatError(err):
   msg = str(err)
   if isinstance(err, errors.ConfigurationError):
     txt = "Corrupt configuration file: %s" % msg
-    logger.Error(txt)
+    logging.error(txt)
     obuf.write(txt + "\n")
     obuf.write("Aborting.")
     retcode = 2
@@ -718,15 +720,16 @@ def GenericMain(commands, override=None, aliases=None):
   utils.debug = options.debug
 
   if old_cmdline:
-    logger.Info("run with arguments '%s'" % old_cmdline)
+    logging.info("run with arguments '%s'", old_cmdline)
   else:
-    logger.Info("run with no arguments")
+    logging.info("run with no arguments")
 
   try:
     result = func(options, args)
   except (errors.GenericError, luxi.ProtocolError), err:
     result, err_msg = FormatError(err)
-    logger.ToStderr(err_msg)
+    logging.exception("Error durring command processing")
+    ToStderr(err_msg)
 
   return result
 
@@ -858,3 +861,45 @@ def ParseTimespec(value):
     except ValueError:
       raise errors.OpPrereqError("Invalid time specification '%s'" % value)
   return value
+
+
+def _ToStream(stream, txt, *args):
+  """Write a message to a stream, bypassing the logging system
+
+  @type stream: file object
+  @param stream: the file to which we should write
+  @type txt: str
+  @param txt: the message
+
+  """
+  if args:
+    args = tuple(args)
+    stream.write(txt % args)
+  else:
+    stream.write(txt)
+  stream.write('\n')
+  stream.flush()
+
+
+def ToStdout(txt, *args):
+  """Write a message to stdout only, bypassing the logging system
+
+  This is just a wrapper over _ToStream.
+
+  @type txt: str
+  @param txt: the message
+
+  """
+  _ToStream(sys.stdout, txt, *args)
+
+
+def ToStderr(txt, *args):
+  """Write a message to stderr only, bypassing the logging system
+
+  This is just a wrapper over _ToStream.
+
+  @type txt: str
+  @param txt: the message
+
+  """
+  _ToStream(sys.stderr, txt, *args)
diff --git a/test/ganeti.cli_unittest.py b/test/ganeti.cli_unittest.py
index cb3b788ae..29734ae0c 100755
--- a/test/ganeti.cli_unittest.py
+++ b/test/ganeti.cli_unittest.py
@@ -22,6 +22,7 @@
 """Script for unittesting the cli module"""
 
 import unittest
+from cStringIO import StringIO
 
 import ganeti
 import testutils
@@ -75,5 +76,30 @@ class TestSplitKeyVal(unittest.TestCase):
                             "option", data)
 
 
+class TestToStream(unittest.TestCase):
+  """Thes the ToStream functions"""
+
+  def testBasic(self):
+    for data in ["foo",
+                 "foo %s",
+                 "foo %(test)s",
+                 "foo %s %s",
+                 "",
+                 ]:
+      buf = StringIO()
+      cli._ToStream(buf, data)
+      self.failUnlessEqual(buf.getvalue(), data+'\n')
+
+  def testParams(self):
+      buf = StringIO()
+      cli._ToStream(buf, "foo %s", 1)
+      self.failUnlessEqual(buf.getvalue(), "foo 1\n")
+      buf = StringIO()
+      cli._ToStream(buf, "foo %s", (15,16))
+      self.failUnlessEqual(buf.getvalue(), "foo (15, 16)\n")
+      buf = StringIO()
+      cli._ToStream(buf, "foo %s %s", "a", "b")
+      self.failUnlessEqual(buf.getvalue(), "foo a b\n")
+
 if __name__ == '__main__':
   unittest.main()
-- 
GitLab