summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Smith <danms@us.ibm.com>2013-02-06 17:48:49 -0500
committerDan Smith <danms@us.ibm.com>2013-02-06 21:45:11 -0500
commit32d6f568aedeee25cb9c0b093ee847459c091f7e (patch)
tree0671bb11349caf57a0f58b26016f4e3b7a96e09a
parent749c3db3f63f70d9a71ff26e253b3eeda5d9d742 (diff)
downloadnova-32d6f568aedeee25cb9c0b093ee847459c091f7e.tar.gz
nova-32d6f568aedeee25cb9c0b093ee847459c091f7e.tar.xz
nova-32d6f568aedeee25cb9c0b093ee847459c091f7e.zip
Move security_groups refreshes to conductor
This moves the last bit of compute-initiated db accesses found during test runs to conductor. The quantum API was hitting the database directly while calling back to compute's API to trigger the refresh. This just makes the quantum API ask conductor to do that in a similar way to the usage notifications patch recently merged. Related to blueprint no-db-compute Change-Id: I44de7e1e12aec291b8319d45ec5975ad05b8e676
-rw-r--r--nova/conductor/api.py17
-rw-r--r--nova/conductor/manager.py10
-rw-r--r--nova/conductor/rpcapi.py13
-rw-r--r--nova/network/quantumv2/api.py22
-rw-r--r--nova/tests/conductor/test_conductor.py43
5 files changed, 92 insertions, 13 deletions
diff --git a/nova/conductor/api.py b/nova/conductor/api.py
index 2ad4b6d8e..9f526646c 100644
--- a/nova/conductor/api.py
+++ b/nova/conductor/api.py
@@ -320,6 +320,14 @@ class LocalAPI(object):
context, instance, current_period, ignore_missing_network_data,
system_metadata, extra_usage_info)
+ def security_groups_trigger_handler(self, context, event, *args):
+ return self._manager.security_groups_trigger_handler(context,
+ event, args)
+
+ def security_groups_trigger_members_refresh(self, context, group_ids):
+ return self._manager.security_groups_trigger_members_refresh(context,
+ group_ids)
+
class API(object):
"""Conductor API that does updates via RPC to the ConductorManager."""
@@ -617,3 +625,12 @@ class API(object):
return self.conductor_rpcapi.notify_usage_exists(
context, instance, current_period, ignore_missing_network_data,
system_metadata, extra_usage_info)
+
+ def security_groups_trigger_handler(self, context, event, *args):
+ return self.conductor_rpcapi.security_groups_trigger_handler(context,
+ event,
+ args)
+
+ def security_groups_trigger_members_refresh(self, context, group_ids):
+ return self.conductor_rpcapi.security_groups_trigger_members_refresh(
+ context, group_ids)
diff --git a/nova/conductor/manager.py b/nova/conductor/manager.py
index 8346a25d0..b53ab8fcc 100644
--- a/nova/conductor/manager.py
+++ b/nova/conductor/manager.py
@@ -14,6 +14,7 @@
"""Handles database requests from other nova services."""
+from nova.compute import api as compute_api
from nova.compute import utils as compute_utils
from nova import exception
from nova import manager
@@ -45,11 +46,12 @@ datetime_fields = ['launched_at', 'terminated_at']
class ConductorManager(manager.SchedulerDependentManager):
"""Mission: TBD."""
- RPC_API_VERSION = '1.39'
+ RPC_API_VERSION = '1.40'
def __init__(self, *args, **kwargs):
super(ConductorManager, self).__init__(service_name='conductor',
*args, **kwargs)
+ self.security_group_api = compute_api.SecurityGroupAPI()
def ping(self, context, arg):
return jsonutils.to_primitive({'service': 'conductor', 'arg': arg})
@@ -351,3 +353,9 @@ class ConductorManager(manager.SchedulerDependentManager):
compute_utils.notify_usage_exists(context, instance, current_period,
ignore_missing_network_data,
system_metadata, extra_usage_info)
+
+ def security_groups_trigger_handler(self, context, event, args):
+ self.security_group_api.trigger_handler(event, context, *args)
+
+ def security_groups_trigger_members_refresh(self, context, group_ids):
+ self.security_group_api.trigger_members_refresh(context, group_ids)
diff --git a/nova/conductor/rpcapi.py b/nova/conductor/rpcapi.py
index 6587bc795..169da4ed7 100644
--- a/nova/conductor/rpcapi.py
+++ b/nova/conductor/rpcapi.py
@@ -72,6 +72,8 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
1.37 - Added task_log_get, task_log_begin_task, task_log_end_task
1.38 - Added service name to instance_update
1.39 - Added notify_usage_exists
+ 1.40 - Added security_groups_trigger_handler and
+ security_groups_trigger_members_refresh
"""
BASE_RPC_API_VERSION = '1.0'
@@ -375,3 +377,14 @@ class ConductorAPI(nova.openstack.common.rpc.proxy.RpcProxy):
system_metadata=system_metadata_p,
extra_usage_info=extra_usage_info_p)
return self.call(context, msg, version='1.39')
+
+ def security_groups_trigger_handler(self, context, event, args):
+ args_p = jsonutils.to_primitive(args)
+ msg = self.make_msg('security_groups_trigger_handler', event=event,
+ args=args_p)
+ return self.call(context, msg, version='1.40')
+
+ def security_groups_trigger_members_refresh(self, context, group_ids):
+ msg = self.make_msg('security_groups_trigger_members_refresh',
+ group_ids=group_ids)
+ return self.call(context, msg, version='1.40')
diff --git a/nova/network/quantumv2/api.py b/nova/network/quantumv2/api.py
index ba8b9cb7d..d11ffe1b3 100644
--- a/nova/network/quantumv2/api.py
+++ b/nova/network/quantumv2/api.py
@@ -16,7 +16,7 @@
#
# vim: tabstop=4 shiftwidth=4 softtabstop=4
-from nova.compute import api as compute_api
+from nova import conductor
from nova.db import base
from nova import exception
from nova.network import api as network_api
@@ -72,7 +72,7 @@ update_instance_info_cache = network_api.update_instance_cache_with_nw_info
class API(base.Base):
"""API for interacting with the quantum 2.x API."""
- security_group_api = compute_api.SecurityGroupAPI()
+ conductor_api = conductor.API()
def setup_networks_on_host(self, context, instance, host=None,
teardown=False):
@@ -364,27 +364,25 @@ class API(base.Base):
instance_ref):
admin_context = context.elevated()
for group in instance_ref['security_groups']:
- self.security_group_api.trigger_handler(
- 'instance_add_security_group', context, instance_ref,
- group['name'])
+ self.conductor_api.security_groups_trigger_handler(context,
+ 'instance_add_security_group', instance_ref, group['name'])
def trigger_instance_remove_security_group_refresh(self, context,
instance_ref):
admin_context = context.elevated()
for group in instance_ref['security_groups']:
- self.security_group_api.trigger_handler(
- 'instance_remove_security_group', context, instance_ref,
- group['name'])
+ self.conductor_api.security_groups_trigger_handler(context,
+ 'instance_remove_security_group', instance_ref, group['name'])
def trigger_security_group_members_refresh(self, context, instance_ref):
admin_context = context.elevated()
group_ids = [group['id'] for group in instance_ref['security_groups']]
- self.security_group_api.trigger_members_refresh(admin_context,
- group_ids)
- self.security_group_api.trigger_handler('security_group_members',
- admin_context, group_ids)
+ self.conductor_api.security_groups_trigger_members_refresh(
+ admin_context, group_ids)
+ self.conductor_api.security_groups_trigger_handler(admin_context,
+ 'security_group_members', group_ids)
def _get_port_id_by_fixed_address(self, client,
instance, address):
diff --git a/nova/tests/conductor/test_conductor.py b/nova/tests/conductor/test_conductor.py
index d9d6f2db5..773b65d43 100644
--- a/nova/tests/conductor/test_conductor.py
+++ b/nova/tests/conductor/test_conductor.py
@@ -495,12 +495,22 @@ class _BaseTestCase(object):
system_metadata={},
extra_usage_info=dict(extra='info'))
+ def test_security_groups_trigger_members_refresh(self):
+ self.mox.StubOutWithMock(self.conductor_manager.security_group_api,
+ 'trigger_members_refresh')
+ self.conductor_manager.security_group_api.trigger_members_refresh(
+ self.context, [1, 2, 3])
+ self.mox.ReplayAll()
+ self.conductor.security_groups_trigger_members_refresh(self.context,
+ [1, 2, 3])
+
class ConductorTestCase(_BaseTestCase, test.TestCase):
"""Conductor Manager Tests."""
def setUp(self):
super(ConductorTestCase, self).setUp()
self.conductor = conductor_manager.ConductorManager()
+ self.conductor_manager = self.conductor
self.stub_out_client_exceptions()
def test_block_device_mapping_update_or_create(self):
@@ -613,6 +623,16 @@ class ConductorTestCase(_BaseTestCase, test.TestCase):
('host', 'binary'),
dict(host='host', binary='binary'))
+ def test_security_groups_trigger_handler(self):
+ self.mox.StubOutWithMock(self.conductor_manager.security_group_api,
+ 'trigger_handler')
+ self.conductor_manager.security_group_api.trigger_handler('event',
+ self.context,
+ 'args')
+ self.mox.ReplayAll()
+ self.conductor.security_groups_trigger_handler(self.context,
+ 'event', ['args'])
+
class ConductorRPCAPITestCase(_BaseTestCase, test.TestCase):
"""Conductor RPC API Tests."""
@@ -620,6 +640,7 @@ class ConductorRPCAPITestCase(_BaseTestCase, test.TestCase):
super(ConductorRPCAPITestCase, self).setUp()
self.conductor_service = self.start_service(
'conductor', manager='nova.conductor.manager.ConductorManager')
+ self.conductor_manager = self.conductor_service.manager
self.conductor = conductor_rpcapi.ConductorAPI()
def test_block_device_mapping_update_or_create(self):
@@ -709,6 +730,16 @@ class ConductorRPCAPITestCase(_BaseTestCase, test.TestCase):
dict(topic='compute', host='host'),
db_result_listified=True)
+ def test_security_groups_trigger_handler(self):
+ self.mox.StubOutWithMock(self.conductor_manager.security_group_api,
+ 'trigger_handler')
+ self.conductor_manager.security_group_api.trigger_handler('event',
+ self.context,
+ 'arg')
+ self.mox.ReplayAll()
+ self.conductor.security_groups_trigger_handler(self.context,
+ 'event', ['arg'])
+
class ConductorAPITestCase(_BaseTestCase, test.TestCase):
"""Conductor API Tests."""
@@ -717,6 +748,7 @@ class ConductorAPITestCase(_BaseTestCase, test.TestCase):
self.conductor_service = self.start_service(
'conductor', manager='nova.conductor.manager.ConductorManager')
self.conductor = conductor_api.API()
+ self.conductor_manager = self.conductor_service.manager
self.db = None
def _do_update(self, instance_uuid, **updates):
@@ -858,12 +890,23 @@ class ConductorAPITestCase(_BaseTestCase, test.TestCase):
self.assertEqual(timeouts.count(10), 10)
self.assertTrue(None in timeouts)
+ def test_security_groups_trigger_handler(self):
+ self.mox.StubOutWithMock(self.conductor_manager.security_group_api,
+ 'trigger_handler')
+ self.conductor_manager.security_group_api.trigger_handler('event',
+ self.context,
+ 'arg')
+ self.mox.ReplayAll()
+ self.conductor.security_groups_trigger_handler(self.context,
+ 'event', 'arg')
+
class ConductorLocalAPITestCase(ConductorAPITestCase):
"""Conductor LocalAPI Tests."""
def setUp(self):
super(ConductorLocalAPITestCase, self).setUp()
self.conductor = conductor_api.LocalAPI()
+ self.conductor_manager = self.conductor._manager._target
self.db = db
self.stub_out_client_exceptions()