Merge "use payloads for SEGMENT events"

This commit is contained in:
Zuul 2021-05-07 11:58:53 +00:00 committed by Gerrit Code Review
commit 235864772d
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])