From c527448894fbecfbd149f99b99c95f414c59739f Mon Sep 17 00:00:00 2001 From: Joshua Harlow Date: Fri, 26 Jun 2015 18:12:08 -0700 Subject: [PATCH] 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 --- oslo_service/eventlet_backdoor.py | 42 ++++++++++++++++++-- oslo_service/tests/test_eventlet_backdoor.py | 6 +-- oslo_service/tests/test_service.py | 12 +++--- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/oslo_service/eventlet_backdoor.py b/oslo_service/eventlet_backdoor.py index a0726194..c16e0e23 100644 --- a/oslo_service/eventlet_backdoor.py +++ b/oslo_service/eventlet_backdoor.py @@ -93,7 +93,7 @@ def _listen(host, start_port, end_port, listen_func): try_port += 1 -def initialize_if_enabled(conf): +def _initialize_if_enabled(conf): conf.register_opts(_options.eventlet_backdoor_opts) backdoor_locals = { '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'), {'port': port, 'pid': os.getpid()} ) - eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, - locals=backdoor_locals) - return port + thread = eventlet.spawn(eventlet.backdoor.backdoor_server, sock, + 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 + + +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() diff --git a/oslo_service/tests/test_eventlet_backdoor.py b/oslo_service/tests/test_eventlet_backdoor.py index 7f03f7d1..1cb54845 100644 --- a/oslo_service/tests/test_eventlet_backdoor.py +++ b/oslo_service/tests/test_eventlet_backdoor.py @@ -36,7 +36,7 @@ class BackdoorPortTest(base.ServiceBaseTestCase): def common_backdoor_port_setup(self): self.sock = self.mox.CreateMockAnything() self.mox.StubOutWithMock(eventlet, 'listen') - self.mox.StubOutWithMock(eventlet, 'spawn_n') + self.mox.StubOutWithMock(eventlet, 'spawn') def test_backdoor_port_inuse(self): self.config(backdoor_port=2345) @@ -52,8 +52,8 @@ class BackdoorPortTest(base.ServiceBaseTestCase): self.common_backdoor_port_setup() eventlet.listen(('localhost', 8800)).AndReturn(self.sock) self.sock.getsockname().AndReturn(('127.0.0.1', 8800)) - eventlet.spawn_n(eventlet.backdoor.backdoor_server, self.sock, - locals=moxstubout.mox.IsA(dict)) + eventlet.spawn(eventlet.backdoor.backdoor_server, self.sock, + locals=moxstubout.mox.IsA(dict)) self.mox.ReplayAll() port = eventlet_backdoor.initialize_if_enabled(self.conf) self.assertEqual(port, 8800) diff --git a/oslo_service/tests/test_service.py b/oslo_service/tests/test_service.py index 5b8d2e58..c5ddc92e 100644 --- a/oslo_service/tests/test_service.py +++ b/oslo_service/tests/test_service.py @@ -287,12 +287,12 @@ class LauncherTest(base.ServiceBaseTestCase): sock = self.mox.CreateMockAnything() self.mox.StubOutWithMock(eventlet, 'listen') - self.mox.StubOutWithMock(eventlet, 'spawn_n') + self.mox.StubOutWithMock(eventlet, 'spawn') eventlet.listen(('localhost', 1234)).AndReturn(sock) sock.getsockname().AndReturn(('127.0.0.1', 1234)) - eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, - locals=mox.IsA(dict)) + eventlet.spawn(eventlet.backdoor.backdoor_server, sock, + locals=mox.IsA(dict)) self.mox.ReplayAll() @@ -315,14 +315,14 @@ class LauncherTest(base.ServiceBaseTestCase): sock = self.mox.CreateMockAnything() self.mox.StubOutWithMock(eventlet, 'listen') - self.mox.StubOutWithMock(eventlet, 'spawn_n') + self.mox.StubOutWithMock(eventlet, 'spawn') eventlet.listen(('localhost', 8800)).AndRaise( socket.error(errno.EADDRINUSE, '')) eventlet.listen(('localhost', 8801)).AndReturn(sock) sock.getsockname().AndReturn(('127.0.0.1', 8801)) - eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, - locals=mox.IsA(dict)) + eventlet.spawn(eventlet.backdoor.backdoor_server, sock, + locals=mox.IsA(dict)) self.mox.ReplayAll()