Extend port resource request only when using qos minimum rules

In the method [1], if there is no minimum bandwidth rule and
minimum packet rate rule in the port's qos policy,
port['resource_request'] is set to None in the end, which means
no furthermore resource_request extension is required in those cases.

This change checks first if there are minimum bandwith rules and
minimum packet rate rules in the policy. If there is no minimum rule,
set port_res['resource_request'] to None, and then continue the
for loop.

This change adds a test checking resource_request extension is not
done and ports' resource_request is set to None in this case.

There is change in existing test. This change fixes test which is
affected by the modified method[1]. This change adds new member
variables network_id and ports_res, and uses them instead of defining
new ones in the other tests.

[1] https://github.com/openstack/neutron/blob/master/neutron/services/qo
s/qos_plugin.py#L276

Closes-Bug: #2103412
Change-Id: I4d84cbf21be5e065a6ff57ba87352e2b602862b5
This commit is contained in:
jimin3-shin
2025-03-17 11:44:32 +09:00
parent 41626a4bb4
commit 19774fde2f
2 changed files with 62 additions and 48 deletions

View File

@@ -296,6 +296,15 @@ class QoSPlugin(qos.QoSPluginBase):
context.get_admin_context(), qos_policy_id=qos_id)
min_bw_rules[qos_id] = rules
if qos_id not in min_pps_rules:
rules = rule_object.QosMinimumPacketRateRule.get_objects(
context.get_admin_context(), qos_policy_id=qos_id)
min_pps_rules[qos_id] = rules
if not min_bw_rules[qos_id] and not min_pps_rules[qos_id]:
port_res['resource_request'] = None
continue
if net_id not in net_segments:
segments = network_object.NetworkSegment.get_objects(
context.get_admin_context(),
@@ -306,10 +315,6 @@ class QoSPlugin(qos.QoSPluginBase):
qos_id, port_id, vnic_type, net_id,
min_bw_rules[qos_id], net_segments[net_id])
if qos_id not in min_pps_rules:
rules = rule_object.QosMinimumPacketRateRule.get_objects(
context.get_admin_context(), qos_policy_id=qos_id)
min_pps_rules[qos_id] = rules
min_pps_request_group = QoSPlugin._get_min_pps_request_group(
qos_id, port_id, vnic_type, min_pps_rules[qos_id])

View File

@@ -135,6 +135,28 @@ class TestQosPlugin(base.BaseQosTestCase):
self._rp_tun_name = cfg.CONF.ml2.tunnelled_network_rp_name
self._rp_tun_trait = n_const.TRAIT_NETWORK_TUNNEL
self.network_id = uuidutils.generate_uuid()
self.ports_res = [
{
"resource_request": {
"port_id": uuidutils.generate_uuid(),
"qos_id": self.policy.id,
"network_id": self.network_id,
"vnic_type": "normal",
}
},
{
"resource_request": {
"port_id": uuidutils.generate_uuid(),
"qos_id": self.policy.id,
"network_id": self.network_id,
"vnic_type": "normal",
}
},
]
def _validate_driver_params(self, method_name, ctxt):
call_args = self.qos_plugin.driver_manager.call.call_args[0]
self.assertTrue(self.qos_plugin.driver_manager.call.called)
@@ -186,27 +208,8 @@ class TestQosPlugin(base.BaseQosTestCase):
def _create_and_extend_ports(self, min_bw_rules, min_pps_rules=None,
physical_network='public',
request_groups_uuids=None):
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",
}
},
]
network_id = self.network_id
ports_res = self.ports_res
segment_mock = mock.MagicMock(network_id=network_id,
physical_network=physical_network)
min_pps_rules = min_pps_rules if min_pps_rules else []
@@ -224,7 +227,13 @@ class TestQosPlugin(base.BaseQosTestCase):
mock.patch(
'uuid.uuid5',
return_value='fake_uuid',
side_effect=request_groups_uuids):
side_effect=request_groups_uuids), \
mock.patch(
'neutron.objects.qos.rule.QosMinimumBandwidthRule.count',
return_value=len(min_bw_rules)), \
mock.patch(
'neutron.objects.qos.rule.QosMinimumPacketRateRule.count',
return_value=len(min_pps_rules)):
return qos_plugin.QoSPlugin._extend_port_resource_request_bulk(
ports_res, None)
@@ -472,27 +481,8 @@ class TestQosPlugin(base.BaseQosTestCase):
)
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",
}
},
]
network_id = self.network_id
ports_res = self.ports_res
segment_mock = mock.MagicMock(network_id=network_id,
physical_network='public')
min_bw_rules = []
@@ -515,12 +505,31 @@ class TestQosPlugin(base.BaseQosTestCase):
ports = qos_plugin.QoSPlugin._extend_port_resource_request_bulk(
ports_res, None)
self.assertEqual(network_segment_mock.call_count, 1)
self.assertEqual(network_segment_mock.call_count, 0)
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_bulk_non_bw_and_pps_rule(
self):
ports_res = self.ports_res
with mock.patch(
'neutron.objects.qos.rule.QosMinimumBandwidthRule.'
'get_objects', return_value=[]), \
mock.patch(
'neutron.objects.qos.rule.QosMinimumPacketRateRule.'
'get_objects', return_value=[]), \
mock.patch(
'neutron.services.qos.qos_plugin.QoSPlugin'
'._get_resource_request') as resource_request_mock:
ports = qos_plugin.QoSPlugin._extend_port_resource_request_bulk(
ports_res, None)
resource_request_mock.assert_not_called()
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)