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:
Sławek Kapłoński 2016-04-01 22:00:41 +00:00
parent 4f8050b172
commit 213d48df01
2 changed files with 34 additions and 4 deletions

View File

@ -13,12 +13,16 @@
# under the License.
from oslo_config import cfg
from oslo_log import log as logging
from neutron.agent.l2.extensions import qos
from neutron.plugins.ml2.drivers.openvswitch.mech_driver import (
mech_openvswitch)
LOG = logging.getLogger(__name__)
class QosOVSAgentDriver(qos.QosAgentDriver):
SUPPORTED_RULES = (
@ -41,17 +45,29 @@ class QosOVSAgentDriver(qos.QosAgentDriver):
self.update_bandwidth_limit(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_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_burst_kbps)
def delete_bandwidth_limit(self, port):
port_name = port['vif_port'].port_name
self.br_int.delete_egress_bw_limit_for_port(port_name)
vif_port = port.get('vif_port')
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):
self.update_dscp_marking(port, rule)

View File

@ -10,6 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
import copy
import mock
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._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):
self.qos_driver.delete(self.port, self.qos_policy)
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):
# Assert create is the last call
self.assertEqual(