)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"ffa6797f453a1095cb3e1465e957eb75d4b6d647","unresolved":false,"context_lines":[{"line_number":24,"context_line":"processed (and defaulted) in the DB sqlalchemy layer (prior to invoking"},{"line_number":25,"context_line":"the common paginate_query function)."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"These functions will be consumed in another change set."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Partially Implements: blueprint cinder-pagination"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_bbfc1e74","line":27,"updated":"2014-12-27 07:16:05.000000000","message":"It would be kind if you could add a reference to the consumer change set.","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":24,"context_line":"processed (and defaulted) in the DB sqlalchemy layer (prior to invoking"},{"line_number":25,"context_line":"the common paginate_query function)."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"These functions will be consumed in another change set."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Partially Implements: blueprint cinder-pagination"},{"line_number":30,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3a961159_3f8f0877","line":27,"in_reply_to":"3a961159_bbfc1e74","updated":"2014-12-31 05:01:08.000000000","message":"Done","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb52079251328209708fc53e73e3562b4cd5c495","unresolved":false,"context_lines":[{"line_number":11,"context_line":"\u0027sort\u0027 parameter, see API working group guidelines for syntax and"},{"line_number":12,"context_line":"examples:"},{"line_number":13,"context_line":"https://github.com/openstack/api-wg/blob/master/guidelines/"},{"line_number":14,"context_line":"pagination_filter_sort.rst"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Note that the existing \u0027sort_key\u0027 and \u0027sort_dir\u0027 parameters are being"},{"line_number":17,"context_line":"deprecated and they cannot be used with the new \u0027sort\u0027 parameter."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da86d52c_20a6a554","line":14,"updated":"2015-02-18 22:35:03.000000000","message":"Is there a way we can make this so the link works when you click on it in the review?","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"048847df9d9d6d7e2fcc3d6313cafc4996024a27","unresolved":false,"context_lines":[{"line_number":11,"context_line":"\u0027sort\u0027 parameter, see API working group guidelines for syntax and"},{"line_number":12,"context_line":"examples:"},{"line_number":13,"context_line":"https://github.com/openstack/api-wg/blob/master/guidelines/"},{"line_number":14,"context_line":"pagination_filter_sort.rst"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Note that the existing \u0027sort_key\u0027 and \u0027sort_dir\u0027 parameters are being"},{"line_number":17,"context_line":"deprecated and they cannot be used with the new \u0027sort\u0027 parameter."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da86d52c_90915a54","line":14,"in_reply_to":"da86d52c_20a6a554","updated":"2015-02-19 15:43:51.000000000","message":"I\u0027m not sure how, but I\u0027d like to know if you know of a way","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb52079251328209708fc53e73e3562b4cd5c495","unresolved":false,"context_lines":[{"line_number":23,"context_line":"The main complexity in this change deals with defaulting the sort keys"},{"line_number":24,"context_line":"and directions so that volume order does not change for existing"},{"line_number":25,"context_line":"paths. A new \u0027process_sort_params\u0027 function is created to consistently"},{"line_number":26,"context_line":"process the the sort parameters that will be passed from the REST API"},{"line_number":27,"context_line":"and down to the DB API. This utility function will be invoked when the"},{"line_number":28,"context_line":"sort params need to be processed (and defaulted) in the DB sqlalchemy"},{"line_number":29,"context_line":"layer (prior to invoking the common paginate_query function)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da86d52c_60633d1a","line":26,"updated":"2015-02-18 22:35:03.000000000","message":"\u0027the\u0027 is repreated","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"048847df9d9d6d7e2fcc3d6313cafc4996024a27","unresolved":false,"context_lines":[{"line_number":23,"context_line":"The main complexity in this change deals with defaulting the sort keys"},{"line_number":24,"context_line":"and directions so that volume order does not change for existing"},{"line_number":25,"context_line":"paths. A new \u0027process_sort_params\u0027 function is created to consistently"},{"line_number":26,"context_line":"process the the sort parameters that will be passed from the REST API"},{"line_number":27,"context_line":"and down to the DB API. This utility function will be invoked when the"},{"line_number":28,"context_line":"sort params need to be processed (and defaulted) in the DB sqlalchemy"},{"line_number":29,"context_line":"layer (prior to invoking the common paginate_query function)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"da86d52c_1009ea94","line":26,"in_reply_to":"da86d52c_60633d1a","updated":"2015-02-19 15:43:51.000000000","message":"Done","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"}],"cinder/api/common.py":[{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"f4f768fa6aa252b62ff40ddf9c32e51002a84007","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    The parameters are modified by this function."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param params: webob.multidict of request parameters (from"},{"line_number":183,"context_line":"                   nova.wsgi.Request.params)"},{"line_number":184,"context_line":"    :param default_key: default sort key value, added to the list if no"},{"line_number":185,"context_line":"                        \u0027sort_key\u0027 parameters are supplied"},{"line_number":186,"context_line":"    :param default_dir: default sort dir value, added to the list if no"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_1aad1eeb","line":183,"updated":"2014-12-29 14:12:38.000000000","message":"cinder ref required..","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    The parameters are modified by this function."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param params: webob.multidict of request parameters (from"},{"line_number":183,"context_line":"                   nova.wsgi.Request.params)"},{"line_number":184,"context_line":"    :param default_key: default sort key value, added to the list if no"},{"line_number":185,"context_line":"                        \u0027sort_key\u0027 parameters are supplied"},{"line_number":186,"context_line":"    :param default_dir: default sort dir value, added to the list if no"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_7ffef006","line":183,"in_reply_to":"3a961159_1aad1eeb","updated":"2014-12-31 05:01:08.000000000","message":"Sorry, how should this reference be formatted?","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"c1061c327fd58214325daf400e2788a5e3920a30","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    The parameters are modified by this function."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param params: webob.multidict of request parameters (from"},{"line_number":183,"context_line":"                   nova.wsgi.Request.params)"},{"line_number":184,"context_line":"    :param default_key: default sort key value, added to the list if no"},{"line_number":185,"context_line":"                        \u0027sort_key\u0027 parameters are supplied"},{"line_number":186,"context_line":"    :param default_dir: default sort dir value, added to the list if no"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_fa490e33","line":183,"in_reply_to":"3a961159_7ffef006","updated":"2014-12-31 07:18:47.000000000","message":"I just saw the word \u0027nova\u0027, and thought it should be replaced with a cinder equivalent, in case this code is pulled over from nova...","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"adef75f54d8317cbcdbda96411c5055d5c6e161a","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    The parameters are modified by this function."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param params: webob.multidict of request parameters (from"},{"line_number":183,"context_line":"                   nova.wsgi.Request.params)"},{"line_number":184,"context_line":"    :param default_key: default sort key value, added to the list if no"},{"line_number":185,"context_line":"                        \u0027sort_key\u0027 parameters are supplied"},{"line_number":186,"context_line":"    :param default_dir: default sort dir value, added to the list if no"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_55b83311","line":183,"in_reply_to":"3a961159_fa490e33","updated":"2014-12-31 07:58:48.000000000","message":"Ahh, yes, I will update to the cinder reference.","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"f4f768fa6aa252b62ff40ddf9c32e51002a84007","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                        \u0027sort_dir\u0027 parameters are supplied"},{"line_number":188,"context_line":"    :returns: list of sort keys, list of sort dirs"},{"line_number":189,"context_line":"    \"\"\""},{"line_number":190,"context_line":"    sort_keys \u003d []"},{"line_number":191,"context_line":"    sort_dirs \u003d []"},{"line_number":192,"context_line":"    while \u0027sort_key\u0027 in params:"},{"line_number":193,"context_line":"        sort_keys.append(params.pop(\u0027sort_key\u0027).strip())"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_9a358eaa","line":190,"updated":"2014-12-29 14:12:38.000000000","message":"Just curious: is it allowed to provide only sort key and not sort dir in the API? If yes, are we handling that sort_keys and sort_dirs have equal elements?","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                        \u0027sort_dir\u0027 parameters are supplied"},{"line_number":188,"context_line":"    :returns: list of sort keys, list of sort dirs"},{"line_number":189,"context_line":"    \"\"\""},{"line_number":190,"context_line":"    sort_keys \u003d []"},{"line_number":191,"context_line":"    sort_dirs \u003d []"},{"line_number":192,"context_line":"    while \u0027sort_key\u0027 in params:"},{"line_number":193,"context_line":"        sort_keys.append(params.pop(\u0027sort_key\u0027).strip())"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_7f2510ad","line":190,"in_reply_to":"3a961159_9a358eaa","updated":"2014-12-31 05:01:08.000000000","message":"This is handled in the DB api after the default keys and directions are applied on line 1470:\n\nhttps://review.openstack.org/#/c/141914/1/cinder/db/sqlalchemy/api.py","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"d8b74cdb5202e3f6168f7f68c5921f823c3e4ec7","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    sort_keys \u003d []"},{"line_number":191,"context_line":"    sort_dirs \u003d []"},{"line_number":192,"context_line":"    while \u0027sort_key\u0027 in params:"},{"line_number":193,"context_line":"        sort_keys.append(params.pop(\u0027sort_key\u0027).strip())"},{"line_number":194,"context_line":"    while \u0027sort_dir\u0027 in params:"},{"line_number":195,"context_line":"        sort_dirs.append(params.pop(\u0027sort_dir\u0027).strip())"},{"line_number":196,"context_line":"    if len(sort_keys) \u003d\u003d 0 and default_key:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_f085d107","line":193,"updated":"2014-12-29 15:28:13.000000000","message":"I\u0027m not sure that this loop is needed here and below","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    sort_keys \u003d []"},{"line_number":191,"context_line":"    sort_dirs \u003d []"},{"line_number":192,"context_line":"    while \u0027sort_key\u0027 in params:"},{"line_number":193,"context_line":"        sort_keys.append(params.pop(\u0027sort_key\u0027).strip())"},{"line_number":194,"context_line":"    while \u0027sort_dir\u0027 in params:"},{"line_number":195,"context_line":"        sort_dirs.append(params.pop(\u0027sort_dir\u0027).strip())"},{"line_number":196,"context_line":"    if len(sort_keys) \u003d\u003d 0 and default_key:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_bf569804","line":193,"in_reply_to":"3a961159_f085d107","updated":"2014-12-31 05:01:08.000000000","message":"Both \u0027sort_dir\u0027 and \u0027sort_key\u0027 can be applied multiple times on the API request, for example:\n\nvolumes?sort_key\u003dstatus\u0026sort_dir\u003ddesc\u0026sort_key\u003ddisplay_name\u0026sort_dir\u003ddesc\u0026sort_key\u003dcreated_at\u0026sort_dir\u003ddesc\n\nThis uses status as the primary key (descending direction), display_name as the secondary key (descending order), etc.\n\nSee spec for more information: https://review.openstack.org/#/c/99475/2/specs/kilo/volume-sorting.rst","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb52079251328209708fc53e73e3562b4cd5c495","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    Note that the \u0027sort_key\u0027 and \u0027sort_dir\u0027 parameters are deprecated in kilo"},{"line_number":181,"context_line":"    and an exception is raised if they are supplied with the \u0027sort\u0027 parameter."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    The sort parameters removed from the request parameters by this function."},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    :param params: webob.multidict of request parameters (from"},{"line_number":186,"context_line":"                   cinder.api.openstack.wsgi.Request.params)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_005b6154","line":183,"updated":"2015-02-18 22:35:03.000000000","message":"This sentence isn\u0027t clear.  Do you mean \u0027The sort parameter are removed ..\"","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"048847df9d9d6d7e2fcc3d6313cafc4996024a27","unresolved":false,"context_lines":[{"line_number":180,"context_line":"    Note that the \u0027sort_key\u0027 and \u0027sort_dir\u0027 parameters are deprecated in kilo"},{"line_number":181,"context_line":"    and an exception is raised if they are supplied with the \u0027sort\u0027 parameter."},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    The sort parameters removed from the request parameters by this function."},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    :param params: webob.multidict of request parameters (from"},{"line_number":186,"context_line":"                   cinder.api.openstack.wsgi.Request.params)"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_f090d644","line":183,"in_reply_to":"da86d52c_005b6154","updated":"2015-02-19 15:43:51.000000000","message":"Yep, thanks.","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb52079251328209708fc53e73e3562b4cd5c495","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":200,"context_line":"    sort_keys \u003d []"},{"line_number":201,"context_line":"    sort_dirs \u003d []"},{"line_number":202,"context_line":"    if \u0027sort\u0027 in params:"},{"line_number":203,"context_line":"        for sort in params.pop(\u0027sort\u0027).strip().split(\u0027,\u0027):"},{"line_number":204,"context_line":"            sort_key, _sep, sort_dir \u003d sort.partition(\u0027:\u0027)"},{"line_number":205,"context_line":"            if not sort_dir:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_db677ce8","line":202,"updated":"2015-02-18 22:35:03.000000000","message":"Maybe a silly question, but do we need to validate that sort is sent in with appropriate format and throw and HTTPBadRequest if not?  Maybe I am being overly paranoid here and if a \u0027;\u0027 is sent instead of \u0027:\u0027 for the separator this will cause an error when it goes through the API as you wouldn\u0027t have a matching number of keys and directions?\n\nWhere are we verifying that the sort_dir is a valid value?","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"148cbce1226230a04700ed40d42ede1451a3cbf1","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":200,"context_line":"    sort_keys \u003d []"},{"line_number":201,"context_line":"    sort_dirs \u003d []"},{"line_number":202,"context_line":"    if \u0027sort\u0027 in params:"},{"line_number":203,"context_line":"        for sort in params.pop(\u0027sort\u0027).strip().split(\u0027,\u0027):"},{"line_number":204,"context_line":"            sort_key, _sep, sort_dir \u003d sort.partition(\u0027:\u0027)"},{"line_number":205,"context_line":"            if not sort_dir:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba7be1f8_9383a603","line":202,"in_reply_to":"da86d52c_5b96104d","updated":"2015-02-22 16:18:13.000000000","message":"Ok, thank you for explaining this.","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"048847df9d9d6d7e2fcc3d6313cafc4996024a27","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":200,"context_line":"    sort_keys \u003d []"},{"line_number":201,"context_line":"    sort_dirs \u003d []"},{"line_number":202,"context_line":"    if \u0027sort\u0027 in params:"},{"line_number":203,"context_line":"        for sort in params.pop(\u0027sort\u0027).strip().split(\u0027,\u0027):"},{"line_number":204,"context_line":"            sort_key, _sep, sort_dir \u003d sort.partition(\u0027:\u0027)"},{"line_number":205,"context_line":"            if not sort_dir:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_5b96104d","line":202,"in_reply_to":"da86d52c_db677ce8","updated":"2015-02-19 15:43:51.000000000","message":"Not a silly question. So the sort direction is verified when the paginated query is formatted here:\n\nhttps://github.com/openstack/cinder/blob/master/cinder/common/sqlalchemyutils.py#L110-L116\n\nHowever, the exception raised here is not handled gracefully since it raises a generic ValueError (server returns with a 500 error and \" The server has either erred or is incapable of performing the requested operation\"), I will add some logic to verify this down in the DB sqlalchemy layer and handle an invalid sort key more gracefully.","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"f4f768fa6aa252b62ff40ddf9c32e51002a84007","unresolved":false,"context_lines":[{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"def process_sort_params(sort_keys, sort_dirs,"},{"line_number":1421,"context_line":"                        default_keys\u003d[\u0027created_at\u0027, \u0027id\u0027],"},{"line_number":1422,"context_line":"                        default_dir\u003d\u0027asc\u0027):"},{"line_number":1423,"context_line":"    \"\"\"Process the sort parameters to include default keys."},{"line_number":1424,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_1af7ded5","line":1421,"updated":"2014-12-29 14:12:38.000000000","message":"Mutable args in python methods/functions are highly discouraged. Can we pass a mutable arg (None) here, and set default_keys to [\u0027created_at\u0027, \u0027id\u0027] by doing a check?","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"d8b74cdb5202e3f6168f7f68c5921f823c3e4ec7","unresolved":false,"context_lines":[{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"def process_sort_params(sort_keys, sort_dirs,"},{"line_number":1421,"context_line":"                        default_keys\u003d[\u0027created_at\u0027, \u0027id\u0027],"},{"line_number":1422,"context_line":"                        default_dir\u003d\u0027asc\u0027):"},{"line_number":1423,"context_line":"    \"\"\"Process the sort parameters to include default keys."},{"line_number":1424,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_d097f538","line":1421,"in_reply_to":"3a961159_1af7ded5","updated":"2014-12-29 15:28:13.000000000","message":"+1, please, remove default mutable args","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":1418,"context_line":""},{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"def process_sort_params(sort_keys, sort_dirs,"},{"line_number":1421,"context_line":"                        default_keys\u003d[\u0027created_at\u0027, \u0027id\u0027],"},{"line_number":1422,"context_line":"                        default_dir\u003d\u0027asc\u0027):"},{"line_number":1423,"context_line":"    \"\"\"Process the sort parameters to include default keys."},{"line_number":1424,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_2480df8a","line":1421,"in_reply_to":"3a961159_d097f538","updated":"2014-12-31 05:01:08.000000000","message":"Will update.","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"f4f768fa6aa252b62ff40ddf9c32e51002a84007","unresolved":false,"context_lines":[{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"def process_sort_params(sort_keys, sort_dirs,"},{"line_number":1421,"context_line":"                        default_keys\u003d[\u0027created_at\u0027, \u0027id\u0027],"},{"line_number":1422,"context_line":"                        default_dir\u003d\u0027asc\u0027):"},{"line_number":1423,"context_line":"    \"\"\"Process the sort parameters to include default keys."},{"line_number":1424,"context_line":""},{"line_number":1425,"context_line":"    Creates a list of sort keys and a list of sort directions. Adds the default"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_7a1542e4","line":1422,"updated":"2014-12-29 14:12:38.000000000","message":"default_dir is desc in api/common.py. Any reason for the inconsistency?","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"c1061c327fd58214325daf400e2788a5e3920a30","unresolved":false,"context_lines":[{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"def process_sort_params(sort_keys, sort_dirs,"},{"line_number":1421,"context_line":"                        default_keys\u003d[\u0027created_at\u0027, \u0027id\u0027],"},{"line_number":1422,"context_line":"                        default_dir\u003d\u0027asc\u0027):"},{"line_number":1423,"context_line":"    \"\"\"Process the sort parameters to include default keys."},{"line_number":1424,"context_line":""},{"line_number":1425,"context_line":"    Creates a list of sort keys and a list of sort directions. Adds the default"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_fa0aee25","line":1422,"in_reply_to":"3a961159_047123de","updated":"2014-12-31 07:18:47.000000000","message":"I should have asked the question differently, sorry. The question was: why is the default value desc in api/common.py then.. is that the default exposed behavior for the API layer?","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"def process_sort_params(sort_keys, sort_dirs,"},{"line_number":1421,"context_line":"                        default_keys\u003d[\u0027created_at\u0027, \u0027id\u0027],"},{"line_number":1422,"context_line":"                        default_dir\u003d\u0027asc\u0027):"},{"line_number":1423,"context_line":"    \"\"\"Process the sort parameters to include default keys."},{"line_number":1424,"context_line":""},{"line_number":1425,"context_line":"    Creates a list of sort keys and a list of sort directions. Adds the default"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_047123de","line":1422,"in_reply_to":"3a961159_7a1542e4","updated":"2014-12-31 05:01:08.000000000","message":"Documented below in the \"Note\" on line 1431.","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"adef75f54d8317cbcdbda96411c5055d5c6e161a","unresolved":false,"context_lines":[{"line_number":1419,"context_line":""},{"line_number":1420,"context_line":"def process_sort_params(sort_keys, sort_dirs,"},{"line_number":1421,"context_line":"                        default_keys\u003d[\u0027created_at\u0027, \u0027id\u0027],"},{"line_number":1422,"context_line":"                        default_dir\u003d\u0027asc\u0027):"},{"line_number":1423,"context_line":"    \"\"\"Process the sort parameters to include default keys."},{"line_number":1424,"context_line":""},{"line_number":1425,"context_line":"    Creates a list of sort keys and a list of sort directions. Adds the default"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_9539bba5","line":1422,"in_reply_to":"3a961159_fa0aee25","updated":"2014-12-31 07:58:48.000000000","message":"Yes, that is correct. At the REST API layer the default direction is \u0027desc\u0027 but at the DB API layer I wanted to keep it consistent with the sqlalchemy.utils.paginate_query function.","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"f4f768fa6aa252b62ff40ddf9c32e51002a84007","unresolved":false,"context_lines":[{"line_number":1445,"context_line":"    \"\"\""},{"line_number":1446,"context_line":"    # Determine direction to use for when adding default keys"},{"line_number":1447,"context_line":"    if sort_dirs and len(sort_dirs) !\u003d 0:"},{"line_number":1448,"context_line":"        default_dir_value \u003d sort_dirs[0]"},{"line_number":1449,"context_line":"    else:"},{"line_number":1450,"context_line":"        default_dir_value \u003d default_dir"},{"line_number":1451,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_5a56c62b","line":1448,"updated":"2014-12-29 14:12:38.000000000","message":"It seems we are ignoring the default direction even if one element in sort_dir exists, and using this value as the default direction. Do you think this behavior should be documented?","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":1445,"context_line":"    \"\"\""},{"line_number":1446,"context_line":"    # Determine direction to use for when adding default keys"},{"line_number":1447,"context_line":"    if sort_dirs and len(sort_dirs) !\u003d 0:"},{"line_number":1448,"context_line":"        default_dir_value \u003d sort_dirs[0]"},{"line_number":1449,"context_line":"    else:"},{"line_number":1450,"context_line":"        default_dir_value \u003d default_dir"},{"line_number":1451,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_a443ef6a","line":1448,"in_reply_to":"3a961159_5a56c62b","updated":"2014-12-31 05:01:08.000000000","message":"Yes, this is documented on lines 1430-1432 above.","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"d8b74cdb5202e3f6168f7f68c5921f823c3e4ec7","unresolved":false,"context_lines":[{"line_number":1451,"context_line":""},{"line_number":1452,"context_line":"    # Create list of keys (do not modify the input list)"},{"line_number":1453,"context_line":"    if sort_keys:"},{"line_number":1454,"context_line":"        result_keys \u003d list(sort_keys)"},{"line_number":1455,"context_line":"    else:"},{"line_number":1456,"context_line":"        result_keys \u003d []"},{"line_number":1457,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_5074e535","line":1454,"updated":"2014-12-29 15:28:13.000000000","message":"According to docstring,  sort_keys should be already list","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":1451,"context_line":""},{"line_number":1452,"context_line":"    # Create list of keys (do not modify the input list)"},{"line_number":1453,"context_line":"    if sort_keys:"},{"line_number":1454,"context_line":"        result_keys \u003d list(sort_keys)"},{"line_number":1455,"context_line":"    else:"},{"line_number":1456,"context_line":"        result_keys \u003d []"},{"line_number":1457,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_3fe62845","line":1454,"in_reply_to":"3a961159_5074e535","updated":"2014-12-31 05:01:08.000000000","message":"Yes it is. This copies the input list so that the input is not modified by this function.","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"d8b74cdb5202e3f6168f7f68c5921f823c3e4ec7","unresolved":false,"context_lines":[{"line_number":1458,"context_line":"    # If a list of directions is not provided, use the default sort direction"},{"line_number":1459,"context_line":"    # for all provided keys"},{"line_number":1460,"context_line":"    if sort_dirs:"},{"line_number":1461,"context_line":"        result_dirs \u003d list(sort_dirs)"},{"line_number":1462,"context_line":"    else:"},{"line_number":1463,"context_line":"        result_dirs \u003d [default_dir_value for _sort_key in result_keys]"},{"line_number":1464,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_b0926949","line":1461,"updated":"2014-12-29 15:28:13.000000000","message":"According to docstring,  sort_dirs should be already list","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":1458,"context_line":"    # If a list of directions is not provided, use the default sort direction"},{"line_number":1459,"context_line":"    # for all provided keys"},{"line_number":1460,"context_line":"    if sort_dirs:"},{"line_number":1461,"context_line":"        result_dirs \u003d list(sort_dirs)"},{"line_number":1462,"context_line":"    else:"},{"line_number":1463,"context_line":"        result_dirs \u003d [default_dir_value for _sort_key in result_keys]"},{"line_number":1464,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_2457ff27","line":1461,"in_reply_to":"3a961159_b0926949","updated":"2014-12-31 05:01:08.000000000","message":"Same as above.","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"f4f768fa6aa252b62ff40ddf9c32e51002a84007","unresolved":false,"context_lines":[{"line_number":1467,"context_line":"        result_dirs.append(default_dir_value)"},{"line_number":1468,"context_line":"    # Unless more direction are specified, which is an error"},{"line_number":1469,"context_line":"    if len(result_dirs) \u003e len(result_keys):"},{"line_number":1470,"context_line":"        msg \u003d _(\"Sort direction size exceeds sort key size\")"},{"line_number":1471,"context_line":"        raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":1472,"context_line":""},{"line_number":1473,"context_line":"    # Ensure defaults are included"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_9a93ceff","line":1470,"updated":"2014-12-29 14:12:38.000000000","message":"Slightly better : sort direction array size exceeds sort key array size. \n\nSizes can also be provided in the message for easier debugging.\n\nCan end with a dot..","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":1467,"context_line":"        result_dirs.append(default_dir_value)"},{"line_number":1468,"context_line":"    # Unless more direction are specified, which is an error"},{"line_number":1469,"context_line":"    if len(result_dirs) \u003e len(result_keys):"},{"line_number":1470,"context_line":"        msg \u003d _(\"Sort direction size exceeds sort key size\")"},{"line_number":1471,"context_line":"        raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":1472,"context_line":""},{"line_number":1473,"context_line":"    # Ensure defaults are included"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_a43a0fe5","line":1470,"in_reply_to":"3a961159_9a93ceff","updated":"2014-12-31 05:01:08.000000000","message":"Done","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"cb52079251328209708fc53e73e3562b4cd5c495","unresolved":false,"context_lines":[{"line_number":1413,"context_line":"        result_keys \u003d []"},{"line_number":1414,"context_line":""},{"line_number":1415,"context_line":"    # If a list of directions is not provided, use the default sort direction"},{"line_number":1416,"context_line":"    # for all provided keys"},{"line_number":1417,"context_line":"    if sort_dirs:"},{"line_number":1418,"context_line":"        result_dirs \u003d list(sort_dirs)"},{"line_number":1419,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_3be09825","line":1416,"updated":"2015-02-18 22:35:03.000000000","message":"Suggest \u0027.\u0027 here.","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"048847df9d9d6d7e2fcc3d6313cafc4996024a27","unresolved":false,"context_lines":[{"line_number":1413,"context_line":"        result_keys \u003d []"},{"line_number":1414,"context_line":""},{"line_number":1415,"context_line":"    # If a list of directions is not provided, use the default sort direction"},{"line_number":1416,"context_line":"    # for all provided keys"},{"line_number":1417,"context_line":"    if sort_dirs:"},{"line_number":1418,"context_line":"        result_dirs \u003d list(sort_dirs)"},{"line_number":1419,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"da86d52c_8eb6843c","line":1416,"in_reply_to":"da86d52c_3be09825","updated":"2015-02-19 15:43:51.000000000","message":"Done","commit_id":"05118d279181bd91f054e8d7c2472e103cbf493f"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"708b9d1bf33039bd0fc118e1629ca8c346bc6617","unresolved":false,"context_lines":[{"line_number":1402,"context_line":"        default_keys \u003d [\u0027created_at\u0027, \u0027id\u0027]"},{"line_number":1403,"context_line":""},{"line_number":1404,"context_line":"    # Determine direction to use for when adding default keys"},{"line_number":1405,"context_line":"    if sort_dirs and len(sort_dirs) !\u003d 0:"},{"line_number":1406,"context_line":"        default_dir_value \u003d sort_dirs[0]"},{"line_number":1407,"context_line":"    else:"},{"line_number":1408,"context_line":"        default_dir_value \u003d default_dir"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_e1ed058d","line":1405,"updated":"2015-02-20 20:16:15.000000000","message":"Could be just \u0027if sort_dirs and len(sort_dirs)\u0027 but I won\u0027t block patch for it","commit_id":"11bdb0ff9c7c1ebf267f6f5c31e93618c83049af"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"3c28f52d17860633300156c588e99e0246a24b26","unresolved":false,"context_lines":[{"line_number":1402,"context_line":"        default_keys \u003d [\u0027created_at\u0027, \u0027id\u0027]"},{"line_number":1403,"context_line":""},{"line_number":1404,"context_line":"    # Determine direction to use for when adding default keys"},{"line_number":1405,"context_line":"    if sort_dirs and len(sort_dirs) !\u003d 0:"},{"line_number":1406,"context_line":"        default_dir_value \u003d sort_dirs[0]"},{"line_number":1407,"context_line":"    else:"},{"line_number":1408,"context_line":"        default_dir_value \u003d default_dir"}],"source_content_type":"text/x-python","patch_set":7,"id":"ba7be1f8_442af42c","line":1405,"in_reply_to":"ba7be1f8_e1ed058d","updated":"2015-02-24 19:42:15.000000000","message":"I need to fix a merge conflict so I will address this in the next iteration.","commit_id":"11bdb0ff9c7c1ebf267f6f5c31e93618c83049af"}],"cinder/tests/test_db_api.py":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"ffa6797f453a1095cb3e1465e957eb75d4b6d647","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from cinder import context"},{"line_number":22,"context_line":"from cinder import db"},{"line_number":23,"context_line":"from cinder.db.sqlalchemy import api as sqlalchemy_api"},{"line_number":24,"context_line":"from cinder import exception"},{"line_number":25,"context_line":"from cinder.openstack.common import uuidutils"},{"line_number":26,"context_line":"from cinder.quota import ReservableResource"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_1bf372a0","line":23,"updated":"2014-12-27 07:16:05.000000000","message":"It would be nice if you sort imports in alphabetical order. Following http://docs.openstack.org/developer/hacking/#import-order-template","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":10559,"name":"Steven Kaufer","email":"kaufer@us.ibm.com","username":"kaufer"},"change_message_id":"58bc991c985bbf3e9325063a365f41c7e8c53589","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from cinder import context"},{"line_number":22,"context_line":"from cinder import db"},{"line_number":23,"context_line":"from cinder.db.sqlalchemy import api as sqlalchemy_api"},{"line_number":24,"context_line":"from cinder import exception"},{"line_number":25,"context_line":"from cinder.openstack.common import uuidutils"},{"line_number":26,"context_line":"from cinder.quota import ReservableResource"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_e475f7cc","line":23,"in_reply_to":"3a961159_1bf372a0","updated":"2014-12-31 05:01:08.000000000","message":"I thought that these were in the correct order. What is the correct order?","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"},{"author":{"_account_id":5538,"name":"Rushi Agrawal","email":"rushi.openstack@gmail.com","username":"rushiagr"},"change_message_id":"c1061c327fd58214325daf400e2788a5e3920a30","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from cinder import context"},{"line_number":22,"context_line":"from cinder import db"},{"line_number":23,"context_line":"from cinder.db.sqlalchemy import api as sqlalchemy_api"},{"line_number":24,"context_line":"from cinder import exception"},{"line_number":25,"context_line":"from cinder.openstack.common import uuidutils"},{"line_number":26,"context_line":"from cinder.quota import ReservableResource"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_bac946ae","line":23,"in_reply_to":"3a961159_e475f7cc","updated":"2014-12-31 07:18:47.000000000","message":"@Accela, think the order is correct here..","commit_id":"b560927d0bad67e6539cbc0edf627b31dabbd7e9"}]}
