summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRob Crittenden <rcritten@redhat.com>2008-09-25 23:53:53 -0400
committerJason Gerard DeRose <jderose@redhat.com>2008-09-30 19:37:35 -0600
commitb965e558b5def14c6416beb36dc790cca96c3724 (patch)
tree6f1c0097f46b19f7a8fd2b76763d783c36813fd1
parentafdc72103847fc27efd00f8cc97a7320909ff6a0 (diff)
downloadfreeipa-b965e558b5def14c6416beb36dc790cca96c3724.tar.gz
freeipa-b965e558b5def14c6416beb36dc790cca96c3724.tar.xz
freeipa-b965e558b5def14c6416beb36dc790cca96c3724.zip
Rebase XML-RPC client and server
Fix error handling in server to return exceptions generated in library code
-rw-r--r--ipalib/crud.py6
-rw-r--r--ipalib/plugins/example.py9
-rwxr-xr-xserver/test_client21
-rwxr-xr-xserver/test_server43
4 files changed, 62 insertions, 17 deletions
diff --git a/ipalib/crud.py b/ipalib/crud.py
index 5021d06da..813e0c814 100644
--- a/ipalib/crud.py
+++ b/ipalib/crud.py
@@ -25,8 +25,12 @@ import frontend, errors
class Add(frontend.Method):
+ def get_args(self):
+ yield self.obj.primary_key
+
def get_options(self):
- return self.obj.params()
+ for param in self.obj.params_minus_pk():
+ yield param.__clone__(required=False)
class Get(frontend.Method):
diff --git a/ipalib/plugins/example.py b/ipalib/plugins/example.py
index c565d6785..c7d161600 100644
--- a/ipalib/plugins/example.py
+++ b/ipalib/plugins/example.py
@@ -26,7 +26,8 @@ from ipalib import frontend
from ipalib import crud
from ipalib.frontend import Param
from ipalib import api
-
+from ipalib import servercore
+import ldap
class user(frontend.Object):
'User object'
@@ -78,6 +79,8 @@ api.register(envtest)
# Register some methods for the 'user' object:
class user_add(crud.Add):
'Add a new user.'
+ def execute(self, *args, **kw):
+ return 1
api.register(user_add)
class user_del(crud.Del):
@@ -90,6 +93,10 @@ api.register(user_mod)
class user_find(crud.Find):
'Search the users.'
+ def execute(self, *args, **kw):
+ uid=args[0]
+ result = servercore.get_sub_entry(servercore.basedn, "uid=%s" % uid, ["*"])
+ return result
api.register(user_find)
class user_show(crud.Get):
diff --git a/server/test_client b/server/test_client
index c6cb7eebc..79945a96b 100755
--- a/server/test_client
+++ b/server/test_client
@@ -5,12 +5,19 @@ import xmlrpclib
server = xmlrpclib.ServerProxy("http://localhost:8888/")
print server.system.listMethods()
-#print server.system.methodHelp("user_add")
+print server.system.methodHelp("user_add")
-user = {'givenname':'Joe', 'sn':'Smith'}
-result = server.user_add(user)
-print "returned %s" % result
+try:
+ args="admin"
+ kw = {'givenname':'Joe', 'sn':'Smith'}
+ result = server.user_add(args, kw)
+ print "returned %s" % result
+except xmlrpclib.Fault, e:
+ print e.faultString
-user = {'givenname':'Joe', 'sn':'Smith', 'uid':'admin'}
-result = server.user_find(user)
-print "returned %s" % result
+try:
+ args="admin"
+ result = server.user_find(args)
+ print "returned %s" % result
+except xmlrpclib.Fault, e:
+ print e.faultString
diff --git a/server/test_server b/server/test_server
index c955d87af..2af833995 100755
--- a/server/test_server
+++ b/server/test_server
@@ -12,6 +12,7 @@ import commands
from ipalib import api, conn
from ipalib.conn import context
import ipalib.load_plugins
+import traceback
PORT=8888
@@ -43,11 +44,6 @@ class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHa
Methods beginning with an '_' are considered private and will
not be called.
"""
- if (params):
- (args, kw) = self.parse(*params)
- else:
- args = []
- kw = {}
# this is fine for our test server
uid = commands.getoutput('/usr/bin/id -u')
@@ -62,12 +58,41 @@ class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHa
func = funcs[method]
except KeyError:
raise Exception('method "%s" is not supported' % method)
- return func(**kw)
+ if len(params) > 1 and isinstance(params[-1], dict):
+ kw = params[-1]
+ params = params[:-1]
+ return func(*params, **kw)
+ else:
+ return func(*params)
finally:
# Clean up any per-request data and connections
for k in context.__dict__.keys():
del context.__dict__[k]
+ def _marshaled_dispatch(self, data, dispatch_method = None):
+ try:
+ params, method = xmlrpclib.loads(data)
+
+ # generate response
+ if dispatch_method is not None:
+ response = dispatch_method(method, params)
+ else:
+ response = self._dispatch(method, params)
+ # wrap response in a singleton tuple
+ response = (response,)
+ response = xmlrpclib.dumps(response, methodresponse=1)
+ except:
+ # report exception back to client. This is needed to report
+ # tracebacks found in server code.
+ e_class, e = sys.exc_info()[:2]
+ # FIXME, need to get this number from somewhere...
+ faultCode = getattr(e_class,'faultCode',1)
+ tb_str = ''.join(traceback.format_exception(*sys.exc_info()))
+ faultString = tb_str
+ response = xmlrpclib.dumps(xmlrpclib.Fault(faultCode, faultString))
+
+ return response
+
def do_POST(self):
clientIP, port = self.client_address
# Log client IP and Port
@@ -82,14 +107,16 @@ class LoggingSimpleXMLRPCRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHa
# Log client request
logger.info('Client request: \n%s\n' % data)
- response = self.server._marshaled_dispatch(
+# response = self.server._marshaled_dispatch(
+ response = self._marshaled_dispatch(
data, getattr(self, '_dispatch', None))
# Log server response
logger.info('Server response: \n%s\n' % response)
- except:
+ except Exception, e:
# This should only happen if the module is buggy
# internal error, report as HTTP server error
+ print e
self.send_response(500)
self.end_headers()
else: