← Back to team overview

yahoo-eng-team team mailing list archive

[Bug 1273975] [NEW] when "v2/images" API with "changes-since" option is requested, Glance API Server returns 500 code

 

Public bug reported:

environment:
    Openstack by deployed devstack

reproduce:
  1.   request "v2/images" with "chnages-since" to Glance API Server.

  2.  return 500 error code

expect result:
   return list filtered out by "changes-since" option 

cause:
   in "_make_conditions_from_filters" method of glance/db/sqlalchemy/api.py,
 "timeutils.normalize_time" function is used.

Although the argument of  "timeutils.normalize_time" have to have datetime,
unicode object is set.

syslog:

2014-01-29 15:21:16.444 24293 INFO glance.wsgi.server [561294e8-8719-4dd1-84d3-c070f9bf421d 2fdafc2b68a54ec19343c5eb45d2b65b ac9666adfda644f181d8005053e27b73] Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/eventlet/wsgi.py", line 389, in handle_one_response
    result = self.application(self.environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
    resp = self.call_func(req, *args, **self.kwargs)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
    return self.func(req, *args, **kwargs)
  File "/opt/stack/glance/glance/common/wsgi.py", line 372, in __call__
    response = req.get_response(self.application)
  File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1296, in send
    application, catch_exc_info=False)
  File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1260, in call_application
    app_iter = application(self.environ, start_response)
  File "/opt/stack/python-keystoneclient/keystoneclient/middleware/auth_token.py", line 581, in __call__
    return self.app(env, start_response)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
    resp = self.call_func(req, *args, **self.kwargs)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
    return self.func(req, *args, **kwargs)
  File "/opt/stack/glance/glance/common/wsgi.py", line 372, in __call__
    response = req.get_response(self.application)
  File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1296, in send
    application, catch_exc_info=False)
  File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1260, in call_application
    app_iter = application(self.environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
    resp = self.call_func(req, *args, **self.kwargs)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
    return self.func(req, *args, **kwargs)
  File "/opt/stack/glance/glance/common/wsgi.py", line 372, in __call__
    response = req.get_response(self.application)
  File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1296, in send
    application, catch_exc_info=False)
  File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1260, in call_application
    app_iter = application(self.environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
    resp = self.call_func(req, *args, **self.kwargs)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
    return self.func(req, *args, **kwargs)
  File "/opt/stack/glance/glance/common/wsgi.py", line 372, in __call__
    response = req.get_response(self.application)
  File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1296, in send
    application, catch_exc_info=False)
  File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1260, in call_application
    app_iter = application(self.environ, start_response)
  File "/usr/lib/python2.7/dist-packages/paste/urlmap.py", line 203, in __call__
    return app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 144, in __call__
    return resp(environ, start_response)
  File "/usr/lib/python2.7/dist-packages/routes/middleware.py", line 131, in __call__
    response = self.app(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 144, in __call__
    return resp(environ, start_response)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
    resp = self.call_func(req, *args, **self.kwargs)
  File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
    return self.func(req, *args, **kwargs)
  File "/opt/stack/glance/glance/common/wsgi.py", line 604, in __call__
    request, **action_args)
  File "/opt/stack/glance/glance/common/wsgi.py", line 623, in dispatch
    return method(*args, **kwargs)
  File "/opt/stack/glance/glance/api/v2/images.py", line 91, in index
    member_status=member_status)
  File "/opt/stack/glance/glance/api/authorization.py", line 90, in list
    images = self.image_repo.list(*args, **kwargs)
  File "/opt/stack/glance/glance/domain/proxy.py", line 56, in list
    items = self.base.list(*args, **kwargs)
  File "/opt/stack/glance/glance/api/policy.py", line 182, in list
    return super(ImageRepoProxy, self).list(*args, **kwargs)
  File "/opt/stack/glance/glance/domain/proxy.py", line 56, in list
    items = self.base.list(*args, **kwargs)
  File "/opt/stack/glance/glance/domain/proxy.py", line 56, in list
    items = self.base.list(*args, **kwargs)
  File "/opt/stack/glance/glance/domain/proxy.py", line 56, in list
    items = self.base.list(*args, **kwargs)
  File "/opt/stack/glance/glance/db/__init__.py", line 74, in list
    member_status=member_status)
  File "/opt/stack/glance/glance/db/sqlalchemy/api.py", line 486, in image_get_all
    _make_conditions_from_filters(filters, is_public)
  File "/opt/stack/glance/glance/db/sqlalchemy/api.py", line 359, in _make_conditions_from_filters
    changes_since = timeutils.normalize_time(filters.pop('changes-since'))
  File "/opt/stack/glance/glance/openstack/common/timeutils.py", line 70, in normalize_time
    offset = timestamp.utcoffset()
AttributeError: 'unicode' object has no attribute 'utcoffset'

2014-01-29 15:21:16.445 24293 INFO glance.wsgi.server
[561294e8-8719-4dd1-84d3-c070f9bf421d 2fdafc2b68a54ec19343c5eb45d2b65b
ac9666adfda644f181d8005053e27b73] 192.168.0.10 - - [29/Jan/2014
15:21:16] "GET /v2/images?changes-since=20131010T10:10:10 HTTP/1.1" 500
139 23.403289

remark)
   in pdb debug, when the value of "changes-since" is changed, it works correctly.

   pdb 
  -----------------------------------------------------------------------
  ll__ /usr/lib/python2.7/dist-packages/routes/middleware.py:103
  > /opt/stack/glance/glance/api/v2/images.py(78)index()
  -> if filters is None:
  (Pdb) import datetime
  (Pdb) filters
  MultiDict([(u'changes-since', u'20131010T10:10:10')])
  (Pdb) filters[changes-since]=datetime.datetime(2013,10,10,10,10,10)
  *** NameError: name 'changes' is not defined
  (Pdb) filters["changes-since"]=datetime.datetime(2013,10,10,10,10,10)
  (Pdb) filters
   MultiDict([('changes-since', datetime.datetime(2013, 10, 10, 10, 10, 10))])
   (Pdb) c
   > /opt/stack/glance/glance/db/sqlalchemy/api.py(359)_make_conditions_from_filters()
   -> changes_since = timeutils.normalize_time(filters.pop('changes-since'))
   (Pdb) c
   2014-01-29 15:29:42.317 24293 INFO glance.wsgi.server [27c9a666-0136-467d-8e18-6f9a78afb8b0 2fdafc2b68a54ec19343c5eb45d2b65b ac9666adfda644f181d8005053e27b73] 192.168.0.10 - - [29/Jan/2014 15:29:42] "GET /v2/images?changes-since=20131010T10:10:10 HTTP/1.1" 200 2013 87.969698

** Affects: glance
     Importance: Undecided
     Assignee: Noboru Arai (arai-h)
         Status: In Progress

** Changed in: glance
     Assignee: (unassigned) => Noboru Arai (arai-h)

** Changed in: glance
       Status: New => In Progress

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

Title:
  when "v2/images" API with "changes-since" option is requested, Glance
  API Server returns 500 code

Status in OpenStack Image Registry and Delivery Service (Glance):
  In Progress

Bug description:
  environment:
      Openstack by deployed devstack

  reproduce:
    1.   request "v2/images" with "chnages-since" to Glance API Server.

    2.  return 500 error code

  expect result:
     return list filtered out by "changes-since" option 

  cause:
     in "_make_conditions_from_filters" method of glance/db/sqlalchemy/api.py,
   "timeutils.normalize_time" function is used.

  Although the argument of  "timeutils.normalize_time" have to have datetime,
  unicode object is set.

  syslog:

  2014-01-29 15:21:16.444 24293 INFO glance.wsgi.server [561294e8-8719-4dd1-84d3-c070f9bf421d 2fdafc2b68a54ec19343c5eb45d2b65b ac9666adfda644f181d8005053e27b73] Traceback (most recent call last):
    File "/usr/local/lib/python2.7/dist-packages/eventlet/wsgi.py", line 389, in handle_one_response
      result = self.application(self.environ, start_response)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
      resp = self.call_func(req, *args, **self.kwargs)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
      return self.func(req, *args, **kwargs)
    File "/opt/stack/glance/glance/common/wsgi.py", line 372, in __call__
      response = req.get_response(self.application)
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1296, in send
      application, catch_exc_info=False)
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1260, in call_application
      app_iter = application(self.environ, start_response)
    File "/opt/stack/python-keystoneclient/keystoneclient/middleware/auth_token.py", line 581, in __call__
      return self.app(env, start_response)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
      resp = self.call_func(req, *args, **self.kwargs)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
      return self.func(req, *args, **kwargs)
    File "/opt/stack/glance/glance/common/wsgi.py", line 372, in __call__
      response = req.get_response(self.application)
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1296, in send
      application, catch_exc_info=False)
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1260, in call_application
      app_iter = application(self.environ, start_response)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
      resp = self.call_func(req, *args, **self.kwargs)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
      return self.func(req, *args, **kwargs)
    File "/opt/stack/glance/glance/common/wsgi.py", line 372, in __call__
      response = req.get_response(self.application)
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1296, in send
      application, catch_exc_info=False)
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1260, in call_application
      app_iter = application(self.environ, start_response)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
      resp = self.call_func(req, *args, **self.kwargs)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
      return self.func(req, *args, **kwargs)
    File "/opt/stack/glance/glance/common/wsgi.py", line 372, in __call__
      response = req.get_response(self.application)
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1296, in send
      application, catch_exc_info=False)
    File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1260, in call_application
      app_iter = application(self.environ, start_response)
    File "/usr/lib/python2.7/dist-packages/paste/urlmap.py", line 203, in __call__
      return app(environ, start_response)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 144, in __call__
      return resp(environ, start_response)
    File "/usr/lib/python2.7/dist-packages/routes/middleware.py", line 131, in __call__
      response = self.app(environ, start_response)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 144, in __call__
      return resp(environ, start_response)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
      resp = self.call_func(req, *args, **self.kwargs)
    File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
      return self.func(req, *args, **kwargs)
    File "/opt/stack/glance/glance/common/wsgi.py", line 604, in __call__
      request, **action_args)
    File "/opt/stack/glance/glance/common/wsgi.py", line 623, in dispatch
      return method(*args, **kwargs)
    File "/opt/stack/glance/glance/api/v2/images.py", line 91, in index
      member_status=member_status)
    File "/opt/stack/glance/glance/api/authorization.py", line 90, in list
      images = self.image_repo.list(*args, **kwargs)
    File "/opt/stack/glance/glance/domain/proxy.py", line 56, in list
      items = self.base.list(*args, **kwargs)
    File "/opt/stack/glance/glance/api/policy.py", line 182, in list
      return super(ImageRepoProxy, self).list(*args, **kwargs)
    File "/opt/stack/glance/glance/domain/proxy.py", line 56, in list
      items = self.base.list(*args, **kwargs)
    File "/opt/stack/glance/glance/domain/proxy.py", line 56, in list
      items = self.base.list(*args, **kwargs)
    File "/opt/stack/glance/glance/domain/proxy.py", line 56, in list
      items = self.base.list(*args, **kwargs)
    File "/opt/stack/glance/glance/db/__init__.py", line 74, in list
      member_status=member_status)
    File "/opt/stack/glance/glance/db/sqlalchemy/api.py", line 486, in image_get_all
      _make_conditions_from_filters(filters, is_public)
    File "/opt/stack/glance/glance/db/sqlalchemy/api.py", line 359, in _make_conditions_from_filters
      changes_since = timeutils.normalize_time(filters.pop('changes-since'))
    File "/opt/stack/glance/glance/openstack/common/timeutils.py", line 70, in normalize_time
      offset = timestamp.utcoffset()
  AttributeError: 'unicode' object has no attribute 'utcoffset'

  2014-01-29 15:21:16.445 24293 INFO glance.wsgi.server
  [561294e8-8719-4dd1-84d3-c070f9bf421d 2fdafc2b68a54ec19343c5eb45d2b65b
  ac9666adfda644f181d8005053e27b73] 192.168.0.10 - - [29/Jan/2014
  15:21:16] "GET /v2/images?changes-since=20131010T10:10:10 HTTP/1.1"
  500 139 23.403289

  remark)
     in pdb debug, when the value of "changes-since" is changed, it works correctly.

     pdb 
    -----------------------------------------------------------------------
    ll__ /usr/lib/python2.7/dist-packages/routes/middleware.py:103
    > /opt/stack/glance/glance/api/v2/images.py(78)index()
    -> if filters is None:
    (Pdb) import datetime
    (Pdb) filters
    MultiDict([(u'changes-since', u'20131010T10:10:10')])
    (Pdb) filters[changes-since]=datetime.datetime(2013,10,10,10,10,10)
    *** NameError: name 'changes' is not defined
    (Pdb) filters["changes-since"]=datetime.datetime(2013,10,10,10,10,10)
    (Pdb) filters
     MultiDict([('changes-since', datetime.datetime(2013, 10, 10, 10, 10, 10))])
     (Pdb) c
     > /opt/stack/glance/glance/db/sqlalchemy/api.py(359)_make_conditions_from_filters()
     -> changes_since = timeutils.normalize_time(filters.pop('changes-since'))
     (Pdb) c
     2014-01-29 15:29:42.317 24293 INFO glance.wsgi.server [27c9a666-0136-467d-8e18-6f9a78afb8b0 2fdafc2b68a54ec19343c5eb45d2b65b ac9666adfda644f181d8005053e27b73] 192.168.0.10 - - [29/Jan/2014 15:29:42] "GET /v2/images?changes-since=20131010T10:10:10 HTTP/1.1" 200 2013 87.969698

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


Follow ups

References