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:
parent
ce22171b05
commit
2d97f3edb2
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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])
|
||||
|
|
Loading…
Reference in New Issue