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:
@@ -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])
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user