Improve handle port_update and port_delete events in ovs qos agent
This patch improves getting vif port name from port info in Openvswitch QoS extension driver. It will prevent to have tracebacks with info that NoneType object has no attribute. Such situation could happen if extension driver handled event on port which was already deleted Change-Id: Ib76630183f1091436f1cd282a91cbce5fb151716 Closes-Bug: #1536540
This commit is contained in:
parent
4f8050b172
commit
213d48df01
|
@ -13,12 +13,16 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
from oslo_log import log as logging
|
||||||
|
|
||||||
from neutron.agent.l2.extensions import qos
|
from neutron.agent.l2.extensions import qos
|
||||||
from neutron.plugins.ml2.drivers.openvswitch.mech_driver import (
|
from neutron.plugins.ml2.drivers.openvswitch.mech_driver import (
|
||||||
mech_openvswitch)
|
mech_openvswitch)
|
||||||
|
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class QosOVSAgentDriver(qos.QosAgentDriver):
|
class QosOVSAgentDriver(qos.QosAgentDriver):
|
||||||
|
|
||||||
SUPPORTED_RULES = (
|
SUPPORTED_RULES = (
|
||||||
|
@ -41,17 +45,29 @@ class QosOVSAgentDriver(qos.QosAgentDriver):
|
||||||
self.update_bandwidth_limit(port, rule)
|
self.update_bandwidth_limit(port, rule)
|
||||||
|
|
||||||
def update_bandwidth_limit(self, port, rule):
|
def update_bandwidth_limit(self, port, rule):
|
||||||
port_name = port['vif_port'].port_name
|
vif_port = port.get('vif_port')
|
||||||
|
if not vif_port:
|
||||||
|
port_id = port.get('port_id', None)
|
||||||
|
LOG.debug("update_bandwidth_limit was received for port %s but "
|
||||||
|
"vif_port was not found. It seems that port is already "
|
||||||
|
"deleted", port_id)
|
||||||
|
return
|
||||||
max_kbps = rule.max_kbps
|
max_kbps = rule.max_kbps
|
||||||
max_burst_kbps = rule.max_burst_kbps
|
max_burst_kbps = rule.max_burst_kbps
|
||||||
|
|
||||||
self.br_int.create_egress_bw_limit_for_port(port_name,
|
self.br_int.create_egress_bw_limit_for_port(vif_port.port_name,
|
||||||
max_kbps,
|
max_kbps,
|
||||||
max_burst_kbps)
|
max_burst_kbps)
|
||||||
|
|
||||||
def delete_bandwidth_limit(self, port):
|
def delete_bandwidth_limit(self, port):
|
||||||
port_name = port['vif_port'].port_name
|
vif_port = port.get('vif_port')
|
||||||
self.br_int.delete_egress_bw_limit_for_port(port_name)
|
if not vif_port:
|
||||||
|
port_id = port.get('port_id', None)
|
||||||
|
LOG.debug("delete_bandwidth_limit was received for port %s but "
|
||||||
|
"vif_port was not found. It seems that port is already "
|
||||||
|
"deleted", port_id)
|
||||||
|
return
|
||||||
|
self.br_int.delete_egress_bw_limit_for_port(vif_port.port_name)
|
||||||
|
|
||||||
def create_dscp_marking(self, port, rule):
|
def create_dscp_marking(self, port, rule):
|
||||||
self.update_dscp_marking(port, rule)
|
self.update_dscp_marking(port, rule)
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import copy
|
||||||
|
|
||||||
import mock
|
import mock
|
||||||
from oslo_utils import uuidutils
|
from oslo_utils import uuidutils
|
||||||
|
|
||||||
|
@ -103,10 +105,22 @@ class QosOVSAgentDriverTestCase(ovs_test_base.OVSAgentConfigTestBase):
|
||||||
self.qos_driver.update(self.port, self.qos_policy)
|
self.qos_driver.update(self.port, self.qos_policy)
|
||||||
self._assert_rule_create_updated()
|
self._assert_rule_create_updated()
|
||||||
|
|
||||||
|
def test_update_rules_no_vif_port(self):
|
||||||
|
port = copy.copy(self.port)
|
||||||
|
port.pop("vif_port")
|
||||||
|
self.qos_driver.update(port, self.qos_policy)
|
||||||
|
self.create.assert_not_called()
|
||||||
|
|
||||||
def test_delete_rules(self):
|
def test_delete_rules(self):
|
||||||
self.qos_driver.delete(self.port, self.qos_policy)
|
self.qos_driver.delete(self.port, self.qos_policy)
|
||||||
self.delete.assert_called_once_with(self.port_name)
|
self.delete.assert_called_once_with(self.port_name)
|
||||||
|
|
||||||
|
def test_delete_rules_no_vif_port(self):
|
||||||
|
port = copy.copy(self.port)
|
||||||
|
port.pop("vif_port")
|
||||||
|
self.qos_driver.delete(port, self.qos_policy)
|
||||||
|
self.delete.assert_not_called()
|
||||||
|
|
||||||
def _assert_rule_create_updated(self):
|
def _assert_rule_create_updated(self):
|
||||||
# Assert create is the last call
|
# Assert create is the last call
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
|
|
Loading…
Reference in New Issue