diff --git a/neutron/agent/l2/extensions/qos.py b/neutron/agent/l2/extensions/qos.py index ca3a7f00ec6..50be0c23cb4 100644 --- a/neutron/agent/l2/extensions/qos.py +++ b/neutron/agent/l2/extensions/qos.py @@ -257,7 +257,8 @@ class QosAgentExtension(l2_agent_extension.L2AgentExtension): if not self.policy_map.has_policy_changed(port, qos_policy_id): return - qos_policy = self.resource_rpc.pull( + qos_policy = self.policy_map.get_policy( + qos_policy_id) or self.resource_rpc.pull( context, resources.QOS_POLICY, qos_policy_id) if qos_policy is None: LOG.info("QoS policy %(qos_policy_id)s applied to port " diff --git a/neutron/tests/unit/agent/l2/extensions/test_qos.py b/neutron/tests/unit/agent/l2/extensions/test_qos.py index 59e293c43a8..e42490ea61d 100644 --- a/neutron/tests/unit/agent/l2/extensions/test_qos.py +++ b/neutron/tests/unit/agent/l2/extensions/test_qos.py @@ -289,6 +289,28 @@ class QosExtensionRpcTestCase(QosExtensionBaseTestCase): self.context, resources.QOS_POLICY, port['qos_policy_id']) + def test_handle_diff_ports_same_policy_id(self): + port_obj1 = self._create_test_port_dict() + port_obj2 = self._create_test_port_dict() + + self.qos_ext.handle_port(self.context, port_obj1) + self.pull_mock.assert_called_once_with( + self.context, resources.QOS_POLICY, + port_obj1['qos_policy_id']) + self.assertIsNotNone( + self.qos_ext.policy_map.get_port_policy(port_obj1)) + self.assertIsNone( + self.qos_ext.policy_map.get_port_policy(port_obj2)) + + self.qos_ext.resource_rpc.pull.reset_mock() + self.qos_ext.handle_port(self.context, port_obj2) + self.assertFalse(self.pull_mock.called) + self.assertIsNotNone( + self.qos_ext.policy_map.get_port_policy(port_obj2)) + self.assertEqual( + self.qos_ext.policy_map.get_port_policy(port_obj1), + self.qos_ext.policy_map.get_port_policy(port_obj2)) + def test_delete_known_port(self): port = self._create_test_port_dict() self.qos_ext.handle_port(self.context, port)