diff options
Diffstat (limited to 'testapp/exam/xmlrpc_clients.py')
-rw-r--r-- | testapp/exam/xmlrpc_clients.py | 80 |
1 files changed, 0 insertions, 80 deletions
diff --git a/testapp/exam/xmlrpc_clients.py b/testapp/exam/xmlrpc_clients.py deleted file mode 100644 index 3a3c0c6..0000000 --- a/testapp/exam/xmlrpc_clients.py +++ /dev/null @@ -1,80 +0,0 @@ -from xmlrpclib import ServerProxy -import time -import random -import socket -import json - -from settings import SERVER_PORTS, SERVER_POOL_PORT - - -class ConnectionError(Exception): - pass - -############################################################################### -# `CodeServerProxy` class. -############################################################################### - - -class CodeServerProxy(object): - """A class that manages accesing the farm of Python servers and making - calls to them such that no one XMLRPC server is overloaded. - """ - def __init__(self): - pool_url = 'http://localhost:%d' % (SERVER_POOL_PORT) - self.pool_server = ServerProxy(pool_url) - - def run_code(self, language, json_data, user_dir): - """Tests given code (`answer`) with the `test_code` supplied. If the - optional `in_dir` keyword argument is supplied it changes the directory - to that directory (it does not change it back to the original when - done). The parameter language specifies which language to use for the - tests. - - Parameters - ---------- - json_data contains; - user_answer : str - The user's answer for the question. - test_code : str - The test code to check the user code with. - language : str - The programming language to use. - - user_dir : str (directory) - The directory to run the tests inside. - - - Returns - ------- - A json string of a dict: {success: success, err: error message}. - """ - - try: - server = self._get_server() - result = server.check_code(language, json_data, user_dir) - except ConnectionError: - result = json.dumps({'success': False, 'error': 'Unable to connect to any code servers!'}) - return result - - def _get_server(self): - # Get a suitable server from our pool of servers. This may block. We - # try about 60 times, essentially waiting at most for about 30 seconds. - done, count = False, 60 - - while not done and count > 0: - try: - port = self.pool_server.get_server_port() - except socket.error: - # Wait a while try again. - time.sleep(random.random()) - count -= 1 - else: - done = True - if not done: - raise ConnectionError("Couldn't connect to a server!") - proxy = ServerProxy('http://localhost:%d' % port) - return proxy - -# views.py calls this Python server which forwards the request to one -# of the running servers. -code_server = CodeServerProxy() |