diff --git a/neutron/plugins/ml2/plugin.py b/neutron/plugins/ml2/plugin.py index 3ca68771c14..e9a88e0bc39 100644 --- a/neutron/plugins/ml2/plugin.py +++ b/neutron/plugins/ml2/plugin.py @@ -1409,6 +1409,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2, if original_port['admin_state_up'] != updated_port['admin_state_up']: need_port_update_notify = True + if original_port['status'] != updated_port['status']: + need_port_update_notify = True # NOTE: In the case of DVR ports, the port-binding is done after # router scheduling when sync_routers is called and so this call # below may not be required for DVR routed interfaces. But still diff --git a/neutron/tests/unit/plugins/ml2/test_plugin.py b/neutron/tests/unit/plugins/ml2/test_plugin.py index bef14186922..40ea374c1ed 100644 --- a/neutron/tests/unit/plugins/ml2/test_plugin.py +++ b/neutron/tests/unit/plugins/ml2/test_plugin.py @@ -807,6 +807,16 @@ class TestMl2PortsV2(test_plugin.TestPortsV2, Ml2PluginV2TestCase): self.assertEqual('DOWN', port['port']['status']) self.assertEqual('DOWN', self.port_create_status) + def test_notify_port_updated_for_status_change(self): + ctx = context.get_admin_context() + plugin = directory.get_plugin() + with self.port() as port: + with mock.patch.object(self.plugin, + '_notify_port_updated') as notify_mock: + port['port']['status'] = constants.PORT_STATUS_ACTIVE + plugin.update_port(ctx, port['port']['id'], port) + self.assertTrue(notify_mock.called) + def test_update_port_status_short_id(self): ctx = context.get_admin_context() plugin = directory.get_plugin()