Merge "Remove extra GET call when limit provided to list"

This commit is contained in:
Jenkins
2014-12-05 21:04:01 +00:00
committed by Gerrit Code Review
2 changed files with 20 additions and 0 deletions

View File

@@ -469,11 +469,19 @@ class Resource(collections.MutableMapping):
if not resp:
more_data = False
# Keep track of how many items we've yielded. If we yielded
# less than our limit, we don't need to do an extra request
# to get back an empty data set, which acts as a sentinel.
yielded = 0
for data in resp:
value = cls.existing(**data)
marker = value.id
yielded += 1
yield value
if limit and yielded < limit:
more_data = False
@classmethod
def find(cls, session, name_or_id, path_args=None):
"""Find a resource by name or id as an instance."""

View File

@@ -324,6 +324,18 @@ class ResourceTests(base.TestTransportBase):
self.assertEqual(fake_name, obj.name)
self.assertIsInstance(obj, FakeResource)
def test_list_bail_out(self):
results = [fake_data.copy(), fake_data.copy(), fake_data.copy()]
body = mock.Mock(body={fake_resources: results})
attrs = {"get.return_value": body}
session = mock.Mock(**attrs)
list(FakeResource.list(session, limit=len(results) + 1,
path_args=fake_arguments))
# Ensure we only made one call to complete this.
self.assertEqual(session.get.call_count, 1)
def test_attrs(self):
obj = FakeResource()