summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/common/eventlet_backdoor.py8
-rw-r--r--nova/compute/api.py4
-rw-r--r--nova/compute/manager.py6
-rw-r--r--nova/compute/rpcapi.py5
-rw-r--r--nova/manager.py1
-rw-r--r--nova/network/api.py3
-rw-r--r--nova/network/manager.py4
-rw-r--r--nova/network/rpcapi.py3
-rw-r--r--nova/service.py11
-rw-r--r--nova/tests/compute/test_compute.py30
-rw-r--r--nova/tests/compute/test_rpcapi.py3
-rw-r--r--nova/tests/network/test_api.py12
-rw-r--r--nova/tests/network/test_manager.py13
-rw-r--r--nova/tests/network/test_rpcapi.py3
14 files changed, 101 insertions, 5 deletions
diff --git a/nova/common/eventlet_backdoor.py b/nova/common/eventlet_backdoor.py
index 4620d76ac..b407171c4 100644
--- a/nova/common/eventlet_backdoor.py
+++ b/nova/common/eventlet_backdoor.py
@@ -64,7 +64,7 @@ backdoor_locals = {
def initialize_if_enabled():
if CONF.backdoor_port is None:
- return
+ return None
# NOTE(johannes): The standard sys.displayhook will print the value of
# the last expression and set it to __builtin__._, which overwrites
@@ -76,6 +76,8 @@ def initialize_if_enabled():
pprint.pprint(val)
sys.displayhook = displayhook
- eventlet.spawn(eventlet.backdoor.backdoor_server,
- eventlet.listen(('localhost', CONF.backdoor_port)),
+ sock = eventlet.listen(('localhost', CONF.backdoor_port))
+ port = sock.getsockname()[1]
+ eventlet.spawn(eventlet.backdoor.backdoor_server, sock,
locals=backdoor_locals)
+ return port
diff --git a/nova/compute/api.py b/nova/compute/api.py
index e21d84f9d..78eb39d65 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -1808,6 +1808,10 @@ class API(base.Base):
"""Retrieve diagnostics for the given instance."""
return self.compute_rpcapi.get_diagnostics(context, instance=instance)
+ def get_backdoor_port(self, context, host):
+ """Retrieve backdoor port"""
+ return self.compute_rpcapi.get_backdoor_port(context, host)
+
@wrap_check_policy
@check_instance_lock
@check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.RESCUED])
diff --git a/nova/compute/manager.py b/nova/compute/manager.py
index 793e94e89..a4bf73ba3 100644
--- a/nova/compute/manager.py
+++ b/nova/compute/manager.py
@@ -265,7 +265,7 @@ class ComputeVirtAPI(virtapi.VirtAPI):
class ComputeManager(manager.SchedulerDependentManager):
"""Manages the running instances from creation to destruction."""
- RPC_API_VERSION = '2.16'
+ RPC_API_VERSION = '2.17'
def __init__(self, compute_driver=None, *args, **kwargs):
"""Load configuration options and connect to the hypervisor."""
@@ -422,6 +422,10 @@ class ComputeManager(manager.SchedulerDependentManager):
except exception.NotFound:
return power_state.NOSTATE
+ def get_backdoor_port(self, context):
+ """Return backdoor port for eventlet_backdoor"""
+ return self.backdoor_port
+
def get_console_topic(self, context):
"""Retrieves the console host for a project on this host.
diff --git a/nova/compute/rpcapi.py b/nova/compute/rpcapi.py
index a363036f6..94551ce2a 100644
--- a/nova/compute/rpcapi.py
+++ b/nova/compute/rpcapi.py
@@ -143,6 +143,7 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
2.14 - Remove aggregate_id, add aggregate to add_aggregate_host
2.15 - Remove aggregate_id, add aggregate to remove_aggregate_host
2.16 - Add instance_type to resize_instance
+ 2.17 - Add get_backdoor_port()
'''
#
@@ -549,6 +550,10 @@ class ComputeAPI(nova.openstack.common.rpc.proxy.RpcProxy):
instance=instance_p),
topic=_compute_topic(self.topic, ctxt, None, instance))
+ def get_backdoor_port(self, ctxt, host):
+ return self.call(ctxt, self.make_msg('get_backdoor_port'),
+ topic=_compute_topic(self.topic, ctxt, host, None))
+
def publish_service_capabilities(self, ctxt):
self.fanout_cast(ctxt, self.make_msg('publish_service_capabilities'))
diff --git a/nova/manager.py b/nova/manager.py
index 2aff3d04e..100e0757c 100644
--- a/nova/manager.py
+++ b/nova/manager.py
@@ -140,6 +140,7 @@ class Manager(base.Base):
host = CONF.host
self.host = host
self.load_plugins()
+ self.backdoor_port = None
super(Manager, self).__init__(db_driver)
def load_plugins(self):
diff --git a/nova/network/api.py b/nova/network/api.py
index 4b803482a..526b969f6 100644
--- a/nova/network/api.py
+++ b/nova/network/api.py
@@ -124,6 +124,9 @@ class API(base.Base):
return self.network_rpcapi.get_floating_ips_by_fixed_address(context,
fixed_address)
+ def get_backdoor_port(self, context):
+ return self.network_rpcapi.get_backdoor_port(context)
+
def get_instance_id_by_floating_address(self, context, address):
# NOTE(tr3buchet): i hate this
return self.network_rpcapi.get_instance_id_by_floating_address(context,
diff --git a/nova/network/manager.py b/nova/network/manager.py
index 78f2296ba..456ab2fb1 100644
--- a/nova/network/manager.py
+++ b/nova/network/manager.py
@@ -1291,6 +1291,10 @@ class NetworkManager(manager.SchedulerDependentManager):
network = self._get_network_by_id(context, network_id)
self._allocate_fixed_ips(context, instance_id, host, [network])
+ def get_backdoor_port(self, context):
+ """Return backdoor port for eventlet_backdoor"""
+ return self.backdoor_port
+
@wrap_check_policy
def remove_fixed_ip_from_instance(self, context, instance_id, host,
address):
diff --git a/nova/network/rpcapi.py b/nova/network/rpcapi.py
index b7e9cd70b..e8a02f6f5 100644
--- a/nova/network/rpcapi.py
+++ b/nova/network/rpcapi.py
@@ -104,6 +104,9 @@ class NetworkAPI(rpc_proxy.RpcProxy):
'get_instance_id_by_floating_address',
address=address))
+ def get_backdoor_port(self, ctxt):
+ return self.call(ctxt, self.make_msg('get_backdoor_port'))
+
def get_vifs_by_instance(self, ctxt, instance_id):
# NOTE(vish): When the db calls are converted to store network
# data by instance_uuid, this should pass uuid instead.
diff --git a/nova/service.py b/nova/service.py
index 45bdf7ec0..15d1ca887 100644
--- a/nova/service.py
+++ b/nova/service.py
@@ -111,7 +111,7 @@ class Launcher(object):
"""
self._services = []
- eventlet_backdoor.initialize_if_enabled()
+ self.backdoor_port = eventlet_backdoor.initialize_if_enabled()
@staticmethod
def run_server(server):
@@ -131,6 +131,8 @@ class Launcher(object):
:returns: None
"""
+ if self.backdoor_port is not None:
+ server.backdoor_port = self.backdoor_port
gt = eventlet.spawn(self.run_server, server)
self._services.append(gt)
@@ -382,6 +384,7 @@ class Service(object):
self.periodic_fuzzy_delay = periodic_fuzzy_delay
self.saved_args, self.saved_kwargs = args, kwargs
self.timers = []
+ self.backdoor_port = None
def start(self):
vcs_string = version.version_string_with_vcs()
@@ -400,6 +403,9 @@ class Service(object):
self.manager.pre_start_hook()
+ if self.backdoor_port is not None:
+ self.manager.backdoor_port = self.backdoor_port
+
self.conn = rpc.create_connection(new=True)
LOG.debug(_("Creating Consumer connection for Service %s") %
self.topic)
@@ -578,6 +584,7 @@ class WSGIService(object):
port=self.port)
# Pull back actual port used
self.port = self.server.port
+ self.backdoor_port = None
def _get_manager(self):
"""Initialize a Manager object appropriate for this service.
@@ -612,6 +619,8 @@ class WSGIService(object):
if self.manager:
self.manager.init_host()
self.manager.pre_start_hook()
+ if self.backdoor_port is not None:
+ self.manager.backdoor_port = self.backdoor_port
self.server.start()
if self.manager:
self.manager.post_start_hook()
diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py
index e84fc9175..451fc3d87 100644
--- a/nova/tests/compute/test_compute.py
+++ b/nova/tests/compute/test_compute.py
@@ -4696,6 +4696,23 @@ class ComputeAPITestCase(BaseTestCase):
db.instance_destroy(self.context, instance['uuid'])
+ def test_get_backdoor_port(self):
+ """Test api call to get backdoor_port"""
+ fake_backdoor_port = 59697
+
+ self.mox.StubOutWithMock(rpc, 'call')
+
+ rpc_msg = {'method': 'get_backdoor_port',
+ 'args': {},
+ 'version': compute_rpcapi.ComputeAPI.BASE_RPC_API_VERSION}
+ rpc.call(self.context, 'compute.fake_host', rpc_msg,
+ None).AndReturn(fake_backdoor_port)
+
+ self.mox.ReplayAll()
+
+ port = self.compute_api.get_backdoor_port(self.context, 'fake_host')
+ self.assertEqual(port, fake_backdoor_port)
+
def test_console_output(self):
fake_instance = {'uuid': 'fake_uuid',
'host': 'fake_compute_host'}
@@ -5146,6 +5163,19 @@ class ComputeAPIAggrTestCase(BaseTestCase):
self.context, aggr['id'], 'invalid_host')
+class ComputeBackdoorPortTestCase(BaseTestCase):
+ """This is for unit test coverage of backdoor port rpc"""
+
+ def setUp(self):
+ super(ComputeBackdoorPortTestCase, self).setUp()
+ self.context = context.get_admin_context()
+ self.compute.backdoor_port = 59697
+
+ def test_get_backdoor_port(self):
+ port = self.compute.get_backdoor_port(self.context)
+ self.assertEqual(port, self.compute.backdoor_port)
+
+
class ComputeAggrTestCase(BaseTestCase):
"""This is for unit coverage of aggregate-related methods
defined in nova.compute.manager."""
diff --git a/nova/tests/compute/test_rpcapi.py b/nova/tests/compute/test_rpcapi.py
index 5cce9a4d9..82537560b 100644
--- a/nova/tests/compute/test_rpcapi.py
+++ b/nova/tests/compute/test_rpcapi.py
@@ -174,6 +174,9 @@ class ComputeRpcAPITestCase(test.TestCase):
self._test_compute_api('host_power_action', 'call', action='action',
host='host')
+ def test_get_backdoor_port(self):
+ self._test_compute_api('get_backdoor_port', 'call', host='host')
+
def test_inject_file(self):
self._test_compute_api('inject_file', 'cast',
instance=self.fake_instance, path='path', file_contents='fc')
diff --git a/nova/tests/network/test_api.py b/nova/tests/network/test_api.py
index 15ead5337..a033c6506 100644
--- a/nova/tests/network/test_api.py
+++ b/nova/tests/network/test_api.py
@@ -198,3 +198,15 @@ class ApiTestCase(test.TestCase):
instance = {'uuid': FAKE_UUID}
result = self.network_api._is_multi_host(self.context, instance)
self.assertEqual(is_multi_host, result)
+
+ def test_get_backdoor_port(self):
+ backdoor_port = 59697
+
+ def fake_get_backdoor_port(ctxt):
+ return backdoor_port
+
+ self.stubs.Set(self.network_api.network_rpcapi, 'get_backdoor_port',
+ fake_get_backdoor_port)
+
+ port = self.network_api.get_backdoor_port(self.context)
+ self.assertEqual(port, backdoor_port)
diff --git a/nova/tests/network/test_manager.py b/nova/tests/network/test_manager.py
index 82168b00e..9c4b29049 100644
--- a/nova/tests/network/test_manager.py
+++ b/nova/tests/network/test_manager.py
@@ -1524,6 +1524,19 @@ class RPCAllocateTestCase(test.TestCase):
self.assertEqual(rval, address)
+class BackdoorPortTestCase(test.TestCase):
+ """Tests nova.network.manager.get_backdoor_port"""
+ def setUp(self):
+ super(BackdoorPortTestCase, self).setUp()
+ self.manager = network_manager.NetworkManager()
+ self.manager.backdoor_port = 59697
+ self.context = context.RequestContext('fake', 'fake')
+
+ def test_backdoor_port(self):
+ port = self.manager.get_backdoor_port(self.context)
+ self.assertEqual(port, self.manager.backdoor_port)
+
+
class TestFloatingIPManager(network_manager.FloatingIP,
network_manager.NetworkManager):
"""Dummy manager that implements FloatingIP"""
diff --git a/nova/tests/network/test_rpcapi.py b/nova/tests/network/test_rpcapi.py
index b0c3572ea..3d8e4235c 100644
--- a/nova/tests/network/test_rpcapi.py
+++ b/nova/tests/network/test_rpcapi.py
@@ -121,6 +121,9 @@ class NetworkRpcAPITestCase(test.TestCase):
self._test_network_api('get_instance_id_by_floating_address',
rpc_method='call', address='w.x.y.z')
+ def test_get_backdoor_port(self):
+ self._test_network_api('get_backdoor_port', rpc_method='call')
+
def test_get_vifs_by_instance(self):
self._test_network_api('get_vifs_by_instance',
rpc_method='call', instance_id='fake_id')