From 2fd51371ec95a712300707623f77ced6969d54fc Mon Sep 17 00:00:00 2001 From: jimin3-shin Date: Thu, 13 Mar 2025 14:50:25 +0900 Subject: [PATCH] Duplicated table lookup in extending port resource request There are duplicated table lookup in the _get_min_bw_request_group, _get_min_pps_request_group method. If there is no minimum bandwidth rule or minimum packet rate rule, empty list ([]) can be passed to the method. Since empty list ([]) is False, the method lookup the table again, which is unnecessary. This occurs longer time taking in port list api. Closes-Bug: #2103408 Change-Id: I21d7b51094bd91ed62e8ffed798aae0e29b6ca61 --- neutron/services/qos/qos_plugin.py | 6 +-- .../unit/services/qos/test_qos_plugin.py | 50 +++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/neutron/services/qos/qos_plugin.py b/neutron/services/qos/qos_plugin.py index 464b2dbd671..3c485f4350c 100644 --- a/neutron/services/qos/qos_plugin.py +++ b/neutron/services/qos/qos_plugin.py @@ -197,11 +197,11 @@ class QoSPlugin(qos.QoSPluginBase): network_id, min_bw_rules=None, segments=None): request_group = {} - if not min_bw_rules: + if min_bw_rules is None: min_bw_rules = rule_object.QosMinimumBandwidthRule.get_objects( context.get_admin_context(), qos_policy_id=qos_policy_id) min_bw_resources = QoSPlugin._get_min_bw_resources(min_bw_rules) - if not segments: + if segments is None: segments = network_object.NetworkSegment.get_objects( context.get_admin_context(), network_id=network_id) min_bw_traits = QoSPlugin._get_min_bw_traits(vnic_type, segments) @@ -218,7 +218,7 @@ class QoSPlugin(qos.QoSPluginBase): def _get_min_pps_request_group(qos_policy_id, port_id, vnic_type, min_pps_rules=None): request_group = {} - if not min_pps_rules: + if min_pps_rules is None: min_pps_rules = rule_object.QosMinimumPacketRateRule.get_objects( context.get_admin_context(), qos_policy_id=qos_policy_id) diff --git a/neutron/tests/unit/services/qos/test_qos_plugin.py b/neutron/tests/unit/services/qos/test_qos_plugin.py index 8b459aea5e1..ea78bb586da 100644 --- a/neutron/tests/unit/services/qos/test_qos_plugin.py +++ b/neutron/tests/unit/services/qos/test_qos_plugin.py @@ -471,6 +471,56 @@ class TestQosPlugin(base.BaseQosTestCase): port['resource_request']['same_subtree'], ) + def test__extend_port_resource_request_bulk_non_min_bw_or_pps_rule(self): + network_id = uuidutils.generate_uuid() + + ports_res = [ + { + "resource_request": { + "port_id": uuidutils.generate_uuid(), + "qos_id": self.policy.id, + "network_id": network_id, + "vnic_type": "normal", + + } + }, + { + "resource_request": { + "port_id": uuidutils.generate_uuid(), + "qos_id": self.policy.id, + "network_id": network_id, + "vnic_type": "normal", + } + }, + ] + segment_mock = mock.MagicMock(network_id=network_id, + physical_network='public') + min_bw_rules = [] + min_pps_rules = [] + + with mock.patch('neutron.objects.network.NetworkSegment.get_objects', + return_value=[segment_mock]) as network_segment_mock, \ + mock.patch( + 'neutron.objects.qos.rule.QosMinimumBandwidthRule.' + 'get_objects', + return_value=min_bw_rules) as qos_min_bw_rule_mock, \ + mock.patch( + 'neutron.objects.qos.rule.QosMinimumPacketRateRule.' + 'get_objects', + return_value=min_pps_rules) as qos_min_pps_rule_mock, \ + mock.patch( + 'uuid.uuid5', + return_value='fake_uuid', + side_effect=None): + ports = qos_plugin.QoSPlugin._extend_port_resource_request_bulk( + ports_res, None) + + self.assertEqual(network_segment_mock.call_count, 1) + self.assertEqual(qos_min_bw_rule_mock.call_count, 1) + self.assertEqual(qos_min_pps_rule_mock.call_count, 1) + for port in ports: + self.assertIsNone(port.get('resource_request')) + def test__extend_port_resource_request_no_qos_policy(self): port = self._create_and_extend_port([], physical_network='public', has_qos_policy=False)