From beb2f2ef1504e608a29dc37a1dfbcd1886f327a9 Mon Sep 17 00:00:00 2001 From: Slawek Kaplonski Date: Mon, 4 Mar 2019 22:20:42 +0100 Subject: [PATCH] Fix handling no qos_queues while removing min bw limit rule When ovs L2 agent is removing qos minimum bandwidth rules for port, it may happen that qos_queues for this port will not be found. Such case should be handled properly to not raise AttributeError when trying to call "keys()" method on None object. Change-Id: Ic76bf41983e021919ab0a6ffcf0fdcfd45c935ee --- neutron/agent/common/ovs_lib.py | 2 ++ .../tests/functional/agent/common/test_ovs_lib.py | 13 +++++++++++++ 2 files changed, 15 insertions(+) diff --git a/neutron/agent/common/ovs_lib.py b/neutron/agent/common/ovs_lib.py index 0f53bad8254..d8bf41fb27a 100644 --- a/neutron/agent/common/ovs_lib.py +++ b/neutron/agent/common/ovs_lib.py @@ -981,6 +981,8 @@ class OVSBridge(BaseOVS): queue_num = int(queue['external_ids']['queue-num']) self._unset_queue_for_minimum_bandwidth(queue_num) qos_id, qos_queues = self._find_qos() + if not qos_queues: + return if queue_num in qos_queues.keys(): qos_queues.pop(queue_num) self._update_qos( diff --git a/neutron/tests/functional/agent/common/test_ovs_lib.py b/neutron/tests/functional/agent/common/test_ovs_lib.py index 3afae35037d..71c94995f13 100644 --- a/neutron/tests/functional/agent/common/test_ovs_lib.py +++ b/neutron/tests/functional/agent/common/test_ovs_lib.py @@ -387,6 +387,19 @@ class BaseOVSTestCase(base.BaseSudoTestCase): qos = self._list_qos(qos_id) self.assertEqual(0, len(qos['queues'])) + def test_delete_minimum_bandwidth_queue_no_qos_found(self): + queue_id, neutron_port_id = self._create_queue(queue_num=1) + self.addCleanup(self.ovs._delete_queue, queue_id) + + # Check that it will not raise any exception even if there is no + # qos with associated queues + self.ovs.delete_minimum_bandwidth_queue(neutron_port_id) + + # And verify that this queue wasn't in fact deleted as there was no + # qos found + queue = self._list_queues(queue_id) + self.assertEqual(queue_id, queue['_uuid']) + def test_clear_minimum_bandwidth_qos(self): queue_id_1, _ = self._create_queue(queue_num=1) queue_id_2, _ = self._create_queue(queue_num=2)