Fix find_resource for keystone and cinder

The find_resource method had two hacks in in to support cinder
and keystone and I have removed those in favor of a monkey patch
for cinder.

The find_resource method used to attempt to UUID parse the id, but
it would do a manager.get anyway.  I changed it to skip the UUID
parsing.  This will make things run minorly faster and it supports
LDAP for keystone.

The find_resource used to attempt to use display_name=name_or_id
when finding.  This was a hack for cinder support, but it breaks
keystone because keystone totally messes up with the bogus filter
and keystone refuses to fix it.

Change-Id: I66e45a6341f704900f1d5321a0e70eac3d051665
Closes-Bug: #1306699
This commit is contained in:
Terry Howe 2014-05-22 17:38:41 -06:00
parent 6380b8b959
commit 0b2987fef3
4 changed files with 78 additions and 15 deletions

View File

@ -21,7 +21,6 @@ import os
import six import six
import sys import sys
import time import time
import uuid
from openstackclient.common import exceptions from openstackclient.common import exceptions
from openstackclient.openstack.common import strutils from openstackclient.openstack.common import strutils
@ -37,13 +36,6 @@ def find_resource(manager, name_or_id):
except exceptions.NotFound: except exceptions.NotFound:
pass pass
# Try to get entity as uuid
try:
uuid.UUID(str(name_or_id))
return manager.get(name_or_id)
except (ValueError, exceptions.NotFound):
pass
# Try directly using the passed value # Try directly using the passed value
try: try:
return manager.get(name_or_id) return manager.get(name_or_id)
@ -65,11 +57,6 @@ def find_resource(manager, name_or_id):
# Eventually this should be pulled from a common set # Eventually this should be pulled from a common set
# of client exceptions. # of client exceptions.
except Exception as ex: except Exception as ex:
try:
return manager.find(display_name=name_or_id)
except Exception:
pass
if type(ex).__name__ == 'NotFound': if type(ex).__name__ == 'NotFound':
msg = "No %s with a name or ID of '%s' exists." % \ msg = "No %s with a name or ID of '%s' exists." % \
(manager.resource_class.__name__.lower(), name_or_id) (manager.resource_class.__name__.lower(), name_or_id)

View File

@ -117,7 +117,7 @@ class TestFindResource(test_utils.TestCase):
self.assertEqual("No lego with a name or ID of 'legos' exists.", self.assertEqual("No lego with a name or ID of 'legos' exists.",
str(result)) str(result))
self.manager.get.assert_called_with(self.name) self.manager.get.assert_called_with(self.name)
self.manager.find.assert_called_with(display_name=self.name) self.manager.find.assert_called_with(name=self.name)
def test_find_resource_find_no_unique(self): def test_find_resource_find_no_unique(self):
self.manager.get = mock.Mock(side_effect=Exception('Boom!')) self.manager.get = mock.Mock(side_effect=Exception('Boom!'))
@ -129,4 +129,4 @@ class TestFindResource(test_utils.TestCase):
self.assertEqual("More than one lego exists with the name 'legos'.", self.assertEqual("More than one lego exists with the name 'legos'.",
str(result)) str(result))
self.manager.get.assert_called_with(self.name) self.manager.get.assert_called_with(self.name)
self.manager.find.assert_called_with(display_name=self.name) self.manager.find.assert_called_with(name=self.name)

View File

@ -0,0 +1,71 @@
# Copyright 2013 Nebula Inc.
#
# 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 cinderclient.v1 import volume_snapshots
from cinderclient.v1 import volumes
from openstackclient.common import exceptions
from openstackclient.common import utils
from openstackclient.tests import utils as test_utils
ID = '1after909'
NAME = 'PhilSpector'
class TestFindResourceVolumes(test_utils.TestCase):
def setUp(self):
super(TestFindResourceVolumes, self).setUp()
api = mock.Mock()
api.client = mock.Mock()
api.client.get = mock.Mock()
resp = mock.Mock()
body = {"volumes": [{"id": ID, 'display_name': NAME}]}
api.client.get.side_effect = [Exception("Not found"), (resp, body)]
self.manager = volumes.VolumeManager(api)
def test_find(self):
result = utils.find_resource(self.manager, NAME)
self.assertEqual(ID, result.id)
self.assertEqual(NAME, result.display_name)
def test_not_find(self):
self.assertRaises(exceptions.CommandError, utils.find_resource,
self.manager, 'GeorgeMartin')
class TestFindResourceVolumeSnapshots(test_utils.TestCase):
def setUp(self):
super(TestFindResourceVolumeSnapshots, self).setUp()
api = mock.Mock()
api.client = mock.Mock()
api.client.get = mock.Mock()
resp = mock.Mock()
body = {"snapshots": [{"id": ID, 'display_name': NAME}]}
api.client.get.side_effect = [Exception("Not found"), (resp, body)]
self.manager = volume_snapshots.SnapshotManager(api)
def test_find(self):
result = utils.find_resource(self.manager, NAME)
self.assertEqual(ID, result.id)
self.assertEqual(NAME, result.display_name)
def test_not_find(self):
self.assertRaises(exceptions.CommandError, utils.find_resource,
self.manager, 'GeorgeMartin')

View File

@ -15,8 +15,13 @@
import logging import logging
from cinderclient.v1 import volume_snapshots
from cinderclient.v1 import volumes
from openstackclient.common import utils from openstackclient.common import utils
# Monkey patch for v1 cinderclient
volumes.Volume.NAME_ATTR = 'display_name'
volume_snapshots.Snapshot.NAME_ATTR = 'display_name'
LOG = logging.getLogger(__name__) LOG = logging.getLogger(__name__)