From 8052c3985325e9067d83496936092ee9334df75b Mon Sep 17 00:00:00 2001
From: Kevin Benton <blak111@gmail.com>
Date: Wed, 27 Jan 2016 04:34:54 -0800
Subject: [PATCH] Allow address pairs to be cleared with None

When the neutron client attempts to clear the allowed
address pairs using the '--action=clear' CLI param, it
sends a value of None to the Neutron server for allowed
address pairs. However, the allowed address pairs extension
was only allowing an empty list to clear the pairs.

This patch just converts None to an empty list on allowed
address pairs to be compatible with the client.

APIImpact
Closes-Bug: #1537734
Change-Id: Iba618b3e07bd3bdc202a9577954d7b97c2a5bf09
---
 neutron/extensions/allowedaddresspairs.py            |  1 +
 neutron/tests/unit/db/test_allowedaddresspairs_db.py | 12 +++++++++---
 ...wed-address-pairs-with-none-4757bcca78076c9e.yaml |  9 +++++++++
 3 files changed, 19 insertions(+), 3 deletions(-)
 create mode 100644 releasenotes/notes/clear-allowed-address-pairs-with-none-4757bcca78076c9e.yaml

diff --git a/neutron/extensions/allowedaddresspairs.py b/neutron/extensions/allowedaddresspairs.py
index 18884b3a364..cb11eb4bfd7 100644
--- a/neutron/extensions/allowedaddresspairs.py
+++ b/neutron/extensions/allowedaddresspairs.py
@@ -97,6 +97,7 @@ ADDRESS_PAIRS = 'allowed_address_pairs'
 EXTENDED_ATTRIBUTES_2_0 = {
     'ports': {
         ADDRESS_PAIRS: {'allow_post': True, 'allow_put': True,
+                        'convert_to': attr.convert_none_to_empty_list,
                         'convert_list_to':
                         attr.convert_kvp_list_to_dict,
                         'validate': {'type:validate_allowed_address_pairs':
diff --git a/neutron/tests/unit/db/test_allowedaddresspairs_db.py b/neutron/tests/unit/db/test_allowedaddresspairs_db.py
index 491e773edbd..8bfb44b1ba6 100644
--- a/neutron/tests/unit/db/test_allowedaddresspairs_db.py
+++ b/neutron/tests/unit/db/test_allowedaddresspairs_db.py
@@ -100,7 +100,7 @@ class TestAllowedAddressPairs(AllowedAddressPairDBTestCase):
 
     def test_create_port_allowed_address_pairs_bad_format(self):
         with self.network() as net:
-            bad_values = [False, True, None, 1.1, 1]
+            bad_values = [False, True, 1.1, 1]
             for value in bad_values:
                 self._create_port(
                     self.fmt, net['network']['id'],
@@ -305,7 +305,13 @@ class TestAllowedAddressPairs(AllowedAddressPairDBTestCase):
             res = req.get_response(self.api)
             self.assertEqual(400, res.status_int)
 
-    def test_create_port_remove_allowed_address_pairs(self):
+    def test_create_port_remove_allowed_address_pairs_with_list(self):
+        self._test_create_port_remove_allowed_address_pairs([])
+
+    def test_create_port_remove_allowed_address_pairs_with_none(self):
+        self._test_create_port_remove_allowed_address_pairs(None)
+
+    def _test_create_port_remove_allowed_address_pairs(self, update_value):
         with self.network() as net:
             address_pairs = [{'mac_address': '00:00:00:00:00:01',
                               'ip_address': '10.0.0.1'}]
@@ -313,7 +319,7 @@ class TestAllowedAddressPairs(AllowedAddressPairDBTestCase):
                                     arg_list=(addr_pair.ADDRESS_PAIRS,),
                                     allowed_address_pairs=address_pairs)
             port = self.deserialize(self.fmt, res)
-            update_port = {'port': {addr_pair.ADDRESS_PAIRS: []}}
+            update_port = {'port': {addr_pair.ADDRESS_PAIRS: update_value}}
             req = self.new_update_request('ports', update_port,
                                           port['port']['id'])
             port = self.deserialize(self.fmt, req.get_response(self.api))
diff --git a/releasenotes/notes/clear-allowed-address-pairs-with-none-4757bcca78076c9e.yaml b/releasenotes/notes/clear-allowed-address-pairs-with-none-4757bcca78076c9e.yaml
new file mode 100644
index 00000000000..112453d9c5e
--- /dev/null
+++ b/releasenotes/notes/clear-allowed-address-pairs-with-none-4757bcca78076c9e.yaml
@@ -0,0 +1,9 @@
+---
+prelude: >
+    Allowed address pairs can now be cleared by passing
+    None in addition to an empty list. This is to make
+    it possible to use the --action=clear option with
+    the neutron client.
+    neutron port-update <uuid> --allowed-address-pairs action=clear
+fixes:
+  - Fixes bug 1537734