]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Add VIF_DELETED notification event to Nova
authorRobert Li <baoli@cisco.com>
Fri, 8 May 2015 15:08:45 +0000 (11:08 -0400)
committerRobert Li <baoli@cisco.com>
Tue, 12 May 2015 15:17:32 +0000 (11:17 -0400)
It's possible to delete a neutron port that is currently associated
with an instance. When it happens, neutron should notify nova of the
port deletion event so that Nova can take proper actions.

Refer to I998b6bb80cc0a81d665b61b8c4a424d7219c666f for the nova patch
that handles the event.

Change-Id: Iff88cd12ae18017ef3e776821bcf3ecf3b4f052f
Related-Bug: #1333365
Related-Bug: #1448148

neutron/notifiers/nova.py
neutron/tests/unit/notifiers/test_nova.py

index 4bad6dcbadd4de902aaf33d4f3ec8946f6965044..86e4a74088c7f68ac8f0c8f4162a7203ce74ec59 100644 (file)
@@ -35,6 +35,7 @@ LOG = logging.getLogger(__name__)
 
 VIF_UNPLUGGED = 'network-vif-unplugged'
 VIF_PLUGGED = 'network-vif-plugged'
+VIF_DELETED = 'network-vif-deleted'
 NEUTRON_NOVA_EVENT_STATUS_MAP = {constants.PORT_STATUS_ACTIVE: 'completed',
                                  constants.PORT_STATUS_ERROR: 'failed',
                                  constants.PORT_STATUS_DOWN: 'completed'}
@@ -121,6 +122,11 @@ class Notifier(object):
         return {'name': 'network-changed',
                 'server_uuid': device_id}
 
+    def _get_port_delete_event(self, port):
+        return {'server_uuid': port['device_id'],
+                'name': VIF_DELETED,
+                'tag': port['id']}
+
     @property
     def _plugin(self):
         # NOTE(arosen): this cannot be set in __init__ currently since
@@ -160,7 +166,7 @@ class Notifier(object):
 
     def create_port_changed_event(self, action, original_obj, returned_obj):
         port = None
-        if action == 'update_port':
+        if action in ['update_port', 'delete_port']:
             port = returned_obj['port']
 
         elif action in ['update_floatingip', 'create_floatingip',
@@ -178,7 +184,10 @@ class Notifier(object):
             port = self._plugin.get_port(ctx, port_id)
 
         if port and self._is_compute_port(port):
-            return self._get_network_changed_event(port['device_id'])
+            if action == 'delete_port':
+                return self._get_port_delete_event(port)
+            else:
+                return self._get_network_changed_event(port['device_id'])
 
     def record_port_status_changed(self, port, current_port_status,
                                    previous_port_status, initiator):
index 49ccb975ae7d5a851ba9619d630d949535856dba..b04e26257816f995e0f6711b736003396362b600 100644 (file)
@@ -290,3 +290,18 @@ class TestNovaNotify(base.BaseTestCase):
             self.nova_notifier.batch_notifier.pending_events[0], event_dis)
         self.assertEqual(
             self.nova_notifier.batch_notifier.pending_events[1], event_assoc)
+
+    def test_delete_port_notify(self):
+        device_id = '32102d7b-1cf4-404d-b50a-97aae1f55f87'
+        port_id = 'bee50827-bcee-4cc8-91c1-a27b0ce54222'
+        returned_obj = {'port':
+                        {'device_owner': 'compute:dfd',
+                         'id': port_id,
+                         'device_id': device_id}}
+
+        expected_event = {'server_uuid': device_id,
+                          'name': nova.VIF_DELETED,
+                          'tag': port_id}
+        event = self.nova_notifier.create_port_changed_event('delete_port',
+                                                             {}, returned_obj)
+        self.assertEqual(expected_event, event)