diff --git a/neutron/services/qos/qos_plugin.py b/neutron/services/qos/qos_plugin.py index 3c485f4350c..d51b3582854 100644 --- a/neutron/services/qos/qos_plugin.py +++ b/neutron/services/qos/qos_plugin.py @@ -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]) diff --git a/neutron/tests/unit/services/qos/test_qos_plugin.py b/neutron/tests/unit/services/qos/test_qos_plugin.py index ea78bb586da..85bb0c01024 100644 --- a/neutron/tests/unit/services/qos/test_qos_plugin.py +++ b/neutron/tests/unit/services/qos/test_qos_plugin.py @@ -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)