Hey, sorry for not getting back to you quicker. The log shows that on
that particular request, the server's response doesn't include the MD5,
so I think Ian is right that this is more of a Glance problem than it is
an SDK problem. I'm going to add Glance in here so perhaps they can take
a look.

** Also affects: glance
   Importance: Undecided
       Status: New

** Changed in: python-openstacksdk
       Status: New => Invalid

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to Glance.
https://bugs.launchpad.net/bugs/1619675

Title:
  Glance does not return image MD5

Status in Glance:
  New
Status in OpenStack SDK:
  Invalid

Bug description:
  I'm trying to download an OpenStack image from glance using only the
  Openstack Python SDK, but I only get this error:

  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'

  The weird part is that if I run the code using an IDE (PyCharm with
  remote debug) or as a script (python script.py -i ...) I get the
  error, but if I run each line using a python interpreter
  (ipython/python) the error does not happen! Have no idea why.

  Here is the code I'm using:

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

  This code ends up calling the API in this file
  /usr/local/lib/python2.7/dist-packages/openstack/image/v2/image.py,
  with this method:

  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

  The resp.headers variable has no key "Content-MD5". This is the value
  I found for it:

  {'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'}

  But according to the REST API documentationm the response should
  return with the key Content-MD5: http://developer.openstack.org/api-
  ref/image/v2/?expanded=download-binary-image-data-detail

  If I just comment the MD5 check the download works fine, but this is
  inside the SDK so I can't/shouldn't change it. Anyone have any
  suggestion on how to achieve this using the OpenStack Python SDK? Is
  this an SDK bug?

To manage notifications about this bug go to:
https://bugs.launchpad.net/glance/+bug/1619675/+subscriptions

-- 
Mailing list: https://launchpad.net/~yahoo-eng-team
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yahoo-eng-team
More help   : https://help.launchpad.net/ListHelp

Reply via email to