Browse Source

a[2051] Wrap the configure method

Michal 'vorner' Vaner 12 years ago
parent
commit
f0ce2e2039

+ 31 - 2
src/lib/python/isc/datasrc/configurableclientlist_python.cc

@@ -56,10 +56,12 @@ ConfigurableClientList_init(PyObject* po_self, PyObject* args, PyObject*) {
     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) {
@@ -84,6 +86,31 @@ ConfigurableClientList_destroy(PyObject* po_self) {
     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
@@ -91,6 +118,8 @@ ConfigurableClientList_destroy(PyObject* po_self) {
 // 3. Argument type
 // 4. Documentation
 PyMethodDef ConfigurableClientList_methods[] = {
+    { "configure", ConfigurableClientList_configure, METH_VARARGS,
+        "TODO: Docs" },
     { NULL, NULL, 0, NULL }
 };
 } // end of unnamed namespace

+ 1 - 0
src/lib/python/isc/datasrc/tests/Makefile.am

@@ -36,6 +36,7 @@ endif
 	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

+ 32 - 0
src/lib/python/isc/datasrc/tests/clientlist_test.py

@@ -17,6 +17,9 @@ import isc.log
 import isc.datasrc
 import isc.dns
 import unittest
+import os
+
+TESTDATA_PATH = os.environ['GLOBAL_TESTDATA_PATH'] + os.sep
 
 class ClientListTest(unittest.TestCase):
     """
@@ -40,6 +43,35 @@ 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()