BIND 10 trac547, updated. d301d84a89e2775dc0fa1364b1101a01adf128dc [trac547] correct variable name

BIND 10 source code commits bind10-changes at lists.isc.org
Sun Feb 20 12:42:38 UTC 2011


The branch, trac547 has been updated
       via  d301d84a89e2775dc0fa1364b1101a01adf128dc (commit)
       via  207a619c87bcc27c21e820437bf4880ed5314076 (commit)
       via  10ac967440c21d0d8ac9e98f767fac3e5efb6c38 (commit)
       via  6fb774065e955d7c03c32a5422df79a9d4eedcfb (commit)
       via  488078af14802bfd182886080b3d17613843b3ca (commit)
       via  625d4ae5052f78ebff0459d8392b3e63a03084b4 (commit)
       via  67f18b71ac3524f082cadf7d42461470c99324d1 (commit)
       via  fbbad07c3c7625064daec38564d308ce6938a17d (commit)
       via  9b0d0986eab98069f8d4fae1ed2f77db0e7c5475 (commit)
       via  74edf35a9f9d269a349ed62301eb62690b35f6ff (commit)
       via  d1455592d9ddf85d310f19d1d44564f68a99f4d2 (commit)
      from  7a98a19dd6326424748be5f1f7db8ce8c595c071 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit d301d84a89e2775dc0fa1364b1101a01adf128dc
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 21:40:45 2011 +0900

    [trac547] correct variable name

commit 207a619c87bcc27c21e820437bf4880ed5314076
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 20:21:47 2011 +0900

    [trac547] correct the example message

commit 10ac967440c21d0d8ac9e98f767fac3e5efb6c38
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 20:17:11 2011 +0900

    [trac547] add dummy http.server

commit 6fb774065e955d7c03c32a5422df79a9d4eedcfb
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 20:16:44 2011 +0900

    [trac547] remove dummy_socket from isc.cc.sesssion and place it current directory

commit 488078af14802bfd182886080b3d17613843b3ca
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 20:13:04 2011 +0900

    [trac547] add test cases for CCSessionLister, HttpListener and HttpHandler

commit 625d4ae5052f78ebff0459d8392b3e63a03084b4
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 20:11:04 2011 +0900

    [trac547] add new sub directory "http" and dummy scokect "dummy_socket.py"

commit 67f18b71ac3524f082cadf7d42461470c99324d1
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 20:09:53 2011 +0900

    [trac547] implement http.server
    [trac547] add some new classes , CCSessionListener, HttpListener, HttpHandler

commit fbbad07c3c7625064daec38564d308ce6938a17d
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 20:07:50 2011 +0900

    [trac547] add new Makefile for dummy http.server

commit 9b0d0986eab98069f8d4fae1ed2f77db0e7c5475
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 12:43:34 2011 +0900

    [trac547] add a test case for 'status' command

commit 74edf35a9f9d269a349ed62301eb62690b35f6ff
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 12:42:32 2011 +0900

    [trac547] add 'status' and 'shutdown' commands

commit d1455592d9ddf85d310f19d1d44564f68a99f4d2
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Sun Feb 20 12:41:48 2011 +0900

    [trac547] add status command and change some messages

-----------------------------------------------------------------------

Summary of changes:
 configure.ac                                       |    1 +
 src/bin/stats/stats_httpd.py.in                    |  142 +++++++++++++++-----
 src/bin/stats/stats_httpd.spec.pre.in              |   10 ++
 src/bin/stats/tests/Makefile.am                    |    6 +-
 src/bin/stats/tests/b10-stats-httpd_test.py        |   45 +++++--
 .../tests/{isc/util/process.py => dummy_socket.py} |   17 ++-
 src/bin/stats/tests/http/Makefile.am               |    2 +
 src/bin/stats/tests/{isc => http}/__init__.py      |    0 
 src/bin/stats/tests/http/server.py                 |   60 ++++++++
 src/bin/stats/tests/isc/cc/session.py              |   24 +---
 10 files changed, 235 insertions(+), 72 deletions(-)
 copy src/bin/stats/tests/{isc/util/process.py => dummy_socket.py} (73%)
 create mode 100644 src/bin/stats/tests/http/Makefile.am
 copy src/bin/stats/tests/{isc => http}/__init__.py (100%)
 create mode 100644 src/bin/stats/tests/http/server.py

-----------------------------------------------------------------------
diff --git a/configure.ac b/configure.ac
index 6453022..a536155 100644
--- a/configure.ac
+++ b/configure.ac
@@ -664,6 +664,7 @@ AC_CONFIG_FILES([Makefile
                  src/bin/stats/tests/isc/config/Makefile
                  src/bin/stats/tests/isc/util/Makefile
                  src/bin/stats/tests/testdata/Makefile
+                 src/bin/stats/tests/http/Makefile
                  src/bin/usermgr/Makefile
                  src/bin/tests/Makefile
                  src/lib/Makefile
diff --git a/src/bin/stats/stats_httpd.py.in b/src/bin/stats/stats_httpd.py.in
index 92dfd48..be7a52c 100644
--- a/src/bin/stats/stats_httpd.py.in
+++ b/src/bin/stats/stats_httpd.py.in
@@ -21,6 +21,7 @@ import time
 import errno
 import select
 from optparse import OptionParser, OptionValueError
+import http.server
 
 import isc.cc
 import isc.config
@@ -40,18 +41,12 @@ else:
 # Assign this process name
 isc.util.process.rename()
 
-class Main():
+IS_VERBOSE = False
+
+class CCSessionListener():
     """
     """
     def __init__(self):
-        try:
-            parser = OptionParser()
-            parser.add_option("-v", "--verbose", dest="verbose", action="store_true",
-                              help="display more about what is going on")
-            (self.options, self.args) = parser.parse_args()
-        except OptionValueError:
-            sys.stderr.write("[b10-stats] Error parsing options\n")
-            sys.exit(1)
         # start ccsession
         self.ccs = isc.config.ModuleCCSession(SPECFILE_LOCATION, 
                                          self.config_handler, self.command_handler)
@@ -68,41 +63,120 @@ class Main():
         """
         command handler
         """
-        if command == "shutdown":
-            self.runnable = False
-            if self.options.verbose:
-                sys.stdout.write("[b10-stats-httpd] shutting down\n")
+        global IS_VERBOSE
+        if command == "status":
+            if IS_VERBOSE:
+                sys.stdout.write("[b10-stats-httpd] Received 'status' command\n")
+            return isc.config.ccsession.create_answer(0, "Stats Httpd is alive.")
+        elif command == "shutdown":
+            if IS_VERBOSE:
+                sys.stdout.write("[b10-stats-httpd] Received 'shutdown' command\n")
             return isc.config.ccsession.create_answer(0)
+            self.runnable = False
         else:
+            if IS_VERBOSE:
+                sys.stdout.write("[b10-stats-httpd] Received a unknown command\n")
             return isc.config.ccsession.create_answer(1, "Unknown command: " + str(command))
 
-    def main(self):
+    def get_spec(self):
+        """
+        return spec data
+        """
+        pass
+
+    def get_socket(self):
         """
+        return socket object
+        """
+        return self.ccs.get_socket()
+
+    def close(self):
+        """
+        close cc session
         """
-        self.ccs_fd = self.ccs.get_socket().fileno()
-        tout = 1
-        while self.runnable:
-            try:
-                (rfd, wfd, xfd) = select.select([self.ccs_fd], [], [], tout)
-                if (rfd, wfd, xfd) == ([], [], []):
-                    pass
-                elif (rfd, wfd, xfd) == ([self.ccs_fd], [], []):
-                    self.ccs.check_command()
-                else:
-                    sys.stderr.write("[b10-stats-httpd] Unexpected Error with select();\n")
-                    break
-            except select.error as err:
-                if err.args[0] == errno.EINTR:
-                    (rlist, wlist, xlist) = ([], [], [])
-                else:
-                    sys.stderr.write("[b10-stats-httpd] Error with select(); %s\n" % err)
-                    break
         self.ccs.close()
+        self.runnable = False
+
+class HttpHandler(http.server.BaseHTTPRequestHandler):
+    """
+    HTTP handler class
+    """
+    def do_GET(self):
+        if self.path:
+            self.send_response(code=200)
+            self.send_header("Content-type", "text/html")
+            self.end_headers()
+            self.wfile.write(b"<html>This is an example.\n</html>")
+
+class HttpListener:
+    """
+    HTTP Listener class
+    """
+
+    def __init__(self, httpd_spec=None, handler=None):
+        self.address = ''
+        self.port = 8000
+        self.httpd = http.server.HTTPServer((self.address, self.port), handler)
+
+    def get_address(self):
+        return (self.address, self.port)
+
+    def get_socket(self):
+        return self.httpd.socket
+
+    def handle_request(self):
+        return self.httpd.handle_request()
+
+    def close(self):
+        return self.get_socket().close()
+
+def main():
+    global IS_VERBOSE
+    try:
+        parser = OptionParser()
+        parser.add_option("-v", "--verbose", dest="verbose", action="store_true", help="display more about what is going on")
+        (options, args) = parser.parse_args()
+        if options.verbose != IS_VERBOSE:
+            IS_VERBOSE = options.verbose
+    except OptionValueError:
+        sys.stderr.write("[b10-stats] Error parsing options\n")
+        sys.exit(1)
+
+    ccs_lsnr = CCSessionListener()
+    http_lsnr = HttpListener(httpd_spec=ccs_lsnr.get_spec(), handler=HttpHandler)
+    css_fd = ccs_lsnr.get_socket()
+    ht_fd = http_lsnr.get_socket()
+
+    running = True
+    poll_intval = 0.5
+    while running:
+        try:
+            (rfd, wfd, xfd) = select.select([css_fd,ht_fd], [], [], poll_intval)
+            if (rfd, wfd, xfd) == ([], [], []):
+                    continue
+        except select.error as err:
+            if err.args[0] == errno.EINTR:
+                (rfd, wfd, xfd) = ([], [], [])
+            else:
+                sys.stderr.write("[b10-stats-httpd] Error with select(); %s\n" % err)
+                break
+        for fd in rfd + xfd:
+            if fd == css_fd:
+                ccs_lsnr.check_command()
+                running = ccs.runnable
+            elif fd == ht_fd:
+                http_lsnr.handle_request()
+            else:
+                sys.stderr.write("[b10-stats-httpd] Unexpected Error with select();\n")
+                running = False
+
+    running = False
+    ccs_lsnr.stop()
+    http_lsnr.stop()
 
 if __name__ == "__main__":
     try:
-        m = Main()
-        m.main()
+        main()
     except isc.cc.session.SessionError as se:
         sys.stderr.write("[b10-stats-httpd] Error creating module, "
                          + "is the command channel daemon running?\n")
diff --git a/src/bin/stats/stats_httpd.spec.pre.in b/src/bin/stats/stats_httpd.spec.pre.in
index ecfa54d..edefb70 100644
--- a/src/bin/stats/stats_httpd.spec.pre.in
+++ b/src/bin/stats/stats_httpd.spec.pre.in
@@ -4,6 +4,16 @@
     "module_description": "Stats HTTP daemon",
     "config_data": [],
     "commands": [
+      {
+        "command_name": "status",
+        "command_description": "identify whether the stats httpd is alive or not",
+        "command_args": []
+      },
+      {
+        "command_name": "shutdown",
+        "command_description": "Shut down the stats httpd",
+        "command_args": []
+      }
     ]
   }
 }
diff --git a/src/bin/stats/tests/Makefile.am b/src/bin/stats/tests/Makefile.am
index fa242d7..0bcc653 100644
--- a/src/bin/stats/tests/Makefile.am
+++ b/src/bin/stats/tests/Makefile.am
@@ -1,8 +1,8 @@
-SUBDIRS = isc testdata
+SUBDIRS = isc http testdata
 PYCOVERAGE_RUN = @PYCOVERAGE_RUN@
 PYTESTS = b10-stats_test.py b10-stats-httpd_test.py
-EXTRA_DIST = $(PYTESTS) fake_time.py
-CLEANFILES = fake_time.pyc
+EXTRA_DIST = $(PYTESTS) fake_time.py dummy_socket.py
+CLEANFILES = fake_time.pyc dummy_socket.pyc
 
 # test using command-line arguments, so use check-local target instead of TESTS
 check-local:
diff --git a/src/bin/stats/tests/b10-stats-httpd_test.py b/src/bin/stats/tests/b10-stats-httpd_test.py
index 1b6d02b..e149987 100644
--- a/src/bin/stats/tests/b10-stats-httpd_test.py
+++ b/src/bin/stats/tests/b10-stats-httpd_test.py
@@ -22,27 +22,46 @@ import stats_httpd
 class TestStats(unittest.TestCase):
 
     def setUp(self):
-        self.m = stats_httpd.Main()
+        self.ccs_lsnr = stats_httpd.CCSessionListener()
+        self.http_lsnr = stats_httpd.HttpListener(httpd_spec=self.ccs_lsnr.get_spec())
+        self.http_handler = stats_httpd.HttpHandler()
+        self.assertFalse(self.ccs_lsnr.get_socket().closed)
+        self.assertTrue(self.ccs_lsnr.runnable)
+        self.assertFalse(self.http_lsnr.get_socket().closed)
 
     def tearDown(self):
-        pass
+        self.ccs_lsnr.close()
+        self.http_lsnr.close()
+        self.assertTrue(self.ccs_lsnr.get_socket().closed)
+        self.assertFalse(self.ccs_lsnr.runnable)
+        self.assertTrue(self.http_lsnr.get_socket().closed)
 
-    def test_config_handler(self):
-        self.assertEqual(self.m.config_handler(None),
-                         isc.config.ccsession.create_answer(0))
+    def test_sockets(self):
+        self.assertEqual(self.ccs_lsnr.get_socket().fileno(), 'dummy')
+        self.assertEqual(self.http_lsnr.get_socket().fileno(), 'dummy')
 
-    def test_command_handler(self):
-        self.assertTrue(self.m.runnable)
-        self.assertEqual(self.m.command_handler("shutdown", None),
+    def test_ccs_listener(self):
+        self.assertIsNone(self.ccs_lsnr.get_spec())
+        self.assertEqual(self.ccs_lsnr.command_handler("status", None),
+                         isc.config.ccsession.create_answer(
+                0, "Stats Httpd is alive."))
+        self.assertEqual(self.ccs_lsnr.command_handler("shutdown", None),
                          isc.config.ccsession.create_answer(0))
         self.assertEqual(
-            self.m.command_handler("unknown_command", None),
+            self.ccs_lsnr.command_handler("__UNKNOWN_COMMAND__", None),
             isc.config.ccsession.create_answer(
-                1, "Unknown command: unknown_command"))
-        self.assertFalse(self.m.runnable)
+                1, "Unknown command: __UNKNOWN_COMMAND__"))
+
+    def test_http_listener(self):
+        self.assertEqual(self.http_lsnr.get_address(), ('', 8000))
+        self.assertIsNone(self.http_lsnr.handle_request())
+
+    def test_http_handler(self):
+        self.assertIsNone(self.http_handler.do_GET())
 
-    def tests_main(self):
-        self.assertRaises(TypeError, self.m.main)
+    def test_main(self):
+        self.assertEqual(stats_httpd.IS_VERBOSE, False)
+        self.assertRaises(TypeError, stats_httpd.main)
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/src/bin/stats/tests/dummy_socket.py b/src/bin/stats/tests/dummy_socket.py
new file mode 100644
index 0000000..53b9496
--- /dev/null
+++ b/src/bin/stats/tests/dummy_socket.py
@@ -0,0 +1,27 @@
+# Copyright (C) 2011  Internet Systems Consortium.
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
+# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+class socket:
+    """
+    This module is a mock-up class of socket
+    """
+    def __init__(self):
+        self.closed = False
+
+    def close(self):
+        self.closed = True
+
+    def fileno(self):
+        return 'dummy'
diff --git a/src/bin/stats/tests/http/Makefile.am b/src/bin/stats/tests/http/Makefile.am
new file mode 100644
index 0000000..879e8a8
--- /dev/null
+++ b/src/bin/stats/tests/http/Makefile.am
@@ -0,0 +1,2 @@
+EXTRA_DIST = __init__.py server.py
+CLEANFILES = __init__.pyc server.pyc
diff --git a/src/bin/stats/tests/http/__init__.py b/src/bin/stats/tests/http/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/src/bin/stats/tests/http/server.py b/src/bin/stats/tests/http/server.py
new file mode 100644
index 0000000..5604ad5
--- /dev/null
+++ b/src/bin/stats/tests/http/server.py
@@ -0,0 +1,60 @@
+# Copyright (C) 2011  Internet Systems Consortium.
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SYSTEMS CONSORTIUM
+# DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
+# INTERNET SYSTEMS CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
+# INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
+# FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+# WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+import dummy_socket
+
+class StreamWriter:
+    """
+    This module is a mock-up class of StreamWriter
+    """
+    def __init__(self):
+        pass
+
+    def write(self, obj):
+        pass
+
+class HTTPServer:
+    """
+    This module is a mock-up class of http.server.HTTPServer
+    """
+    def __init__(self, server_class, handler_class):
+        self.socket = dummy_socket.socket()
+
+    def get_socket(self):
+        return self.socket
+
+    def handle_request(self):
+        pass
+
+    def close(self):
+        self.socket.close()
+
+class BaseHTTPRequestHandler:
+    """
+    This module is a mock-up class of http.server.BaseHTTPRequestHandler
+    """
+
+    def __init__(self):
+        self.path = "/"
+        self.wfile = StreamWriter()
+
+    def send_response(self, code=0):
+        pass
+
+    def send_header(self, key, value):
+        pass
+
+    def end_headers(self):
+        pass
diff --git a/src/bin/stats/tests/isc/cc/session.py b/src/bin/stats/tests/isc/cc/session.py
index a07caf7..9a50558 100644
--- a/src/bin/stats/tests/isc/cc/session.py
+++ b/src/bin/stats/tests/isc/cc/session.py
@@ -16,23 +16,11 @@
 # This module is a mock-up class of isc.cc.session
 
 import sys
+import dummy_socket
 
 # set a dummy lname
 _TEST_LNAME = '123abc at xxxx'
 
-class DummySocket:
-    """
-    Dummy Socket Class
-    """
-    def __init__(self):
-        self.closed = False
-
-    def close(self):
-        self.closed = True
-
-    def fileno(self):
-        return 'dummy'
-
 class Queue():
     def __init__(self, msg=None, env={}):
         self.msg = msg
@@ -49,7 +37,7 @@ class Session:
         self._lname = _TEST_LNAME
         self.message_queue = []
         self.old_message_queue = []
-        self._socket = DummySocket()
+        self._socket = dummy_socket.socket()
         self.verbose = verbose
 
     @property
@@ -57,7 +45,7 @@ class Session:
         return self._lname
 
     def close(self):
-        self._socket = None
+        self._socket.close()
 
     def _next_sequence(self, que=None):
         return len(self.message_queue)
@@ -74,7 +62,7 @@ class Session:
         return seq
 
     def dequeue(self, seq=0):
-        if self._socket is None:
+        if self._socket.closed:
             raise SessionError("Session has been closed.")
         que = None
         try:
@@ -87,7 +75,7 @@ class Session:
         return que
 
     def get_queue(self, seq=None):
-        if self._socket is None:
+        if self._socket.closed:
             raise SessionError("Session has been closed.")
         if seq is None:
             seq = len(self.message_queue) - 1
@@ -123,7 +111,7 @@ class Session:
                 "reply": routing["seq"] })
 
     def get_message(self, group, to='*'):
-        if self._socket is None:
+        if self._socket.closed:
             raise SessionError("Session has been closed.")
         que = Queue()
         for q in self.message_queue:




More information about the bind10-changes mailing list