)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f43b0729e14e97cef24b276c77959e5a04027ce6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Don\u0027t lock whole project\u0027s resource when reserve/commit"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We lock whole project\u0027s resource when reserve and commit"},{"line_number":10,"context_line":"quotas. This patch only lock the required resource by"},{"line_number":11,"context_line":"adding complex index (project_id and resource) and filter"},{"line_number":12,"context_line":"quota_usage by project and resource."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_f2baf26b","line":9,"updated":"2017-08-28 08:01:40.000000000","message":"Specify what kind of lock (DB lock)","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"1bc293e58cb71179bf7ed4098eebeca9b7ab99e0","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Don\u0027t lock whole project\u0027s resource when reserve/commit"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We lock whole project\u0027s resource when reserve and commit"},{"line_number":10,"context_line":"quotas. This patch only lock the required resource by"},{"line_number":11,"context_line":"adding complex index (project_id and resource) and filter"},{"line_number":12,"context_line":"quota_usage by project and resource."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_55d5301b","line":9,"in_reply_to":"7f287b81_f2baf26b","updated":"2017-08-28 08:30:36.000000000","message":"Done","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f43b0729e14e97cef24b276c77959e5a04027ce6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Don\u0027t lock whole project\u0027s resource when reserve/commit"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We lock whole project\u0027s resource when reserve and commit"},{"line_number":10,"context_line":"quotas. This patch only lock the required resource by"},{"line_number":11,"context_line":"adding complex index (project_id and resource) and filter"},{"line_number":12,"context_line":"quota_usage by project and resource."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_d2b37697","line":10,"range":{"start_line":10,"start_character":24,"end_line":10,"end_character":28},"updated":"2017-08-28 08:01:40.000000000","message":"locks","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f43b0729e14e97cef24b276c77959e5a04027ce6","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Don\u0027t lock whole project\u0027s resource when reserve/commit"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We lock whole project\u0027s resource when reserve and commit"},{"line_number":10,"context_line":"quotas. This patch only lock the required resource by"},{"line_number":11,"context_line":"adding complex index (project_id and resource) and filter"},{"line_number":12,"context_line":"quota_usage by project and resource."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_92a96e25","line":10,"range":{"start_line":10,"start_character":42,"end_line":10,"end_character":50},"updated":"2017-08-28 08:01:40.000000000","message":"resources","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"1bc293e58cb71179bf7ed4098eebeca9b7ab99e0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Don\u0027t lock whole project\u0027s resource when reserve/commit"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We lock whole project\u0027s resource when reserve and commit"},{"line_number":10,"context_line":"quotas. This patch only lock the required resource by"},{"line_number":11,"context_line":"adding complex index (project_id and resource) and filter"},{"line_number":12,"context_line":"quota_usage by project and resource."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_35daa44b","line":10,"range":{"start_line":10,"start_character":42,"end_line":10,"end_character":50},"in_reply_to":"7f287b81_92a96e25","updated":"2017-08-28 08:30:36.000000000","message":"Done","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"1bc293e58cb71179bf7ed4098eebeca9b7ab99e0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Don\u0027t lock whole project\u0027s resource when reserve/commit"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We lock whole project\u0027s resource when reserve and commit"},{"line_number":10,"context_line":"quotas. This patch only lock the required resource by"},{"line_number":11,"context_line":"adding complex index (project_id and resource) and filter"},{"line_number":12,"context_line":"quota_usage by project and resource."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7f287b81_15db284f","line":10,"range":{"start_line":10,"start_character":24,"end_line":10,"end_character":28},"in_reply_to":"7f287b81_d2b37697","updated":"2017-08-28 08:30:36.000000000","message":"Done","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f43b0729e14e97cef24b276c77959e5a04027ce6","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"    with session.begin():"},{"line_number":1331,"context_line":"        reservation_records \u003d _quota_reservations("},{"line_number":1332,"context_line":"            session, context, reservations)"},{"line_number":1333,"context_line":"        usages \u003d _get_quota_usages("},{"line_number":1334,"context_line":"            context, session, project_id,"},{"line_number":1335,"context_line":"            resources\u003d{r.resource for r in reservation_records})"},{"line_number":1336,"context_line":"        usages \u003d _dict_with_usage_id(usages)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_32219ab1","line":1333,"updated":"2017-08-28 08:01:40.000000000","message":"-1: Shouldn\u0027t the locks be in place before calling _quota_reservations?","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"1bc293e58cb71179bf7ed4098eebeca9b7ab99e0","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"    with session.begin():"},{"line_number":1331,"context_line":"        reservation_records \u003d _quota_reservations("},{"line_number":1332,"context_line":"            session, context, reservations)"},{"line_number":1333,"context_line":"        usages \u003d _get_quota_usages("},{"line_number":1334,"context_line":"            context, session, project_id,"},{"line_number":1335,"context_line":"            resources\u003d{r.resource for r in reservation_records})"},{"line_number":1336,"context_line":"        usages \u003d _dict_with_usage_id(usages)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_15e8c879","line":1333,"in_reply_to":"7f287b81_32219ab1","updated":"2017-08-28 08:30:36.000000000","message":"We have two locks for both reservations and  quota_usage tables, so, do you think it matters whether we lock the quota_usage before the \nreservations or countary?","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f43b0729e14e97cef24b276c77959e5a04027ce6","unresolved":false,"context_lines":[{"line_number":1351,"context_line":"def reservation_rollback(context, reservations, project_id\u003dNone):"},{"line_number":1352,"context_line":"    session \u003d get_session()"},{"line_number":1353,"context_line":"    with session.begin():"},{"line_number":1354,"context_line":"        reservation_records \u003d _quota_reservations("},{"line_number":1355,"context_line":"            session, context, reservations)"},{"line_number":1356,"context_line":"        usages \u003d _get_quota_usages("},{"line_number":1357,"context_line":"            context, session, project_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_f2167255","line":1354,"updated":"2017-08-28 08:01:40.000000000","message":"ditto","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"80f413410671442669d5974960ff392264e3621d","unresolved":false,"context_lines":[{"line_number":1114,"context_line":"    if resources:"},{"line_number":1115,"context_line":"        query \u003d query.filter(models.QuotaUsage.resource.in_(list(resources)))"},{"line_number":1116,"context_line":"    rows \u003d query.order_by(models.QuotaUsage.id.asc()).\\"},{"line_number":1117,"context_line":"        with_lockmode(\u0027update\u0027).all()"},{"line_number":1118,"context_line":""},{"line_number":1119,"context_line":"    return {row.resource: row for row in rows}"},{"line_number":1120,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7f287b81_17e2e9a0","line":1117,"range":{"start_line":1117,"start_character":8,"end_line":1117,"end_character":21},"updated":"2017-08-29 12:12:28.000000000","message":"nit: This is deprecated since SQLA 0.9.0, we should be using `with_for_update` instead.","commit_id":"5ac8b997be0ebab62aaf6da639588819bf14deb0"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"80f413410671442669d5974960ff392264e3621d","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"    reservations \u003d model_query(context, models.Reservation,"},{"line_number":1326,"context_line":"                               read_deleted\u003d\"no\","},{"line_number":1327,"context_line":"                               session\u003dsession). \\"},{"line_number":1328,"context_line":"        filter(models.Reservation.uuid.in_(reservation_ids)). \\"},{"line_number":1329,"context_line":"        all()"},{"line_number":1330,"context_line":"    return {r.resource for r in reservations}"},{"line_number":1331,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7f287b81_9a1f205a","line":1328,"updated":"2017-08-29 12:12:28.000000000","message":"nit: it would be good to just retrieve the resource field if that\u0027s all we need.","commit_id":"5ac8b997be0ebab62aaf6da639588819bf14deb0"}],"cinder/db/sqlalchemy/migrate_repo/versions/106_add_project_resource_idx_for_quota_usage.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"f43b0729e14e97cef24b276c77959e5a04027ce6","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    meta \u003d MetaData()"},{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":"    index_name \u003d \u0027quota_usage_project_resource_idx\u0027"},{"line_number":24,"context_line":"    columns \u003d [\u0027project_id\u0027, \u0027resource\u0027]"},{"line_number":25,"context_line":"    if utils.index_exists_on_columns(migrate_engine, \u0027quota_usages\u0027, columns):"},{"line_number":26,"context_line":"        LOG.info("},{"line_number":27,"context_line":"            \u0027Skipped adding %s because an equivalent index already exists.\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_7202820d","line":24,"updated":"2017-08-28 08:01:40.000000000","message":"-1: We know project_id already has index","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"1bc293e58cb71179bf7ed4098eebeca9b7ab99e0","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    meta \u003d MetaData()"},{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":"    index_name \u003d \u0027quota_usage_project_resource_idx\u0027"},{"line_number":24,"context_line":"    columns \u003d [\u0027project_id\u0027, \u0027resource\u0027]"},{"line_number":25,"context_line":"    if utils.index_exists_on_columns(migrate_engine, \u0027quota_usages\u0027, columns):"},{"line_number":26,"context_line":"        LOG.info("},{"line_number":27,"context_line":"            \u0027Skipped adding %s because an equivalent index already exists.\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f287b81_559770ed","line":24,"in_reply_to":"7f287b81_7202820d","updated":"2017-08-28 08:30:36.000000000","message":"Not sure we can remove the \u0027project_id\u0027 index if we have this complex index.","commit_id":"b599b1b7a903db7407ae9240db493d4a0478beda"}],"cinder/tests/unit/test_db_api.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7e18d61fd8bef12432e07f0c35d98f907f3247f4","unresolved":false,"context_lines":[{"line_number":2218,"context_line":""},{"line_number":2219,"context_line":"    def test__get_reservation_resources(self):"},{"line_number":2220,"context_line":"        reservations \u003d _quota_reserve(self.ctxt, \u0027project1\u0027)"},{"line_number":2221,"context_line":"        expected \u003d sorted([\u0027volumes\u0027, \u0027gigabytes\u0027])"},{"line_number":2222,"context_line":"        self.assertEqual("},{"line_number":2223,"context_line":"            expected, sorted(sqlalchemy_api._get_reservation_resources("},{"line_number":2224,"context_line":"                sqlalchemy_api.get_session(), self.ctxt, reservations)))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_0e6632c2","line":2221,"updated":"2017-08-30 12:18:43.000000000","message":"nit: Can\u0027t we just sort it out ourselves here?   ;-)","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"faf403f08bb697d3000f9fd718d929ad4cb55187","unresolved":false,"context_lines":[{"line_number":2218,"context_line":""},{"line_number":2219,"context_line":"    def test__get_reservation_resources(self):"},{"line_number":2220,"context_line":"        reservations \u003d _quota_reserve(self.ctxt, \u0027project1\u0027)"},{"line_number":2221,"context_line":"        expected \u003d sorted([\u0027volumes\u0027, \u0027gigabytes\u0027])"},{"line_number":2222,"context_line":"        self.assertEqual("},{"line_number":2223,"context_line":"            expected, sorted(sqlalchemy_api._get_reservation_resources("},{"line_number":2224,"context_line":"                sqlalchemy_api.get_session(), self.ctxt, reservations)))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_619dc764","line":2221,"in_reply_to":"7f287b81_0e6632c2","updated":"2017-08-30 13:00:53.000000000","message":"Thanks!","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7e18d61fd8bef12432e07f0c35d98f907f3247f4","unresolved":false,"context_lines":[{"line_number":2221,"context_line":"        expected \u003d sorted([\u0027volumes\u0027, \u0027gigabytes\u0027])"},{"line_number":2222,"context_line":"        self.assertEqual("},{"line_number":2223,"context_line":"            expected, sorted(sqlalchemy_api._get_reservation_resources("},{"line_number":2224,"context_line":"                sqlalchemy_api.get_session(), self.ctxt, reservations)))"},{"line_number":2225,"context_line":""},{"line_number":2226,"context_line":"    def test_reservation_commit(self):"},{"line_number":2227,"context_line":"        reservations \u003d _quota_reserve(self.ctxt, \u0027project1\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_4efc3ab4","line":2224,"updated":"2017-08-30 12:18:43.000000000","message":"-1: Please split the actual call on a different line:\n\n    result \u003d sqlalchemy_api...\n\n    self.assertEqual(expected, sorted(result))","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"faf403f08bb697d3000f9fd718d929ad4cb55187","unresolved":false,"context_lines":[{"line_number":2221,"context_line":"        expected \u003d sorted([\u0027volumes\u0027, \u0027gigabytes\u0027])"},{"line_number":2222,"context_line":"        self.assertEqual("},{"line_number":2223,"context_line":"            expected, sorted(sqlalchemy_api._get_reservation_resources("},{"line_number":2224,"context_line":"                sqlalchemy_api.get_session(), self.ctxt, reservations)))"},{"line_number":2225,"context_line":""},{"line_number":2226,"context_line":"    def test_reservation_commit(self):"},{"line_number":2227,"context_line":"        reservations \u003d _quota_reserve(self.ctxt, \u0027project1\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_21921f4d","line":2224,"in_reply_to":"7f287b81_4efc3ab4","updated":"2017-08-30 13:00:53.000000000","message":"Done","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7e18d61fd8bef12432e07f0c35d98f907f3247f4","unresolved":false,"context_lines":[{"line_number":2439,"context_line":"        quota_usage \u003d sqlalchemy_api._get_quota_usages("},{"line_number":2440,"context_line":"            self.ctxt, session, \u0027project1\u0027)"},{"line_number":2441,"context_line":""},{"line_number":2442,"context_line":"        self.assertEqual(sorted([\u0027gigabytes\u0027, \u0027volumes\u0027]),"},{"line_number":2443,"context_line":"                         sorted(quota_usage.keys()))"},{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        quota_usage \u003d sqlalchemy_api._get_quota_usages("}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_0ed99255","line":2442,"updated":"2017-08-30 12:18:43.000000000","message":"nit: why not sort it manually?","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"faf403f08bb697d3000f9fd718d929ad4cb55187","unresolved":false,"context_lines":[{"line_number":2439,"context_line":"        quota_usage \u003d sqlalchemy_api._get_quota_usages("},{"line_number":2440,"context_line":"            self.ctxt, session, \u0027project1\u0027)"},{"line_number":2441,"context_line":""},{"line_number":2442,"context_line":"        self.assertEqual(sorted([\u0027gigabytes\u0027, \u0027volumes\u0027]),"},{"line_number":2443,"context_line":"                         sorted(quota_usage.keys()))"},{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        quota_usage \u003d sqlalchemy_api._get_quota_usages("}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_a1a5efa3","line":2442,"in_reply_to":"7f287b81_0ed99255","updated":"2017-08-30 13:00:53.000000000","message":"Done","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7e18d61fd8bef12432e07f0c35d98f907f3247f4","unresolved":false,"context_lines":[{"line_number":2442,"context_line":"        self.assertEqual(sorted([\u0027gigabytes\u0027, \u0027volumes\u0027]),"},{"line_number":2443,"context_line":"                         sorted(quota_usage.keys()))"},{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        quota_usage \u003d sqlalchemy_api._get_quota_usages("},{"line_number":2446,"context_line":"            self.ctxt, session, \u0027project1\u0027, resources\u003d[\u0027volumes\u0027])"},{"line_number":2447,"context_line":""},{"line_number":2448,"context_line":"        self.assertEqual([\u0027volumes\u0027], quota_usage.keys())"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_8ee4620e","line":2445,"updated":"2017-08-30 12:18:43.000000000","message":"-1: Split in a different test","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"faf403f08bb697d3000f9fd718d929ad4cb55187","unresolved":false,"context_lines":[{"line_number":2442,"context_line":"        self.assertEqual(sorted([\u0027gigabytes\u0027, \u0027volumes\u0027]),"},{"line_number":2443,"context_line":"                         sorted(quota_usage.keys()))"},{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        quota_usage \u003d sqlalchemy_api._get_quota_usages("},{"line_number":2446,"context_line":"            self.ctxt, session, \u0027project1\u0027, resources\u003d[\u0027volumes\u0027])"},{"line_number":2447,"context_line":""},{"line_number":2448,"context_line":"        self.assertEqual([\u0027volumes\u0027], quota_usage.keys())"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_2109ff94","line":2445,"in_reply_to":"7f287b81_8ee4620e","updated":"2017-08-30 13:00:53.000000000","message":"Done","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7e18d61fd8bef12432e07f0c35d98f907f3247f4","unresolved":false,"context_lines":[{"line_number":2445,"context_line":"        quota_usage \u003d sqlalchemy_api._get_quota_usages("},{"line_number":2446,"context_line":"            self.ctxt, session, \u0027project1\u0027, resources\u003d[\u0027volumes\u0027])"},{"line_number":2447,"context_line":""},{"line_number":2448,"context_line":"        self.assertEqual([\u0027volumes\u0027], quota_usage.keys())"},{"line_number":2449,"context_line":""},{"line_number":2450,"context_line":"    @mock.patch(\u0027oslo_utils.timeutils.utcnow\u0027, return_value\u003dUTC_NOW)"},{"line_number":2451,"context_line":"    def test_quota_destroy(self, utcnow_mock):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_ae803ef6","line":2448,"range":{"start_line":2448,"start_character":37,"end_line":2448,"end_character":56},"updated":"2017-08-30 12:18:43.000000000","message":"-1: For python 3: `list(quota_usage.keys())`","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"faf403f08bb697d3000f9fd718d929ad4cb55187","unresolved":false,"context_lines":[{"line_number":2445,"context_line":"        quota_usage \u003d sqlalchemy_api._get_quota_usages("},{"line_number":2446,"context_line":"            self.ctxt, session, \u0027project1\u0027, resources\u003d[\u0027volumes\u0027])"},{"line_number":2447,"context_line":""},{"line_number":2448,"context_line":"        self.assertEqual([\u0027volumes\u0027], quota_usage.keys())"},{"line_number":2449,"context_line":""},{"line_number":2450,"context_line":"    @mock.patch(\u0027oslo_utils.timeutils.utcnow\u0027, return_value\u003dUTC_NOW)"},{"line_number":2451,"context_line":"    def test_quota_destroy(self, utcnow_mock):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7f287b81_010cc3a2","line":2448,"range":{"start_line":2448,"start_character":37,"end_line":2448,"end_character":56},"in_reply_to":"7f287b81_ae803ef6","updated":"2017-08-30 13:00:53.000000000","message":"Done","commit_id":"b9ea296408af73b2e526989950c700111c93f51c"}]}
