s_ConfigurableClientList* self =
static_cast<s_ConfigurableClientList*>(po_self);
try {
- isc::dns::RRClass rrclass(isc::dns::RRClass::IN());
+ const PyObject* rrclass;
if (PyArg_ParseTuple(args, "O!", &isc::dns::python::rrclass_type,
&rrclass)) {
- self->cppobj = new ConfigurableClientList(rrclass);
+ self->cppobj =
+ new ConfigurableClientList(isc::dns::python::
+ PyRRClass_ToRRClass(rrclass));
return (0);
}
} catch (const exception& ex) {
Py_TYPE(self)->tp_free(self);
}
+PyObject*
+ConfigurableClientList_configure(PyObject* po_self, PyObject* args) {
+ s_ConfigurableClientList* self =
+ static_cast<s_ConfigurableClientList*>(po_self);
+ try {
+ const char* configuration;
+ int allow_cache;
+ if (PyArg_ParseTuple(args, "si", &configuration, &allow_cache)) {
+ const isc::data::ConstElementPtr
+ element(isc::data::Element::fromJSON(string(configuration)));
+ self->cppobj->configure(*element, allow_cache);
+ Py_RETURN_NONE;
+ } 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
// 3. Argument type
// 4. Documentation
PyMethodDef ConfigurableClientList_methods[] = {
+ { "configure", ConfigurableClientList_configure, METH_VARARGS,
+ "TODO: Docs" },
{ NULL, NULL, 0, NULL }
};
} // end of unnamed namespace
PYTHONPATH=:$(COMMON_PYTHON_PATH):$(abs_top_builddir)/src/lib/python/isc/log:$(abs_top_builddir)/src/lib/python/isc/datasrc/.libs:$(abs_top_builddir)/src/lib/dns/python/.libs \
TESTDATA_PATH=$(abs_srcdir)/testdata \
TESTDATA_WRITE_PATH=$(abs_builddir) \
+ GLOBAL_TESTDATA_PATH=$(abs_top_srcdir)/src/lib/testutils/testdata \
B10_FROM_BUILD=$(abs_top_builddir) \
$(PYCOVERAGE_RUN) $(abs_srcdir)/$$pytest || exit ; \
done
import isc.datasrc
import isc.dns
import unittest
+import os
+
+TESTDATA_PATH = os.environ['GLOBAL_TESTDATA_PATH'] + os.sep
class ClientListTest(unittest.TestCase):
"""
self.assertRaises(TypeError, isc.datasrc.ConfigurableClientList,
isc.dns.RRClass.IN(), isc.dns.RRClass.IN())
+ def test_configure(self):
+ """
+ Test we can configure the client list. This tests if the valid
+ ones are acceptend and invalid rejected. We check the changes
+ have effect.
+ """
+ clist = isc.datasrc.ConfigurableClientList(isc.dns.RRClass.IN())
+ # This should be NOP now
+ clist.configure("[]", True)
+ # We can use this type, as it is not loaded dynamically.
+ clist.configure('''[{
+ "type": "MasterFiles",
+ "params": {
+ "example.org": "''' + TESTDATA_PATH + '''example.org.zone"
+ },
+ "cache-enable": true
+ }]''', True)
+ self.assertRaises(isc.datasrc.Error, clist.configure, '"bad type"',
+ True)
+ self.assertRaises(isc.datasrc.Error, clist.configure, '''[{
+ "type": "bad type"
+ }]''', True)
+ self.assertRaises(isc.datasrc.Error, clist.configure, '''[{
+ bad JSON,
+ }]''', True)
+ self.assertRaises(TypeError, clist.configure, [], True)
+ self.assertRaises(TypeError, clist.configure, "[]")
+ self.assertRaises(TypeError, clist.configure, "[]", "true")
+
if __name__ == "__main__":
isc.log.init("bind10")
isc.log.resetUnitTestRootLogger()