Openstack Python SDK - Glance 没有 return 图像 MD5
Openstack Python SDK - Glance does not return image MD5
我尝试仅使用 Openstack Python SDK 从 glance 下载 OpenStack 映像,但我只收到此错误:
Traceback (most recent call last):
File "/home/openstack/discovery/discovery.py", line 222, in <module>
main(sys.argv[1:])
File "/home/openstack/discovery/discovery.py", line 117, in main
image_service.download_image(image)
File "/usr/local/lib/python2.7/dist-packages/openstack/image/v2/_proxy.py", line 72, in download_image
return image.download(self.session)
File "/usr/local/lib/python2.7/dist-packages/openstack/image/v2/image.py", line 166, in download
checksum = resp.headers["Content-MD5"]
File "/usr/local/lib/python2.7/dist-packages/requests/structures.py", line 54, in __getitem__
return self._store[key.lower()][1]
KeyError: 'content-md5'
奇怪的是,如果我 运行 使用 IDE(PyCharm 远程调试)或作为脚本(python script.py -i ...) 我得到了错误,但是如果我 运行 每行使用 python 解释器 (ipython/python),错误就不会发生!不知道为什么。
这是我使用的代码:
...
image_name = node.name + "_" + time.strftime("%Y-%m-%d_%H-%M-%S")
print "Getting data from", node.name
compute_service.create_server_image(node, image_name)
image = image_service.find_image(image_name)
image_service.wait_for_status(image, 'active')
fileName = "%s.img" % image.name
with open(str(fileName), 'w+') as imgFile:
imgFile.write(image.download(conn.image.session))
...
此代码最终使用此方法调用此文件 /usr/local/lib/python2.7/dist-packages/openstack/image/v2/image.py
中的 API:
def download(self, session):
"""Download the data contained in an image"""
# TODO(briancurtin): This method should probably offload the get
# operation into another thread or something of that nature.
url = utils.urljoin(self.base_path, self.id, 'file')
resp = session.get(url, endpoint_filter=self.service)
checksum = resp.headers["Content-MD5"]
digest = hashlib.md5(resp.content).hexdigest()
if digest != checksum:
raise exceptions.InvalidResponse("checksum mismatch")
return resp.content
resp.headers 变量没有键 "Content-MD5"。这是我为它找到的值:
{'Date': 'Thu, 01 Sep 2016 20:17:01 GMT', 'Transfer-Encoding': 'chunked',
'Connection': 'keep-alive', 'Content-Type': 'application/octet-stream',
'X-Openstack-Request-Id': 'req-9eb16897-1398-4ab2-9cd4-45706e92819c'}
但是根据 REST API 文档,响应应该 return 使用密钥 Content-MD5:
http://developer.openstack.org/api-ref/image/v2/?expanded=download-binary-image-data-detail
如果我只是评论 MD5 检查下载工作正常,但这是在 SDK 中所以我不能't/shouldn改变它。有人对如何使用 OpenStack Python SDK 实现这一点有任何建议吗?这是一个 SDK 错误吗?
事实证明这确实是一个错误 SDK/Glance。有关它的更多详细信息,请参见此处:
https://bugs.launchpad.net/python-openstacksdk/+bug/1619675
可以在此处查看已实施的修复:
https://github.com/openstack/python-openstacksdk/commit/759651f4a9eae2ba546f46613550a4cb10ddd964
我尝试仅使用 Openstack Python SDK 从 glance 下载 OpenStack 映像,但我只收到此错误:
Traceback (most recent call last):
File "/home/openstack/discovery/discovery.py", line 222, in <module>
main(sys.argv[1:])
File "/home/openstack/discovery/discovery.py", line 117, in main
image_service.download_image(image)
File "/usr/local/lib/python2.7/dist-packages/openstack/image/v2/_proxy.py", line 72, in download_image
return image.download(self.session)
File "/usr/local/lib/python2.7/dist-packages/openstack/image/v2/image.py", line 166, in download
checksum = resp.headers["Content-MD5"]
File "/usr/local/lib/python2.7/dist-packages/requests/structures.py", line 54, in __getitem__
return self._store[key.lower()][1]
KeyError: 'content-md5'
奇怪的是,如果我 运行 使用 IDE(PyCharm 远程调试)或作为脚本(python script.py -i ...) 我得到了错误,但是如果我 运行 每行使用 python 解释器 (ipython/python),错误就不会发生!不知道为什么。
这是我使用的代码:
...
image_name = node.name + "_" + time.strftime("%Y-%m-%d_%H-%M-%S")
print "Getting data from", node.name
compute_service.create_server_image(node, image_name)
image = image_service.find_image(image_name)
image_service.wait_for_status(image, 'active')
fileName = "%s.img" % image.name
with open(str(fileName), 'w+') as imgFile:
imgFile.write(image.download(conn.image.session))
...
此代码最终使用此方法调用此文件 /usr/local/lib/python2.7/dist-packages/openstack/image/v2/image.py
中的 API:
def download(self, session):
"""Download the data contained in an image"""
# TODO(briancurtin): This method should probably offload the get
# operation into another thread or something of that nature.
url = utils.urljoin(self.base_path, self.id, 'file')
resp = session.get(url, endpoint_filter=self.service)
checksum = resp.headers["Content-MD5"]
digest = hashlib.md5(resp.content).hexdigest()
if digest != checksum:
raise exceptions.InvalidResponse("checksum mismatch")
return resp.content
resp.headers 变量没有键 "Content-MD5"。这是我为它找到的值:
{'Date': 'Thu, 01 Sep 2016 20:17:01 GMT', 'Transfer-Encoding': 'chunked',
'Connection': 'keep-alive', 'Content-Type': 'application/octet-stream',
'X-Openstack-Request-Id': 'req-9eb16897-1398-4ab2-9cd4-45706e92819c'}
但是根据 REST API 文档,响应应该 return 使用密钥 Content-MD5: http://developer.openstack.org/api-ref/image/v2/?expanded=download-binary-image-data-detail
如果我只是评论 MD5 检查下载工作正常,但这是在 SDK 中所以我不能't/shouldn改变它。有人对如何使用 OpenStack Python SDK 实现这一点有任何建议吗?这是一个 SDK 错误吗?
事实证明这确实是一个错误 SDK/Glance。有关它的更多详细信息,请参见此处: https://bugs.launchpad.net/python-openstacksdk/+bug/1619675
可以在此处查看已实施的修复: https://github.com/openstack/python-openstacksdk/commit/759651f4a9eae2ba546f46613550a4cb10ddd964