summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYAMAMOTO Takashi <yamamoto@valinux.co.jp>2014-08-15 14:20:00 +0900
committerYAMAMOTO Takashi <yamamoto@valinux.co.jp>2014-09-16 06:46:07 +0000
commitdd5c73450da908d95724e20eb3be09bc936cb551 (patch)
treed708b02d4867eb02adca5099fb044c2369c0dce4
parenta50bff9685dc6ae86c98538f6dcce061de03946b (diff)
downloadneutron-dd5c73450da908d95724e20eb3be09bc936cb551.tar.gz
ofagent: Ignore unknown l2pop entry removals
l2pop can send us entry removal without the corresponding addition. Gracefully ignore it instead of crashing. Closes-Bug: #1357198 Change-Id: I5a0cc44ba62faf15d6fe3730a9532a3826647820
-rw-r--r--neutron/plugins/ofagent/agent/arp_lib.py7
-rw-r--r--neutron/tests/unit/ofagent/test_arp_lib.py17
2 files changed, 23 insertions, 1 deletions
diff --git a/neutron/plugins/ofagent/agent/arp_lib.py b/neutron/plugins/ofagent/agent/arp_lib.py
index c83e943528..aeae8f3588 100644
--- a/neutron/plugins/ofagent/agent/arp_lib.py
+++ b/neutron/plugins/ofagent/agent/arp_lib.py
@@ -120,7 +120,12 @@ class ArpLib(object):
@log.log
def del_arp_table_entry(self, network, ip):
- del self._arp_tbl[network][ip]
+ if network not in self._arp_tbl:
+ LOG.debug("removal of unknown network %s", network)
+ return
+ if self._arp_tbl[network].pop(ip, None) is None:
+ LOG.debug("removal of unknown ip %s", ip)
+ return
if not self._arp_tbl[network]:
del self._arp_tbl[network]
diff --git a/neutron/tests/unit/ofagent/test_arp_lib.py b/neutron/tests/unit/ofagent/test_arp_lib.py
index a0b0dcdafc..45c1193628 100644
--- a/neutron/tests/unit/ofagent/test_arp_lib.py
+++ b/neutron/tests/unit/ofagent/test_arp_lib.py
@@ -16,6 +16,7 @@
import collections
import contextlib
+import copy
import mock
@@ -203,6 +204,22 @@ class TestArpLib(OFAAgentTestCase):
self.arplib.del_arp_table_entry(self.nets[0].net, self.nets[0].ip)
self.assertEqual(self.arplib._arp_tbl, {})
+ def test_del_arp_table_entry_unknown_network(self):
+ self.arplib._arp_tbl = {
+ 100: {"192.0.2.1": "fa:16:3e:e2:37:37"},
+ }
+ orig = copy.deepcopy(self.arplib._arp_tbl)
+ self.arplib.del_arp_table_entry(200, "192.0.2.1")
+ self.assertEqual(orig, self.arplib._arp_tbl)
+
+ def test_del_arp_table_entry_unknown_ip(self):
+ self.arplib._arp_tbl = {
+ 100: {"192.0.2.1": "fa:16:3e:e2:37:37"},
+ }
+ orig = copy.deepcopy(self.arplib._arp_tbl)
+ self.arplib.del_arp_table_entry(100, "192.0.2.9")
+ self.assertEqual(orig, self.arplib._arp_tbl)
+
def test_del_arp_table_entry_multiple_net(self):
self.arplib._arp_tbl = {
self.nets[0].net: {self.nets[0].ip: self.nets[0].mac},