use payloads for SEGMENT events

This patch switches over to payload style of callbacks for the remaining
SEGMENT based callback events. Unit tests are also updated as needed
to handle the switch.

NeutronLibImpact

Change-Id: I3624228238babc64fe02bf0cc56eb0c1f6d35e73
This commit is contained in:
Nurmatov Mamatisa 2021-05-01 17:07:40 +03:00
parent ce22171b05
commit 2d97f3edb2
6 changed files with 47 additions and 40 deletions

View File

@ -50,11 +50,12 @@ def add_network_segment(context, network_id, segment, segment_index=0,
segmentation_id=segment.get(SEGMENTATION_ID),
segment_index=segment_index, is_dynamic=is_dynamic)
netseg_obj.create()
registry.notify(resources.SEGMENT,
events.PRECOMMIT_CREATE,
trigger=add_network_segment,
context=context,
segment=netseg_obj)
registry.publish(resources.SEGMENT,
events.PRECOMMIT_CREATE,
add_network_segment,
payload=events.DBEventPayload(
context, resource_id=netseg_obj.id,
states=(netseg_obj,)))
segment['id'] = netseg_obj.id
LOG.info("Added segment %(id)s of type %(network_type)s for network "
"%(network_id)s",

View File

@ -466,7 +466,8 @@ class OVNMechanismDriver(api.MechanismDriver):
raise n_exc.InvalidInput(error_message=m)
def create_segment_provnet_port(self, resource, event, trigger,
context, segment, payload=None):
payload=None):
segment = payload.latest_state
if not segment.get(segment_def.PHYSICAL_NETWORK):
return
self._ovn_client.create_provnet_port(segment['network_id'], segment)
@ -1075,7 +1076,9 @@ class OVNMechanismDriver(api.MechanismDriver):
ctx, host, available_seg_ids)
def _add_segment_host_mapping_for_segment(self, resource, event, trigger,
context, segment):
payload=None):
context = payload.context
segment = payload.latest_state
phynet = segment.physical_network
if not phynet:
return

View File

@ -2297,20 +2297,11 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
return True
return False
@registry.receives(resources.SEGMENT, [events.AFTER_DELETE])
def _handle_after_delete_segment_change(
self, rtype, event, trigger, payload=None):
# TODO(boden); refactor into _handle_segment_change once all
# event types use payloads
return self._handle_segment_change(
rtype, event, trigger, payload.context, payload.latest_state,
for_net_delete=payload.metadata.get('for_net_delete'))
@registry.receives(resources.SEGMENT, (events.PRECOMMIT_CREATE,
events.PRECOMMIT_DELETE,
events.AFTER_CREATE))
def _handle_segment_change(self, rtype, event, trigger, context, segment,
for_net_delete=False):
events.AFTER_CREATE,
events.AFTER_DELETE))
def _handle_segment_change(self, rtype, event, trigger, payload=None):
if (event == events.PRECOMMIT_CREATE and
not isinstance(trigger, segments_plugin.Plugin)):
# TODO(xiaohhui): Now, when create network, ml2 will reserve
@ -2320,6 +2311,8 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
# by unifying segment creation procedure.
return
segment = payload.latest_state
context = payload.context
network_id = segment.get('network_id')
if event == events.PRECOMMIT_CREATE:
@ -2331,6 +2324,7 @@ class Ml2Plugin(db_base_plugin_v2.NeutronDbPluginV2,
elif event == events.PRECOMMIT_DELETE:
self.type_manager.release_network_segment(context, segment)
for_net_delete = payload.metadata.get('for_net_delete')
if for_net_delete:
return

View File

@ -91,8 +91,10 @@ class SegmentDbMixin(object):
new_segment = self._create_segment_db(context, segment_id, segment)
except db_exc.DBReferenceError:
raise n_exc.NetworkNotFound(net_id=segment['network_id'])
registry.notify(resources.SEGMENT, events.AFTER_CREATE, self,
context=context, segment=new_segment)
registry.publish(resources.SEGMENT, events.AFTER_CREATE, self,
payload=events.DBEventPayload(
context, resource_id=segment_id,
states=(new_segment,)))
return self._make_segment_dict(new_segment)
def _create_segment_db(self, context, segment_id, segment):
@ -136,9 +138,10 @@ class SegmentDbMixin(object):
new_segment.create()
# Do some preliminary operations before committing the segment to
# db
registry.notify(
registry.publish(
resources.SEGMENT, events.PRECOMMIT_CREATE, self,
context=context, segment=new_segment)
payload=events.DBEventPayload(context, resource_id=segment_id,
states=(new_segment,)))
# The new segment might have been updated by the callbacks
# subscribed to the PRECOMMIT_CREATE event. So update it in the DB
new_segment.update()
@ -200,10 +203,13 @@ class SegmentDbMixin(object):
if not network.NetworkSegment.delete_objects(context, id=uuid):
raise exceptions.SegmentNotFound(segment_id=uuid)
# Do some preliminary operations before deleting segment in db
registry.notify(resources.SEGMENT, events.PRECOMMIT_DELETE,
self.delete_segment, context=context,
segment=segment_dict,
for_net_delete=for_net_delete)
registry.publish(resources.SEGMENT, events.PRECOMMIT_DELETE,
self.delete_segment,
payload=events.DBEventPayload(
context, metadata={
FOR_NET_DELETE: for_net_delete},
resource_id=uuid,
states=(segment_dict,)))
registry.publish(resources.SEGMENT, events.AFTER_DELETE,
self.delete_segment,
@ -313,7 +319,9 @@ def _update_segment_host_mapping_for_agent(resource, event, trigger,
def _add_segment_host_mapping_for_segment(resource, event, trigger,
context, segment):
payload=None):
context = payload.context
segment = payload.latest_state
if not context.session.is_active:
# The session might be in partial rollback state, due to errors in
# peer callback. In that case, there is no need to add the mapping.

View File

@ -256,7 +256,8 @@ class TestSegment(SegmentTestCase):
def test_create_segment_no_segmentation_id(self):
def _mock_reserve_segmentation_id(rtype, event, trigger,
context, segment):
payload=None):
segment = payload.latest_state
if not segment.get('segmentation_id'):
segment['segmentation_id'] = 200
@ -278,8 +279,8 @@ class TestSegment(SegmentTestCase):
with self.network() as network:
network = network['network']
with mock.patch.object(registry, 'notify') as notify:
notify.side_effect = exceptions.CallbackFailure(errors=Exception)
with mock.patch.object(registry, 'publish') as publish:
publish.side_effect = exceptions.CallbackFailure(errors=Exception)
self.assertRaises(webob.exc.HTTPClientError,
self.segment,
network_id=network['id'],
@ -429,14 +430,13 @@ class TestSegmentML2(SegmentTestCase):
super(TestSegmentML2, self).setUp(plugin='ml2')
def test_segment_notification_on_create_network(self):
with mock.patch.object(registry, 'notify') as notify:
with mock.patch.object(registry, 'publish') as publish:
with self.network():
pass
notify.assert_any_call(resources.SEGMENT,
events.PRECOMMIT_CREATE,
context=mock.ANY,
segment=mock.ANY,
trigger=mock.ANY)
publish.assert_any_call(resources.SEGMENT,
events.PRECOMMIT_CREATE,
mock.ANY,
payload=mock.ANY)
class TestSegmentSubnetAssociation(SegmentTestCase):

View File

@ -3350,7 +3350,7 @@ class TestML2Segments(Ml2PluginV2TestCase):
self.driver._handle_segment_change(
mock.ANY, events.PRECOMMIT_CREATE, segments_plugin.Plugin(),
self.context, segment)
payload=events.DBEventPayload(self.context, states=(segment,)))
if seg_id:
# Assert it is not changed
@ -3438,7 +3438,8 @@ class TestML2Segments(Ml2PluginV2TestCase):
'update_network_precommit',
side_effect=record_network_context):
self.driver._handle_segment_change(
mock.ANY, event, segments_plugin.Plugin(), self.context, seg1)
mock.ANY, event, segments_plugin.Plugin(),
payload=events.DBEventPayload(self.context, states=(seg1,)))
# Make sure the mechanism manager can get the right amount of
# segments of network
self.assertEqual(
@ -3453,7 +3454,7 @@ class TestML2Segments(Ml2PluginV2TestCase):
segment['network_id'] = network['network']['id']
self.driver._handle_segment_change(
mock.ANY, events.PRECOMMIT_DELETE, mock.ANY,
self.context, segment)
payload=events.DBEventPayload(self.context, states=(segment,)))
# Check that the segment_id is not reserved
segment = self._reserve_segment(
network, segment[driver_api.SEGMENTATION_ID])