XQueue Hacking

Verifying That Your Credentials Work

We provide a reference implementation application for listening to an XQueue and dispatching messages to graders.  The reference implementation, xqueue-watcher, is written in python and is open source.  You can clone or fork it from here https://github.com/edx/xqueue-watcher.  We use xqueue-watcher in production to run pull graders.  You don't have to, but, even if you don't, it's a useful tool for ensuring you can connect to your queue.  Here's a relatively quick way of verifying that you have the correct credentials and can connect.

This, of course, assumes that you have had a queue provisioned for you course either on edX infrastructure or your own.  The following commands will clone the xqueue-watcher repository, create a python virtualenvironment, install the xqueue-watcher and IPython.

$ git clone git@github.com:edx/xqueue-watcher.git
$ cd xqueue-watcher
$ virtualenv /tmp/xqueue-watcher
New python executable in /tmp/xqueue-watcher/bin/python2
Also creating executable in /tmp/xqueue-watcher/bin/python
Installing setuptools, pip...done.
$ . /tmp/xqueue-watcher/bin/activate
(xqueue-watcher) $ make requirements
(xqueue-watcher) $ pip install ipython

Assuming that all has gone well, start an IPython REPL

(xqueue-watcher) $ ipython

Type "copyright", "credits" or "license" for more information.

IPython 4.2.0 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [n]: # Setup logging to help figure out what, if anything, went wrong

In [n]: import logging
In [n]: logger = logging.getLogger()
In [n]: logger.setLevel(logging.DEBUG)

In [n]: # Note that this example is using both HTTP basic auth and XQueue authentication
In [n]: # for the sake of completeness.  The HTTP basic auth is encoded in URL between // and @
In [n]: # typically you will not need this.

In [n]: # Create a client a login to test you credentials
In [n]: from xqueue_watcher.client import XQueueClient
In [n]: c = XQueueClient('queue-name', xqueue_server='https://basic-auth-user:basic-auth-pass@xqueue.example.com', xqueue_auth=('xqueue-user','xqueue-pass'))
In [n]: c._login()
DEBUG:xqueue_watcher.client:Trying to login to https://basic-auth-user:basic-auth-pass@xqueue.example.com/xqueue/login/ with user: xqueue-user and pass xqueue-pass
INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): xqueue.example.com
DEBUG:requests.packages.urllib3.connectionpool:"POST /xqueue/login/ HTTP/1.1" 200 61
DEBUG:xqueue_watcher.client:login response from 'https://basic-auth-user:basic-auth-pass@xqueue.example.com/xqueue/login/': {u'content': u'Logged in', u'return_code': 0}
Out[n]: True

In [n]: # Check the queue for work
In [n]: c.process_one()
INFO:requests.packages.urllib3.connectionpool:Resetting dropped connection: xqueue.example.com
DEBUG:requests.packages.urllib3.connectionpool:"GET /xqueue/get_submission/?queue_name=queue-name&block=true HTTP/1.1" 200 78
Out[n]: False

In [n]: # Things are working, but the queue is empty

If the call to _login() returns False, something is not working correctly and additional investigation is required.