BIND 10 trac917, updated. d5ec22cc344998038cf68b6fdf309ad2a12b2b5e [917] add some minor changes

BIND 10 source code commits bind10-changes at lists.isc.org
Tue Nov 1 11:53:53 UTC 2011


The branch, trac917 has been updated
       via  d5ec22cc344998038cf68b6fdf309ad2a12b2b5e (commit)
       via  2024a1554624868e5f0a4d09b75c3ddf39dd342d (commit)
       via  10b6bc17b7c264f41dcdba64fc3a79904c06164a (commit)
       via  a48e7fa14f2ef90bce27ff3e7aa4a93165e08d37 (commit)
       via  62809f71c563128cb3cc467d867c621c61dbb926 (commit)
       via  08d090b4685220d3f286e1506e1a3c884146122f (commit)
       via  7b667cbd3bd3baeaceb60b987ab9770684ff5038 (commit)
       via  ab48bd8228405d50b149c502d7f73b5eb1a57608 (commit)
      from  ecf9f48f4b4c3beaf97ae0e83c11f4547f024734 (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 d5ec22cc344998038cf68b6fdf309ad2a12b2b5e
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Tue Nov 1 20:52:47 2011 +0900

    [917] add some minor changes
    
    - set minOccurs "0" if item_optional is True
    
    - prepare table tag before going through list-type item
    
    - use item_title instead of item_name if item_title is set

commit 2024a1554624868e5f0a4d09b75c3ddf39dd342d
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Tue Nov 1 19:03:59 2011 +0900

    [917] add more document in stats_spec2xsl

commit 10b6bc17b7c264f41dcdba64fc3a79904c06164a
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Tue Nov 1 18:57:29 2011 +0900

    [917] remove unnecessary else statement

commit a48e7fa14f2ef90bce27ff3e7aa4a93165e08d37
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Tue Nov 1 18:44:58 2011 +0900

    [917] return 404 NotFound when specified module name or item name is not found

commit 62809f71c563128cb3cc467d867c621c61dbb926
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Tue Nov 1 18:17:41 2011 +0900

    [917] add anchor tag in each module and each item in XSL and description in
    each item in XSL

commit 08d090b4685220d3f286e1506e1a3c884146122f
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Tue Nov 1 11:49:24 2011 +0900

    [917] change header name and add descriptions in item name of XSL

commit 7b667cbd3bd3baeaceb60b987ab9770684ff5038
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Tue Nov 1 11:08:47 2011 +0900

    [917] fix indentation and minor changes

commit ab48bd8228405d50b149c502d7f73b5eb1a57608
Author: Naoki Kambe <kambe at jprs.co.jp>
Date:   Fri Oct 28 21:08:49 2011 +0900

    [917] fix incorrection in XSD and XSL

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

Summary of changes:
 src/bin/stats/stats_httpd.py.in             |  125 +++++++++++++++++---------
 src/bin/stats/tests/b10-stats-httpd_test.py |   89 +++++++++++++++-----
 src/bin/stats/tests/b10-stats_test.py       |    8 ++-
 src/bin/stats/tests/test_utils.py           |    4 +-
 4 files changed, 159 insertions(+), 67 deletions(-)

-----------------------------------------------------------------------
diff --git a/src/bin/stats/stats_httpd.py.in b/src/bin/stats/stats_httpd.py.in
index b3df28c..ad99e3b 100644
--- a/src/bin/stats/stats_httpd.py.in
+++ b/src/bin/stats/stats_httpd.py.in
@@ -120,7 +120,12 @@ class HttpHandler(http.server.BaseHTTPRequestHandler):
                     self.send_error(404)
                     return None
         except StatsHttpdError as err:
-            self.send_error(500)
+            # Couldn't find neither specified module name nor
+            # specified item name
+            if str(err).startswith('Stats module: specified arguments are incorrect:'):
+                self.send_error(404)
+            else:
+                self.send_error(500)
             logger.error(STATHTTPD_SERVER_ERROR, err)
             return None
         else:
@@ -420,35 +425,28 @@ class StatsHttpd:
                     for module_name in stats_spec.keys():
                         elem = xml.etree.ElementTree.Element(module_name)
                         stats_data2xml(stats_spec[module_name],
-                                            stats_data[module_name], elem)
+                                       stats_data[module_name], elem)
                         xml_elem.append(elem)
                 # started with item_spec in statistics
                 else:
+                    elem = xml.etree.ElementTree.Element(stats_spec['item_name'])
                     if stats_spec['item_type'] == 'map':
-                        elem = xml.etree.ElementTree.Element(stats_spec['item_name'])
                         stats_data2xml(stats_spec['map_item_spec'],
-                                            stats_data,
-                                            elem)
-                        xml_elem.append(elem)
+                                       stats_data,
+                                       elem)
                     elif stats_spec['item_type'] == 'list':
-                        elem = xml.etree.ElementTree.Element(stats_spec['item_name'])
                         for item in stats_data:
                             stats_data2xml(stats_spec['list_item_spec'],
-                                                item,
-                                                elem)
-                        xml_elem.append(elem)
+                                           item, elem)
                     else:
-                        elem = xml.etree.ElementTree.Element(stats_spec['item_name'])
                         elem.text = str(stats_data)
-                        xml_elem.append(elem)
+                    xml_elem.append(elem)
             # assumed started with stats_spec
             elif type(stats_spec) is list:
                 for item_spec in stats_spec:
                     stats_data2xml(item_spec,
-                                        stats_data[item_spec['item_name']],
-                                        xml_elem)
-            else:
-                xml_elem.text = str(stats_data)
+                                   stats_data[item_spec['item_name']],
+                                   xml_elem)
             return None
 
         stats_spec = self.get_stats_spec(module_name, item_name)
@@ -485,15 +483,15 @@ class StatsHttpd:
             if type(stats_spec) is dict:
                 # assumed module_spec
                 if 'item_name' not in stats_spec:
-                    alltag = xml.etree.ElementTree.Element("all")
                     for mod in stats_spec.keys():
+                        elem = xml.etree.ElementTree.Element(
+                            "element", { "name" : mod })
+                        complextype = xml.etree.ElementTree.Element("complexType")
+                        alltag = xml.etree.ElementTree.Element("all")
                         stats_spec2xsd(stats_spec[mod], alltag)
-                    complextype = xml.etree.ElementTree.Element("complexType")
-                    complextype.append(alltag)
-                    elem = xml.etree.ElementTree.Element(
-                        "element", { "name" : mod })
-                    elem.append(complextype)
-                    xsd_elem.append(elem)
+                        complextype.append(alltag)
+                        elem.append(complextype)
+                        xsd_elem.append(elem)
                 # assumed stats_spec
                 else:
                     if stats_spec['item_type'] == 'map':
@@ -502,16 +500,24 @@ class StatsHttpd:
                         complextype = xml.etree.ElementTree.Element("complexType")
                         complextype.append(alltag)
                         elem = xml.etree.ElementTree.Element(
-                            "element", { "name" : stats_spec["item_name"] })
+                            "element", attrib={ "name" : stats_spec["item_name"],
+                                                "minOccurs": "0" \
+                                                    if stats_spec["item_optional"] \
+                                                    else "1",
+                                                "maxOccurs": "unbounded" })
                         elem.append(complextype)
                         xsd_elem.append(elem)
                     elif stats_spec['item_type'] == 'list':
-                        alltag = xml.etree.ElementTree.Element("all")
+                        alltag = xml.etree.ElementTree.Element("sequence")
                         stats_spec2xsd(stats_spec['list_item_spec'], alltag)
                         complextype = xml.etree.ElementTree.Element("complexType")
                         complextype.append(alltag)
                         elem = xml.etree.ElementTree.Element(
-                            "element", { "name" : stats_spec["item_name"] })
+                            "element", attrib={ "name" : stats_spec["item_name"],
+                                                "minOccurs": "0" \
+                                                    if stats_spec["item_optional"] \
+                                                    else "1",
+                                                "maxOccurs": "1" })
                         elem.append(complextype)
                         xsd_elem.append(elem)
                     else:
@@ -522,7 +528,9 @@ class StatsHttpd:
                                 'type' : stats_spec["item_type"] \
                                     if stats_spec["item_type"].lower() != 'real' \
                                     else 'float',
-                                'minOccurs' : "1",
+                                'minOccurs' : "0" \
+                                    if stats_spec["item_optional"] \
+                                    else "1",
                                 'maxOccurs' : "1"
                                 }
                             )
@@ -584,11 +592,13 @@ class StatsHttpd:
     def xsl_handler(self, module_name=None, item_name=None):
         """Handler which just returns the body of XSL document"""
 
-        def stats_spec2xsl(stats_spec, xsl_elem):
+        def stats_spec2xsl(stats_spec, xsl_elem, path='.'):
             """Internal use for xsl_handler. Reads stats_spec
             specified as first arguments, and modify the xml object
             specified as second argument. xsl_elem must be
-            modified. Always returns None with no exceptions."""
+            modified. The third argument is a base path used for
+            making anchor tag in XSL. Always returns None with no
+            exceptions."""
             # assumed module_spec or one stats_spec
             if type(stats_spec) is dict:
                 # assumed module_spec
@@ -599,7 +609,7 @@ class StatsHttpd:
                     th.text = "Module Names"
                     tr.append(th)
                     th = xml.etree.ElementTree.Element("th")
-                    th.text = "Items"
+                    th.text = "Module Items"
                     tr.append(th)
                     table.append(tr)
                     for mod in stats_spec.keys():
@@ -607,31 +617,55 @@ class StatsHttpd:
                             "xsl:for-each", attrib={ "select" : mod })
                         tr = xml.etree.ElementTree.Element("tr")
                         td = xml.etree.ElementTree.Element("td")
-                        td.text = mod
+                        a = xml.etree.ElementTree.Element(
+                            "a", attrib={ "href": urllib.parse.quote(path + "/" + mod) })
+                        a.text = mod
+                        td.append(a)
                         tr.append(td)
                         td = xml.etree.ElementTree.Element("td")
-                        stats_spec2xsl(stats_spec[mod], td)
+                        stats_spec2xsl(stats_spec[mod], td,
+                                       path + "/" + mod)
                         tr.append(td)
                         foreach.append(tr)
                         table.append(foreach)
                     xsl_elem.append(table)
                 # assumed stats_spec
                 else:
-                    #tr = xml.etree.ElementTree.Element("tr")
-                    td = xml.etree.ElementTree.Element("td")
-                    td.text = stats_spec["item_name"]
+                    td = xml.etree.ElementTree.Element(
+                        "td",
+                        attrib={ "class" : "title",
+                                 "title" : stats_spec["item_description"] \
+                                     if "item_description" in stats_spec \
+                                     else "" })
+                    a = xml.etree.ElementTree.Element(
+                        "a", attrib={ "href": urllib.parse.quote(path + "/" + stats_spec["item_name"]) })
+                    a.text = stats_spec[ "item_title" if "item_title" in stats_spec else "item_name" ]
+                    td.append(a)
                     xsl_elem.append(td)
                     td = xml.etree.ElementTree.Element("td")
                     if stats_spec['item_type'] == 'map':
-                        stats_spec2xsl(stats_spec['map_item_spec'], td)
+                        stats_spec2xsl(stats_spec['map_item_spec'], td,
+                                       path + "/" + stats_spec["item_name"])
                     elif stats_spec['item_type'] == 'list':
-                        stats_spec2xsl(stats_spec['list_item_spec'], td)
+                        table = xml.etree.ElementTree.Element("table")
+                        tr = xml.etree.ElementTree.Element("tr")
+                        th = xml.etree.ElementTree.Element("th")
+                        th.text = "Item Names"
+                        tr.append(th)
+                        th = xml.etree.ElementTree.Element("th")
+                        th.text = "Item Values"
+                        tr.append(th)
+                        table.append(tr)
+                        tr = xml.etree.ElementTree.Element("tr")
+                        stats_spec2xsl(stats_spec['list_item_spec'], tr,
+                                       path + "/" + stats_spec["item_name"])
+                        table.append(tr)
+                        td.append(table)
                     else:
                         xsl_valueof = xml.etree.ElementTree.Element(
                             "xsl:value-of",
                             attrib={'select': stats_spec["item_name"]})
                         td.append(xsl_valueof)
-                    #tr.append(td)
                     xsl_elem.append(td)
             # multiple stats_specs
             elif type(stats_spec) is list:
@@ -641,13 +675,13 @@ class StatsHttpd:
                 th.text = "Item Names"
                 tr.append(th)
                 th = xml.etree.ElementTree.Element("th")
-                th.text = "Values"
+                th.text = "Item Values"
                 tr.append(th)
                 table.append(tr)
-                tr = xml.etree.ElementTree.Element("tr")
                 for item_spec in stats_spec:
-                    stats_spec2xsl(item_spec, tr)
-                table.append(tr)
+                    tr = xml.etree.ElementTree.Element("tr")
+                    stats_spec2xsl(item_spec, tr, path)
+                    table.append(tr)
                 xsl_elem.append(table)
             return None
 
@@ -656,7 +690,12 @@ class StatsHttpd:
         xsd_root = xml.etree.ElementTree.Element( # started with xml:template tag
             "xsl:template",
             attrib={'match': "bind10:statistics"})
-        stats_spec2xsl(stats_spec, xsd_root)
+        if module_name is not None and item_name is not None:
+            stats_spec2xsl([ stats_spec ], xsd_root, './' + module_name)
+        elif module_name is not None:
+            stats_spec2xsl(stats_spec, xsd_root, './' + module_name)
+        else:
+            stats_spec2xsl(stats_spec, xsd_root)
         # The coding conversion is tricky. xml..tostring() of Python 3.2
         # returns bytes (not string) regardless of the coding, while
         # tostring() of Python 3.1 returns a string.  To support both
diff --git a/src/bin/stats/tests/b10-stats-httpd_test.py b/src/bin/stats/tests/b10-stats-httpd_test.py
index e0dafc2..cc23ffc 100644
--- a/src/bin/stats/tests/b10-stats-httpd_test.py
+++ b/src/bin/stats/tests/b10-stats-httpd_test.py
@@ -160,7 +160,6 @@ class TestHttpHandler(unittest.TestCase):
                     self.assertIsNotNone(root.find(k))
             else:
                 self.assertIsNotNone(root.find(item))
-
         # URL is '/bind10/statistics/xml'
         check_XML_URL_PATH(mod=None, item=None)
         for m in DUMMY_DATA:
@@ -223,25 +222,30 @@ class TestHttpHandler(unittest.TestCase):
             root = xml.etree.ElementTree.parse(response).getroot()
             url_trans = '{http://www.w3.org/1999/XSL/Transform}'
             url_xhtml = '{http://www.w3.org/1999/xhtml}'
-            xslpath = url_trans + 'template/' + url_xhtml + 'tr'
             self.assertEqual(root.tag, url_trans + 'stylesheet')
-            for tr in root.findall(xslpath):
-                tds = tr.findall(url_xhtml + 'td')
-                self.assertIsNotNone(tds)
-                self.assertEqual(type(tds), list)
-                self.assertTrue(len(tds) > 2)
-                self.assertTrue(hasattr(tds[0], 'text'))
-                if mod is None:
-                    self.assertTrue(tds[0].text in DUMMY_DATA)
-                else:
-                    self.assertTrue(tds[0].text in DUMMY_DATA[mod])
-                valueof = tds[2].find(url_trans + 'value-of')
-                self.assertIsNotNone(valueof)
-                self.assertTrue(hasattr(valueof, 'attrib'))
-                self.assertIsNotNone(valueof.attrib)
-                self.assertTrue('select' in valueof.attrib)
-                self.assertTrue(valueof.attrib['select'] in \
-                                [ tds[0].text+'/'+item for item in DUMMY_DATA[tds[0].text].keys() ])
+            if item is None and mod is None:
+                xslpath = url_trans + 'template/' + url_xhtml + 'table/' + url_trans + 'for-each'
+                for fe in root.findall(xslpath):
+                    self.assertTrue(fe.attrib['select'] in DUMMY_DATA)
+                    for vo in fe.findall(url_xhtml + 'tr/' \
+                                             + url_xhtml + 'td/' \
+                                             + url_xhtml + 'table/' \
+                                             + url_xhtml + 'tr/' \
+                                             + url_xhtml + 'td/' \
+                                             + url_trans + 'value-of/'):
+                        self.assertTrue(vo.attrib['select'] in DUMMY_DATA[fe.attrib['select']])
+            elif item is None:
+                xslpath = url_trans + 'template/' \
+                    + url_xhtml + 'table/' + url_xhtml + 'tr/' + url_xhtml + 'td/' \
+                    + url_trans + 'value-of'
+                for vo in root.findall(xslpath):
+                    self.assertTrue(vo.attrib['select'] in DUMMY_DATA[mod])
+            else:
+                xslpath = url_trans + 'template/' \
+                    + url_xhtml + 'table/' + url_xhtml + 'tr/' + url_xhtml + 'td/' \
+                    + url_trans + 'value-of'
+                for vo in root.findall(xslpath):
+                    self.assertEqual(vo.attrib['select'], item)
 
         # URL is '/bind10/statistics/xsl'
         check_XSL_URL_PATH(mod=None, item=None)
@@ -262,13 +266,56 @@ class TestHttpHandler(unittest.TestCase):
         self.assertEqual(response.getheader('Location'),
                          "http://%s:%d%s" % (self.address, self.port, stats_httpd.XML_URL_PATH))
 
-        # 404 NotFound
+        # 404 NotFound (random path)
         self.client._http_vsn_str = 'HTTP/1.0'
         self.client.putrequest('GET', '/path/to/foo/bar')
         self.client.endheaders()
         response = self.client.getresponse()
         self.assertEqual(response.status, 404)
+        self.client._http_vsn_str = 'HTTP/1.0'
+        self.client.putrequest('GET', '/bind10/foo')
+        self.client.endheaders()
+        response = self.client.getresponse()
+        self.assertEqual(response.status, 404)
+        self.client._http_vsn_str = 'HTTP/1.0'
+        self.client.putrequest('GET', '/bind10/statistics/foo')
+        self.client.endheaders()
+        response = self.client.getresponse()
+        self.assertEqual(response.status, 404)
 
+        # 404 NotFound (nonexistent module name)
+        self.client._http_vsn_str = 'HTTP/1.0'
+        self.client.putrequest('GET', '/bind10/statistics/xml/Foo')
+        self.client.endheaders()
+        response = self.client.getresponse()
+        self.assertEqual(response.status, 404)
+        self.client._http_vsn_str = 'HTTP/1.0'
+        self.client.putrequest('GET', '/bind10/statistics/xsd/Foo')
+        self.client.endheaders()
+        response = self.client.getresponse()
+        self.assertEqual(response.status, 404)
+        self.client._http_vsn_str = 'HTTP/1.0'
+        self.client.putrequest('GET', '/bind10/statistics/xsl/Foo')
+        self.client.endheaders()
+        response = self.client.getresponse()
+        self.assertEqual(response.status, 404)
+
+        # 404 NotFound (nonexistent item name)
+        self.client._http_vsn_str = 'HTTP/1.0'
+        self.client.putrequest('GET', '/bind10/statistics/xml/Foo/bar')
+        self.client.endheaders()
+        response = self.client.getresponse()
+        self.assertEqual(response.status, 404)
+        self.client._http_vsn_str = 'HTTP/1.0'
+        self.client.putrequest('GET', '/bind10/statistics/xsd/Foo/bar')
+        self.client.endheaders()
+        response = self.client.getresponse()
+        self.assertEqual(response.status, 404)
+        self.client._http_vsn_str = 'HTTP/1.0'
+        self.client.putrequest('GET', '/bind10/statistics/xsl/Foo/bar')
+        self.client.endheaders()
+        response = self.client.getresponse()
+        self.assertEqual(response.status, 404)
 
     def test_do_GET_failed1(self):
         # checks status
@@ -708,7 +755,7 @@ class TestStatsHttpd(unittest.TestCase):
               }
         xsl_body1 = self.stats_httpd.open_template(
             stats_httpd.XSL_TEMPLATE_LOCATION).substitute(
-            xsl_string='<xsl:template match="bind10:statistics"><table><tr><th>Module Names</th><th>Items</th></tr><xsl:for-each select="Dummy"><tr><td>Dummy</td><td><table><tr><th>Item Names</th><th>Values</th></tr><tr><td>foo</td><td><xsl:value-of select="foo" /></td></tr></table></td></tr></xsl:for-each></table></xsl:template>',
+            xsl_string='<xsl:template match="bind10:statistics"><table><tr><th>Module Names</th><th>Module Items</th></tr><xsl:for-each select="Dummy"><tr><td><a href="./Dummy">Dummy</a></td><td><table><tr><th>Item Names</th><th>Item Values</th></tr><tr><td class="title" title="foo is bar"><a href="./Dummy/foo">Foo</a></td><td><xsl:value-of select="foo" /></td></tr></table></td></tr></xsl:for-each></table></xsl:template>',
             xsd_namespace=stats_httpd.XSD_NAMESPACE)
         xsl_body2 = self.stats_httpd.xsl_handler()
         self.assertEqual(type(xsl_body1), str)
diff --git a/src/bin/stats/tests/b10-stats_test.py b/src/bin/stats/tests/b10-stats_test.py
index ebda73c..cb4420b 100644
--- a/src/bin/stats/tests/b10-stats_test.py
+++ b/src/bin/stats/tests/b10-stats_test.py
@@ -556,7 +556,9 @@ class TestStats(unittest.TestCase):
                                     "item_name": "zonename",
                                     "item_type": "string",
                                     "item_optional": False,
-                                    "item_default": ""
+                                    "item_default": "",
+                                    "item_title": "Zonename",
+                                    "item_description": "Zonename"
                                     },
                                 {
                                     "item_name": "queries.udp",
@@ -617,7 +619,9 @@ class TestStats(unittest.TestCase):
                                 "item_name": "zonename",
                                 "item_type": "string",
                                 "item_optional": False,
-                                "item_default": ""
+                                "item_default": "",
+                                "item_title": "Zonename",
+                                "item_description": "Zonename"
                                 },
                             {
                                 "item_name": "queries.udp",
diff --git a/src/bin/stats/tests/test_utils.py b/src/bin/stats/tests/test_utils.py
index 83d3cde..3f6ff33 100644
--- a/src/bin/stats/tests/test_utils.py
+++ b/src/bin/stats/tests/test_utils.py
@@ -261,7 +261,9 @@ class MockAuth:
               "item_name": "zonename",
               "item_type": "string",
               "item_optional": false,
-              "item_default": ""
+              "item_default": "",
+              "item_title": "Zonename",
+              "item_description": "Zonename"
             },
             {
               "item_name": "queries.udp",




More information about the bind10-changes mailing list