summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-06-16 19:01:18 +0000
committerGerrit Code Review <review@openstack.org>2015-06-16 19:01:18 +0000
commit71d852836474f59f10a7bb9883f6dcecc56e5675 (patch)
treefc75ba7846126921d3fd3509404f2cd7ac72c9e3
parent0d22e821f9df4247e16a115f8b486d9bdd68eea1 (diff)
parent43621dc1ac626f7ce3322cee8b7908a93af20f26 (diff)
downloadpython-glanceclient-71d852836474f59f10a7bb9883f6dcecc56e5675.tar.gz
Merge "Close iterables at the end of iteration"
-rw-r--r--glanceclient/common/utils.py6
-rw-r--r--glanceclient/tests/unit/test_utils.py13
2 files changed, 18 insertions, 1 deletions
diff --git a/glanceclient/common/utils.py b/glanceclient/common/utils.py
index 9016860..7410b3b 100644
--- a/glanceclient/common/utils.py
+++ b/glanceclient/common/utils.py
@@ -442,7 +442,11 @@ class IterableWithLength(object):
self.length = length
def __iter__(self):
- return self.iterable
+ try:
+ for chunk in self.iterable:
+ yield chunk
+ finally:
+ self.iterable.close()
def next(self):
return next(self.iterable)
diff --git a/glanceclient/tests/unit/test_utils.py b/glanceclient/tests/unit/test_utils.py
index 564d7f6..e2c1780 100644
--- a/glanceclient/tests/unit/test_utils.py
+++ b/glanceclient/tests/unit/test_utils.py
@@ -15,6 +15,7 @@
import sys
+import mock
import six
# NOTE(jokke): simplified transition to py3, behaves like py2 xrange
from six.moves import range
@@ -163,3 +164,15 @@ class TestUtils(testtools.TestCase):
self.assertIn('--test', arg)
self.assertEqual(str, opts['type'])
self.assertIn('None, opt-1, opt-2', opts['help'])
+
+ def test_iterable_closes(self):
+ # Regression test for bug 1461678.
+ def _iterate(i):
+ for chunk in i:
+ raise(IOError)
+
+ data = six.moves.StringIO('somestring')
+ data.close = mock.Mock()
+ i = utils.IterableWithLength(data, 10)
+ self.assertRaises(IOError, _iterate, i)
+ data.close.assert_called_with()