From c7c55b2f82e6a9d712f7951b937a2a2e46e2b2d5 Mon Sep 17 00:00:00 2001 From: Raymond Pekowski Date: Thu, 20 Jun 2013 05:50:59 +0000 Subject: Improve usability when backdoor_port is nonzero Users who may not know that configuring a backdoor_port with 0 allows multiple services to be enabled for the eventlet backdoor or who simply want a more predictable port assignment might like this patch. If the specified port is in use, it is incremented until a free port is found. This is a backdoor_port collision recovery scheme as opposed to the collision failure scheme that exists today. This related to I95fdb5ca: Add support for backdoor_port to be returned with a rpc call. Change-Id: I7ec346db3575995fa15483b617eea34c1e003bb0 --- tests/unit/test_service.py | 62 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) (limited to 'tests/unit/test_service.py') diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py index 7e07f28..0f93830 100644 --- a/tests/unit/test_service.py +++ b/tests/unit/test_service.py @@ -17,18 +17,23 @@ # under the License. """ -Unit Tests for remote procedure calls using queue +Unit Tests for service class """ from __future__ import print_function +import errno +import eventlet +import mox import os import signal +import socket import time import traceback from oslo.config import cfg +from openstack.common import eventlet_backdoor from openstack.common import log as logging from openstack.common.notifier import api as notifier_api from openstack.common import service @@ -191,10 +196,59 @@ class ServiceLauncherTest(utils.BaseTestCase): class LauncherTest(utils.BaseTestCase): + def test_backdoor_port(self): - # backdoor port should get passed to the service being launched - self.config(backdoor_port=1234) + self.config(backdoor_port='1234') + + sock = self.mox.CreateMockAnything() + self.mox.StubOutWithMock(eventlet, 'listen') + self.mox.StubOutWithMock(eventlet, 'spawn_n') + + 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)) + + self.mox.ReplayAll() + svc = service.Service() launcher = service.launch(svc) - self.assertEqual(1234, svc.backdoor_port) + self.assertEqual(svc.backdoor_port, 1234) launcher.stop() + + def test_backdoor_inuse(self): + sock = eventlet.listen(('localhost', 0)) + port = sock.getsockname()[1] + self.config(backdoor_port=port) + svc = service.Service() + self.assertRaises(socket.error, + service.launch, svc) + sock.close() + + def test_backdoor_port_range_one_inuse(self): + self.config(backdoor_port='8800:8900') + + sock = self.mox.CreateMockAnything() + self.mox.StubOutWithMock(eventlet, 'listen') + self.mox.StubOutWithMock(eventlet, 'spawn_n') + + 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)) + + self.mox.ReplayAll() + + svc = service.Service() + launcher = service.launch(svc) + self.assertEqual(svc.backdoor_port, 8801) + launcher.stop() + + def test_backdoor_port_reverse_range(self): + # backdoor port should get passed to the service being launched + self.config(backdoor_port='8888:7777') + svc = service.Service() + self.assertRaises(eventlet_backdoor.EventletBackdoorConfigValueError, + service.launch, svc) -- cgit