Merge "Tweak find_image method to search in hidden images"
This commit is contained in:
commit
30d8a15bcd
@ -313,3 +313,25 @@ class Image(resource.Resource, resource.TagMixin):
|
||||
request.headers.update(headers)
|
||||
|
||||
return request
|
||||
|
||||
@classmethod
|
||||
def find(cls, session, name_or_id, ignore_missing=True, **params):
|
||||
# Do a regular search first (ignoring missing)
|
||||
result = super(Image, cls).find(session, name_or_id, True,
|
||||
**params)
|
||||
|
||||
if result:
|
||||
return result
|
||||
else:
|
||||
# Search also in hidden images
|
||||
params['is_hidden'] = True
|
||||
data = cls.list(session, **params)
|
||||
|
||||
result = cls._get_one_match(name_or_id, data)
|
||||
if result is not None:
|
||||
return result
|
||||
|
||||
if ignore_missing:
|
||||
return None
|
||||
raise exceptions.ResourceNotFound(
|
||||
"No %s found for %s" % (cls.__name__, name_or_id))
|
||||
|
@ -86,12 +86,16 @@ EXAMPLE = {
|
||||
|
||||
|
||||
class FakeResponse(object):
|
||||
def __init__(self, response, status_code=200, headers=None):
|
||||
def __init__(self, response, status_code=200, headers=None, reason=None):
|
||||
self.body = response
|
||||
self.content = response
|
||||
self.status_code = status_code
|
||||
headers = headers if headers else {'content-type': 'application/json'}
|
||||
self.headers = requests.structures.CaseInsensitiveDict(headers)
|
||||
if reason:
|
||||
self.reason = reason
|
||||
# for the sake of "list" response faking
|
||||
self.links = []
|
||||
|
||||
def json(self):
|
||||
return self.body
|
||||
@ -108,6 +112,7 @@ class TestImage(base.TestCase):
|
||||
self.sess.post = mock.Mock(return_value=self.resp)
|
||||
self.sess.put = mock.Mock(return_value=FakeResponse({}))
|
||||
self.sess.delete = mock.Mock(return_value=FakeResponse({}))
|
||||
self.sess.fetch = mock.Mock(return_value=FakeResponse({}))
|
||||
self.sess.default_microversion = None
|
||||
self.sess.retriable_status_codes = None
|
||||
|
||||
@ -383,3 +388,30 @@ class TestImage(base.TestCase):
|
||||
self.assertEqual(
|
||||
sorted(value, key=operator.itemgetter('value')),
|
||||
sorted(call_kwargs['json'], key=operator.itemgetter('value')))
|
||||
|
||||
def test_image_find(self):
|
||||
sot = image.Image()
|
||||
|
||||
self.sess._get_connection = mock.Mock(return_value=self.cloud)
|
||||
self.sess.get.side_effect = [
|
||||
# First fetch by name
|
||||
FakeResponse(None, 404, headers={}, reason='dummy'),
|
||||
# Then list with no results
|
||||
FakeResponse({'images': []}),
|
||||
# And finally new list of hidden images with one searched
|
||||
FakeResponse({'images': [EXAMPLE]})
|
||||
|
||||
]
|
||||
|
||||
result = sot.find(self.sess, EXAMPLE['name'])
|
||||
|
||||
self.sess.get.assert_has_calls([
|
||||
mock.call('images/' + EXAMPLE['name'], microversion=None),
|
||||
mock.call('/images', headers={'Accept': 'application/json'},
|
||||
microversion=None, params={}),
|
||||
mock.call('/images', headers={'Accept': 'application/json'},
|
||||
microversion=None, params={'os_hidden': True})
|
||||
])
|
||||
|
||||
self.assertIsInstance(result, image.Image)
|
||||
self.assertEqual(IDENTIFIER, result.id)
|
||||
|
Loading…
x
Reference in New Issue
Block a user