Looks good,

Ethan

On Tue, May 1, 2012 at 2:28 PM, Ben Pfaff <[email protected]> wrote:
> Signed-off-by: Ben Pfaff <[email protected]>
> ---
>  python/ovs/vlog.py    |   33 +++++++++++++++++++--
>  tests/test-unixctl.py |    6 ++++
>  tests/unixctl-py.at   |    2 +
>  tests/vlog.at         |   77 
> +++++++++++++++++++++++++++++++++++++++++++++++++
>  4 files changed, 115 insertions(+), 3 deletions(-)
>
> diff --git a/python/ovs/vlog.py b/python/ovs/vlog.py
> index ad53781..6d2e84d 100644
> --- a/python/ovs/vlog.py
> +++ b/python/ovs/vlog.py
> @@ -1,5 +1,5 @@
>
> -# Copyright (c) 2011 Nicira Networks
> +# Copyright (c) 2011, 2012 Nicira Networks
>  #
>  # Licensed under the Apache License, Version 2.0 (the "License");
>  # you may not use this file except in compliance with the License.
> @@ -20,6 +20,7 @@ import socket
>  import sys
>
>  import ovs.dirs
> +import ovs.unixctl
>  import ovs.util
>
>  FACILITIES = {"console": "info", "file": "info", "syslog": "info"}
> @@ -41,6 +42,8 @@ class Vlog:
>     __inited = False
>     __msg_num = 0
>     __mfl = {}  # Module -> facility -> level
> +    __log_file = None
> +    __file_handler = None
>
>     def __init__(self, name):
>         """Creates a new Vlog object representing a module called 'name'.  The
> @@ -99,6 +102,7 @@ class Vlog:
>
>         Vlog.__inited = True
>         logging.raiseExceptions = False
> +        Vlog.__log_file = log_file
>         for f in FACILITIES:
>             logger = logging.getLogger(f)
>             logger.setLevel(logging.DEBUG)
> @@ -110,11 +114,15 @@ class Vlog:
>                     logger.addHandler(logging.handlers.SysLogHandler(
>                         address="/dev/log",
>                         facility=logging.handlers.SysLogHandler.LOG_DAEMON))
> -                elif f == "file" and log_file:
> -                    logger.addHandler(logging.FileHandler(log_file))
> +                elif f == "file" and Vlog.__log_file:
> +                    Vlog.__file_handler = 
> logging.FileHandler(Vlog.__log_file)
> +                    logger.addHandler(Vlog.__file_handler)
>             except (IOError, socket.error):
>                 logger.setLevel(logging.CRITICAL)
>
> +        ovs.unixctl.command_register("vlog/reopen", "", 0, 0,
> +                                     Vlog._unixctl_vlog_reopen, None)
> +
>     @staticmethod
>     def set_level(module, facility, level):
>         """ Sets the log level of the 'module'-'facility' tuple to 'level'.
> @@ -149,6 +157,25 @@ class Vlog:
>             for f in facilities:
>                 Vlog.__mfl[m][f] = level
>
> +    @staticmethod
> +    def reopen_log_file():
> +        """Closes and then attempts to re-open the current log file.  (This 
> is
> +        useful just after log rotation, to ensure that the new log file 
> starts
> +        being used.)"""
> +
> +        if Vlog.__log_file:
> +            logger = logging.getLogger("file")
> +            logger.removeHandler(Vlog.__file_handler)
> +            Vlog.__file_handler = logging.FileHandler(Vlog.__log_file)
> +            logger.addHandler(Vlog.__file_handler)
> +
> +    @staticmethod
> +    def _unixctl_vlog_reopen(conn, unused_argv, unused_aux):
> +        if Vlog.__log_file:
> +            Vlog.reopen_log_file()
> +            conn.reply(None)
> +        else:
> +            conn.reply("Logging to file not configured")
>
>  def add_args(parser):
>     """Adds vlog related options to 'parser', an ArgumentParser object.  The
> diff --git a/tests/test-unixctl.py b/tests/test-unixctl.py
> index 392999e..6ad599a 100644
> --- a/tests/test-unixctl.py
> +++ b/tests/test-unixctl.py
> @@ -40,6 +40,11 @@ def unixctl_echo_error(conn, argv, aux):
>     conn.reply_error(str(argv))
>
>
> +def unixctl_log(conn, argv, unused_aux):
> +    vlog.info(str(argv[0]))
> +    conn.reply(None)
> +
> +
>  def unixctl_block(conn, unused_argv, unused_aux):
>     pass
>
> @@ -64,6 +69,7 @@ def main():
>     ovs.unixctl.command_register("exit", "", 0, 0, unixctl_exit, "aux_exit")
>     ovs.unixctl.command_register("echo", "[arg ...]", 1, 2, unixctl_echo,
>                                  "aux_echo")
> +    ovs.unixctl.command_register("log", "[arg ...]", 1, 2, unixctl_log, None)
>     ovs.unixctl.command_register("echo_error", "[arg ...]", 1, 2,
>                                  unixctl_echo_error, "aux_echo_error")
>     ovs.unixctl.command_register("block", "", 0, 0, unixctl_block, None)
> diff --git a/tests/unixctl-py.at b/tests/unixctl-py.at
> index f9caa60..37070c9 100644
> --- a/tests/unixctl-py.at
> +++ b/tests/unixctl-py.at
> @@ -104,7 +104,9 @@ The available commands are:
>   echo_error              [[arg ...]]
>   exit
>   help
> +  log                     [[arg ...]]
>   version
> +  vlog/reopen
>  ])
>  mv stdout expout
>  AT_CHECK([PYAPPCTL -t test-unixctl.py help], [0], [expout])
> diff --git a/tests/vlog.at b/tests/vlog.at
> index 597c27a..a1afb10 100644
> --- a/tests/vlog.at
> +++ b/tests/vlog.at
> @@ -103,3 +103,80 @@ AssertionError
>  ])
>
>  AT_CLEANUP
> +
> +AT_SETUP([vlog - vlog/reopen - Python])
> +AT_SKIP_IF([test $HAVE_PYTHON = no])
> +OVS_RUNDIR=`pwd`; export OVS_RUNDIR
> +OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> +OVS_SYSCONFDIR=`pwd`; export OVS_SYSCONFDIR
> +trap 'kill `cat test-unixctl.py.pid`' 0
> +
> +AT_CAPTURE_FILE([log])
> +AT_CAPTURE_FILE([log.old])
> +AT_CHECK([$PYTHON $srcdir/test-unixctl.py --log-file=`pwd`/log --pidfile 
> --detach])
> +
> +AT_CHECK([APPCTL -t test-unixctl.py log message])
> +mv log log.old
> +AT_CHECK([APPCTL -t test-unixctl.py log message2])
> +AT_CHECK([APPCTL -t test-unixctl.py vlog/reopen])
> +AT_CHECK([APPCTL -t test-unixctl.py log message3])
> +AT_CHECK([APPCTL -t test-unixctl.py exit])
> +trap '' 0
> +
> +AT_CHECK([sed 's/.*|//' log.old], [0], [dnl
> +Entering run loop.
> +message
> +message2
> +])
> +AT_CHECK([sed 's/.*|//' log], [0], [dnl
> +message3
> +])
> +AT_CLEANUP
> +
> +AT_SETUP([vlog - vlog/reopen without log file - Python])
> +AT_SKIP_IF([test $HAVE_PYTHON = no])
> +OVS_RUNDIR=`pwd`; export OVS_RUNDIR
> +OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> +OVS_SYSCONFDIR=`pwd`; export OVS_SYSCONFDIR
> +trap 'kill `cat test-unixctl.py.pid`' 0
> +
> +AT_CHECK([$PYTHON $srcdir/test-unixctl.py --pidfile --detach])
> +
> +AT_CHECK([APPCTL -t test-unixctl.py vlog/reopen], [0],
> +  [Logging to file not configured
> +])
> +AT_CLEANUP
> +
> +dnl This checks that if vlog/reopen can't reopen the log file,
> +dnl nothing particularly bad (e.g. Python throws an exception and
> +dnl aborts the program) happens.
> +AT_SETUP([vlog - vlog/reopen can't reopen log file - Python])
> +AT_SKIP_IF([test $HAVE_PYTHON = no])
> +
> +# Verify that /dev/full is a character device that fails writes.
> +AT_SKIP_IF([test ! -c /dev/full])
> +AT_SKIP_IF([echo > /dev/full])
> +
> +OVS_RUNDIR=`pwd`; export OVS_RUNDIR
> +OVS_LOGDIR=`pwd`; export OVS_LOGDIR
> +OVS_SYSCONFDIR=`pwd`; export OVS_SYSCONFDIR
> +trap 'kill `cat test-unixctl.py.pid`' 0
> +
> +AT_CHECK([$PYTHON $srcdir/test-unixctl.py --log-file=`pwd`/log --pidfile 
> --detach])
> +AT_CHECK([APPCTL -t test-unixctl.py log message])
> +mv log log.old
> +ln -s /dev/full log
> +AT_CHECK([APPCTL -t test-unixctl.py vlog/reopen])
> +AT_CHECK([APPCTL -t test-unixctl.py log message2])
> +rm log
> +AT_CHECK([APPCTL -t test-unixctl.py vlog/reopen])
> +AT_CHECK([APPCTL -t test-unixctl.py log message3])
> +AT_CHECK([APPCTL -t test-unixctl.py exit])
> +AT_CHECK([sed 's/.*|//' log.old], [0], [dnl
> +Entering run loop.
> +message
> +])
> +AT_CHECK([sed 's/.*|//' log], [0], [dnl
> +message3
> +])
> +AT_CLEANUP
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> [email protected]
> http://openvswitch.org/mailman/listinfo/dev
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to