Openstack Python SDK — Glance не возвращает изображение MD5

Я пытаюсь загрузить образ OpenStack из look, используя только Openstack Python SDK, но получаю только эту ошибку:

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))
...

Этот код в конечном итоге вызывает API в этом файле /usr/local/lib/python2.7/dist-packages/openstack/image/v2/image.py с помощью этого метода:

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 ответ должен возвращаться с ключом Content-MD5: http://developer.openstack.org/api-ref/image/v2/?expanded=download-binary-image-data-detail

Если я просто прокомментирую проверку MD5, загрузка будет работать нормально, но это внутри SDK, поэтому я не могу/не должен его менять. У кого-нибудь есть какие-либо предложения о том, как добиться этого с помощью OpenStack Python SDK? Это ошибка SDK?


person Vini.g.fer    schedule 01.09.2016    source источник


Ответы (1)


Оказывается, это действительно была ошибка SDK/Glance. Подробнее об этом можно узнать здесь: https://bugs.launchpad.net/python-openstacksdk/+bug/1619675

Реализованное исправление можно увидеть здесь: https://github.com/openstack/python-openstacksdk/commit/759651f4a9eae2ba546f46613550a4cb10ddd964

person Vini.g.fer    schedule 12.09.2016