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.
|
||||
|
||||
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)
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue