BIND 10 trac1484, updated. 321a37a11088881f57df5088571f9ac7c919daf7 [1484] The find_all for finder
BIND 10 source code commits
bind10-changes at lists.isc.org
Mon Dec 19 11:41:22 UTC 2011
The branch, trac1484 has been updated
via 321a37a11088881f57df5088571f9ac7c919daf7 (commit)
via 0938b2fb80685e2b91fafcc3bf75dba718c72de0 (commit)
via 855f42784d0e9e5f86a3dfb6988da3987cda2200 (commit)
from 424113eeebb77e6edac02231a64595729bc04bbc (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 321a37a11088881f57df5088571f9ac7c919daf7
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Dec 19 12:40:46 2011 +0100
[1484] The find_all for finder
We still need to add it for the updater.
commit 0938b2fb80685e2b91fafcc3bf75dba718c72de0
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Dec 19 12:06:56 2011 +0100
[1484] Tests for python find_all
commit 855f42784d0e9e5f86a3dfb6988da3987cda2200
Author: Michal 'vorner' Vaner <michal.vaner at nic.cz>
Date: Mon Dec 19 11:12:12 2011 +0100
[1484] Removed target parameter from python binding
It was removed in the C++ version and returning something through a
parameter in python is wrong anyway.
-----------------------------------------------------------------------
Summary of changes:
src/bin/xfrin/tests/xfrin_test.py | 2 +-
src/bin/xfrin/xfrin.py.in | 2 +-
src/bin/xfrout/tests/xfrout_test.py.in | 2 +-
src/bin/xfrout/xfrout.py.in | 2 +-
src/lib/python/isc/datasrc/finder_python.cc | 74 ++++++++++++++++++--
src/lib/python/isc/datasrc/tests/datasrc_test.py | 80 ++++++++++------------
6 files changed, 107 insertions(+), 55 deletions(-)
-----------------------------------------------------------------------
diff --git a/src/bin/xfrin/tests/xfrin_test.py b/src/bin/xfrin/tests/xfrin_test.py
index eb2c747..497ecd1 100644
--- a/src/bin/xfrin/tests/xfrin_test.py
+++ b/src/bin/xfrin/tests/xfrin_test.py
@@ -158,7 +158,7 @@ class MockDataSourceClient():
return (DataSourceClient.PARTIALMATCH, self)
raise ValueError('Unexpected input to mock client: bug in test case?')
- def find(self, name, rrtype, target=None, options=ZoneFinder.FIND_DEFAULT):
+ def find(self, name, rrtype, options=ZoneFinder.FIND_DEFAULT):
'''Mock ZoneFinder.find().
It returns the predefined SOA RRset to queries for SOA of the common
diff --git a/src/bin/xfrin/xfrin.py.in b/src/bin/xfrin/xfrin.py.in
index 1167bef..18c9ed0 100755
--- a/src/bin/xfrin/xfrin.py.in
+++ b/src/bin/xfrin/xfrin.py.in
@@ -584,7 +584,7 @@ class XfrinConnection(asyncore.dispatcher):
if result != DataSourceClient.SUCCESS:
return None
result, soa_rrset = finder.find(self._zone_name, RRType.SOA(),
- None, ZoneFinder.FIND_DEFAULT)
+ ZoneFinder.FIND_DEFAULT)
if result != ZoneFinder.SUCCESS:
logger.info(XFRIN_ZONE_NO_SOA, self.zone_str())
return None
diff --git a/src/bin/xfrout/tests/xfrout_test.py.in b/src/bin/xfrout/tests/xfrout_test.py.in
index ea4de27..2c7fab8 100644
--- a/src/bin/xfrout/tests/xfrout_test.py.in
+++ b/src/bin/xfrout/tests/xfrout_test.py.in
@@ -95,7 +95,7 @@ class MockDataSrcClient:
return (isc.datasrc.DataSourceClient.NOTFOUND, None)
return (isc.datasrc.DataSourceClient.SUCCESS, self)
- def find(self, name, rrtype, target=None, options=ZoneFinder.FIND_DEFAULT):
+ def find(self, name, rrtype, options=ZoneFinder.FIND_DEFAULT):
'''Mock ZoneFinder.find().
(At the moment) this method only handles query for type SOA.
diff --git a/src/bin/xfrout/xfrout.py.in b/src/bin/xfrout/xfrout.py.in
index 310a0aa..b536e4c 100755
--- a/src/bin/xfrout/xfrout.py.in
+++ b/src/bin/xfrout/xfrout.py.in
@@ -336,7 +336,7 @@ class XfroutSession():
result, finder = self._datasrc_client.find_zone(zone_name)
if result != DataSourceClient.SUCCESS:
return (Rcode.NOTAUTH(), None)
- result, soa_rrset = finder.find(zone_name, RRType.SOA(), None,
+ result, soa_rrset = finder.find(zone_name, RRType.SOA(),
ZoneFinder.FIND_DEFAULT)
if result != ZoneFinder.SUCCESS:
return (Rcode.SERVFAIL(), None)
diff --git a/src/lib/python/isc/datasrc/finder_python.cc b/src/lib/python/isc/datasrc/finder_python.cc
index 5aa9c3e..ae1a0c4 100644
--- a/src/lib/python/isc/datasrc/finder_python.cc
+++ b/src/lib/python/isc/datasrc/finder_python.cc
@@ -59,17 +59,11 @@ PyObject* ZoneFinder_helper(ZoneFinder* finder, PyObject* args) {
}
PyObject* name;
PyObject* rrtype;
- PyObject* target = Py_None;
unsigned int options_int = ZoneFinder::FIND_DEFAULT;
- if (PyArg_ParseTuple(args, "O!O!|OI", &name_type, &name,
+ if (PyArg_ParseTuple(args, "O!O!|I", &name_type, &name,
&rrtype_type, &rrtype,
- &target, &options_int)) {
+ &options_int)) {
try {
- if (target != Py_None) {
- PyErr_SetString(PyExc_TypeError,
- "find(): target must be None in this version");
- return (NULL);
- }
ZoneFinder::FindOptions options =
static_cast<ZoneFinder::FindOptions>(options_int);
const ZoneFinder::FindResult find_result(
@@ -100,6 +94,62 @@ PyObject* ZoneFinder_helper(ZoneFinder* finder, PyObject* args) {
return Py_BuildValue("I", 1);
}
+PyObject* ZoneFinder_helper_all(ZoneFinder* finder, PyObject* args) {
+ if (finder == NULL) {
+ PyErr_SetString(getDataSourceException("Error"),
+ "Internal error in find_all() wrapper; "
+ "finder object NULL");
+ return (NULL);
+ }
+ PyObject* name;
+ unsigned int options_int = ZoneFinder::FIND_DEFAULT;
+ if (PyArg_ParseTuple(args, "O!|I", &name_type, &name,
+ &options_int)) {
+ try {
+ ZoneFinder::FindOptions options =
+ static_cast<ZoneFinder::FindOptions>(options_int);
+ std::vector<isc::dns::ConstRRsetPtr> target;
+ const ZoneFinder::FindResult find_result(
+ finder->findAll(PyName_ToName(name), target, options));
+ const ZoneFinder::Result r = find_result.code;
+ isc::dns::ConstRRsetPtr rrsp = find_result.rrset;
+ if (r == ZoneFinder::SUCCESS || r == ZoneFinder::WILDCARD) {
+ // Copy all the RRsets to the result list
+ PyObjectContainer list_container(PyList_New(target.size()));
+ for (size_t i(0); i < target.size(); ++i) {
+ PyList_SET_ITEM(list_container.get(), i,
+ createRRsetObject(*target[i]));
+ }
+ // Construct the result with the list. The Py_BuildValue
+ // increases the refcount and the container decreases it
+ // later. This way, it feels safer in case the build function
+ // would fail.
+ return (Py_BuildValue("IO", r, list_container.get()));
+ } else {
+ if (rrsp) {
+ // Use N instead of O so the refcount isn't increased twice
+ return (Py_BuildValue("IN", r, createRRsetObject(*rrsp)));
+ } else {
+ return (Py_BuildValue("IO", r, Py_None));
+ }
+ }
+ } catch (const DataSourceError& dse) {
+ PyErr_SetString(getDataSourceException("Error"), dse.what());
+ return (NULL);
+ } catch (const std::exception& exc) {
+ PyErr_SetString(getDataSourceException("Error"), exc.what());
+ return (NULL);
+ } catch (...) {
+ PyErr_SetString(getDataSourceException("Error"),
+ "Unexpected exception");
+ return (NULL);
+ }
+ } else {
+ return (NULL);
+ }
+ return Py_BuildValue("I", 1);
+}
+
} // end namespace internal
namespace {
@@ -173,6 +223,13 @@ ZoneFinder_find(PyObject* po_self, PyObject* args) {
}
PyObject*
+ZoneFinder_find_all(PyObject* po_self, PyObject* args) {
+ s_ZoneFinder* const self = static_cast<s_ZoneFinder*>(po_self);
+ return (isc_datasrc_internal::ZoneFinder_helper_all(self->cppobj.get(),
+ args));
+}
+
+PyObject*
ZoneFinder_findPreviousName(PyObject* po_self, PyObject* args) {
s_ZoneFinder* const self = static_cast<s_ZoneFinder*>(po_self);
PyObject* name_obj;
@@ -208,6 +265,7 @@ PyMethodDef ZoneFinder_methods[] = {
ZoneFinder_getOrigin_doc },
{ "get_class", ZoneFinder_getClass, METH_NOARGS, ZoneFinder_getClass_doc },
{ "find", ZoneFinder_find, METH_VARARGS, ZoneFinder_find_doc },
+ { "find_all", ZoneFinder_find_all, METH_VARARGS, "TODO" },
{ "find_previous_name", ZoneFinder_findPreviousName, METH_VARARGS,
ZoneFinder_find_previous_name_doc },
{ NULL, NULL, 0, NULL }
diff --git a/src/lib/python/isc/datasrc/tests/datasrc_test.py b/src/lib/python/isc/datasrc/tests/datasrc_test.py
index 3e4a1d7..c9f837f 100644
--- a/src/lib/python/isc/datasrc/tests/datasrc_test.py
+++ b/src/lib/python/isc/datasrc/tests/datasrc_test.py
@@ -269,6 +269,43 @@ class DataSrcClient(unittest.TestCase):
self.assertNotEqual(ZoneFinder.WILDCARD_CNAME,
ZoneFinder.WILDCARD_NXRRSET)
+ def test_findall(self):
+ """
+ A test for the find_all method.
+ """
+ dsc = isc.datasrc.DataSourceClient("sqlite3", READ_ZONE_DB_CONFIG)
+ result, finder = dsc.find_zone(isc.dns.Name("example.com"))
+ self.assertEqual(finder.SUCCESS, result)
+ self.assertEqual(isc.dns.RRClass.IN(), finder.get_class())
+ self.assertEqual("example.com.", finder.get_origin().to_text())
+
+ # Some "failure" responses
+ result, rrset = finder.find_all(isc.dns.Name("www.sql1.example.com"),
+ finder.FIND_DEFAULT)
+ self.assertEqual(finder.DELEGATION, result)
+ self.assertEqual("sql1.example.com. 3600 IN NS dns01.example.com.\n" +
+ "sql1.example.com. 3600 IN NS dns02.example.com.\n" +
+ "sql1.example.com. 3600 IN NS dns03.example.com.\n",
+ rrset.to_text())
+
+ result, rrset = finder.find_all(isc.dns.Name("nxdomain.example.com"),
+ finder.FIND_DEFAULT)
+ self.assertEqual(finder.NXDOMAIN, result)
+ self.assertIsNone(None, rrset)
+
+ # A success. It should return the list now.
+ result, rrsets = finder.find_all(isc.dns.Name("mix.example.com."))
+ self.assertEqual(ZoneFinder.SUCCESS, result)
+ self.assertEqual(2, len(rrsets))
+ self.assertEqual(sorted(map(lambda rrset: rrset.get_type().to_text(),
+ rrsets)), sorted(["A", "AAAA"]))
+ rdatas = []
+ for rrset in rrsets:
+ rdatas.extend(rrset.get_rdata())
+ self.assertEqual(sorted(map(lambda rdata: rdata.to_text(), rdatas)),
+ sorted(["192.0.2.1", "192.0.2.2", "2001:db8::1",
+ "2001:db8::2"]))
+
def test_find(self):
dsc = isc.datasrc.DataSourceClient("sqlite3", READ_ZONE_DB_CONFIG)
@@ -279,7 +316,6 @@ class DataSrcClient(unittest.TestCase):
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.SUCCESS, result)
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
@@ -292,20 +328,8 @@ class DataSrcClient(unittest.TestCase):
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
rrset.to_text())
- result, rrset = finder.find(isc.dns.Name("www.example.com"),
- isc.dns.RRType.A(), None)
- self.assertEqual(finder.SUCCESS, result)
- self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
- rrset.to_text())
-
- # Invalid value for the "target"
- self.assertRaises(TypeError, finder.find,
- isc.dns.Name("www.example.com"),
- isc.dns.RRType.A(), True)
-
result, rrset = finder.find(isc.dns.Name("www.sql1.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.DELEGATION, result)
self.assertEqual("sql1.example.com. 3600 IN NS dns01.example.com.\n" +
@@ -315,28 +339,24 @@ class DataSrcClient(unittest.TestCase):
result, rrset = finder.find(isc.dns.Name("doesnotexist.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.NXDOMAIN, result)
self.assertEqual(None, rrset)
result, rrset = finder.find(isc.dns.Name("www.some.other.domain"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.NXDOMAIN, result)
self.assertEqual(None, rrset)
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.TXT(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.NXRRSET, result)
self.assertEqual(None, rrset)
result, rrset = finder.find(isc.dns.Name("cname-ext.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.CNAME, result)
self.assertEqual(
@@ -345,7 +365,6 @@ class DataSrcClient(unittest.TestCase):
result, rrset = finder.find(isc.dns.Name("foo.wild.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.WILDCARD, result)
self.assertEqual("foo.wild.example.com. 3600 IN A 192.0.2.255\n",
@@ -353,7 +372,6 @@ class DataSrcClient(unittest.TestCase):
result, rrset = finder.find(isc.dns.Name("foo.wild.example.com"),
isc.dns.RRType.TXT(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.WILDCARD_NXRRSET, result)
self.assertEqual(None, rrset)
@@ -361,17 +379,14 @@ class DataSrcClient(unittest.TestCase):
self.assertRaises(TypeError, finder.find,
"foo",
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertRaises(TypeError, finder.find,
isc.dns.Name("cname-ext.example.com"),
"foo",
- None,
finder.FIND_DEFAULT)
self.assertRaises(TypeError, finder.find,
isc.dns.Name("cname-ext.example.com"),
isc.dns.RRType.A(),
- None,
"foo")
def test_find_previous(self):
@@ -409,7 +424,6 @@ class DataSrcUpdater(unittest.TestCase):
updater = dsc.get_updater(isc.dns.Name("example.com"), False)
result, rrset = updater.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
ZoneFinder.FIND_DEFAULT)
self.assertEqual(ZoneFinder.SUCCESS, result)
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
@@ -422,17 +436,6 @@ class DataSrcUpdater(unittest.TestCase):
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
rrset.to_text())
- result, rrset = updater.find(isc.dns.Name("www.example.com"),
- isc.dns.RRType.A(), None)
- self.assertEqual(ZoneFinder.SUCCESS, result)
- self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
- rrset.to_text())
-
- # Invalid value for 'target'
- self.assertRaises(TypeError, updater.find,
- isc.dns.Name("www.example.com"),
- isc.dns.RRType.A(), 1)
-
def test_update_delete_commit(self):
dsc = isc.datasrc.DataSourceClient("sqlite3", WRITE_ZONE_DB_CONFIG)
@@ -445,7 +448,6 @@ class DataSrcUpdater(unittest.TestCase):
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.SUCCESS, result)
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
@@ -467,14 +469,12 @@ class DataSrcUpdater(unittest.TestCase):
# finder (since we have not committed)
result, rrset = updater.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.NXDOMAIN, result)
self.assertEqual(None, rrset)
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.SUCCESS, result)
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
@@ -487,7 +487,6 @@ class DataSrcUpdater(unittest.TestCase):
# the record should be gone now in the 'real' finder as well
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.NXDOMAIN, result)
self.assertEqual(None, rrset)
@@ -502,7 +501,6 @@ class DataSrcUpdater(unittest.TestCase):
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.SUCCESS, result)
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
@@ -527,7 +525,6 @@ class DataSrcUpdater(unittest.TestCase):
self.assertEqual("example.com.", finder.get_origin().to_text())
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.SUCCESS, result)
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
@@ -551,7 +548,6 @@ class DataSrcUpdater(unittest.TestCase):
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.SUCCESS, result)
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
@@ -573,7 +569,6 @@ class DataSrcUpdater(unittest.TestCase):
# finder (since we have not committed)
result, rrset = updater.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.NXDOMAIN, result)
self.assertEqual(None, rrset)
@@ -584,7 +579,6 @@ class DataSrcUpdater(unittest.TestCase):
# the record should still be available in the 'real' finder as well
result, rrset = finder.find(isc.dns.Name("www.example.com"),
isc.dns.RRType.A(),
- None,
finder.FIND_DEFAULT)
self.assertEqual(finder.SUCCESS, result)
self.assertEqual("www.example.com. 3600 IN A 192.0.2.1\n",
More information about the bind10-changes
mailing list