search with invalid uuid raise 500

Bug #1490553 reported by Mehdi Abaakouk
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Gnocchi
Fix Released
High
Chris Dent

Bug Description

Gi,

When a search request is done on an UUID column but an invalid uuid the API returns 500 as status code

The server shows the following backtrace:

2015-08-30 14:16:57.378235 mod_wsgi (pid=32433): Exception occurred processing WSGI script '/var/www/gnocchi/app.wsgi'.
2015-08-30 14:16:57.378253 Traceback (most recent call last):
2015-08-30 14:16:57.378265 File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 130, in __call__
2015-08-30 14:16:57.378282 resp = self.call_func(req, *args, **self.kwargs)
2015-08-30 14:16:57.378291 File "/usr/local/lib/python2.7/dist-packages/webob/dec.py", line 195, in call_func
2015-08-30 14:16:57.378303 return self.func(req, *args, **kwargs)
2015-08-30 14:16:57.378311 File "/vagrant/stack-master/keystonemiddleware/keystonemiddleware/auth_token/__init__.py", line 445, in __call__
2015-08-30 14:16:57.378729 response = req.get_response(self._app)
2015-08-30 14:16:57.378741 File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1317, in send
2015-08-30 14:16:57.378755 application, catch_exc_info=False)
2015-08-30 14:16:57.378762 File "/usr/local/lib/python2.7/dist-packages/webob/request.py", line 1281, in call_application
2015-08-30 14:16:57.378772 app_iter = application(self.environ, start_response)
2015-08-30 14:16:57.378781 File "/usr/local/lib/python2.7/dist-packages/webob/exc.py", line 1117, in __call__
2015-08-30 14:16:57.378792 return self.application(environ, start_response)
2015-08-30 14:16:57.378800 File "/vagrant/stack-master/gnocchi/gnocchi/rest/app.py", line 88, in __call__
2015-08-30 14:16:57.378939 return self.app(environ, start_response)
2015-08-30 14:16:57.378950 File "/usr/local/lib/python2.7/dist-packages/werkzeug/wsgi.py", line 591, in __call__
2015-08-30 14:16:57.378963 return self.app(environ, start_response)
2015-08-30 14:16:57.378971 File "/usr/local/lib/python2.7/dist-packages/pecan/middleware/recursive.py", line 56, in __call__
2015-08-30 14:16:57.378984 return self.application(environ, start_response)
2015-08-30 14:16:57.378992 File "/usr/local/lib/python2.7/dist-packages/pecan/core.py", line 829, in __call__
2015-08-30 14:16:57.379003 return super(Pecan, self).__call__(environ, start_response)
2015-08-30 14:16:57.379011 File "/usr/local/lib/python2.7/dist-packages/pecan/core.py", line 678, in __call__
2015-08-30 14:16:57.379022 self.invoke_controller(controller, args, kwargs, state)
2015-08-30 14:16:57.379030 File "/usr/local/lib/python2.7/dist-packages/pecan/core.py", line 572, in invoke_controller
2015-08-30 14:16:57.379041 result = controller(*args, **kwargs)
2015-08-30 14:16:57.379049 File "/vagrant/stack-master/gnocchi/gnocchi/rest/__init__.py", line 1168, in post
2015-08-30 14:16:57.379099 return SearchMetricController.MetricSearchSchema(v)
2015-08-30 14:16:57.379110 File "/vagrant/stack-master/gnocchi/gnocchi/indexer/sqlalchemy.py", line 510, in list_resources
2015-08-30 14:16:57.379190 all_resources = q.all()
2015-08-30 14:16:57.379201 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2399, in all
2015-08-30 14:16:57.379214 return list(self)
2015-08-30 14:16:57.379222 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2516, in __iter__
2015-08-30 14:16:57.379233 return self._execute_and_instances(context)
2015-08-30 14:16:57.379241 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2531, in _execute_and_instances
2015-08-30 14:16:57.379256 result = conn.execute(querycontext.statement, self._params)
2015-08-30 14:16:57.379264 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 914, in execute
2015-08-30 14:16:57.379276 return meth(self, multiparams, params)
2015-08-30 14:16:57.379284 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
2015-08-30 14:16:57.379295 return connection._execute_clauseelement(self, multiparams, params)
2015-08-30 14:16:57.379303 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
2015-08-30 14:16:57.379315 compiled_sql, distilled_params
2015-08-30 14:16:57.379322 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1078, in _execute_context
2015-08-30 14:16:57.379333 None, None)
2015-08-30 14:16:57.379341 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1337, in _handle_dbapi_exception
2015-08-30 14:16:57.379352 util.raise_from_cause(newraise, exc_info)
2015-08-30 14:16:57.379360 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 199, in raise_from_cause
2015-08-30 14:16:57.379372 reraise(type(exception), exception, tb=exc_tb)
2015-08-30 14:16:57.379380 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1073, in _execute_context
2015-08-30 14:16:57.379390 context = constructor(dialect, self, conn, *args)
2015-08-30 14:16:57.379398 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 582, in _init_compiled
2015-08-30 14:16:57.379409 param.append(processors[key](compiled_params[key]))
2015-08-30 14:16:57.379417 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/type_api.py", line 958, in process
2015-08-30 14:16:57.379427 return impl_processor(process_param(value, dialect))
2015-08-30 14:16:57.379435 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy_utils/types/uuid.py", line 64, in process_bind_param
2015-08-30 14:16:57.379447 value = self._coerce(value)
2015-08-30 14:16:57.379454 File "/usr/local/lib/python2.7/dist-packages/sqlalchemy_utils/types/uuid.py", line 55, in _coerce
2015-08-30 14:16:57.379465 value = uuid.UUID(bytes=value)
2015-08-30 14:16:57.379473 File "/usr/lib/python2.7/uuid.py", line 144, in __init__
2015-08-30 14:16:57.379484 raise ValueError('bytes is not a 16-char string')
2015-08-30 14:16:57.379500 DBError: (exceptions.ValueError) bytes is not a 16-char string [SQL: u'SELECT anon_1.resource_type AS anon_1_resource_type, anon_1.resource_created_by_user_id AS anon_1_resource_created_by_user_id, anon_1.resource_created_by_project_id AS anon_1_resource_created_by_project_id, anon_1.resource_started_at AS anon_1_resource_started_at, anon_1.resource_revision_start AS anon_1_resource_revision_start, anon_1.resource_ended_at AS anon_1_resource_ended_at, anon_1.resource_user_id AS anon_1_resource_user_id, anon_1.resource_project_id AS anon_1_resource_project_id, anon_1.resource_id AS anon_1_resource_id, archive_policy_1.name AS archive_policy_1_name, archive_policy_1.back_window AS archive_policy_1_back_window, archive_policy_1.definition AS archive_policy_1_definition, archive_policy_1.aggregation_methods AS archive_policy_1_aggregation_methods, metric_1.id AS metric_1_id, metric_1.archive_policy_name AS metric_1_archive_policy_name, metric_1.created_by_user_id AS metric_1_created_by_user_id, metric_1.created_by_project_id AS metric_1_created_by_project_id, metric_1.resource_id AS metric_1_resource_id, metric_1.name AS metric_1_name \\nFROM (SELECT resource.type AS resource_type, resource.created_by_user_id AS resource_created_by_user_id, resource.created_by_project_id AS resource_created_by_project_id, resource.started_at AS resource_started_at, resource.revision_start AS resource_revision_start, resource.ended_at AS resource_ended_at, resource.user_id AS resource_user_id, resource.project_id AS resource_project_id, resource.id AS resource_id \\nFROM resource \\nWHERE resource.id = %s ORDER BY resource.revision_start ASC, resource.started_at ASC, resource.id ASC \\n LIMIT %s) AS anon_1 LEFT OUTER JOIN metric AS metric_1 ON anon_1.resource_id = metric_1.resource_id LEFT OUTER JOIN archive_policy AS archive_policy_1 ON archive_policy_1.name = metric_1.archive_policy_name ORDER BY anon_1.resource_revision_start ASC, anon_1.resource_started_at ASC, anon_1.resource_id ASC'] [parameters: [immutabledict({})]]

Cheers,

Revision history for this message
Julien Danjou (jdanjou) wrote :

[14:59:52] <sileht> jd__, REQ: curl -g -i -X POST http://192.168.3.51:8041/v1/search/resource/generic? -H "User-Agent: python-keystoneclient" -H "Content-Type: application/json" -H "X-Auth-Token: {SHA1}3621ff659ededa91ad8ecf2b6926a2aab35d2558" -d '{"=": {"id": "cd9eeff"}}'

Changed in gnocchi:
status: New → Triaged
importance: Undecided → High
assignee: nobody → Julien Danjou (jdanjou)
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to gnocchi (master)

Fix proposed to branch: master
Review: https://review.openstack.org/218891

Changed in gnocchi:
status: Triaged → In Progress
Changed in gnocchi:
assignee: Julien Danjou (jdanjou) → Chris Dent (chdent)
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to gnocchi (master)

Reviewed: https://review.openstack.org/218891
Committed: https://git.openstack.org/cgit/openstack/gnocchi/commit/?id=c39bae37b012436b957ad06cdd63370ee149fdf9
Submitter: Jenkins
Branch: master

commit c39bae37b012436b957ad06cdd63370ee149fdf9
Author: Julien Danjou <email address hidden>
Date: Mon Aug 31 16:03:50 2015 +0200

    sqlalchemy: convert UUID correctly before doing a search

    Currently UUID are passed as string to SQLAlchemy, but that ends up
    failing in a DBError if the RDBMS cannot transform a random string to a
    valid UUID. We now convert the value to a ResourceUUID, except if it
    fails, where we returns a 400 error.

    Change-Id: I17adb24ffd169cba6606314c7de7f62b409d4fb4
    Closes-Bug: #1490553

Changed in gnocchi:
status: In Progress → Fix Committed
Julien Danjou (jdanjou)
Changed in gnocchi:
milestone: none → 1.2.0
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.