From 57cfc57da694da40eaeb6c825c5e4548d7d6d9bc Mon Sep 17 00:00:00 2001 From: Nurmatov Mamatisa Date: Thu, 22 Jul 2021 18:43:06 +0300 Subject: [PATCH] use payloads for FLOATING_IP This patch switches over to callback payloads for FLOATING_IP PRECOMMIT_CREATE and PRECOMMIT_UPDATE events Change-Id: I886a360b838c78b0596c042fb5650bc73848af31 --- neutron/db/l3_db.py | 43 ++++++++++++-------- neutron/services/ovn_l3/plugin.py | 7 +++- neutron/services/portforwarding/pf_plugin.py | 24 ++++------- neutron/tests/unit/extensions/test_l3.py | 6 +-- 4 files changed, 43 insertions(+), 37 deletions(-) diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py index 4732c889aca..823d1962610 100644 --- a/neutron/db/l3_db.py +++ b/neutron/db/l3_db.py @@ -1413,10 +1413,14 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, if self._is_fip_qos_supported: self._process_extra_fip_qos_create(context, fip_id, fip) - registry.notify(resources.FLOATING_IP, events.PRECOMMIT_CREATE, - self, context=context, floatingip=fip, - floatingip_id=fip_id, - floatingip_db=floatingip_obj.db_obj) + registry.publish(resources.FLOATING_IP, + events.PRECOMMIT_CREATE, + self, + payload=events.DBEventPayload( + context, + resource_id=fip_id, + desired_state=floatingip_obj.db_obj, + states=(fip,))) self._core_plugin.update_port( context.elevated(), external_port['id'], @@ -1478,13 +1482,14 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, floatingip_obj = l3_obj.FloatingIP.get_object( context, id=floatingip_obj.id) floatingip_db = floatingip_obj.db_obj - registry.notify(resources.FLOATING_IP, - events.PRECOMMIT_UPDATE, - self, - floatingip=floatingip, - floatingip_db=floatingip_db, - old_floatingip=old_floatingip, - **assoc_result) + + registry.publish(resources.FLOATING_IP, + events.PRECOMMIT_UPDATE, + self, + payload=events.DBEventPayload( + context, + desired_state=floatingip_db, + states=(old_floatingip, floatingip))) registry.notify(resources.FLOATING_IP, events.AFTER_UPDATE, @@ -1669,12 +1674,16 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, l3_obj.FloatingIP.update_objects( context, values, fixed_port_id=port_id) for fip in floating_ip_objs: - registry.notify(resources.FLOATING_IP, events.PRECOMMIT_UPDATE, - self, context=context, - floatingip={l3_apidef.FLOATINGIP: values}, - floatingip_db=fip, - old_floatingip=old_fips[fip.id], - router_ids=router_ids) + registry.publish( + resources.FLOATING_IP, + events.PRECOMMIT_UPDATE, + self, + payload=events.DBEventPayload( + context, + desired_state=fip, + metadata={'router_ids': router_ids}, + states=(old_fips[fip.id], + {l3_apidef.FLOATINGIP: values}))) for fip in floating_ip_objs: assoc_result = { diff --git a/neutron/services/ovn_l3/plugin.py b/neutron/services/ovn_l3/plugin.py index b0e61279484..5fb94344ead 100644 --- a/neutron/services/ovn_l3/plugin.py +++ b/neutron/services/ovn_l3/plugin.py @@ -250,8 +250,11 @@ class OVNL3RouterPlugin(service_base.ServicePluginBase, context, router_id, interface_info) return router_interface_info - def create_floatingip_precommit(self, resource, event, trigger, context, - floatingip, floatingip_id, floatingip_db): + def create_floatingip_precommit(self, resource, event, trigger, payload): + context = payload.context + floatingip_id = payload.resource_id + floatingip_db = payload.desired_state + db_rev.create_initial_revision( context, floatingip_id, ovn_const.TYPE_FLOATINGIPS, std_attr_id=floatingip_db.standard_attr.id) diff --git a/neutron/services/portforwarding/pf_plugin.py b/neutron/services/portforwarding/pf_plugin.py index b8476a0c170..4b73915f4a4 100644 --- a/neutron/services/portforwarding/pf_plugin.py +++ b/neutron/services/portforwarding/pf_plugin.py @@ -147,29 +147,22 @@ class PortForwardingPlugin(fip_pf.PortForwardingPluginBase): if l3_dvr_db.is_distributed_router(router): raise pf_exc.PortHasPortForwarding(port_id=port_id) - @registry.receives(resources.FLOATING_IP, [events.PRECOMMIT_DELETE]) - def _check_floatingip_request_precommit_delete( - self, resource, event, trigger, payload): - # TODO(isabek): refactor back into 1 method when FIP code is moved - # to event payloads - return self._check_floatingip_request(resource, event, trigger, - payload.context, - port=payload.latest_state) - - @registry.receives(resources.FLOATING_IP, [events.PRECOMMIT_UPDATE]) - def _check_floatingip_request(self, resource, event, trigger, context, - **kwargs): + @registry.receives(resources.FLOATING_IP, [events.PRECOMMIT_UPDATE, + events.PRECOMMIT_DELETE]) + def _check_floatingip_request(self, resource, event, trigger, payload): # We only support the "free" floatingip to be associated with # port forwarding resources. And in the PUT request of floatingip, # the request body must contain a "port_id" field which is not # allowed in port forwarding functionality. + context = payload.context floatingip_id = None if event == events.PRECOMMIT_UPDATE: - fip_db = kwargs.get('floatingip_db') + floatingip = payload.states[-1] + fip_db = payload.desired_state floatingip_id = fip_db.id # Here the key-value must contain a floatingip param, and the value # must a dict with key 'floatingip'. - if not kwargs['floatingip']['floatingip'].get('port_id'): + if not floatingip['floatingip'].get('port_id'): # Only care about the associate floatingip cases. # The port_id field is a must-option. But if a floatingip # disassociate a internal port, the port_id should be null. @@ -177,7 +170,8 @@ class PortForwardingPlugin(fip_pf.PortForwardingPluginBase): 'request does not contain port_id.', floatingip_id) return elif event == events.PRECOMMIT_DELETE: - floatingip_id = kwargs.get('port').get('device_id') + port = payload.states[-1] + floatingip_id = port.get('device_id') if not floatingip_id: return diff --git a/neutron/tests/unit/extensions/test_l3.py b/neutron/tests/unit/extensions/test_l3.py index 777d7aa662c..dac9fc141de 100644 --- a/neutron/tests/unit/extensions/test_l3.py +++ b/neutron/tests/unit/extensions/test_l3.py @@ -4005,9 +4005,9 @@ class L3AgentDbTestCaseBase(L3NatTestCaseMixin): with self.floatingip_with_assoc() as f: fake_method.assert_called_once_with( resources.FLOATING_IP, events.PRECOMMIT_CREATE, mock.ANY, - context=mock.ANY, floatingip=mock.ANY, - floatingip_id=f['floatingip']['id'], - floatingip_db=mock.ANY) + payload=mock.ANY) + payload = fake_method.call_args_list[0][1]['payload'] + self.assertEqual(f['floatingip']['id'], payload.resource_id) finally: registry.unsubscribe(fake_method, resources.FLOATING_IP, events.PRECOMMIT_CREATE)