Permalink
Browse files

Adding a means to connect back to a pydevd debugger.

That patch allows a developer to remotely run a pydev debugger and have the
keystone-all process connect back to it.  Two command line options are
introduced:
    --pydev-debug-host <host>
    --pydev-debug-port <port>
both of the above options are required to enable this behavior.

This patch only enables this behavior when the service is started with
keystone-all.  In the future parts of this patch can be used to enable
this behavior when running in Apache.

Change-Id: I92f99fa34112336a96e42e8261b7313f23ee994e
  • Loading branch information...
1 parent ac2d92c commit 0f225743e8644416df2f200d710912c40b7acd47 John Bresnahan committed Dec 19, 2012
Showing with 29 additions and 0 deletions.
  1. +7 −0 bin/keystone-all
  2. +19 −0 keystone/common/utils.py
  3. +3 −0 keystone/config.py
View
@@ -91,6 +91,13 @@ if __name__ == '__main__':
sys.exit(1)
monkeypatch_thread = not CONF.standard_threads
+ pydev_debug_url = utils.setup_remote_pydev_debug()
+ if pydev_debug_url:
+ # in order to work around errors caused by monkey patching we have to
+ # set the thread to False. An explanation is here:
+ # http://lists.openstack.org/pipermail/openstack-dev/2012-August/
+ # 000794.html
+ monkeypatch_thread = False
eventlet.patcher.monkey_patch(all=False, socket=True, time=True,
thread=monkeypatch_thread)
View
@@ -292,3 +292,22 @@ def hash_signed_token(signed_text):
hash_ = hashlib.md5()
hash_.update(signed_text)
return hash_.hexdigest()
+
+
+def setup_remote_pydev_debug():
+ if CONF.pydev_debug_host and CONF.pydev_debug_port:
+ error_msg = ('Error setting up the debug environment. Verify that the'
+ ' option --debug-url has the format <host>:<port> and '
+ 'that a debugger processes is listening on that port.')
+
+ try:
+ from pydev import pydevd
+
+ pydevd.settrace(CONF.pydev_debug_host,
+ port=CONF.pydev_debug_port,
+ stdoutToServer=True,
+ stderrToServer=True)
+ return True
+ except:
+ LOG.exception(_(error_msg))
+ raise
View
@@ -125,6 +125,9 @@ def register_cli_int(*args, **kw):
register_cli_bool('standard-threads', default=False)
+register_cli_str('pydev-debug-host', default=None)
+register_cli_int('pydev-debug-port', default=None)
+
register_str('admin_token', default='ADMIN')
register_str('bind_host', default='0.0.0.0')
register_str('compute_port', default=8774)

0 comments on commit 0f22574

Please sign in to comment.