From 10c2fa034f4f60df5a5873ea6c81ebd55de9e014 Mon Sep 17 00:00:00 2001 From: Rodolfo Alonso Hernandez Date: Sun, 6 Mar 2022 11:50:02 +0000 Subject: [PATCH] [QoS][L3] Use floating IP OVO QoS fields Since [1], "FloatingIP" OVO has the synthetic field "qos_policy_id", linked to "QosPolicyFloatingIPBinding". This patch uses the OVO implementation to bind the corresponding QoS policy to the floating IP register. Related-Bug: #1877404 [1]https://review.opendev.org/c/openstack/neutron/+/726208 Change-Id: I7071eb29c55fadcb3a87bd9c7f76e4c68c3ea217 --- neutron/db/l3_db.py | 16 ++++++++-------- neutron/db/l3_fip_qos.py | 36 ------------------------------------ 2 files changed, 8 insertions(+), 44 deletions(-) diff --git a/neutron/db/l3_db.py b/neutron/db/l3_db.py index 9e1468d1926..b19ebb74989 100644 --- a/neutron/db/l3_db.py +++ b/neutron/db/l3_db.py @@ -37,6 +37,7 @@ from neutron_lib.plugins import directory from neutron_lib.plugins import utils as plugin_utils from neutron_lib import rpc as n_rpc from neutron_lib.services import base as base_services +from neutron_lib.services.qos import constants as qos_const from oslo_log import log as logging from oslo_utils import uuidutils from sqlalchemy import orm @@ -1413,6 +1414,8 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, floating_fixed_ip = external_ipv4_ips[0] floating_ip_address = floating_fixed_ip['ip_address'] + qos_policy_id = (fip.get(qos_const.QOS_POLICY_ID) + if self._is_fip_qos_supported else None) floatingip_obj = l3_obj.FloatingIP( context, id=fip_id, @@ -1421,7 +1424,8 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, floating_network_id=fip['floating_network_id'], floating_ip_address=floating_ip_address, floating_port_id=external_port['id'], - description=fip.get('description')) + description=fip.get('description'), + qos_policy_id=qos_policy_id) # Update association with internal port # and define external IP address assoc_result = self._update_fip_assoc(context, fip, floatingip_obj) @@ -1431,8 +1435,6 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, if self._is_dns_integration_supported: dns_data = self._process_dns_floatingip_create_precommit( context, floatingip_dict, fip) - if self._is_fip_qos_supported: - self._process_extra_fip_qos_create(context, fip_id, fip) registry.publish(resources.FLOATING_IP, events.PRECOMMIT_CREATE, @@ -1490,17 +1492,15 @@ class L3_NAT_dbonly_mixin(l3.RouterPluginBase, old_floatingip = self._make_floatingip_dict(floatingip_obj) old_fixed_port_id = floatingip_obj.fixed_port_id assoc_result = self._update_fip_assoc(context, fip, floatingip_obj) + if self._is_fip_qos_supported: + floatingip_obj.qos_policy_id = fip.get(qos_const.QOS_POLICY_ID) floatingip_obj.update() floatingip_dict = self._make_floatingip_dict(floatingip_obj) + if self._is_dns_integration_supported: dns_data = self._process_dns_floatingip_update_precommit( context, floatingip_dict) - if self._is_fip_qos_supported: - self._process_extra_fip_qos_update(context, - floatingip_obj, - fip, - old_floatingip) floatingip_obj = l3_obj.FloatingIP.get_object( context, id=floatingip_obj.id) floatingip_db = floatingip_obj.db_obj diff --git a/neutron/db/l3_fip_qos.py b/neutron/db/l3_fip_qos.py index b7958243c8d..99e19c857ce 100644 --- a/neutron/db/l3_fip_qos.py +++ b/neutron/db/l3_fip_qos.py @@ -16,8 +16,6 @@ from neutron_lib.api.definitions import l3 as l3_apidef from neutron_lib.db import resource_extend from neutron_lib.services.qos import constants as qos_consts -from neutron.objects.qos import policy as policy_object - @resource_extend.has_resource_extenders class FloatingQoSDbMixin(object): @@ -33,37 +31,3 @@ class FloatingQoSDbMixin(object): fip_db.qos_network_policy_binding else None) fip_res[qos_consts.QOS_NETWORK_POLICY_ID] = qos_id return fip_res - - def _create_fip_qos_db(self, context, fip_id, policy_id): - policy = policy_object.QosPolicy.get_policy_obj(context, policy_id) - policy.attach_floatingip(fip_id) - - def _delete_fip_qos_db(self, context, fip_id, policy_id): - policy = policy_object.QosPolicy.get_policy_obj(context, policy_id) - policy.detach_floatingip(fip_id) - - def _process_extra_fip_qos_create(self, context, fip_id, fip): - qos_policy_id = fip.get(qos_consts.QOS_POLICY_ID) - if not qos_policy_id: - return - self._create_fip_qos_db(context, fip_id, qos_policy_id) - - def _process_extra_fip_qos_update( - self, context, floatingip_obj, fip, old_floatingip): - if qos_consts.QOS_POLICY_ID not in fip: - # No qos_policy_id in API input, do nothing - return - - new_qos_policy_id = fip.get(qos_consts.QOS_POLICY_ID) - old_qos_policy_id = old_floatingip.get(qos_consts.QOS_POLICY_ID) - - if old_qos_policy_id == new_qos_policy_id: - return - if old_qos_policy_id: - self._delete_fip_qos_db(context, - floatingip_obj['id'], - old_qos_policy_id) - if not new_qos_policy_id: - return - self._create_fip_qos_db( - context, floatingip_obj['id'], new_qos_policy_id)