Flask和Nova一瞥下载:TypeError:'generator'类型的对象没有len()

时间:2014-02-24 09:49:01

标签: python flask

我对一段代码感到头脑发热。 我正在开发一个Openstack Nova驱动程序,它需要在某个时候将Glance映像下载到远程服务器。此远程服务器托管Flask Web服务器,该服务器具有REST API以允许下载内容(POST / api / images / pull)。 当我尝试代码时,我收到以下错误:“TypeError:'generator'类型的对象没有len()”。

以下是Nova方面的代码:

def pull_image(self, image_obj, context, image_href):
    # Put the Glance image to the Wparrip server
    (image_service, image_id) = glance.get_remote_image_service(context,image_href)
    read_iter = image_service.download(context, image_id)
    image_size = image_obj.get_image_size(context, image_href)
    headers = {
         'Content-Type': 'application/octet-stream',
         'Content-Length': image_size,
         'Transfer-encoding':'chunked',
         'Cache-Control': 'no-cache',
         'Connection': 'Keep-Alive',
         'X-Meta-Glance-Image-Id': image_href
    }
    def _get_next():
        for chunk in read_iter:
            if chunk:
                yield chunk

    resp = self._make_request('POST','/api/images/pull',headers=headers, body=_get_next())
    if resp.code != 200:
        raise Exception(_("Cannot create_container %s") % format(resp.code))
    return True

这是Flask服务器端的代码:

@app.route('/wparrip/api/images/pull', methods = ['POST'])
@crossdomain(origin='*')
def image_download():
    """
    The other way around... we download an image coming from
    Glance (or another source __future__). 
    """
    local_filename="test.tgz"
    file = os.path.join(image_local,local_filename)
    f = open(file, 'wb')
    while True:
        data = request.data
        if data:
            f.write(data)
            f.flush()
        else:
            f.close()
            break
    resp = make_response(jsonify( {'file':file} ), 200)
    return resp

所以,这是_make_request函数:

def _make_request(self, *args, **kwargs):
    headers = {}
    if 'headers' in kwargs and kwargs['headers']:
        headers = kwargs['headers']
    if 'Content-Type' not in headers:
        headers['Content-Type'] = 'application/json'
        kwargs['headers'] = headers
    rest = httplib.HTTPConnection(self._host_ip,self._host_port)
    if rest is None:
        raise Exception(_("Cannot create the Http remote Connection"))

    rest.request(*args, **kwargs)
    return rest_utils.Response(rest.getresponse())

有没有人可以帮我弄清楚这段代码有什么问题?

这是nova方面的错误日志(Flask方面没有意思,除了我们确实传递了我发送的代码段)

    2014-02-21 15:46:55.101   [00;32mDEBUG glanceclient.common.http [  [00;36m-  [00;32m]   [01;35m  [00;32mcurl -i -X HEAD -H 'X-Service-Catalog: [{"endpoints": [{"adminURL": "http://10.197.160.95:8776/v1/174a21dd0de043719d87c7c9e2f9d062", "region": "RegionOne", "internalURL": "http://10.197.160.95:8776/v1/174a21dd0de043719d87c7c9e2f9d062", "id": "11b750f23e9b4c36bb9d1948cdfb0ad6", "publicURL": "http://10.197.160.95:8776/v1/174a21dd0de043719d87c7c9e2f9d062"}], "endpoints_links": [], "type": "volume", "name": "cinder"}]' -H 'X-Identity-Status: Confirmed' -H 'X-Roles: admin' -H 'User-Agent: python-glanceclient' -H 'X-Tenant-Id: 174a21dd0de043719d87c7c9e2f9d062' -H 'X-User-Id: 451d46cd619243668658c92f8a1a29a4' -H 'X-Auth-Token: af6606b8713d09b2f85b308098e4c7d7' -H 'Content-Type: application/octet-stream' http://10.197.160.95:9292/v1/images/b408d525-3186-4200-a9a7-90eaf756b843  [00m   [00;33mfrom (pid=836) log_curl_request /opt/stack/python-glanceclient/glanceclient/common/http.py:142  [00m
2014-02-21 15:46:55.121   [00;32mDEBUG glanceclient.common.http [  [00;36m-  [00;32m]   [01;35m  [00;32m
HTTP/1.1 200 OK
content-length: 0
x-image-meta-id: b408d525-3186-4200-a9a7-90eaf756b843
date: Fri, 21 Feb 2014 14:46:55 GMT
x-image-meta-deleted: False
x-image-meta-checksum: 3a106675dfc12795963726e7b9cf53b0
x-image-meta-container_format: wparrip
x-image-meta-protected: False
x-image-meta-min_disk: 0
x-image-meta-created_at: 2014-02-03T20:17:24
x-image-meta-size: 505
x-image-meta-status: active
etag: 3a106675dfc12795963726e7b9cf53b0
location: http://10.197.160.95:9292/v1/images/b408d525-3186-4200-a9a7-90eaf756b843
x-image-meta-is_public: True
x-image-meta-min_ram: 0
x-image-meta-owner: 174a21dd0de043719d87c7c9e2f9d062
x-image-meta-updated_at: 2014-02-03T20:17:24
content-type: text/html; charset=UTF-8
x-openstack-request-id: req-8413d18f-a4d1-486c-b846-f47c92b39e8e
x-image-meta-disk_format: raw
x-image-meta-name: testwpar
  [00m   [00;33mfrom (pid=836) log_http_response /opt/stack/python-glanceclient/glanceclient/common/http.py:152  [00m
2014-02-21 15:46:55.121   [00;32mDEBUG nova.virt.wparrip.client [  [01;36mreq-62be8844-136e-4fe0-a431-7ecc02e87758   [00;36madmin admin  [00;32m]   [01;35m  [00;32mwparrip, pull_image=505  [00m   [00;33mfrom (pid=836) pull_image /opt/stack/nova/nova/virt/wparrip/client.py:292  [00m
2014-02-21 15:46:55.122   [01;31mERROR nova.compute.manager [  [01;36mreq-62be8844-136e-4fe0-a431-7ecc02e87758   [00;36madmin admin  [01;31m]   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [01;31mInstance failed to spawn  [00m
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00mTraceback (most recent call last):
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/opt/stack/nova/nova/compute/manager.py", line 1434, in _spawn
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    block_device_info)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/opt/stack/nova/nova/virt/wparrip/driver.py", line 287, in spawn
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    res = self._session.pull_image(_image, context, instance['image_ref'])
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/opt/stack/nova/nova/virt/wparrip/client.py", line 307, in pull_image
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    resp = self._make_request('POST','/wparrip/api/images/pull',headers=headers, body=_get_next())
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/opt/stack/nova/nova/virt/wparrip/client.py", line 152, in _make_request
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    rest.request(*args, **kwargs)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/usr/lib/python2.7/httplib.py", line 958, in request
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    self._send_request(method, url, body, headers)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/usr/lib/python2.7/httplib.py", line 992, in _send_request
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    self.endheaders(body)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/usr/lib/python2.7/httplib.py", line 954, in endheaders
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    self._send_output(message_body)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/usr/lib/python2.7/httplib.py", line 818, in _send_output
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    self.send(message_body)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/usr/lib/python2.7/httplib.py", line 790, in send
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    self.sock.sendall(data)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/usr/local/lib/python2.7/dist-packages/eventlet/greenio.py", line 309, in sendall
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    tail = self.send(data, flags)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m  File "/usr/local/lib/python2.7/dist-packages/eventlet/greenio.py", line 291, in send
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m    len_data = len(data)
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00mTypeError: object of type 'generator' has no len()
  [01;31m2014-02-21 15:46:55.122 TRACE nova.compute.manager   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00m
2014-02-21 15:46:55.124   [00;32mDEBUG nova.compute.claims [  [01;36mreq-62be8844-136e-4fe0-a431-7ecc02e87758   [00;36madmin admin  [00;32m]   [01;35m[instance: d22e3fbb-2035-4b4f-a89c-37656adc4a12]   [00;32mAborting claim: [Claim: 1 MB memory, 0 GB disk, 1 VCPUS]  [00m   [00;33mfrom (pid=836) abort /opt/stack/nova/nova/compute/claims.py:107  [00m
2014-02-21 15:46:55.124   [00;32mDEBUG nova.openstack.common.lockutils [  [01;36mreq-62be8844-136e-4fe0-a431-7ecc02e87758   [00;36madmin admin  [00;32m]   [01;35m  [00;32mGot semaphore "compute_resources"  [00m   [00;33mfrom (pid=836) lock /opt/stack/nova/nova/openstack/common/lockutils.py:167  [00m

谢谢!

0 个答案:

没有答案