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