create/update respource_provider APIs raises HTTP 500 Internal Server Error when name is greater than 200 characters

Bug #1642485 reported by Bhagyashri Shewale
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
OpenStack Compute (nova)
Fix Released
Medium
Bhagyashri Shewale

Bug Description

create/update resource_provider APIs raises HTTP 500 Internal Server Error if you pass name
greater than 200 character

Steps to reproduce:

$ curl -g -i -X POST http://10.232.48.200/placement/resource_providers -H "Content-Type: application/json" -H "X-Auth-Token: 38aac4d389d3437da8f6c0107a81ae95" -d '{"name": "testcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"}'

Output:

HTTP/1.1 500 Internal Server Error
Date: Thu, 17 Nov 2016 06:45:05 GMT
Server: Apache/2.4.7 (Ubuntu)
x-openstack-request-id: req-7408f1f0-62be-4b22-9fdc-b005b9dc74c0
Content-Length: 128
Connection: close
Content-Type: application/json; charset=UTF-8

{"computeFault": {"message": "The server has either erred or is incapable of performing the requested operation.", "code": 500}}

Error log:

2016-11-17 12:15:05.334 TRACE nova.api.openstack Traceback (most recent call last):
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/opt/stack/nova/nova/api/openstack/
__init__.py", line 88, in __call__
2016-11-17 12:15:05.334 TRACE nova.api.openstack return req.get_response(self.applicatio
n)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packa
ges/webob/request.py", line 1299, in send
2016-11-17 12:15:05.334 TRACE nova.api.openstack application, catch_exc_info=False)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packa
ges/webob/request.py", line 1263, in call_application
2016-11-17 12:15:05.334 TRACE nova.api.openstack app_iter = application(self.environ, st
art_response)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packa
ges/webob/dec.py", line 130, in __call__
2016-11-17 12:15:05.334 TRACE nova.api.openstack resp = self.call_func(req, *args, **sel
f.kwargs)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packa
ges/webob/dec.py", line 195, in call_func
2016-11-17 12:15:05.334 TRACE nova.api.openstack return self.func(req, *args, **kwargs)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/opt/stack/nova/nova/api/openstack/
placement/microversion.py", line 103, in __call__
2016-11-17 12:15:05.334 TRACE nova.api.openstack response = req.get_response(self.applic
ation)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packa
ges/webob/request.py", line 1299, in send
2016-11-17 12:15:05.334 TRACE nova.api.openstack application, catch_exc_info=False)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packa
ges/webob/request.py", line 1263, in call_application
2016-11-17 12:15:05.334 TRACE nova.api.openstack app_iter = application(self.environ, st
art_response)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/opt/stack/nova/nova/api/openstack/
placement/handler.py", line 188, in __call__
2016-11-17 12:15:05.334 TRACE nova.api.openstack return dispatch(environ, start_response
, self._map)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/opt/stack/nova/nova/api/openstack/
placement/handler.py", line 111, in dispatch
2016-11-17 12:15:05.334 TRACE nova.api.openstack return handler(environ, start_response)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packa
ges/webob/dec.py", line 130, in __call__
2016-11-17 12:15:05.334 TRACE nova.api.openstack resp = self.call_func(req, *args, **sel
f.kwargs)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packa
ges/webob/dec.py", line 195, in call_func
2016-11-17 12:15:05.334 TRACE nova.api.openstack return self.func(req, *args, **kwargs)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/opt/stack/nova/nova/api/openstack/placement/util.py", line 133, in decorated_function
2016-11-17 12:15:05.334 TRACE nova.api.openstack return f(req)
2016-11-17 12:15:05.334 TRACE nova.api.openstack return f(req)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/opt/stack/nova/nova/api/openstack/placement/handlers/resource_provider.py", line 89, in create_resource_provider
2016-11-17 12:15:05.334 TRACE nova.api.openstack resource_provider.create()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/oslo_versionedobjects/base.py", line 226, in wrapper
2016-11-17 12:15:05.334 TRACE nova.api.openstack return fn(self, *args, **kwargs)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/opt/stack/nova/nova/objects/resource_provider.py", line 331, in create
2016-11-17 12:15:05.334 TRACE nova.api.openstack db_rp = self._create_in_db(self._context, updates)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 824, in wrapper
2016-11-17 12:15:05.334 TRACE nova.api.openstack return fn(*args, **kwargs)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/lib/python2.7/contextlib.py", line 24, in __exit__
2016-11-17 12:15:05.334 TRACE nova.api.openstack self.gen.next()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 875, in _transaction_scope
2016-11-17 12:15:05.334 TRACE nova.api.openstack yield resource
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/lib/python2.7/contextlib.py", line 24, in __exit__
2016-11-17 12:15:05.334 TRACE nova.api.openstack self.gen.next()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 522, in _session
2016-11-17 12:15:05.334 TRACE nova.api.openstack self._end_session_transaction(self.session)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/enginefacade.py", line 543, in _end_session_transaction
2016-11-17 12:15:05.334 TRACE nova.api.openstack session.commit()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 801, in commit
2016-11-17 12:15:05.334 TRACE nova.api.openstack self.transaction.commit()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 392, in commit
2016-11-17 12:15:05.334 TRACE nova.api.openstack self._prepare_impl()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 372, in _prepare_impl
2016-11-17 12:15:05.334 TRACE nova.api.openstack self.session.flush()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 2019, in flush
2016-11-17 12:15:05.334 TRACE nova.api.openstack self._flush(objects)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 2137, in _flush
2016-11-17 12:15:05.334 TRACE nova.api.openstack transaction.rollback(_capture_exception=True)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/langhelpers.py", line 60, in __exit__
2016-11-17 12:15:05.334 TRACE nova.api.openstack compat.reraise(exc_type, exc_value, exc_tb)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/session.py", line 2101, in _flush
2016-11-17 12:15:05.334 TRACE nova.api.openstack flush_context.execute()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 373, in execute
2016-11-17 12:15:05.334 TRACE nova.api.openstack rec.execute(self)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/unitofwork.py", line 532, in execute
2016-11-17 12:15:05.334 TRACE nova.api.openstack uow
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 174, in save_obj
2016-11-17 12:15:05.334 TRACE nova.api.openstack mapper, table, insert)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/persistence.py", line 800, in _emit_insert_statements
2016-11-17 12:15:05.334 TRACE nova.api.openstack execute(statement, params)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 914, in execute
2016-11-17 12:15:05.334 TRACE nova.api.openstack return meth(self, multiparams, params)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 323, in _execute_on_connection
2016-11-17 12:15:05.334 TRACE nova.api.openstack return connection._execute_clauseelement(self, multiparams, params)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1010, in _execute_clauseelement
2016-11-17 12:15:05.334 TRACE nova.api.openstack compiled_sql, distilled_params
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1146, in _execute_context
2016-11-17 12:15:05.334 TRACE nova.api.openstack context)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1337, in _handle_dbapi_exception
2016-11-17 12:15:05.334 TRACE nova.api.openstack util.raise_from_cause(newraise, exc_info)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 202, in raise_from_cause
2016-11-17 12:15:05.334 TRACE nova.api.openstack reraise(type(exception), exception, tb=exc_tb, cause=cause)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1139, in _execute_context
2016-11-17 12:15:05.334 TRACE nova.api.openstack context)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 450, in do_execute
2016-11-17 12:15:05.334 TRACE nova.api.openstack cursor.execute(statement, parameters)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 166, in execute
2016-11-17 12:15:05.334 TRACE nova.api.openstack result = self._query(query)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/cursors.py", line 322, in _query
2016-11-17 12:15:05.334 TRACE nova.api.openstack conn.query(q)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 835, in query
2016-11-17 12:15:05.334 TRACE nova.api.openstack self._affected_rows = self._read_query_result(unbuffered=unbuffered)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1019, in _read_query_result
2016-11-17 12:15:05.334 TRACE nova.api.openstack result.read()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 1302, in read
2016-11-17 12:15:05.334 TRACE nova.api.openstack first_packet = self.connection._read_packet()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 981, in _read_packet
2016-11-17 12:15:05.334 TRACE nova.api.openstack packet.check_error()
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/connections.py", line 393, in check_error
2016-11-17 12:15:05.334 TRACE nova.api.openstack err.raise_mysql_exception(self._data)
2016-11-17 12:15:05.334 TRACE nova.api.openstack File "/usr/local/lib/python2.7/dist-packages/pymysql/err.py", line 107, in raise_mysql_exception
2016-11-17 12:15:05.334 TRACE nova.api.openstack raise errorclass(errno, errval)
2016-11-17 12:15:05.334 TRACE nova.api.openstack DBError: (pymysql.err.DataError) (1406, u"Data too long for column 'name' at row 1") [SQL: u'INSERT INTO resource_providers (created_at, updated_at, uuid, name, generation, can_host) VALUES (%(created_at)s, %(updated_at)s, %(uuid)s, %(name)s, %(generation)s, %(can_host)s)'] [parameters: {'uuid': '5730402b-eff2-485a-906c-cbf0cb02f4ab', 'generation': 0, 'created_at': datetime.datetime(2016, 11, 17, 6, 45, 5, 321074), 'updated_at': None, 'can_host': 0, 'name': u'testcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccctestcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc'}]

Tags: api placement
Changed in nova:
assignee: nobody → Bhagyashri Shewale (bhagyashri-shewale)
summary: - create/update respource_provider APIs raises HTTP Internal Server Error
- when name is greater than 200 characters
+ create/update respource_provider APIs raises HTTP 500 Internal Server
+ Error when name is greater than 200 characters
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to nova (master)

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

Changed in nova:
status: New → In Progress
Changed in nova:
importance: Undecided → Medium
tags: added: api
Revision history for this message
Chris Dent (cdent) wrote :

Nice, thanks for identifying this and 1642484. There probably violations of this kind throughout the API. The basic issue here is that jsonschema are being used to validate input but in most cases are not checking length, letting that fall through to the DB, but then never catching the error.

So if you're in there looking around, might make sense to add tests for length things across the resource provider objects.

tags: added: placement
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to nova (master)

Reviewed: https://review.openstack.org/398998
Committed: https://git.openstack.org/cgit/openstack/nova/commit/?id=9bbce28c56666de6eb430d027af4ddf5cfc686e4
Submitter: Jenkins
Branch: master

commit 9bbce28c56666de6eb430d027af4ddf5cfc686e4
Author: bhagyashris <email address hidden>
Date: Wed Nov 30 20:41:48 2016 +0530

    Return 400 when name is more than 200 characters

    APIs listed below are returning 500 error if you pass name more than
    200 characters.
    1. create resource_providers
    2. update resource_providers

    Added maxLength check in schema to ensure name should not be more than
    200 characters.

    Closes-Bug: #1642485
    Change-Id: Ia22ae86702dabe18bc577b17164a81c363da6d41

Changed in nova:
status: In Progress → Fix Released
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix included in openstack/nova 15.0.0.0b2

This issue was fixed in the openstack/nova 15.0.0.0b2 development milestone.

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.