#include <util/python/pycppwrapper_util.h>
#include <dns/python/rrclass_python.h>
+#include <dns/python/name_python.h>
#include <datasrc/client_list.h>
#include "configurableclientlist_python.h"
#include "datasrc.h"
#include "configurableclientlist_inc.cc"
+#include "finder_python.h"
+#include "client_python.h"
using namespace std;
using namespace isc::util::python;
}
namespace {
-// Shortcut type which would be convenient for adding class variables safely.
-typedef CPPPyObjectContainer<s_ConfigurableClientList, ConfigurableClientList>
- ConfigurableClientListContainer;
int
ConfigurableClientList_init(PyObject* po_self, PyObject* args, PyObject*) {
}
}
+PyObject*
+ConfigurableClientList_find(PyObject* po_self, PyObject* args) {
+ s_ConfigurableClientList* self =
+ static_cast<s_ConfigurableClientList*>(po_self);
+ try {
+ PyObject* name_obj;
+ int want_exact_match = 0;
+ int want_finder = 1;
+ if (PyArg_ParseTuple(args, "O!|ii", &isc::dns::python::name_type,
+ &name_obj, &want_exact_match, &want_finder)) {
+ const isc::dns::Name
+ name(isc::dns::python::PyName_ToName(name_obj));
+ const ClientList::FindResult
+ result(self->cppobj->find(name, want_exact_match,
+ want_finder));
+ PyObjectContainer dsrc;
+ if (result.dsrc_client_ == NULL) {
+ // Use the Py_BuildValue, as it takes care of the
+ // reference counts correctly.
+ dsrc.reset(Py_BuildValue(""));
+ } else {
+ dsrc.reset(wrapDataSourceClient(result.dsrc_client_));
+ }
+ PyObjectContainer finder;
+ if (result.finder_ == NULL) {
+ finder.reset(Py_BuildValue(""));
+ } else {
+ finder.reset(createZoneFinderObject(result.finder_));
+ }
+ PyObjectContainer exact(PyBool_FromLong(result.exact_match_));
+
+ return (Py_BuildValue("OOO", dsrc.get(), finder.get(),
+ exact.get()));
+ } else {
+ return (NULL);
+ }
+ } catch (const std::exception& exc) {
+ PyErr_SetString(getDataSourceException("Error"), exc.what());
+ return (NULL);
+ } catch (...) {
+ PyErr_SetString(getDataSourceException("Error"),
+ "Unknown C++ exception");
+ return (NULL);
+ }
+}
+
// This list contains the actual set of functions we have in
// python. Each entry has
// 1. Python method name
PyMethodDef ConfigurableClientList_methods[] = {
{ "configure", ConfigurableClientList_configure, METH_VARARGS,
"TODO: Docs" },
+ { "find", ConfigurableClientList_find, METH_VARARGS, "TODO: Docs" },
{ NULL, NULL, 0, NULL }
};
} // end of unnamed namespace
clist = isc.datasrc.ConfigurableClientList(isc.dns.RRClass.IN())
# This should be NOP now
clist.configure("[]", True)
+ # Check the zone is not there yet
+ dsrc, finder, exact = clist.find(isc.dns.Name("example.org"))
+ self.assertIsNone(dsrc)
+ self.assertIsNone(finder)
+ self.assertFalse(exact)
# We can use this type, as it is not loaded dynamically.
clist.configure('''[{
"type": "MasterFiles",
},
"cache-enable": true
}]''', True)
+ # Check the zone is there now. Proper tests of find are in other
+ # test methods.
+ dsrc, finder, exact = clist.find(isc.dns.Name("example.org"))
+ self.assertIsNotNone(dsrc)
+ self.assertTrue(isinstance(dsrc, isc.datasrc.DataSourceClient))
+ self.assertIsNotNone(finder)
+ self.assertTrue(isinstance(finder, isc.datasrc.ZoneFinder))
+ self.assertTrue(exact)
self.assertRaises(isc.datasrc.Error, clist.configure, '"bad type"',
True)
self.assertRaises(isc.datasrc.Error, clist.configure, '''[{
self.assertRaises(TypeError, clist.configure, "[]")
self.assertRaises(TypeError, clist.configure, "[]", "true")
+ def test_find(self):
+ """
+ Test the find accepts the right arguments, some of them can be omitted,
+ etc.
+ """
+ clist = isc.datasrc.ConfigurableClientList(isc.dns.RRClass.IN())
+ clist.configure('''[{
+ "type": "MasterFiles",
+ "params": {
+ "example.org": "''' + TESTDATA_PATH + '''example.org.zone"
+ },
+ "cache-enable": true
+ }]''', True)
+ dsrc, finder, exact = clist.find(isc.dns.Name("sub.example.org"))
+ self.assertIsNotNone(dsrc)
+ self.assertTrue(isinstance(dsrc, isc.datasrc.DataSourceClient))
+ self.assertIsNotNone(finder)
+ self.assertTrue(isinstance(finder, isc.datasrc.ZoneFinder))
+ # We check an exact match in test_configure already
+ self.assertFalse(exact)
+ dsrc, finder, exact = clist.find(isc.dns.Name("sub.example.org"),
+ False)
+ self.assertIsNotNone(dsrc)
+ self.assertTrue(isinstance(dsrc, isc.datasrc.DataSourceClient))
+ self.assertIsNotNone(finder)
+ self.assertTrue(isinstance(finder, isc.datasrc.ZoneFinder))
+ self.assertFalse(exact)
+ dsrc, finder, exact = clist.find(isc.dns.Name("sub.example.org"),
+ True)
+ self.assertIsNone(dsrc)
+ self.assertIsNone(finder)
+ self.assertFalse(exact)
+ dsrc, finder, exact = clist.find(isc.dns.Name("sub.example.org"),
+ False, False)
+ self.assertIsNotNone(dsrc)
+ self.assertTrue(isinstance(dsrc, isc.datasrc.DataSourceClient))
+ self.assertIsNotNone(finder)
+ self.assertTrue(isinstance(finder, isc.datasrc.ZoneFinder))
+ self.assertFalse(exact)
+ dsrc, finder, exact = clist.find(isc.dns.Name("sub.example.org"),
+ True, False)
+ self.assertIsNone(dsrc)
+ self.assertIsNone(finder)
+ self.assertFalse(exact)
+ # Some invalid inputs
+ self.assertRaises(TypeError, clist.find, "example.org")
+ self.assertRaises(TypeError, clist.find)
+
if __name__ == "__main__":
isc.log.init("bind10")
isc.log.resetUnitTestRootLogger()