Move Nova notification logic out of API controller
Once the decoupling started with 60c05a6d57, this cleanup
patch continues the effort by improving the decoupling
between the API layer and Nova.
Change-Id: I1d7d4b80ee77deefce18df22f76cab81750c0397
This commit is contained in:
@@ -18,7 +18,6 @@ import copy
|
||||
|
||||
import netaddr
|
||||
from neutron_lib import exceptions
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_policy import policy as oslo_policy
|
||||
from oslo_utils import excutils
|
||||
@@ -90,9 +89,6 @@ class Controller(object):
|
||||
self._policy_attrs = [name for (name, info) in self._attr_info.items()
|
||||
if info.get('required_by_policy')]
|
||||
self._notifier = n_rpc.get_notifier('network')
|
||||
if cfg.CONF.notify_nova_on_port_data_changes:
|
||||
from neutron.notifiers import nova
|
||||
self._nova_notifier = nova.Notifier()
|
||||
self._member_actions = member_actions
|
||||
self._primary_key = self._get_primary_key()
|
||||
if self._allow_pagination and self._native_pagination:
|
||||
@@ -327,10 +323,6 @@ class Controller(object):
|
||||
pluralized=self._collection)
|
||||
return obj
|
||||
|
||||
def _send_nova_notification(self, action, orig, returned):
|
||||
if hasattr(self, '_nova_notifier'):
|
||||
self._nova_notifier.send_network_change(action, orig, returned)
|
||||
|
||||
@db_api.retry_db_errors
|
||||
def index(self, request, **kwargs):
|
||||
"""Returns a list of the requested entity."""
|
||||
@@ -473,7 +465,8 @@ class Controller(object):
|
||||
registry.notify(self._resource, events.BEFORE_RESPONSE, self,
|
||||
context=request.context, data=create_result,
|
||||
method_name=notifier_method,
|
||||
collection=self._collection)
|
||||
collection=self._collection,
|
||||
action=action, original={})
|
||||
return create_result
|
||||
|
||||
def do_create(body, bulk=False, emulated=False):
|
||||
@@ -519,8 +512,6 @@ class Controller(object):
|
||||
return notify({self._collection: objs})
|
||||
else:
|
||||
obj = do_create(body)
|
||||
self._send_nova_notification(action, {},
|
||||
{self._resource: obj})
|
||||
return notify({self._resource: self._view(request.context,
|
||||
obj)})
|
||||
|
||||
@@ -563,10 +554,10 @@ class Controller(object):
|
||||
notifier_method,
|
||||
{self._resource + '_id': id})
|
||||
result = {self._resource: self._view(request.context, obj)}
|
||||
self._send_nova_notification(action, {}, result)
|
||||
registry.notify(self._resource, events.BEFORE_RESPONSE, self,
|
||||
context=request.context, data=result,
|
||||
method_name=notifier_method)
|
||||
method_name=notifier_method, action=action,
|
||||
original={})
|
||||
|
||||
def update(self, request, id, body=None, **kwargs):
|
||||
"""Updates the specified entity's attributes."""
|
||||
@@ -637,8 +628,8 @@ class Controller(object):
|
||||
self._notifier.info(request.context, notifier_method, result)
|
||||
registry.notify(self._resource, events.BEFORE_RESPONSE, self,
|
||||
context=request.context, data=result,
|
||||
method_name=notifier_method)
|
||||
self._send_nova_notification(action, orig_object_copy, result)
|
||||
method_name=notifier_method, action=action,
|
||||
original=orig_object_copy)
|
||||
return result
|
||||
|
||||
@staticmethod
|
||||
|
||||
@@ -23,6 +23,9 @@ from oslo_utils import uuidutils
|
||||
from sqlalchemy.orm import attributes as sql_attr
|
||||
|
||||
from neutron._i18n import _LE, _LI, _LW
|
||||
from neutron.callbacks import events
|
||||
from neutron.callbacks import registry
|
||||
from neutron.callbacks import resources
|
||||
from neutron import context
|
||||
from neutron import manager
|
||||
from neutron.notifiers import batch_notifier
|
||||
@@ -68,6 +71,15 @@ class Notifier(object):
|
||||
self.batch_notifier = batch_notifier.BatchNotifier(
|
||||
cfg.CONF.send_events_interval, self.send_events)
|
||||
|
||||
# register callbacks for events pertaining resources affecting Nova
|
||||
callback_resources = (
|
||||
resources.FLOATING_IP,
|
||||
resources.PORT,
|
||||
)
|
||||
for resource in callback_resources:
|
||||
registry.subscribe(self._send_nova_notification,
|
||||
resource, events.BEFORE_RESPONSE)
|
||||
|
||||
def _is_compute_port(self, port):
|
||||
try:
|
||||
if (port['device_id'] and uuidutils.is_uuid_like(port['device_id'])
|
||||
@@ -96,6 +108,11 @@ class Notifier(object):
|
||||
self._plugin_ref = manager.NeutronManager.get_plugin()
|
||||
return self._plugin_ref
|
||||
|
||||
def _send_nova_notification(self, resource, event, trigger,
|
||||
action=None, original=None, data=None,
|
||||
**kwargs):
|
||||
self.send_network_change(action, original, data)
|
||||
|
||||
def send_network_change(self, action, original_obj,
|
||||
returned_obj):
|
||||
"""Called when a network change is made that nova cares about.
|
||||
|
||||
Reference in New Issue
Block a user