← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 1619675] Re: Glance does not return image MD5

 

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