[svn] commit: r2872 - in /branches/trac232/src/lib/datasrc/python: libdata_source_python.cc tests/data_source_python_test.py
BIND 10 source code commits
bind10-changes at lists.isc.org
Wed Sep 8 20:04:13 UTC 2010
Author: jelte
Date: Wed Sep 8 20:04:13 2010
New Revision: 2872
Log:
replaceZone, haveRRset, and updateCheckPrerequisite wrappers
Modified:
branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
Modified: branches/trac232/src/lib/datasrc/python/libdata_source_python.cc
==============================================================================
--- branches/trac232/src/lib/datasrc/python/libdata_source_python.cc (original)
+++ branches/trac232/src/lib/datasrc/python/libdata_source_python.cc Wed Sep 8 20:04:13 2010
@@ -86,6 +86,9 @@
static PyObject* DataSrc_addRRset(s_DataSrc* self, PyObject* args);
static PyObject* DataSrc_delRRset(s_DataSrc* self, PyObject* args);
static PyObject* DataSrc_delZone(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_replaceZone(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_haveRRset(s_DataSrc* self, PyObject* args);
+static PyObject* DataSrc_updateCheckPrerequisite(s_DataSrc* self, PyObject* args);
static PyMethodDef DataSrc_methods[] = {
{ "get_class", reinterpret_cast<PyCFunction>(DataSrc_getClass), METH_NOARGS,
@@ -119,6 +122,12 @@
"Delete an RRset" },
{ "del_zone", reinterpret_cast<PyCFunction>(DataSrc_delZone), METH_VARARGS,
"Delete an entire zone" },
+ { "replace_zone", reinterpret_cast<PyCFunction>(DataSrc_replaceZone), METH_VARARGS,
+ "Replace an entire zone" },
+ { "have_rrset", reinterpret_cast<PyCFunction>(DataSrc_haveRRset), METH_VARARGS,
+ "Checks if the given RRset exists" },
+ { "update_check_prerequisite", reinterpret_cast<PyCFunction>(DataSrc_updateCheckPrerequisite), METH_VARARGS,
+ "Checks the given DNS Update prerequisite" },
{ NULL, NULL, 0, NULL }
};
@@ -413,6 +422,20 @@
return isc::dns::rdata::createRdata(rrtype, rrclass, rdata_str);
}
+bool
+pyRRset_Check(const PyObject* rrset_obj)
+{
+ PyObject* rrset_class = PyObject_GetAttrString(po_DNS_module, "RRset");
+ bool result = false;
+
+ if (rrset_obj && rrset_obj->ob_type &&
+ rrset_class->ob_type == rrset_obj->ob_type
+ ) {
+ result = true;
+ }
+ return result;
+}
+
PyObject*
pyRRset_FromRRset(const isc::dns::RRset& rrset)
{
@@ -444,7 +467,7 @@
return rrset_obj;
}
-isc::dns::ConstRRsetPtr
+isc::dns::RRsetPtr
pyRRset_AsRRsetPtr(PyObject* rrset_obj)
{
PyObject* name_obj = PyObject_CallMethod(rrset_obj, "get_name", NULL);
@@ -469,6 +492,15 @@
Py_DECREF(rrttl_obj);
return rrset_ptr;
+}
+
+PyObject*
+pyRcode_FromRcode(const isc::dns::Rcode& rcode)
+{
+ PyObject* rcode_class = PyObject_GetAttrString(po_DNS_module, "Rcode");
+ PyObject* rcode_obj = PyObject_CallObject(rcode_class, Py_BuildValue("(I)", rcode.getCode()));
+ Py_DECREF(rcode_class);
+ return rcode_obj;
}
/* end of conversion functions */
@@ -865,9 +897,84 @@
}
+static PyObject*
+DataSrc_replaceZone(s_DataSrc* self, PyObject* args) {
+ s_DataSrcTransaction *transaction;
+ PyObject *rrset_list_obj;
+
+ if (PyArg_ParseTuple(args, "O!O",
+ &datasrc_transaction_type, &transaction,
+ &rrset_list_obj)) {
+ if (!PyList_Check(rrset_list_obj)) {
+ PyErr_SetString(PyExc_TypeError,
+ "argument 2 of replace_zone() is not a List");
+ return (NULL);
+ }
+ isc::dns::RRsetList rrset_list;
+ for (int i = 0; i < PyList_Size(rrset_list_obj); ++i) {
+ PyObject* rrset_obj = PyList_GET_ITEM(rrset_list_obj, i);
+ if (!pyRRset_Check(rrset_obj)) {
+ PyErr_SetString(PyExc_TypeError,
+ "non-RRset object in argument 2 of replace_zone()");
+ return (NULL);
+ }
+ rrset_list.addRRset(pyRRset_AsRRsetPtr(rrset_obj));
+ }
+ PyObject* result = Py_BuildValue("I",
+ self->datasrc->replaceZone(
+ *(transaction->datasrc_transaction),
+ rrset_list));
+ return result;
+ }
+ return (NULL);
+}
+
+static PyObject*
+DataSrc_haveRRset(s_DataSrc* self, PyObject* args) {
+ s_DataSrcTransaction *transaction;
+ PyObject* rrset_obj;
+
+ if (PyArg_ParseTuple(args, "O!O",
+ &datasrc_transaction_type, &transaction,
+ &rrset_obj)) {
+ isc::dns::ConstRRsetPtr rrset_ptr = pyRRset_AsRRsetPtr(rrset_obj);
+
+ PyObject* result = Py_BuildValue("I",
+ self->datasrc->haveRRset(
+ *(transaction->datasrc_transaction),
+ rrset_ptr));
+ return result;
+ }
+ return (NULL);
+}
+
+static PyObject*
+DataSrc_updateCheckPrerequisite(s_DataSrc* self, PyObject* args) {
+ s_DataSrcTransaction *transaction;
+ PyObject* rrset_type = PyObject_GetAttrString(po_DNS_module, "RRset");
+ PyObject* rrset_obj;
+
+ if (PyArg_ParseTuple(args, "O!O!",
+ &datasrc_transaction_type, &transaction,
+ rrset_type, &rrset_obj)) {
+ isc::dns::ConstRRsetPtr rrset_ptr = pyRRset_AsRRsetPtr(rrset_obj);
+ isc::dns::Rcode rcode = self->datasrc->updateCheckPrerequisite(
+ *(transaction->datasrc_transaction),
+ rrset_ptr);
+ return pyRcode_FromRcode(rcode);
+ }
+ return (NULL);
+}
+
+
+
+//
//
// Transaction objects
//
+//
+
+
static int
DataSrcTransaction_new(s_DataSrcTransaction* self, PyObject* args) {
// TODO: hardcoded to sqlite3 data source right now.
Modified: branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py
==============================================================================
--- branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py (original)
+++ branches/trac232/src/lib/datasrc/python/tests/data_source_python_test.py Wed Sep 8 20:04:13 2010
@@ -321,10 +321,11 @@
def test_del_zone(self):
transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
result = self.ds.start_transaction(transaction)
-
- self.assertEqual(DataSrc.T_SUCCESS, result)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
result = self.ds.del_zone(transaction)
self.assertEqual(DataSrc.T_SUCCESS, result)
+
result = self.ds.commit_transaction(transaction)
self.assertEqual(DataSrc.T_SUCCESS, result)
@@ -336,6 +337,76 @@
transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
result = self.ds.start_transaction(transaction)
self.assertEqual(DataSrc.T_NO_SUCH_ZONE, result)
+
+ def test_replace_zone(self):
+ transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+ result = self.ds.start_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ result = []
+ n = self.ds.find_rrset(Name("www.example.com"), RRClass.IN(), RRType.A(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(1, len(result))
+
+ new_rrs = []
+ result = self.ds.replace_zone(transaction, new_rrs)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ self.assertRaises(TypeError, self.ds.replace_zone, transaction)
+ self.assertRaises(TypeError, self.ds.replace_zone, transaction, 1)
+ self.assertRaises(TypeError, self.ds.replace_zone, transaction, [1])
+
+ result = self.ds.commit_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ result = []
+ n = self.ds.find_rrset(Name("www.example.com"), RRClass.IN(), RRType.A(), result, 0, Name("example.com"))
+ self.assertEqual(DataSrc.SUCCESS, n);
+ self.assertEqual(0, len(result))
+
+ def test_have_rrset(self):
+ transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+ result = self.ds.start_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ rrset1 = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+ rrset1.add_rdata(Rdata(rrset1.get_type(), rrset1.get_class(), "192.0.2.1"))
+ rrset2 = RRset(Name("www.example.com"), RRClass.IN(), RRType.TXT(), RRTTL(3600))
+ rrset2.add_rdata(Rdata(rrset2.get_type(), rrset2.get_class(), "Just some text"))
+
+ self.assertTrue(self.ds.have_rrset(transaction, rrset1))
+ self.assertFalse(self.ds.have_rrset(transaction, rrset2))
+
+ self.assertRaises(TypeError, self.ds.have_rrset)
+ self.assertRaises(TypeError, self.ds.have_rrset, 1)
+ self.assertRaises(TypeError, self.ds.have_rrset, [])
+
+
+ def test_update_check_prerequisite(self):
+ transaction = DataSrcTransaction(self.ds, Name("example.com"), RRClass.IN())
+ result = self.ds.start_transaction(transaction)
+ self.assertEqual(DataSrc.T_SUCCESS, result)
+
+ rrset1 = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(0))
+ rrset1.add_rdata(Rdata(rrset1.get_type(), rrset1.get_class(), "192.0.2.1"))
+ rrset2 = RRset(Name("www.example.com"), RRClass.IN(), RRType.TXT(), RRTTL(0))
+ rrset2.add_rdata(Rdata(rrset2.get_type(), rrset2.get_class(), "Just some text"))
+ rrset3 = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(0))
+ rrset3.add_rdata(Rdata(rrset3.get_type(), rrset3.get_class(), "192.0.2.255"))
+ rrset4 = RRset(Name("www.example.com"), RRClass.IN(), RRType.A(), RRTTL(3600))
+ rrset4.add_rdata(Rdata(rrset3.get_type(), rrset4.get_class(), "192.0.2.255"))
+
+ self.assertEqual(Rcode.NOERROR(), self.ds.update_check_prerequisite(transaction, rrset1))
+ self.assertEqual(Rcode.NXRRSET(), self.ds.update_check_prerequisite(transaction, rrset2))
+ self.assertEqual(Rcode.NXRRSET(), self.ds.update_check_prerequisite(transaction, rrset3))
+ self.assertEqual(Rcode.FORMERR(), self.ds.update_check_prerequisite(transaction, rrset4))
+
+ self.assertRaises(TypeError, self.ds.update_check_prerequisite)
+ self.assertRaises(TypeError, self.ds.update_check_prerequisite, 1)
+ self.assertRaises(TypeError, self.ds.update_check_prerequisite, [])
+
+
+
# helper functions for tests taken from c++ unittests
More information about the bind10-changes
mailing list