From a065dd09e4e649186710435f93a1ad0734601476 Mon Sep 17 00:00:00 2001
From: Terry Howe <terrylhowe@gmail.com>
Date: Mon, 7 Jul 2014 06:11:58 -0600
Subject: [PATCH] Allow network find to use alternate name

Add the name_attr to the network find method so it can search
for things like floating_ip_address for floating IP addresses
rather than just id.

Change-Id: I827e3745b06397a54555d1286e477bf2e05bf789
---
 openstackclient/network/common.py            |  6 +-
 openstackclient/tests/network/test_common.py | 72 ++++++++++++++++++++
 2 files changed, 76 insertions(+), 2 deletions(-)
 create mode 100644 openstackclient/tests/network/test_common.py

diff --git a/openstackclient/network/common.py b/openstackclient/network/common.py
index 5ba44f7bfa..bd6203bd03 100644
--- a/openstackclient/network/common.py
+++ b/openstackclient/network/common.py
@@ -14,20 +14,22 @@
 from openstackclient.common import exceptions
 
 
-def find(client, resource, resources, name_or_id):
+def find(client, resource, resources, name_or_id, name_attr='name'):
     """Find a network resource
 
     :param client: network client
     :param resource: name of the resource
     :param resources: plural name of resource
     :param name_or_id: name or id of resource user is looking for
+    :param name_attr: key to the name attribute for the resource
 
     For example:
         n = find(netclient, 'network', 'networks', 'matrix')
     """
     list_method = getattr(client, "list_%s" % resources)
     # Search for by name
-    data = list_method(name=name_or_id, fields='id')
+    kwargs = {name_attr: name_or_id, 'fields': 'id'}
+    data = list_method(**kwargs)
     info = data[resources]
     if len(info) == 1:
         return info[0]['id']
diff --git a/openstackclient/tests/network/test_common.py b/openstackclient/tests/network/test_common.py
new file mode 100644
index 0000000000..b30fdfcb35
--- /dev/null
+++ b/openstackclient/tests/network/test_common.py
@@ -0,0 +1,72 @@
+#   Licensed under the Apache License, Version 2.0 (the "License"); you may
+#   not use this file except in compliance with the License. You may obtain
+#   a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#   License for the specific language governing permissions and limitations
+#   under the License.
+#
+
+import mock
+
+from openstackclient.common import exceptions
+from openstackclient.network import common
+from openstackclient.tests import utils
+
+RESOURCE = 'resource'
+RESOURCES = 'resources'
+NAME = 'matrix'
+ID = 'Fishburne'
+
+
+class TestFind(utils.TestCase):
+    def setUp(self):
+        super(TestFind, self).setUp()
+        self.mock_client = mock.Mock()
+        self.list_resources = mock.Mock()
+        self.mock_client.list_resources = self.list_resources
+        self.matrix = {'id': ID}
+
+    def test_name(self):
+        self.list_resources.return_value = {RESOURCES: [self.matrix]}
+
+        result = common.find(self.mock_client, RESOURCE, RESOURCES, NAME)
+
+        self.assertEqual(ID, result)
+        self.list_resources.assert_called_with(fields='id', name=NAME)
+
+    def test_id(self):
+        self.list_resources.side_effect = [{RESOURCES: []},
+                                           {RESOURCES: [self.matrix]}]
+
+        result = common.find(self.mock_client, RESOURCE, RESOURCES, NAME)
+
+        self.assertEqual(ID, result)
+        self.list_resources.assert_called_with(fields='id', id=NAME)
+
+    def test_nameo(self):
+        self.list_resources.return_value = {RESOURCES: [self.matrix]}
+
+        result = common.find(self.mock_client, RESOURCE, RESOURCES, NAME,
+                             name_attr='nameo')
+
+        self.assertEqual(ID, result)
+        self.list_resources.assert_called_with(fields='id', nameo=NAME)
+
+    def test_dups(self):
+        dup = {'id': 'Larry'}
+        self.list_resources.return_value = {RESOURCES: [self.matrix, dup]}
+
+        self.assertRaises(exceptions.CommandError, common.find,
+                          self.mock_client, RESOURCE, RESOURCES, NAME)
+
+    def test_nada(self):
+        self.list_resources.side_effect = [{RESOURCES: []},
+                                           {RESOURCES: []}]
+
+        self.assertRaises(exceptions.CommandError, common.find,
+                          self.mock_client, RESOURCE, RESOURCES, NAME)