Make it easier to use the eventlet backdoor locally

In order to determine what to do about this module it
is quite useful to provide for a way to run it as its own
main program (and interact with it from another telnet
session).

This adds a simple `main` function and uses it.

This can then be used like:

$ python oslo_service/eventlet_backdoor.py --backdoor_port 8000

Then from another terminal:

$ telnet localhost 8000

Change-Id: I8c2b93dfad328929e1a106c5883903fe0bfb188a
This commit is contained in:
Joshua Harlow 2015-06-26 18:12:08 -07:00
parent eea13af645
commit c527448894
3 changed files with 47 additions and 13 deletions

View File

@ -93,7 +93,7 @@ def _listen(host, start_port, end_port, listen_func):
try_port += 1 try_port += 1
def initialize_if_enabled(conf): def _initialize_if_enabled(conf):
conf.register_opts(_options.eventlet_backdoor_opts) conf.register_opts(_options.eventlet_backdoor_opts)
backdoor_locals = { backdoor_locals = {
'exit': _dont_use_this, # So we don't exit the entire process 'exit': _dont_use_this, # So we don't exit the entire process
@ -127,6 +127,40 @@ def initialize_if_enabled(conf):
_LI('Eventlet backdoor listening on %(port)s for process %(pid)d'), _LI('Eventlet backdoor listening on %(port)s for process %(pid)d'),
{'port': port, 'pid': os.getpid()} {'port': port, 'pid': os.getpid()}
) )
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, thread = eventlet.spawn(eventlet.backdoor.backdoor_server, sock,
locals=backdoor_locals) locals=backdoor_locals)
return (port, thread)
def initialize_if_enabled(conf):
port_thread = _initialize_if_enabled(conf)
if not port_thread:
return None
else:
port, _thread = port_thread
return port return port
def _main():
import eventlet
eventlet.monkey_patch(all=True)
from oslo_config import cfg
logging.basicConfig(level=logging.DEBUG)
conf = cfg.ConfigOpts()
conf.register_cli_opts(_options.eventlet_backdoor_opts)
conf(sys.argv[1:])
port_thread = _initialize_if_enabled(conf)
if not port_thread:
raise RuntimeError("Did not create backdoor at requested port")
else:
_port, thread = port_thread
thread.wait()
if __name__ == '__main__':
# simple CLI for testing
_main()

View File

@ -36,7 +36,7 @@ class BackdoorPortTest(base.ServiceBaseTestCase):
def common_backdoor_port_setup(self): def common_backdoor_port_setup(self):
self.sock = self.mox.CreateMockAnything() self.sock = self.mox.CreateMockAnything()
self.mox.StubOutWithMock(eventlet, 'listen') self.mox.StubOutWithMock(eventlet, 'listen')
self.mox.StubOutWithMock(eventlet, 'spawn_n') self.mox.StubOutWithMock(eventlet, 'spawn')
def test_backdoor_port_inuse(self): def test_backdoor_port_inuse(self):
self.config(backdoor_port=2345) self.config(backdoor_port=2345)
@ -52,7 +52,7 @@ class BackdoorPortTest(base.ServiceBaseTestCase):
self.common_backdoor_port_setup() self.common_backdoor_port_setup()
eventlet.listen(('localhost', 8800)).AndReturn(self.sock) eventlet.listen(('localhost', 8800)).AndReturn(self.sock)
self.sock.getsockname().AndReturn(('127.0.0.1', 8800)) self.sock.getsockname().AndReturn(('127.0.0.1', 8800))
eventlet.spawn_n(eventlet.backdoor.backdoor_server, self.sock, eventlet.spawn(eventlet.backdoor.backdoor_server, self.sock,
locals=moxstubout.mox.IsA(dict)) locals=moxstubout.mox.IsA(dict))
self.mox.ReplayAll() self.mox.ReplayAll()
port = eventlet_backdoor.initialize_if_enabled(self.conf) port = eventlet_backdoor.initialize_if_enabled(self.conf)

View File

@ -287,11 +287,11 @@ class LauncherTest(base.ServiceBaseTestCase):
sock = self.mox.CreateMockAnything() sock = self.mox.CreateMockAnything()
self.mox.StubOutWithMock(eventlet, 'listen') self.mox.StubOutWithMock(eventlet, 'listen')
self.mox.StubOutWithMock(eventlet, 'spawn_n') self.mox.StubOutWithMock(eventlet, 'spawn')
eventlet.listen(('localhost', 1234)).AndReturn(sock) eventlet.listen(('localhost', 1234)).AndReturn(sock)
sock.getsockname().AndReturn(('127.0.0.1', 1234)) sock.getsockname().AndReturn(('127.0.0.1', 1234))
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, eventlet.spawn(eventlet.backdoor.backdoor_server, sock,
locals=mox.IsA(dict)) locals=mox.IsA(dict))
self.mox.ReplayAll() self.mox.ReplayAll()
@ -315,13 +315,13 @@ class LauncherTest(base.ServiceBaseTestCase):
sock = self.mox.CreateMockAnything() sock = self.mox.CreateMockAnything()
self.mox.StubOutWithMock(eventlet, 'listen') self.mox.StubOutWithMock(eventlet, 'listen')
self.mox.StubOutWithMock(eventlet, 'spawn_n') self.mox.StubOutWithMock(eventlet, 'spawn')
eventlet.listen(('localhost', 8800)).AndRaise( eventlet.listen(('localhost', 8800)).AndRaise(
socket.error(errno.EADDRINUSE, '')) socket.error(errno.EADDRINUSE, ''))
eventlet.listen(('localhost', 8801)).AndReturn(sock) eventlet.listen(('localhost', 8801)).AndReturn(sock)
sock.getsockname().AndReturn(('127.0.0.1', 8801)) sock.getsockname().AndReturn(('127.0.0.1', 8801))
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, eventlet.spawn(eventlet.backdoor.backdoor_server, sock,
locals=mox.IsA(dict)) locals=mox.IsA(dict))
self.mox.ReplayAll() self.mox.ReplayAll()