Fix glance image-download error
When use command 'glance image-download --file xxx.raw <image-id>' to download the image, it will fail with error code 500. It shows "TypeError:'ImageTarget' object does not support item assignment" in glance-api's log. It is because that when instance snapshot of volume-backed instance is uploaded to glance, image size is set to 0 from nova. While downloading that snapshot with using image-download call it tries to get the image size from the cache where it fails as image is instance of policy.ImageTarget. Made change to set image size on image_meta.target if image is a policy.ImageTarget. Change-Id: I1a08baa465d3927b721678a5a7ab5f54304993d6 Co-Authored-By: Abhishek Kekane <abhishek.kekane@nttdata.com> Co-Authored-By: Eric Fried <efried@us.ibm.com> Closes-Bug: #1686488
This commit is contained in:
parent
f24aebaca9
commit
94306a686b
|
@ -72,7 +72,12 @@ class CacheFilter(wsgi.Middleware):
|
||||||
if not image_meta['size']:
|
if not image_meta['size']:
|
||||||
# override image size metadata with the actual cached
|
# override image size metadata with the actual cached
|
||||||
# file size, see LP Bug #900959
|
# file size, see LP Bug #900959
|
||||||
image_meta['size'] = self.cache.get_image_size(image_meta['id'])
|
if not isinstance(image_meta, policy.ImageTarget):
|
||||||
|
image_meta['size'] = self.cache.get_image_size(
|
||||||
|
image_meta['id'])
|
||||||
|
else:
|
||||||
|
image_meta.target.size = self.cache.get_image_size(
|
||||||
|
image_meta['id'])
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _match_request(request):
|
def _match_request(request):
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
from mock import patch
|
||||||
from oslo_policy import policy
|
from oslo_policy import policy
|
||||||
# NOTE(jokke): simplified transition to py3, behaves like py2 xrange
|
# NOTE(jokke): simplified transition to py3, behaves like py2 xrange
|
||||||
from six.moves import http_client as http
|
from six.moves import http_client as http
|
||||||
|
@ -322,24 +322,38 @@ class TestCacheMiddlewareProcessRequest(base.IsolatedUnitTest):
|
||||||
self.assertRaises(exception.NotFound,
|
self.assertRaises(exception.NotFound,
|
||||||
cache_filter._verify_metadata, image_meta)
|
cache_filter._verify_metadata, image_meta)
|
||||||
|
|
||||||
|
def _test_verify_metadata_zero_size(self, image_meta):
|
||||||
|
"""
|
||||||
|
Test verify_metadata updates metadata with cached image size for images
|
||||||
|
with 0 size.
|
||||||
|
|
||||||
|
:param image_meta: Image metadata, which may be either an ImageTarget
|
||||||
|
instance or a legacy v1 dict.
|
||||||
|
"""
|
||||||
|
image_size = 1
|
||||||
|
cache_filter = ProcessRequestTestCacheFilter()
|
||||||
|
with patch.object(cache_filter.cache, 'get_image_size',
|
||||||
|
return_value=image_size):
|
||||||
|
cache_filter._verify_metadata(image_meta)
|
||||||
|
self.assertEqual(image_size, image_meta['size'])
|
||||||
|
|
||||||
def test_verify_metadata_zero_size(self):
|
def test_verify_metadata_zero_size(self):
|
||||||
"""
|
"""
|
||||||
Test verify_metadata updates metadata with cached image size for images
|
Test verify_metadata updates metadata with cached image size for images
|
||||||
with 0 size
|
with 0 size
|
||||||
"""
|
"""
|
||||||
image_size = 1
|
image_meta = {'size': 0, 'deleted': False, 'id': 'test1',
|
||||||
|
|
||||||
def fake_get_image_size(image_id):
|
|
||||||
return image_size
|
|
||||||
|
|
||||||
image_id = 'test1'
|
|
||||||
image_meta = {'size': 0, 'deleted': False, 'id': image_id,
|
|
||||||
'status': 'active'}
|
'status': 'active'}
|
||||||
cache_filter = ProcessRequestTestCacheFilter()
|
self._test_verify_metadata_zero_size(image_meta)
|
||||||
self.stubs.Set(cache_filter.cache, 'get_image_size',
|
|
||||||
fake_get_image_size)
|
def test_verify_metadata_is_image_target_instance_with_zero_size(self):
|
||||||
cache_filter._verify_metadata(image_meta)
|
"""
|
||||||
self.assertEqual(image_size, image_meta['size'])
|
Test verify_metadata updates metadata which is ImageTarget instance
|
||||||
|
"""
|
||||||
|
image = ImageStub('test1')
|
||||||
|
image.size = 0
|
||||||
|
image_meta = glance.api.policy.ImageTarget(image)
|
||||||
|
self._test_verify_metadata_zero_size(image_meta)
|
||||||
|
|
||||||
def test_v2_process_request_response_headers(self):
|
def test_v2_process_request_response_headers(self):
|
||||||
def dummy_img_iterator():
|
def dummy_img_iterator():
|
||||||
|
|
Loading…
Reference in New Issue