Only notify nova of port status changes if configured

Although notify_nova_on_port_status_changes defaults to true, it
could be to false, making the nova_notifier attribute unsafe to
use without checking.

This patch checks both the config option and that the attribute
exists, since the config could be changed after the plugin is
already initialized without the nova_notifier attribute being set.

Change-Id: Ide0f93275e60dffda10b7da59f6d81c5582c3849
Closes-bug: #1843269
This commit is contained in:
Brian Haley 2019-09-09 09:51:30 -04:00 committed by Brian Haley
parent 84317b8820
commit ab4320edb4
2 changed files with 13 additions and 1 deletions

View File

@ -23,6 +23,7 @@ from neutron_lib.plugins import directory
from neutron_lib.plugins.ml2 import api
from neutron_lib import rpc as n_rpc
from neutron_lib.services.qos import constants as qos_consts
from oslo_config import cfg
from oslo_log import log
import oslo_messaging
from osprofiler import profiler
@ -289,7 +290,12 @@ class RpcCallbacks(type_tunnel.TunnelRpcCallbackMixin):
else:
if port.device_owner.startswith(
n_const.DEVICE_OWNER_COMPUTE_PREFIX):
plugin.nova_notifier.notify_port_active_direct(port)
# NOTE(haleyb): It is possible for a test to override a
# config option after the plugin has been initialized so
# the nova_notifier attribute is not set on the plugin.
if (cfg.CONF.notify_nova_on_port_status_changes and
hasattr(plugin, 'nova_notifier')):
plugin.nova_notifier.notify_port_active_direct(port)
return
else:
self.update_port_status_to_active(port, rpc_context, port_id, host)

View File

@ -250,6 +250,12 @@ class RpcCallbacksTestCase(base.BaseTestCase):
(self.plugin.nova_notifier.notify_port_active_direct.
assert_called_once_with(port))
def test_update_device_up_with_device_not_bound_to_host_no_notify(self):
cfg.CONF.set_override('notify_nova_on_port_status_changes', False)
self.assertIsNone(self._test_update_device_not_bound_to_host(
self.callbacks.update_device_up))
self.plugin.nova_notifier.notify_port_active_direct.assert_not_called()
def test_update_device_down_with_device_not_bound_to_host(self):
self.assertEqual(
{'device': 'fake_device', 'exists': True},