Skip to content

Commit 4900c64

Browse files
committed
Produce a useful error message for NoUniqueMatch
Most of the CLIs use a NoUniqueMatch, so produce a useful error message if that happens. Added some tests for find_resource as well. Change-Id: I85ba61d5f6d1be5bd336a1cc4b02501492905f33 Closes-Bug: #1293846
1 parent 0c0803d commit 4900c64

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

openstackclient/common/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ def find_resource(manager, name_or_id):
7474
msg = "No %s with a name or ID of '%s' exists." % \
7575
(manager.resource_class.__name__.lower(), name_or_id)
7676
raise exceptions.CommandError(msg)
77+
if type(ex).__name__ == 'NoUniqueMatch':
78+
msg = "More than one %s exists with the name '%s'." % \
79+
(manager.resource_class.__name__.lower(), name_or_id)
80+
raise exceptions.CommandError(msg)
7781
else:
7882
raise
7983

openstackclient/tests/common/test_utils.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,75 @@ def test_get_password_cntrl_d(self):
5757
self.assertRaises(exceptions.CommandError,
5858
utils.get_password,
5959
mock_stdin)
60+
61+
62+
class NoUniqueMatch(Exception):
63+
pass
64+
65+
66+
class TestFindResource(test_utils.TestCase):
67+
def setUp(self):
68+
super(TestFindResource, self).setUp()
69+
self.name = 'legos'
70+
self.expected = mock.Mock()
71+
self.manager = mock.Mock()
72+
self.manager.resource_class = mock.Mock()
73+
self.manager.resource_class.__name__ = 'lego'
74+
75+
def test_find_resource_get_int(self):
76+
self.manager.get = mock.Mock(return_value=self.expected)
77+
result = utils.find_resource(self.manager, 1)
78+
self.assertEqual(self.expected, result)
79+
self.manager.get.assert_called_with(1)
80+
81+
def test_find_resource_get_int_string(self):
82+
self.manager.get = mock.Mock(return_value=self.expected)
83+
result = utils.find_resource(self.manager, "2")
84+
self.assertEqual(self.expected, result)
85+
self.manager.get.assert_called_with(2)
86+
87+
def test_find_resource_get_uuid(self):
88+
uuid = '9a0dc2a0-ad0d-11e3-a5e2-0800200c9a66'
89+
self.manager.get = mock.Mock(return_value=self.expected)
90+
result = utils.find_resource(self.manager, uuid)
91+
self.assertEqual(self.expected, result)
92+
self.manager.get.assert_called_with(uuid)
93+
94+
def test_find_resource_get_whatever(self):
95+
self.manager.get = mock.Mock(return_value=self.expected)
96+
result = utils.find_resource(self.manager, 'whatever')
97+
self.assertEqual(self.expected, result)
98+
self.manager.get.assert_called_with('whatever')
99+
100+
def test_find_resource_find(self):
101+
self.manager.get = mock.Mock(side_effect=Exception('Boom!'))
102+
self.manager.find = mock.Mock(return_value=self.expected)
103+
result = utils.find_resource(self.manager, self.name)
104+
self.assertEqual(self.expected, result)
105+
self.manager.get.assert_called_with(self.name)
106+
self.manager.find.assert_called_with(name=self.name)
107+
108+
def test_find_resource_find_not_found(self):
109+
self.manager.get = mock.Mock(side_effect=Exception('Boom!'))
110+
self.manager.find = mock.Mock(side_effect=
111+
exceptions.NotFound(404, "2"))
112+
result = self.assertRaises(exceptions.CommandError,
113+
utils.find_resource,
114+
self.manager,
115+
self.name)
116+
self.assertEqual("No lego with a name or ID of 'legos' exists.",
117+
str(result))
118+
self.manager.get.assert_called_with(self.name)
119+
self.manager.find.assert_called_with(display_name=self.name)
120+
121+
def test_find_resource_find_no_unique(self):
122+
self.manager.get = mock.Mock(side_effect=Exception('Boom!'))
123+
self.manager.find = mock.Mock(side_effect=NoUniqueMatch())
124+
result = self.assertRaises(exceptions.CommandError,
125+
utils.find_resource,
126+
self.manager,
127+
self.name)
128+
self.assertEqual("More than one lego exists with the name 'legos'.",
129+
str(result))
130+
self.manager.get.assert_called_with(self.name)
131+
self.manager.find.assert_called_with(display_name=self.name)

0 commit comments

Comments
 (0)