summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipalib/crud.py76
-rw-r--r--tests/test_ipalib/test_crud.py51
2 files changed, 126 insertions, 1 deletions
diff --git a/ipalib/crud.py b/ipalib/crud.py
index 1bdd03f83..5a60ac8c6 100644
--- a/ipalib/crud.py
+++ b/ipalib/crud.py
@@ -21,7 +21,7 @@
Base classes for standard CRUD operations.
"""
-import frontend, errors
+import backend, frontend, errors
class Add(frontend.Method):
@@ -63,3 +63,77 @@ class Find(frontend.Method):
def get_options(self):
for param in self.obj.params_minus_pk():
yield param.__clone__(required=False)
+
+
+class CrudBackend(backend.Backend):
+ """
+ Base class defining generic CRUD backend API.
+ """
+
+ def create(self, *kw):
+ """
+ Create a new entry.
+
+ This method should take key word arguments representing the
+ attributes the created entry will have.
+
+ If this methods constructs the primary_key internally, it should raise
+ an exception if the primary_key was passed. Likewise, if this method
+ requires the primary_key to be passed in from the caller, it should
+ raise an exception if the primary key was *not* passed.
+
+ This method should return a dict of the exact entry as it was created
+ in the backing store, including any automatically created attributes.
+ """
+ raise NotImplementedError('%s.create()' % self.name)
+
+ def retrieve(self, primary_key):
+ """
+ Retrieve an existing entry.
+
+ This method should take a single argument, the primary_key of the
+ entry in question.
+
+ If such an entry exists, this method should return a dict
+ representing that entry. If no such entry exists, this method
+ should return None.
+ """
+ raise NotImplementedError('%s.retrieve()' % self.name)
+
+ def update(self, primary_key, *kw):
+ """
+ Update an existing entry.
+
+ This method should take one required argument, the primary_key of the
+ entry to modify, plus optional keyword arguments for each of the
+ attributes being updated.
+
+ This method should return a dict representing the entry as it now
+ exists in the backing store. If no such entry exists, this method
+ should return None.
+ """
+ raise NotImplementedError('%s.update()' % self.name)
+
+ def delete(self, primary_key):
+ """
+ Delete an existing entry.
+
+ This method should take one required argument, the primary_key of the
+ entry to delete.
+ """
+ raise NotImplementedError('%s.delete()' % self.name)
+
+ def search(self, **kw):
+ """
+ Return entries matching specific criteria.
+
+ This method should take keyword arguments representing the search
+ criteria. If a key is the name of an entry attribute, the value
+ should be treated as a filter on that attribute. The meaning of
+ keys outside this namespace is left to the implementation.
+
+ This method should return and iterable containing the matched
+ entries, where each entry is a dict. If no entries are matched,
+ this method should return an empty iterable.
+ """
+ raise NotImplementedError('%s.search()' % self.name)
diff --git a/tests/test_ipalib/test_crud.py b/tests/test_ipalib/test_crud.py
index 37da503b5..d7e6b51f3 100644
--- a/tests/test_ipalib/test_crud.py
+++ b/tests/test_ipalib/test_crud.py
@@ -189,3 +189,54 @@ class test_Find(CrudChecker):
['givenname', 'sn', 'initials']
for param in api.Method.user_verb.options():
assert param.required is False
+
+
+class test_CrudBackend(ClassChecker):
+ """
+ Test the `ipalib.crud.CrudBackend` class.
+ """
+
+ _cls = crud.CrudBackend
+
+ def get_subcls(self):
+ class ldap(self.cls):
+ pass
+ return ldap
+
+ def check_method(self, name, *args):
+ o = self.cls()
+ e = raises(NotImplementedError, getattr(o, name), *args)
+ assert str(e) == 'CrudBackend.%s()' % name
+ sub = self.subcls()
+ e = raises(NotImplementedError, getattr(sub, name), *args)
+ assert str(e) == 'ldap.%s()' % name
+
+ def test_create(self):
+ """
+ Test the `ipalib.crud.CrudBackend.create` method.
+ """
+ self.check_method('create')
+
+ def test_retrieve(self):
+ """
+ Test the `ipalib.crud.CrudBackend.retrieve` method.
+ """
+ self.check_method('retrieve', 'primary key')
+
+ def test_update(self):
+ """
+ Test the `ipalib.crud.CrudBackend.update` method.
+ """
+ self.check_method('update', 'primary key')
+
+ def test_delete(self):
+ """
+ Test the `ipalib.crud.CrudBackend.delete` method.
+ """
+ self.check_method('delete', 'primary key')
+
+ def test_search(self):
+ """
+ Test the `ipalib.crud.CrudBackend.search` method.
+ """
+ self.check_method('search')