)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd411f519191ba3ead95a176f4a9776998d86a33","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This will be used by migration pagination API."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"And also, we need ensure it would be maintain a default"},{"line_number":12,"context_line":"sort order with order microversions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Part of blueprint add-pagination-and-change-since-for-migration-list"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f4b6375_0a19a620","line":11,"range":{"start_line":11,"start_character":25,"end_line":11,"end_character":45},"updated":"2017-10-25 14:07:02.000000000","message":"it will maintain","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"91dbac61caabe5393e2502b37864ab359e0549e4","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This will be used by migration pagination API."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"And also, we need ensure it would be maintain a default"},{"line_number":12,"context_line":"sort order with order microversions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Part of blueprint add-pagination-and-change-since-for-migration-list"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f4b6375_72347dfc","line":11,"range":{"start_line":11,"start_character":25,"end_line":11,"end_character":45},"in_reply_to":"3f4b6375_0a19a620","updated":"2017-10-26 03:38:27.000000000","message":"Done","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd411f519191ba3ead95a176f4a9776998d86a33","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This will be used by migration pagination API."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"And also, we need ensure it would be maintain a default"},{"line_number":12,"context_line":"sort order with order microversions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Part of blueprint add-pagination-and-change-since-for-migration-list"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f4b6375_cad4ae22","line":12,"range":{"start_line":12,"start_character":16,"end_line":12,"end_character":21},"updated":"2017-10-25 14:07:02.000000000","message":"older","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"91dbac61caabe5393e2502b37864ab359e0549e4","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This will be used by migration pagination API."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"And also, we need ensure it would be maintain a default"},{"line_number":12,"context_line":"sort order with order microversions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Part of blueprint add-pagination-and-change-since-for-migration-list"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f4b6375_52374100","line":12,"range":{"start_line":12,"start_character":16,"end_line":12,"end_character":21},"in_reply_to":"3f4b6375_cad4ae22","updated":"2017-10-26 03:38:27.000000000","message":"Done","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"}],"nova/api/openstack/compute/migrations.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e502c1f5015f4f6b5b39230807319feac3935b42","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        context.can(migrations_policies.POLICY_ROOT % \u0027index\u0027)"},{"line_number":75,"context_line":"        migrations \u003d self.compute_api.get_migrations("},{"line_number":76,"context_line":"            context, req.GET,"},{"line_number":77,"context_line":"            sort_dirs\u003d[\u0027asc\u0027, \u0027asc\u0027], sort_keys\u003d[\u0027created_at\u0027, \u0027id\u0027])"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if api_version_request.is_supported(req, min_version\u003d\u00272.23\u0027):"},{"line_number":80,"context_line":"            return {\u0027migrations\u0027: self._output(req, migrations, True)}"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f4b6375_23802fbf","line":77,"updated":"2017-11-02 18:57:51.000000000","message":"Why do we need this here? Before the microversion, we can just rely on the DB API to be doing a consistent sort order, and we get that by calling process_sort_params() in the DB API code, correct?\n\nMaybe I confused things with this comment:\n\nhttps://review.openstack.org/#/c/514904/6..12/nova/db/sqlalchemy/api.py@4911\n\nBut what I mean is, before the new microversion, the API does not have to pass sort_dirs or sort_keys (defaults to None). The DB API is what will define a default sort order, which will be whatever we have today - which is actually undefined, it\u0027s dependent on the backend RDBMS I believe.\n\nThen with the new microversion, the API will pass sort_keys/dirs to the DB API, per the spec:\n\n\"We propose to merge sort the results in compute api code once we get the results back from all of the multiple cells, and results are sorted in descending order by [‘created_at’, ‘id’] keys.\"","commit_id":"df86e2958ac98601d48450ba611eccea2d221233"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd411f519191ba3ead95a176f4a9776998d86a33","unresolved":false,"context_lines":[{"line_number":3985,"context_line":"                       request_spec\u003drequest_spec,"},{"line_number":3986,"context_line":"                       )"},{"line_number":3987,"context_line":""},{"line_number":3988,"context_line":"    def get_migrations(self, context, filters, sort_dirs\u003dNone, sort_keys\u003dNone):"},{"line_number":3989,"context_line":"        \"\"\"Get all migrations for the given filters.\"\"\""},{"line_number":3990,"context_line":"        load_cells()"},{"line_number":3991,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_65b84be4","line":3988,"range":{"start_line":3988,"start_character":47,"end_line":3988,"end_character":77},"updated":"2017-10-25 14:07:02.000000000","message":"OK so the end user can\u0027t pass in sort dirs or keys, but the API controller code will pass None for older microversions, and pass created_at/desc for the newer microversion because of this code in the API:\n\nhttps://github.com/openstack/nova/blob/df9fbbfec97a1ce13364d025bcd66621725bb7e4/nova/api/openstack/common.py#L142\n\n--\n\nYou will also have to make the method signature change in the cells API code here:\n\nhttps://github.com/openstack/nova/blob/df9fbbfec97a1ce13364d025bcd66621725bb7e4/nova/compute/cells_api.py#L508\n\nYou don\u0027t need to make this work with cells v1 though, just modify the signature to be the same as the normal compute API.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"2cc2729e9f2537cd4789ead7585c711a47d1f2d8","unresolved":false,"context_lines":[{"line_number":3985,"context_line":"                       request_spec\u003drequest_spec,"},{"line_number":3986,"context_line":"                       )"},{"line_number":3987,"context_line":""},{"line_number":3988,"context_line":"    def get_migrations(self, context, filters, sort_dirs\u003dNone, sort_keys\u003dNone):"},{"line_number":3989,"context_line":"        \"\"\"Get all migrations for the given filters.\"\"\""},{"line_number":3990,"context_line":"        load_cells()"},{"line_number":3991,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_16517a63","line":3988,"range":{"start_line":3988,"start_character":47,"end_line":3988,"end_character":77},"in_reply_to":"3f4b6375_5a0ddae6","updated":"2017-10-28 09:58:45.000000000","message":"OK, got it. :)","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"91dbac61caabe5393e2502b37864ab359e0549e4","unresolved":false,"context_lines":[{"line_number":3985,"context_line":"                       request_spec\u003drequest_spec,"},{"line_number":3986,"context_line":"                       )"},{"line_number":3987,"context_line":""},{"line_number":3988,"context_line":"    def get_migrations(self, context, filters, sort_dirs\u003dNone, sort_keys\u003dNone):"},{"line_number":3989,"context_line":"        \"\"\"Get all migrations for the given filters.\"\"\""},{"line_number":3990,"context_line":"        load_cells()"},{"line_number":3991,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_88a6acaa","line":3988,"range":{"start_line":3988,"start_character":47,"end_line":3988,"end_character":77},"in_reply_to":"3f4b6375_65b84be4","updated":"2017-10-26 03:38:27.000000000","message":"emm... a little confusing. The \"signature change\" means just add kwargs(keys/dirs) on the cell method and nothing should be implemented? like this:\nhttps://review.openstack.org/#/c/514904/4/nova/compute/cells_api.py","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"03a763861fd8b4a12edd78e32c5409f035831a6b","unresolved":false,"context_lines":[{"line_number":3985,"context_line":"                       request_spec\u003drequest_spec,"},{"line_number":3986,"context_line":"                       )"},{"line_number":3987,"context_line":""},{"line_number":3988,"context_line":"    def get_migrations(self, context, filters, sort_dirs\u003dNone, sort_keys\u003dNone):"},{"line_number":3989,"context_line":"        \"\"\"Get all migrations for the given filters.\"\"\""},{"line_number":3990,"context_line":"        load_cells()"},{"line_number":3991,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_5a0ddae6","line":3988,"range":{"start_line":3988,"start_character":47,"end_line":3988,"end_character":77},"in_reply_to":"3f4b6375_88a6acaa","updated":"2017-10-28 02:05:09.000000000","message":"Correct. Cells v1 is deprecated so we don\u0027t need to implement new features like this for cells v1.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd411f519191ba3ead95a176f4a9776998d86a33","unresolved":false,"context_lines":[{"line_number":4908,"context_line":"        else:"},{"line_number":4909,"context_line":"            limit \u003d filters[\u0027limit\u0027]"},{"line_number":4910,"context_line":""},{"line_number":4911,"context_line":"    sort_ks \u003d sort_keys or [\u0027id\u0027]"},{"line_number":4912,"context_line":"    sort_ds \u003d sort_dirs or [\u0027asc\u0027]"},{"line_number":4913,"context_line":"    query \u003d model_query(context, models.Migration)"},{"line_number":4914,"context_line":"    if \u0027changes-since\u0027 in filters:"},{"line_number":4915,"context_line":"        changes_since \u003d timeutils.normalize_time(filters[\u0027changes-since\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_65372b4f","line":4912,"range":{"start_line":4911,"start_character":4,"end_line":4912,"end_character":34},"updated":"2017-10-25 14:07:02.000000000","message":"Should consider using process_sort_params here?","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"91dbac61caabe5393e2502b37864ab359e0549e4","unresolved":false,"context_lines":[{"line_number":4908,"context_line":"        else:"},{"line_number":4909,"context_line":"            limit \u003d filters[\u0027limit\u0027]"},{"line_number":4910,"context_line":""},{"line_number":4911,"context_line":"    sort_ks \u003d sort_keys or [\u0027id\u0027]"},{"line_number":4912,"context_line":"    sort_ds \u003d sort_dirs or [\u0027asc\u0027]"},{"line_number":4913,"context_line":"    query \u003d model_query(context, models.Migration)"},{"line_number":4914,"context_line":"    if \u0027changes-since\u0027 in filters:"},{"line_number":4915,"context_line":"        changes_since \u003d timeutils.normalize_time(filters[\u0027changes-since\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_0872bcad","line":4912,"range":{"start_line":4911,"start_character":4,"end_line":4912,"end_character":34},"in_reply_to":"3f4b6375_65372b4f","updated":"2017-10-26 03:38:27.000000000","message":"Yes, good idea, I will update.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd411f519191ba3ead95a176f4a9776998d86a33","unresolved":false,"context_lines":[{"line_number":4914,"context_line":"    if \u0027changes-since\u0027 in filters:"},{"line_number":4915,"context_line":"        changes_since \u003d timeutils.normalize_time(filters[\u0027changes-since\u0027])"},{"line_number":4916,"context_line":"        query \u003d query. \\"},{"line_number":4917,"context_line":"            filter(models.Migration.created_at \u003e\u003d changes_since)"},{"line_number":4918,"context_line":"    if \"status\" in filters:"},{"line_number":4919,"context_line":"        status \u003d filters[\"status\"]"},{"line_number":4920,"context_line":"        status \u003d [status] if isinstance(status, six.string_types) else status"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_c57a5fef","line":4917,"range":{"start_line":4917,"start_character":36,"end_line":4917,"end_character":46},"updated":"2017-10-25 14:07:02.000000000","message":"This should be updated_at right? The changes-since parameter is for filtering on updated_at in other APIs.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"91dbac61caabe5393e2502b37864ab359e0549e4","unresolved":false,"context_lines":[{"line_number":4914,"context_line":"    if \u0027changes-since\u0027 in filters:"},{"line_number":4915,"context_line":"        changes_since \u003d timeutils.normalize_time(filters[\u0027changes-since\u0027])"},{"line_number":4916,"context_line":"        query \u003d query. \\"},{"line_number":4917,"context_line":"            filter(models.Migration.created_at \u003e\u003d changes_since)"},{"line_number":4918,"context_line":"    if \"status\" in filters:"},{"line_number":4919,"context_line":"        status \u003d filters[\"status\"]"},{"line_number":4920,"context_line":"        status \u003d [status] if isinstance(status, six.string_types) else status"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_683a5099","line":4917,"range":{"start_line":4917,"start_character":36,"end_line":4917,"end_character":46},"in_reply_to":"3f4b6375_c57a5fef","updated":"2017-10-26 03:38:27.000000000","message":"Yes, sure. I forgot to change this, I will update soon.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd411f519191ba3ead95a176f4a9776998d86a33","unresolved":false,"context_lines":[{"line_number":4939,"context_line":"        try:"},{"line_number":4940,"context_line":"            marker \u003d migration_get_by_uuid(context, filters[\u0027marker\u0027])"},{"line_number":4941,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4942,"context_line":"            raise exception.MarkerNotFound"},{"line_number":4943,"context_line":"    return sqlalchemyutils.paginate_query(query,"},{"line_number":4944,"context_line":"                                          models.Migration,"},{"line_number":4945,"context_line":"                                          limit\u003dlimit,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_0574f7fc","line":4942,"range":{"start_line":4942,"start_character":28,"end_line":4942,"end_character":42},"updated":"2017-10-25 14:07:02.000000000","message":"Should be:\n\nraise exception.MarkerNotFound(marker\u003dfilters[\u0027marker\u0027])","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"91dbac61caabe5393e2502b37864ab359e0549e4","unresolved":false,"context_lines":[{"line_number":4939,"context_line":"        try:"},{"line_number":4940,"context_line":"            marker \u003d migration_get_by_uuid(context, filters[\u0027marker\u0027])"},{"line_number":4941,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4942,"context_line":"            raise exception.MarkerNotFound"},{"line_number":4943,"context_line":"    return sqlalchemyutils.paginate_query(query,"},{"line_number":4944,"context_line":"                                          models.Migration,"},{"line_number":4945,"context_line":"                                          limit\u003dlimit,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_0843dc14","line":4942,"range":{"start_line":4942,"start_character":28,"end_line":4942,"end_character":42},"in_reply_to":"3f4b6375_0574f7fc","updated":"2017-10-26 03:38:27.000000000","message":"Yes. :)","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6687b14abf818f747731ed095c0b70402efefa2f","unresolved":false,"context_lines":[{"line_number":4898,"context_line":""},{"line_number":4899,"context_line":""},{"line_number":4900,"context_line":"@pick_context_manager_reader"},{"line_number":4901,"context_line":"def migration_get_all_by_filters(context, filters,"},{"line_number":4902,"context_line":"                                 sort_keys\u003dNone, sort_dirs\u003dNone):"},{"line_number":4903,"context_line":"    limit \u003d None"},{"line_number":4904,"context_line":"    marker \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_7a31b6a2","line":4901,"updated":"2017-10-28 02:10:56.000000000","message":"Were you going to add some unit tests to nova.tests.unit.db.test_db_api for this? Could do some simple tests with a few migration records and test out the limit/marker logic and passing in different sort keys and directions. Also need to test MarkerNotFound.","commit_id":"cdff91a149e8f81375030692a6d2fc3e74082851"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"96d06c26a1a9c8bea190bdabf2f2fdd0db6ff03b","unresolved":false,"context_lines":[{"line_number":4898,"context_line":""},{"line_number":4899,"context_line":""},{"line_number":4900,"context_line":"@pick_context_manager_reader"},{"line_number":4901,"context_line":"def migration_get_all_by_filters(context, filters,"},{"line_number":4902,"context_line":"                                 sort_keys\u003dNone, sort_dirs\u003dNone):"},{"line_number":4903,"context_line":"    limit \u003d None"},{"line_number":4904,"context_line":"    marker \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_16797a2e","line":4901,"in_reply_to":"3f4b6375_7a31b6a2","updated":"2017-10-28 09:58:10.000000000","message":"Sure, test cases have been added.","commit_id":"cdff91a149e8f81375030692a6d2fc3e74082851"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6687b14abf818f747731ed095c0b70402efefa2f","unresolved":false,"context_lines":[{"line_number":4908,"context_line":"        else:"},{"line_number":4909,"context_line":"            limit \u003d filters[\u0027limit\u0027]"},{"line_number":4910,"context_line":""},{"line_number":4911,"context_line":"    sort_keys, sort_dirs \u003d process_sort_params(sort_keys, sort_dirs)"},{"line_number":4912,"context_line":""},{"line_number":4913,"context_line":"    query \u003d model_query(context, models.Migration)"},{"line_number":4914,"context_line":"    if \u0027changes-since\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_da00aaae","line":4911,"range":{"start_line":4911,"start_character":27,"end_line":4911,"end_character":46},"updated":"2017-10-28 02:10:56.000000000","message":"Pass default_dir\u003d\u0027desc\u0027 here, the default otherwise is \u0027asc\u0027 and we said in the spec that we\u0027d default to descending order.","commit_id":"cdff91a149e8f81375030692a6d2fc3e74082851"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"96d06c26a1a9c8bea190bdabf2f2fdd0db6ff03b","unresolved":false,"context_lines":[{"line_number":4908,"context_line":"        else:"},{"line_number":4909,"context_line":"            limit \u003d filters[\u0027limit\u0027]"},{"line_number":4910,"context_line":""},{"line_number":4911,"context_line":"    sort_keys, sort_dirs \u003d process_sort_params(sort_keys, sort_dirs)"},{"line_number":4912,"context_line":""},{"line_number":4913,"context_line":"    query \u003d model_query(context, models.Migration)"},{"line_number":4914,"context_line":"    if \u0027changes-since\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_16c73a48","line":4911,"range":{"start_line":4911,"start_character":27,"end_line":4911,"end_character":46},"in_reply_to":"3f4b6375_da00aaae","updated":"2017-10-28 09:58:10.000000000","message":"Yeah, thanks, and seems we also need to add some default sort key/dir in API code for compatibility, like this:\n\nhttps://review.openstack.org/#/c/514904/8/nova/api/openstack/compute/migrations.py","commit_id":"cdff91a149e8f81375030692a6d2fc3e74082851"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e502c1f5015f4f6b5b39230807319feac3935b42","unresolved":false,"context_lines":[{"line_number":4941,"context_line":"            marker \u003d migration_get_by_uuid(context, filters[\u0027marker\u0027])"},{"line_number":4942,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4943,"context_line":"            raise exception.MarkerNotFound(marker\u003dfilters[\u0027marker\u0027])"},{"line_number":4944,"context_line":"    return sqlalchemyutils.paginate_query(query,"},{"line_number":4945,"context_line":"                                          models.Migration,"},{"line_number":4946,"context_line":"                                          limit\u003dlimit,"},{"line_number":4947,"context_line":"                                          sort_keys\u003dsort_keys, marker\u003dmarker,"},{"line_number":4948,"context_line":"                                          sort_dirs\u003dsort_dirs).all()"},{"line_number":4949,"context_line":""},{"line_number":4950,"context_line":""},{"line_number":4951,"context_line":"@pick_context_manager_writer"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f4b6375_2606fd1d","line":4948,"range":{"start_line":4944,"start_character":11,"end_line":4948,"end_character":68},"updated":"2017-11-02 18:57:51.000000000","message":"Related to my comment in the API code, I don\u0027t think we want to try and enforce a sort order before the new microversion. We only need to page if we have a limit or a marker, and before the new microversion we won\u0027t have either of those. That also means before the new microversion, the API shouldn\u0027t be sending sort_keys or sort_dirs.\n\nSo I think what we want is more something like this:\n\nif limit or marker:\n   # Determine default sort keys/direction\n   sort_keys, sort_dirs \u003d process_sort_params(sort_keys, sort_dirs,\n                                               default_dir\u003d\u0027desc\u0027)\n   return sqlalchemyutils.paginate_query(...)\nelse:\n   return query.all()\n\nThat way we only apply the sort key/dir paging logic if we\u0027re asked to (with the new microversion), otherwise we do what we did before.","commit_id":"df86e2958ac98601d48450ba611eccea2d221233"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"847ceca5c48170f799894fbff6e1cd7dfcca75ae","unresolved":false,"context_lines":[{"line_number":4941,"context_line":"            marker \u003d migration_get_by_uuid(context, filters[\u0027marker\u0027])"},{"line_number":4942,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4943,"context_line":"            raise exception.MarkerNotFound(marker\u003dfilters[\u0027marker\u0027])"},{"line_number":4944,"context_line":"    return sqlalchemyutils.paginate_query(query,"},{"line_number":4945,"context_line":"                                          models.Migration,"},{"line_number":4946,"context_line":"                                          limit\u003dlimit,"},{"line_number":4947,"context_line":"                                          sort_keys\u003dsort_keys, marker\u003dmarker,"},{"line_number":4948,"context_line":"                                          sort_dirs\u003dsort_dirs).all()"},{"line_number":4949,"context_line":""},{"line_number":4950,"context_line":""},{"line_number":4951,"context_line":"@pick_context_manager_writer"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f4b6375_ac84075f","line":4948,"range":{"start_line":4944,"start_character":11,"end_line":4948,"end_character":68},"in_reply_to":"3f4b6375_2606fd1d","updated":"2017-11-03 02:13:50.000000000","message":"Ah, sorry for misunderstanding your means. Yeah, this approach is better than mine. Before patch submitted, I was entangled with something about which the old default sort order should be chosen with old microversion, actually, no need.\n\nAnd other thing I want to make sure again, with new microversion, we need to keep the new default order(pass by the new micro version API) **without limit and marker**, right? \n\nSo, sort_keys or sort_dirs also should be added in the condition:\n\nif limit or marker or sort_keys or sort_dirs:\n    sort_keys, sort_dirs \u003d process_sort_params(sort_keys, sort_dirs, default_dir\u003d\u0027desc\u0027)\n    return sqlalchemyutils.paginate_query().all()\nelse:\n    return query.all()\n\nIf so, I have no questions left. Thanks for review again. : )","commit_id":"df86e2958ac98601d48450ba611eccea2d221233"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"67b2978e613802b22e329762e13c07b55c0c93c6","unresolved":false,"context_lines":[{"line_number":4941,"context_line":"            marker \u003d migration_get_by_uuid(context, filters[\u0027marker\u0027])"},{"line_number":4942,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4943,"context_line":"            raise exception.MarkerNotFound(marker\u003dfilters[\u0027marker\u0027])"},{"line_number":4944,"context_line":"    return sqlalchemyutils.paginate_query(query,"},{"line_number":4945,"context_line":"                                          models.Migration,"},{"line_number":4946,"context_line":"                                          limit\u003dlimit,"},{"line_number":4947,"context_line":"                                          sort_keys\u003dsort_keys, marker\u003dmarker,"},{"line_number":4948,"context_line":"                                          sort_dirs\u003dsort_dirs).all()"},{"line_number":4949,"context_line":""},{"line_number":4950,"context_line":""},{"line_number":4951,"context_line":"@pick_context_manager_writer"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f4b6375_a6e4ff3c","line":4948,"range":{"start_line":4944,"start_character":11,"end_line":4948,"end_character":68},"in_reply_to":"3f4b6375_7b1eaa5f","updated":"2017-11-06 01:59:31.000000000","message":"Yes, I think you know what I mean. : )\n\nWith old microversion, query.all() will be used.\n\nWith new microversion, no matter whether the limit or marker are specified or not, sqlalchemyutils.paginate_query will be used. \n\nIt\u0027s benefit to keep the new default order because paginate_query will work, otherwise we need some duplicated code to do some sort stuff before query.all() call.","commit_id":"df86e2958ac98601d48450ba611eccea2d221233"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"002d92b3bcb416234539cadc96bfc331f8e36f38","unresolved":false,"context_lines":[{"line_number":4941,"context_line":"            marker \u003d migration_get_by_uuid(context, filters[\u0027marker\u0027])"},{"line_number":4942,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4943,"context_line":"            raise exception.MarkerNotFound(marker\u003dfilters[\u0027marker\u0027])"},{"line_number":4944,"context_line":"    return sqlalchemyutils.paginate_query(query,"},{"line_number":4945,"context_line":"                                          models.Migration,"},{"line_number":4946,"context_line":"                                          limit\u003dlimit,"},{"line_number":4947,"context_line":"                                          sort_keys\u003dsort_keys, marker\u003dmarker,"},{"line_number":4948,"context_line":"                                          sort_dirs\u003dsort_dirs).all()"},{"line_number":4949,"context_line":""},{"line_number":4950,"context_line":""},{"line_number":4951,"context_line":"@pick_context_manager_writer"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f4b6375_7b1eaa5f","line":4948,"range":{"start_line":4944,"start_character":11,"end_line":4948,"end_character":68},"in_reply_to":"3f4b6375_9b04c616","updated":"2017-11-04 01:16:29.000000000","message":"You know what, I think you\u0027re right.\n\nThe DB API will only call paginate_query if limit or marker or sort_keys or sort_dirs is specified, which in the old microversion will all be None. The new default sort order is controlled in the REST API.\n\nSorry for the confusion.","commit_id":"df86e2958ac98601d48450ba611eccea2d221233"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5c441603431e09132b7542150e4efe8d7922ba22","unresolved":false,"context_lines":[{"line_number":4941,"context_line":"            marker \u003d migration_get_by_uuid(context, filters[\u0027marker\u0027])"},{"line_number":4942,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4943,"context_line":"            raise exception.MarkerNotFound(marker\u003dfilters[\u0027marker\u0027])"},{"line_number":4944,"context_line":"    return sqlalchemyutils.paginate_query(query,"},{"line_number":4945,"context_line":"                                          models.Migration,"},{"line_number":4946,"context_line":"                                          limit\u003dlimit,"},{"line_number":4947,"context_line":"                                          sort_keys\u003dsort_keys, marker\u003dmarker,"},{"line_number":4948,"context_line":"                                          sort_dirs\u003dsort_dirs).all()"},{"line_number":4949,"context_line":""},{"line_number":4950,"context_line":""},{"line_number":4951,"context_line":"@pick_context_manager_writer"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f4b6375_9b04c616","line":4948,"range":{"start_line":4944,"start_character":11,"end_line":4948,"end_character":68},"in_reply_to":"3f4b6375_ac84075f","updated":"2017-11-04 01:14:22.000000000","message":"\u003e if limit or marker or sort_keys or sort_dirs:\n\nI\u0027m not sure about adding sort_keys and sort_dirs here honestly.\n\nWith the old microversions, those will always be None because the REST API doesn\u0027t pass them down to the DB API.\n\nWith the new microversion, limit and marker are None by default if the user doesn\u0027t request them.\n\nHowever, I assumed that with the new microversion we\u0027d always impose our new default sort order, which is [created_at, id] in descending order. That\u0027s how we handle listing instances anyway, so I figured we\u0027d do the same here with the new microversion. The DB API wouldn\u0027t control this, the REST API would by checking the microversion and if it\u0027s the new one, the REST API code passes down the sort_keys/sort_dirs regardless of whether or not limit/marker are specified. This way we\u0027d have a consistent sort order with the new microversion even if you\u0027re not paging - and it would be consistent with the sort order when you do page.","commit_id":"df86e2958ac98601d48450ba611eccea2d221233"},{"author":{"_account_id":24711,"name":"Jackie Truong","email":"jacklyn.truong@jhuapl.edu","username":"jackie-truong"},"change_message_id":"a6b35bfd21dff51f40793d1f8f45f1acdadde1a3","unresolved":false,"context_lines":[{"line_number":4401,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4402,"context_line":"            raise exception.MarkerNotFound(marker\u003dmarker)"},{"line_number":4403,"context_line":"    if limit or marker or sort_keys or sort_dirs:"},{"line_number":4404,"context_line":"        sort_keys, sort_dirs \u003d process_sort_params(sort_keys, sort_dirs,"},{"line_number":4405,"context_line":"                                                   default_dir\u003d\u0027desc\u0027)"},{"line_number":4406,"context_line":"        return sqlalchemyutils.paginate_query(query,"},{"line_number":4407,"context_line":"                                              models.Migration,"},{"line_number":4408,"context_line":"                                              limit\u003dlimit,"}],"source_content_type":"text/x-python","patch_set":29,"id":"df87a7cf_c274f2d1","line":4405,"range":{"start_line":4404,"start_character":0,"end_line":4405,"end_character":70},"updated":"2017-12-18 20:16:35.000000000","message":"Add a note that default sort direction is \"descending\" (and default sort key is \"created at\"?)","commit_id":"a98a5ec7b7c049d3c6ad9938ba4076cf589df766"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"0cbfc8c0e834acd2f2c4fccbc7070505badfc85f","unresolved":false,"context_lines":[{"line_number":4401,"context_line":"        except exception.MigrationNotFound:"},{"line_number":4402,"context_line":"            raise exception.MarkerNotFound(marker\u003dmarker)"},{"line_number":4403,"context_line":"    if limit or marker or sort_keys or sort_dirs:"},{"line_number":4404,"context_line":"        sort_keys, sort_dirs \u003d process_sort_params(sort_keys, sort_dirs,"},{"line_number":4405,"context_line":"                                                   default_dir\u003d\u0027desc\u0027)"},{"line_number":4406,"context_line":"        return sqlalchemyutils.paginate_query(query,"},{"line_number":4407,"context_line":"                                              models.Migration,"},{"line_number":4408,"context_line":"                                              limit\u003dlimit,"}],"source_content_type":"text/x-python","patch_set":29,"id":"df87a7cf_04de41d9","line":4405,"range":{"start_line":4404,"start_character":0,"end_line":4405,"end_character":70},"in_reply_to":"df87a7cf_c274f2d1","updated":"2017-12-20 06:43:13.000000000","message":"Done","commit_id":"a98a5ec7b7c049d3c6ad9938ba4076cf589df766"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1cf91c14dccf1fea5a2abb3a10ebe3967fc12045","unresolved":false,"context_lines":[{"line_number":4374,"context_line":"    if \u0027changes-since\u0027 in filters:"},{"line_number":4375,"context_line":"        changes_since \u003d timeutils.normalize_time(filters[\u0027changes-since\u0027])"},{"line_number":4376,"context_line":"        query \u003d query. \\"},{"line_number":4377,"context_line":"            filter(models.Migration.updated_at \u003e\u003d changes_since)"},{"line_number":4378,"context_line":"    if \"status\" in filters:"},{"line_number":4379,"context_line":"        status \u003d filters[\"status\"]"},{"line_number":4380,"context_line":"        status \u003d [status] if isinstance(status, six.string_types) else status"}],"source_content_type":"text/x-python","patch_set":32,"id":"9f91af0f_73975f92","line":4377,"range":{"start_line":4377,"start_character":12,"end_line":4377,"end_character":64},"updated":"2018-01-02 17:24:34.000000000","message":"Don\u0027t forget that the spec says we were going to add an index on the updated_at column:\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/queens/approved/add-pagination-and-change-since-for-migration-list.html#data-model-impact\n\nYou could do that in this patch, or in a separate patch to keep things simple.","commit_id":"f451b89768e159acbbf0a3d70016988f90569d8a"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"8448f12d09dde45d47ce1a944d3b06c24b34c418","unresolved":false,"context_lines":[{"line_number":4374,"context_line":"    if \u0027changes-since\u0027 in filters:"},{"line_number":4375,"context_line":"        changes_since \u003d timeutils.normalize_time(filters[\u0027changes-since\u0027])"},{"line_number":4376,"context_line":"        query \u003d query. \\"},{"line_number":4377,"context_line":"            filter(models.Migration.updated_at \u003e\u003d changes_since)"},{"line_number":4378,"context_line":"    if \"status\" in filters:"},{"line_number":4379,"context_line":"        status \u003d filters[\"status\"]"},{"line_number":4380,"context_line":"        status \u003d [status] if isinstance(status, six.string_types) else status"}],"source_content_type":"text/x-python","patch_set":32,"id":"9f91af0f_1814c74d","line":4377,"range":{"start_line":4377,"start_character":12,"end_line":4377,"end_character":64},"in_reply_to":"9f91af0f_73975f92","updated":"2018-01-04 11:17:45.000000000","message":"OK, thanks for reminder, the patch in here:\nhttps://review.openstack.org/#/c/531132/","commit_id":"f451b89768e159acbbf0a3d70016988f90569d8a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3629636e0f79cf50b1cb884e67b0eba70103f64d","unresolved":false,"context_lines":[{"line_number":4420,"context_line":"        hidden \u003d filters[\"hidden\"]"},{"line_number":4421,"context_line":"        query \u003d query.filter(models.Migration.hidden \u003d\u003d hidden)"},{"line_number":4422,"context_line":"    if \"instance_uuid\" in filters:"},{"line_number":4423,"context_line":"        instance_uuid \u003d filters[\"instance_uuid\"]"},{"line_number":4424,"context_line":"        query \u003d query.filter(models.Migration.instance_uuid \u003d\u003d instance_uuid)"},{"line_number":4425,"context_line":"    if marker:"},{"line_number":4426,"context_line":"        try:"},{"line_number":4427,"context_line":"            marker \u003d migration_get_by_uuid(context, marker)"}],"source_content_type":"text/x-python","patch_set":34,"id":"9f91af0f_1f0f6837","line":4424,"range":{"start_line":4423,"start_character":0,"end_line":4424,"end_character":77},"updated":"2018-01-09 16:31:13.000000000","message":"I don\u0027t think these changes were required.","commit_id":"971cbaee02da724c1911dd6545a54e530671c0b1"}],"nova/objects/migration.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd411f519191ba3ead95a176f4a9776998d86a33","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                  db_migrations)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    @base.remotable_classmethod"},{"line_number":217,"context_line":"    def get_by_filters(cls, context, filters, sort_keys\u003dNone, sort_dirs\u003dNone):"},{"line_number":218,"context_line":"        db_migrations \u003d db.migration_get_all_by_filters(context, filters,"},{"line_number":219,"context_line":"                                                        sort_keys\u003dsort_keys,"},{"line_number":220,"context_line":"                                                        sort_dirs\u003dsort_dirs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_85e7c7ac","line":217,"updated":"2017-10-25 14:07:02.000000000","message":"There would need to be a version bump on the object for this.\n\nWe should ask dansmith, but we might just want a new remotable classmethod for this call get_by_filters_sorted and then get_by_filters could call the new method by leave out the sort_keys and sort_dirs. We have something like that in the InstanceList class.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"91dbac61caabe5393e2502b37864ab359e0549e4","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                  db_migrations)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    @base.remotable_classmethod"},{"line_number":217,"context_line":"    def get_by_filters(cls, context, filters, sort_keys\u003dNone, sort_dirs\u003dNone):"},{"line_number":218,"context_line":"        db_migrations \u003d db.migration_get_all_by_filters(context, filters,"},{"line_number":219,"context_line":"                                                        sort_keys\u003dsort_keys,"},{"line_number":220,"context_line":"                                                        sort_dirs\u003dsort_dirs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_280e98e4","line":217,"in_reply_to":"3f4b6375_85110760","updated":"2017-10-26 03:38:27.000000000","message":"@dans @matt Thanks for review.\nSure, I will update the object version to 1.4.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ad314263fce859ecbc032916c90521032e7a4b6a","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                  db_migrations)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    @base.remotable_classmethod"},{"line_number":217,"context_line":"    def get_by_filters(cls, context, filters, sort_keys\u003dNone, sort_dirs\u003dNone):"},{"line_number":218,"context_line":"        db_migrations \u003d db.migration_get_all_by_filters(context, filters,"},{"line_number":219,"context_line":"                                                        sort_keys\u003dsort_keys,"},{"line_number":220,"context_line":"                                                        sort_dirs\u003dsort_dirs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_85110760","line":217,"in_reply_to":"3f4b6375_85e7c7ac","updated":"2017-10-25 14:10:29.000000000","message":"Definitely a version bump required.\n\nI think adding these arguments is fine and they make sense when unset to equate to \"default sort\".\n\nWe did something different for instances, but only because we already had sort_key and they wanted to change the name and format to sort_keys. So I think what is here is fine, but it needs a bump.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"aa21100ff602e060fac6000311faf7f80e8edfa2","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                                  db_migrations)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    @base.remotable_classmethod"},{"line_number":217,"context_line":"    def get_by_filters(cls, context, filters, sort_keys\u003dNone, sort_dirs\u003dNone):"},{"line_number":218,"context_line":"        db_migrations \u003d db.migration_get_all_by_filters(context, filters,"},{"line_number":219,"context_line":"                                                        sort_keys\u003dsort_keys,"},{"line_number":220,"context_line":"                                                        sort_dirs\u003dsort_dirs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_05575728","line":217,"in_reply_to":"3f4b6375_85e7c7ac","updated":"2017-10-25 14:09:44.000000000","message":"I asked Dan and he said adding parameters here is OK since they have default values - just make sure to update the object version to 1.4.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"84120a0ca2f923fe508179aa6c013d0c8689b045","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                                  db_migrations)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    @base.remotable_classmethod"},{"line_number":219,"context_line":"    def get_by_filters(cls, context, filters, sort_keys\u003dNone, sort_dirs\u003dNone,"},{"line_number":220,"context_line":"                       limit\u003dNone, marker\u003dNone):"},{"line_number":221,"context_line":"        db_migrations \u003d db.migration_get_all_by_filters("},{"line_number":222,"context_line":"            context, filters, sort_keys\u003dsort_keys, sort_dirs\u003dsort_dirs,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff82abbf_4ccf4029","line":219,"range":{"start_line":219,"start_character":46,"end_line":219,"end_character":76},"updated":"2017-11-30 15:50:09.000000000","message":"I\u0027d like to avoid complex sorting of objects unless we need it, and I\u0027m not sure I see the value here. I thought we were going to stick to a single ordering for these?","commit_id":"82d22333de59747d37c852122c1eefc1eb5e71ec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7aaf864e31d8aab38d68f7905e7920b0ca9e9aff","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                                  db_migrations)"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    @base.remotable_classmethod"},{"line_number":219,"context_line":"    def get_by_filters(cls, context, filters, sort_keys\u003dNone, sort_dirs\u003dNone,"},{"line_number":220,"context_line":"                       limit\u003dNone, marker\u003dNone):"},{"line_number":221,"context_line":"        db_migrations \u003d db.migration_get_all_by_filters("},{"line_number":222,"context_line":"            context, filters, sort_keys\u003dsort_keys, sort_dirs\u003dsort_dirs,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff82abbf_4cb6608d","line":219,"range":{"start_line":219,"start_character":46,"end_line":219,"end_character":76},"in_reply_to":"ff82abbf_4ccf4029","updated":"2017-11-30 15:52:19.000000000","message":"We are, I think this is just plumbing, and the API handler code passes down a hard-coded set of sort keys/dirs:\n\nhttps://review.openstack.org/#/c/330406/67/nova/api/openstack/compute/migrations.py@128","commit_id":"82d22333de59747d37c852122c1eefc1eb5e71ec"}],"nova/tests/functional/api_sample_tests/test_migrations.py":[{"author":{"_account_id":19853,"name":"Nguyen Hung Phuong","email":"phuongnh@vn.fujitsu.com","username":"phuongnh"},"change_message_id":"31819fa4cc102f4becbd04af2b3f1d6bc3d46b71","unresolved":false,"context_lines":[{"line_number":27,"context_line":"INSTANCE_UUID_2 \u003d \"9128d044-7b61-403e-b766-7547076ff6c1\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def _stub_migrations(stub_self, context, filters, sort_dirs\u003dNone, sort_keys\u003dNone):"},{"line_number":31,"context_line":"    fake_migrations \u003d ["},{"line_number":32,"context_line":"        {"},{"line_number":33,"context_line":"            \u0027id\u0027: 1234,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_87208b9d","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":82},"updated":"2017-10-30 03:51:02.000000000","message":"Please fix pep8 issue, line too long","commit_id":"b29bb1a096ed24a83e8d03f51441b32c6a566036"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"51492fdf5d53bc1f28a919b5faeebccabc6dc1c6","unresolved":false,"context_lines":[{"line_number":27,"context_line":"INSTANCE_UUID_2 \u003d \"9128d044-7b61-403e-b766-7547076ff6c1\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def _stub_migrations(stub_self, context, filters, sort_dirs\u003dNone, sort_keys\u003dNone):"},{"line_number":31,"context_line":"    fake_migrations \u003d ["},{"line_number":32,"context_line":"        {"},{"line_number":33,"context_line":"            \u0027id\u0027: 1234,"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f4b6375_229e6554","line":30,"range":{"start_line":30,"start_character":0,"end_line":30,"end_character":82},"in_reply_to":"3f4b6375_87208b9d","updated":"2017-10-30 06:21:22.000000000","message":"Done, Thanks.","commit_id":"b29bb1a096ed24a83e8d03f51441b32c6a566036"}],"nova/tests/unit/db/test_db_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e502c1f5015f4f6b5b39230807319feac3935b42","unresolved":false,"context_lines":[{"line_number":1460,"context_line":"    def setUp(self):"},{"line_number":1461,"context_line":"        super(MigrationTestCase, self).setUp()"},{"line_number":1462,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":1463,"context_line":""},{"line_number":1464,"context_line":"        self._create()"},{"line_number":1465,"context_line":"        self._create()"},{"line_number":1466,"context_line":"        self._create(status\u003d\u0027reverted\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_a38f7fcb","line":1463,"updated":"2017-11-02 18:57:51.000000000","message":"nit: unrelated change","commit_id":"cdff91a149e8f81375030692a6d2fc3e74082851"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"af2bf49efff25d9abc9faaef917d0429ef0e8bb0","unresolved":false,"context_lines":[{"line_number":1460,"context_line":"    def setUp(self):"},{"line_number":1461,"context_line":"        super(MigrationTestCase, self).setUp()"},{"line_number":1462,"context_line":"        self.ctxt \u003d context.get_admin_context()"},{"line_number":1463,"context_line":""},{"line_number":1464,"context_line":"        self._create()"},{"line_number":1465,"context_line":"        self._create()"},{"line_number":1466,"context_line":"        self._create(status\u003d\u0027reverted\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f4b6375_6cd96f54","line":1463,"in_reply_to":"3f4b6375_a38f7fcb","updated":"2017-11-03 02:31:57.000000000","message":"Done","commit_id":"cdff91a149e8f81375030692a6d2fc3e74082851"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6c71011636488b4d9083d84ff54fdbac3db11e10","unresolved":false,"context_lines":[{"line_number":1726,"context_line":"                          db.migration_get_by_id_and_instance, self.ctxt,"},{"line_number":1727,"context_line":"                          \u0027500\u0027, \u0027501\u0027)"},{"line_number":1728,"context_line":""},{"line_number":1729,"context_line":"    def _create_3_migration_after_time(self, time\u003dNone):"},{"line_number":1730,"context_line":"        time \u003d time or timeutils.utcnow()"},{"line_number":1731,"context_line":"        tmp_time \u003d time + datetime.timedelta(days\u003d1)"},{"line_number":1732,"context_line":"        self._create(uuid\u003duuidsentinel.uuid_time1, updated_at\u003dtmp_time,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_5b71aea7","line":1729,"updated":"2017-11-04 01:34:09.000000000","message":"nit: this would be more interesting if at least one of these migration records had different values for the created_at and updated_at times. I\u0027m not exactly sure how that might affect your tests though.","commit_id":"e5477a97ff94d45fd3afae60dee3956b900d1b55"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"67b2978e613802b22e329762e13c07b55c0c93c6","unresolved":false,"context_lines":[{"line_number":1726,"context_line":"                          db.migration_get_by_id_and_instance, self.ctxt,"},{"line_number":1727,"context_line":"                          \u0027500\u0027, \u0027501\u0027)"},{"line_number":1728,"context_line":""},{"line_number":1729,"context_line":"    def _create_3_migration_after_time(self, time\u003dNone):"},{"line_number":1730,"context_line":"        time \u003d time or timeutils.utcnow()"},{"line_number":1731,"context_line":"        tmp_time \u003d time + datetime.timedelta(days\u003d1)"},{"line_number":1732,"context_line":"        self._create(uuid\u003duuidsentinel.uuid_time1, updated_at\u003dtmp_time,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_263fef87","line":1729,"in_reply_to":"3f4b6375_5b71aea7","updated":"2017-11-06 01:59:31.000000000","message":"Yes, sure, I will plus some testcase for it. \n\nIf created_at and updated_at are different, we can coverage more cases on filtering and sorting.","commit_id":"e5477a97ff94d45fd3afae60dee3956b900d1b55"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6c71011636488b4d9083d84ff54fdbac3db11e10","unresolved":false,"context_lines":[{"line_number":1768,"context_line":"        filters \u003d {\"marker\": uuidsentinel.uuid_time3, \"limit\": 2}"},{"line_number":1769,"context_line":"        migrations \u003d db.migration_get_all_by_filters("},{"line_number":1770,"context_line":"            self.ctxt, filters,"},{"line_number":1771,"context_line":"            sort_keys\u003d[\u0027created_at\u0027, \u0027id\u0027], sort_dirs\u003d[\u0027desc\u0027, \u0027desc\u0027])"},{"line_number":1772,"context_line":"        # time2, time1"},{"line_number":1773,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":1774,"context_line":"        self.assertEqual(migrations[0][\u0027uuid\u0027], uuidsentinel.uuid_time2)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_5ba64e11","line":1771,"range":{"start_line":1771,"start_character":12,"end_line":1771,"end_character":70},"updated":"2017-11-04 01:34:09.000000000","message":"You could just not pass these to see that process_sort_params is used.","commit_id":"e5477a97ff94d45fd3afae60dee3956b900d1b55"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"67b2978e613802b22e329762e13c07b55c0c93c6","unresolved":false,"context_lines":[{"line_number":1768,"context_line":"        filters \u003d {\"marker\": uuidsentinel.uuid_time3, \"limit\": 2}"},{"line_number":1769,"context_line":"        migrations \u003d db.migration_get_all_by_filters("},{"line_number":1770,"context_line":"            self.ctxt, filters,"},{"line_number":1771,"context_line":"            sort_keys\u003d[\u0027created_at\u0027, \u0027id\u0027], sort_dirs\u003d[\u0027desc\u0027, \u0027desc\u0027])"},{"line_number":1772,"context_line":"        # time2, time1"},{"line_number":1773,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":1774,"context_line":"        self.assertEqual(migrations[0][\u0027uuid\u0027], uuidsentinel.uuid_time2)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_e6d2f7ff","line":1771,"range":{"start_line":1771,"start_character":12,"end_line":1771,"end_character":70},"in_reply_to":"3f4b6375_5ba64e11","updated":"2017-11-06 01:59:31.000000000","message":"Yes, right.","commit_id":"e5477a97ff94d45fd3afae60dee3956b900d1b55"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6c71011636488b4d9083d84ff54fdbac3db11e10","unresolved":false,"context_lines":[{"line_number":1791,"context_line":""},{"line_number":1792,"context_line":"    def test_get_migrations_by_filters_with_changes_since(self):"},{"line_number":1793,"context_line":"        changes_time \u003d timeutils.utcnow(with_timezone\u003dTrue)"},{"line_number":1794,"context_line":"        self._create_3_migration_after_time(changes_time)"},{"line_number":1795,"context_line":"        filters \u003d {\"changes-since\": changes_time}"},{"line_number":1796,"context_line":"        migrations \u003d db.migration_get_all_by_filters(self.ctxt, filters)"},{"line_number":1797,"context_line":"        self.assertEqual(3, len(migrations))"},{"line_number":1798,"context_line":""},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"class ModelsObjectComparatorMixin(object):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_1bac56eb","line":1797,"range":{"start_line":1794,"start_character":8,"end_line":1797,"end_character":44},"updated":"2017-11-04 01:34:09.000000000","message":"This would be more interesting if you didn\u0027t create the migration records with the same value you\u0027re using for the changes-since filter. For example, create 3 migrations, then update one of them to the exact changes-since filter time, and another to changes-since + 1 hour or something, so you\u0027d get 2 back and test the updated_at \u003e\u003d logic.","commit_id":"e5477a97ff94d45fd3afae60dee3956b900d1b55"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"67b2978e613802b22e329762e13c07b55c0c93c6","unresolved":false,"context_lines":[{"line_number":1791,"context_line":""},{"line_number":1792,"context_line":"    def test_get_migrations_by_filters_with_changes_since(self):"},{"line_number":1793,"context_line":"        changes_time \u003d timeutils.utcnow(with_timezone\u003dTrue)"},{"line_number":1794,"context_line":"        self._create_3_migration_after_time(changes_time)"},{"line_number":1795,"context_line":"        filters \u003d {\"changes-since\": changes_time}"},{"line_number":1796,"context_line":"        migrations \u003d db.migration_get_all_by_filters(self.ctxt, filters)"},{"line_number":1797,"context_line":"        self.assertEqual(3, len(migrations))"},{"line_number":1798,"context_line":""},{"line_number":1799,"context_line":""},{"line_number":1800,"context_line":"class ModelsObjectComparatorMixin(object):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f4b6375_46e2ebd6","line":1797,"range":{"start_line":1794,"start_character":8,"end_line":1797,"end_character":44},"in_reply_to":"3f4b6375_1bac56eb","updated":"2017-11-06 01:59:31.000000000","message":"Actually, these 3 migrations are created after setUp(12 migrations are created, the time we call ‘base time’), and also these 3 migrations\u0027 created/updated times are already different(base + 1 day, base + 1 day, base + 3 day), and current case filter migrations after base time, so return 3 migrations. otherwise without changes_since we will get 15 migrations back.\n\nOf course, I think it\u0027s very OK for me to set change_since filter to changes_time + 1, and we will get 2 back, because I think it\u0027s more clearly to show what we do.","commit_id":"e5477a97ff94d45fd3afae60dee3956b900d1b55"},{"author":{"_account_id":24711,"name":"Jackie Truong","email":"jacklyn.truong@jhuapl.edu","username":"jackie-truong"},"change_message_id":"a6b35bfd21dff51f40793d1f8f45f1acdadde1a3","unresolved":false,"context_lines":[{"line_number":1767,"context_line":"        filters \u003d {\"changes-since\": changes_time + after_1day_2hours}"},{"line_number":1768,"context_line":"        migrations \u003d db.migration_get_all_by_filters("},{"line_number":1769,"context_line":"            self.ctxt, filters,"},{"line_number":1770,"context_line":"            sort_keys\u003d[\u0027updated_at\u0027], sort_dirs\u003d[\u0027asc\u0027])"},{"line_number":1771,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":1772,"context_line":""},{"line_number":1773,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"df87a7cf_e2cd7630","line":1770,"range":{"start_line":1770,"start_character":50,"end_line":1770,"end_character":53},"updated":"2017-12-18 20:16:35.000000000","message":"Add assertions to check that sorting is done correctly, or don\u0027t specify sort direction since that has already been tested in test_get_migrations_by_filters_with_limit_marker_sort","commit_id":"a98a5ec7b7c049d3c6ad9938ba4076cf589df766"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"0cbfc8c0e834acd2f2c4fccbc7070505badfc85f","unresolved":false,"context_lines":[{"line_number":1767,"context_line":"        filters \u003d {\"changes-since\": changes_time + after_1day_2hours}"},{"line_number":1768,"context_line":"        migrations \u003d db.migration_get_all_by_filters("},{"line_number":1769,"context_line":"            self.ctxt, filters,"},{"line_number":1770,"context_line":"            sort_keys\u003d[\u0027updated_at\u0027], sort_dirs\u003d[\u0027asc\u0027])"},{"line_number":1771,"context_line":"        self.assertEqual(2, len(migrations))"},{"line_number":1772,"context_line":""},{"line_number":1773,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"df87a7cf_64e62db3","line":1770,"range":{"start_line":1770,"start_character":50,"end_line":1770,"end_character":53},"in_reply_to":"df87a7cf_e2cd7630","updated":"2017-12-20 06:43:13.000000000","message":"Done","commit_id":"a98a5ec7b7c049d3c6ad9938ba4076cf589df766"}],"nova/tests/unit/objects/test_objects.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cd411f519191ba3ead95a176f4a9776998d86a33","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"    \u0027MemoryDiagnostics\u0027: \u00271.0-2c995ae0f2223bb0f8e523c5cc0b83da\u0027,"},{"line_number":1125,"context_line":"    \u0027Migration\u0027: \u00271.5-48bebaada664ee15bc23b35b2b814d75\u0027,"},{"line_number":1126,"context_line":"    \u0027MigrationContext\u0027: \u00271.1-9fb17b0b521370957a884636499df52d\u0027,"},{"line_number":1127,"context_line":"    \u0027MigrationList\u0027: \u00271.3-85f6faf0d33526a6f40fd939639aa963\u0027,"},{"line_number":1128,"context_line":"    \u0027MonitorMetric\u0027: \u00271.1-53b1db7c4ae2c531db79761e7acc52ba\u0027,"},{"line_number":1129,"context_line":"    \u0027MonitorMetricList\u0027: \u00271.1-15ecf022a68ddbb8c2a6739cfc9f8f5e\u0027,"},{"line_number":1130,"context_line":"    \u0027NicDiagnostics\u0027: \u00271.0-895e9ad50e0f56d5258585e3e066aea5\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_e5f79b58","line":1127,"range":{"start_line":1127,"start_character":22,"end_line":1127,"end_character":25},"updated":"2017-10-25 14:07:02.000000000","message":"This has to be 1.4.","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"},{"author":{"_account_id":20722,"name":"Yikun Jiang","email":"yikunkero@gmail.com","username":"yikunkero"},"change_message_id":"91dbac61caabe5393e2502b37864ab359e0549e4","unresolved":false,"context_lines":[{"line_number":1124,"context_line":"    \u0027MemoryDiagnostics\u0027: \u00271.0-2c995ae0f2223bb0f8e523c5cc0b83da\u0027,"},{"line_number":1125,"context_line":"    \u0027Migration\u0027: \u00271.5-48bebaada664ee15bc23b35b2b814d75\u0027,"},{"line_number":1126,"context_line":"    \u0027MigrationContext\u0027: \u00271.1-9fb17b0b521370957a884636499df52d\u0027,"},{"line_number":1127,"context_line":"    \u0027MigrationList\u0027: \u00271.3-85f6faf0d33526a6f40fd939639aa963\u0027,"},{"line_number":1128,"context_line":"    \u0027MonitorMetric\u0027: \u00271.1-53b1db7c4ae2c531db79761e7acc52ba\u0027,"},{"line_number":1129,"context_line":"    \u0027MonitorMetricList\u0027: \u00271.1-15ecf022a68ddbb8c2a6739cfc9f8f5e\u0027,"},{"line_number":1130,"context_line":"    \u0027NicDiagnostics\u0027: \u00271.0-895e9ad50e0f56d5258585e3e066aea5\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f4b6375_48343493","line":1127,"range":{"start_line":1127,"start_character":22,"end_line":1127,"end_character":25},"in_reply_to":"3f4b6375_e5f79b58","updated":"2017-10-26 03:38:27.000000000","message":"Done","commit_id":"9590e060bccb43f5bffe0241e2447750fbab6db4"}]}
