Merge "use payloads for SEGMENT events"
This commit is contained in:
commit
235864772d
|
@ -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