)]}'
{"nova/db/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"59893dbeb16e02802de5c1b70db81f9f0f2e1ca3","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"                                   **kwargs)"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"###################"},{"line_number":1155,"context_line":"def quota_usage_refresh(context, resources, keys, until_refresh, max_age,"},{"line_number":1156,"context_line":"                        project_id\u003dNone, user_id\u003dNone):"},{"line_number":1157,"context_line":"    \"\"\"Refresh the quota usages.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_44cf8855","line":1154,"updated":"2016-04-01 14:42:01.000000000","message":"nit: move quota_usage_refresh into the group above this marker line, the APIs are grouped by table usage, so the group above is quota usage, the group you have this in now are for reservations.","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"30e635b13c572aa414a7d0f2bc518334ecd68a54","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"                                   **kwargs)"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"###################"},{"line_number":1155,"context_line":"def quota_usage_refresh(context, resources, keys, until_refresh, max_age,"},{"line_number":1156,"context_line":"                        project_id\u003dNone, user_id\u003dNone):"},{"line_number":1157,"context_line":"    \"\"\"Refresh the quota usages.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_88924ef4","line":1154,"in_reply_to":"ba0121b8_44cf8855","updated":"2016-04-01 16:29:16.000000000","message":"Done","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"59893dbeb16e02802de5c1b70db81f9f0f2e1ca3","unresolved":false,"context_lines":[{"line_number":1154,"context_line":"###################"},{"line_number":1155,"context_line":"def quota_usage_refresh(context, resources, keys, until_refresh, max_age,"},{"line_number":1156,"context_line":"                        project_id\u003dNone, user_id\u003dNone):"},{"line_number":1157,"context_line":"    \"\"\"Refresh the quota usages.\"\"\""},{"line_number":1158,"context_line":"    return IMPL.quota_usage_refresh(context, resources, keys, until_refresh,"},{"line_number":1159,"context_line":"                              max_age, project_id\u003dproject_id, user_id\u003duser_id)"},{"line_number":1160,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_07111204","line":1157,"updated":"2016-04-01 14:42:01.000000000","message":"Let\u0027s take this opportunity to provide a better docstring here, by actually documenting the parameters. For example, I don\u0027t know what \u0027keys\u0027 are here. For quota_reserve it\u0027s the deltas.","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"30e635b13c572aa414a7d0f2bc518334ecd68a54","unresolved":false,"context_lines":[{"line_number":1154,"context_line":"###################"},{"line_number":1155,"context_line":"def quota_usage_refresh(context, resources, keys, until_refresh, max_age,"},{"line_number":1156,"context_line":"                        project_id\u003dNone, user_id\u003dNone):"},{"line_number":1157,"context_line":"    \"\"\"Refresh the quota usages.\"\"\""},{"line_number":1158,"context_line":"    return IMPL.quota_usage_refresh(context, resources, keys, until_refresh,"},{"line_number":1159,"context_line":"                              max_age, project_id\u003dproject_id, user_id\u003duser_id)"},{"line_number":1160,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_688d3ad2","line":1157,"in_reply_to":"ba0121b8_07111204","updated":"2016-04-01 16:29:16.000000000","message":"Done","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":5441,"name":"Andrew Laski","email":"andrew@lascii.com","username":"alaski"},"change_message_id":"70a5ff33210e71afb9e3e6bfc0629136b144691c","unresolved":false,"context_lines":[{"line_number":1147,"context_line":""},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"###################"},{"line_number":1150,"context_line":""},{"line_number":1151,"context_line":""},{"line_number":1152,"context_line":"def quota_reserve(context, resources, quotas, user_quotas, deltas, expire,"},{"line_number":1153,"context_line":"                  until_refresh, max_age, project_id\u003dNone, user_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_7803d40d","side":"PARENT","line":1150,"updated":"2016-04-06 16:13:58.000000000","message":"Frowny face at the unnecessary whitespace changes.","commit_id":"7ba44cbb9969c1dd31c6cec26c13f98ceee7c746"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"62ce8d97968e59e8ea6752c9abe2e763d82e2b1c","unresolved":false,"context_lines":[{"line_number":1147,"context_line":""},{"line_number":1148,"context_line":""},{"line_number":1149,"context_line":"###################"},{"line_number":1150,"context_line":""},{"line_number":1151,"context_line":""},{"line_number":1152,"context_line":"def quota_reserve(context, resources, quotas, user_quotas, deltas, expire,"},{"line_number":1153,"context_line":"                  until_refresh, max_age, project_id\u003dNone, user_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_ccbb0fe4","side":"PARENT","line":1150,"in_reply_to":"9a061dce_7803d40d","updated":"2016-04-06 18:27:49.000000000","message":"Done. Turn that frown upside-down","commit_id":"7ba44cbb9969c1dd31c6cec26c13f98ceee7c746"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fc99357af784824e919564f804a3addac5f2445","unresolved":false,"context_lines":[{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"def quota_get_per_project_resources():"},{"line_number":1086,"context_line":"    \"\"\"Retrieve the per-project resource names.\"\"\""},{"line_number":1087,"context_line":"    return IMPL.quota_get_per_project_resources()"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_aac87b23","line":1086,"updated":"2016-04-05 19:23:07.000000000","message":"Would be helpful to document what the return value is, i.e. a list of resource names whose quotas are calculated per-project, rather than per-user.","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"62ce8d97968e59e8ea6752c9abe2e763d82e2b1c","unresolved":false,"context_lines":[{"line_number":1083,"context_line":""},{"line_number":1084,"context_line":""},{"line_number":1085,"context_line":"def quota_get_per_project_resources():"},{"line_number":1086,"context_line":"    \"\"\"Retrieve the per-project resource names.\"\"\""},{"line_number":1087,"context_line":"    return IMPL.quota_get_per_project_resources()"},{"line_number":1088,"context_line":""},{"line_number":1089,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_ec0b7322","line":1086,"in_reply_to":"9a061dce_aac87b23","updated":"2016-04-06 18:27:49.000000000","message":"Done","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fc99357af784824e919564f804a3addac5f2445","unresolved":false,"context_lines":[{"line_number":1156,"context_line":"    \"\"\"Refresh the quota usages."},{"line_number":1157,"context_line":""},{"line_number":1158,"context_line":"    :param context: The request context, for access checks."},{"line_number":1159,"context_line":"    :param resources: A dictionary of the registered resources."},{"line_number":1160,"context_line":"    :param keys: Names of the resources whose usage is to be refreshed."},{"line_number":1161,"context_line":"    :param until_refresh:  The until_refresh configuration value."},{"line_number":1162,"context_line":"    :param max_age:  The max_age configuration value."}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_4a1d5fbc","line":1159,"updated":"2016-04-05 19:23:07.000000000","message":"OK, this is the quota engine resources which gets populated in nova.quotas.QUOTAS.register_resources. That\u0027s probably an implementation detail we don\u0027t need here, I just had to look it up because I never remember what this dictionary is.","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"}],"nova/db/sqlalchemy/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"59893dbeb16e02802de5c1b70db81f9f0f2e1ca3","unresolved":false,"context_lines":[{"line_number":3782,"context_line":"def quota_reserve(context, resources, project_quotas, user_quotas, deltas,"},{"line_number":3783,"context_line":"                  expire, until_refresh, max_age, project_id\u003dNone,"},{"line_number":3784,"context_line":"                  user_id\u003dNone):"},{"line_number":3785,"context_line":"    elevated \u003d context.elevated()"},{"line_number":3786,"context_line":""},{"line_number":3787,"context_line":"    if project_id is None:"},{"line_number":3788,"context_line":"        project_id \u003d context.project_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_a7bdc603","side":"PARENT","line":3785,"updated":"2016-04-01 14:42:01.000000000","message":"You\u0027ve lost this now. I see that you\u0027re doing it in the new private common method, but it is a change for how the rest of this method works, i.e. the rest of the method is no longer using an elevated context. Honestly I\u0027m not sure if that\u0027s a problem, but it\u0027s a change, and with a quota code refactor I\u0027m not sure if we should be doing it.","commit_id":"7ba44cbb9969c1dd31c6cec26c13f98ceee7c746"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"30e635b13c572aa414a7d0f2bc518334ecd68a54","unresolved":false,"context_lines":[{"line_number":3782,"context_line":"def quota_reserve(context, resources, project_quotas, user_quotas, deltas,"},{"line_number":3783,"context_line":"                  expire, until_refresh, max_age, project_id\u003dNone,"},{"line_number":3784,"context_line":"                  user_id\u003dNone):"},{"line_number":3785,"context_line":"    elevated \u003d context.elevated()"},{"line_number":3786,"context_line":""},{"line_number":3787,"context_line":"    if project_id is None:"},{"line_number":3788,"context_line":"        project_id \u003d context.project_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_c833a612","side":"PARENT","line":3785,"in_reply_to":"ba0121b8_a7bdc603","updated":"2016-04-01 16:29:16.000000000","message":"Done","commit_id":"7ba44cbb9969c1dd31c6cec26c13f98ceee7c746"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"6b4dcf68323e9884e31ce596c656ea16540c555c","unresolved":false,"context_lines":[{"line_number":3782,"context_line":"def quota_reserve(context, resources, project_quotas, user_quotas, deltas,"},{"line_number":3783,"context_line":"                  expire, until_refresh, max_age, project_id\u003dNone,"},{"line_number":3784,"context_line":"                  user_id\u003dNone):"},{"line_number":3785,"context_line":"    elevated \u003d context.elevated()"},{"line_number":3786,"context_line":""},{"line_number":3787,"context_line":"    if project_id is None:"},{"line_number":3788,"context_line":"        project_id \u003d context.project_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_dbb7ee82","side":"PARENT","line":3785,"in_reply_to":"ba0121b8_c833a612","updated":"2016-04-01 16:44:21.000000000","message":"Re-reading the code:  All the usages of elevated in this method moved to the common function. If I put this back here, then I would need to pass both context and elevated to the common function.","commit_id":"7ba44cbb9969c1dd31c6cec26c13f98ceee7c746"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"639ff8e4aacc33dbefbf6f115832e58e7278f423","unresolved":false,"context_lines":[{"line_number":3782,"context_line":"def quota_reserve(context, resources, project_quotas, user_quotas, deltas,"},{"line_number":3783,"context_line":"                  expire, until_refresh, max_age, project_id\u003dNone,"},{"line_number":3784,"context_line":"                  user_id\u003dNone):"},{"line_number":3785,"context_line":"    elevated \u003d context.elevated()"},{"line_number":3786,"context_line":""},{"line_number":3787,"context_line":"    if project_id is None:"},{"line_number":3788,"context_line":"        project_id \u003d context.project_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_4a69df8a","side":"PARENT","line":3785,"in_reply_to":"ba0121b8_dbb7ee82","updated":"2016-04-05 18:55:44.000000000","message":"Good point, I figured elevated was used throughout this method but it\u0027s only the common one.","commit_id":"7ba44cbb9969c1dd31c6cec26c13f98ceee7c746"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"59893dbeb16e02802de5c1b70db81f9f0f2e1ca3","unresolved":false,"context_lines":[{"line_number":3742,"context_line":"def _refresh_quota_usages_if_needed(user_usages, context, resources, keys,"},{"line_number":3743,"context_line":"                                    project_id, user_id, until_refresh,"},{"line_number":3744,"context_line":"                                    max_age, force_refresh\u003dFalse):"},{"line_number":3745,"context_line":"    elevated \u003d context.elevated()"},{"line_number":3746,"context_line":""},{"line_number":3747,"context_line":"    # Handle usage refresh"},{"line_number":3748,"context_line":"    work \u003d set(keys)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_a7aca68c","line":3745,"range":{"start_line":3745,"start_character":4,"end_line":3745,"end_character":33},"updated":"2016-04-01 14:42:01.000000000","message":"We should probably leave this in the calling methods like it was before.","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"30e635b13c572aa414a7d0f2bc518334ecd68a54","unresolved":false,"context_lines":[{"line_number":3742,"context_line":"def _refresh_quota_usages_if_needed(user_usages, context, resources, keys,"},{"line_number":3743,"context_line":"                                    project_id, user_id, until_refresh,"},{"line_number":3744,"context_line":"                                    max_age, force_refresh\u003dFalse):"},{"line_number":3745,"context_line":"    elevated \u003d context.elevated()"},{"line_number":3746,"context_line":""},{"line_number":3747,"context_line":"    # Handle usage refresh"},{"line_number":3748,"context_line":"    work \u003d set(keys)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_a8363200","line":3745,"range":{"start_line":3745,"start_character":4,"end_line":3745,"end_character":33},"in_reply_to":"ba0121b8_a7aca68c","updated":"2016-04-01 16:29:16.000000000","message":"Done","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"8f7333d39153c9edf4d97214341f5041ef619210","unresolved":false,"context_lines":[{"line_number":3742,"context_line":"def _refresh_quota_usages_if_needed(user_usages, context, resources, keys,"},{"line_number":3743,"context_line":"                                    project_id, user_id, until_refresh,"},{"line_number":3744,"context_line":"                                    max_age, force_refresh\u003dFalse):"},{"line_number":3745,"context_line":"    elevated \u003d context.elevated()"},{"line_number":3746,"context_line":""},{"line_number":3747,"context_line":"    # Handle usage refresh"},{"line_number":3748,"context_line":"    work \u003d set(keys)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_1e3dd42a","line":3745,"range":{"start_line":3745,"start_character":4,"end_line":3745,"end_character":33},"in_reply_to":"ba0121b8_a8363200","updated":"2016-04-01 16:58:01.000000000","message":"I needed to keep this here. The only places elevated was used in quota_reserve were moved here.  But context is also used here.","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"59893dbeb16e02802de5c1b70db81f9f0f2e1ca3","unresolved":false,"context_lines":[{"line_number":3844,"context_line":"    # Force refresh of the usages"},{"line_number":3845,"context_line":"    _refresh_quota_usages_if_needed(user_usages, context, resources, keys,"},{"line_number":3846,"context_line":"                                    project_id, user_id, until_refresh,"},{"line_number":3847,"context_line":"                                    max_age, force_refresh \u003d True)"},{"line_number":3848,"context_line":""},{"line_number":3849,"context_line":""},{"line_number":3850,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_874fe232","line":3847,"range":{"start_line":3847,"start_character":58,"end_line":3847,"end_character":61},"updated":"2016-04-01 14:42:01.000000000","message":"remove whitespaces around \u003d","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"30e635b13c572aa414a7d0f2bc518334ecd68a54","unresolved":false,"context_lines":[{"line_number":3844,"context_line":"    # Force refresh of the usages"},{"line_number":3845,"context_line":"    _refresh_quota_usages_if_needed(user_usages, context, resources, keys,"},{"line_number":3846,"context_line":"                                    project_id, user_id, until_refresh,"},{"line_number":3847,"context_line":"                                    max_age, force_refresh \u003d True)"},{"line_number":3848,"context_line":""},{"line_number":3849,"context_line":""},{"line_number":3850,"context_line":"@require_context"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_083abee6","line":3847,"range":{"start_line":3847,"start_character":58,"end_line":3847,"end_character":61},"in_reply_to":"ba0121b8_874fe232","updated":"2016-04-01 16:29:16.000000000","message":"Done","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"}],"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":"59893dbeb16e02802de5c1b70db81f9f0f2e1ca3","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                    datetime.timedelta(days\u003d1), project_id, user_id)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"def _quota_refresh(context, project_id, user_id, keys):"},{"line_number":136,"context_line":"    \"\"\"Refresh the in_use count on the QuotaUsage objects."},{"line_number":137,"context_line":"       The QuotaUsage objects are created if they don\u0027t exist."},{"line_number":138,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_a7c30637","line":135,"range":{"start_line":135,"start_character":4,"end_line":135,"end_character":18},"updated":"2016-04-01 14:42:01.000000000","message":"Can this live in the RefreshUsageTestCase? I don\u0027t understand why it\u0027s global like this if it\u0027s only used in that test class.","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"30e635b13c572aa414a7d0f2bc518334ecd68a54","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                    datetime.timedelta(days\u003d1), project_id, user_id)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"def _quota_refresh(context, project_id, user_id, keys):"},{"line_number":136,"context_line":"    \"\"\"Refresh the in_use count on the QuotaUsage objects."},{"line_number":137,"context_line":"       The QuotaUsage objects are created if they don\u0027t exist."},{"line_number":138,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_7b8fc274","line":135,"range":{"start_line":135,"start_character":4,"end_line":135,"end_character":18},"in_reply_to":"ba0121b8_a7c30637","updated":"2016-04-01 16:29:16.000000000","message":"Done","commit_id":"15fb184909e65a74631564ee3e4cd196083e0e91"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fc99357af784824e919564f804a3addac5f2445","unresolved":false,"context_lines":[{"line_number":1616,"context_line":"                          {\u0027key\u0027: \u0027value\u0027}, True)"},{"line_number":1617,"context_line":""},{"line_number":1618,"context_line":""},{"line_number":1619,"context_line":"class RefreshUsageTestCase(test.TestCase, ModelsObjectComparatorMixin):"},{"line_number":1620,"context_line":"    \"\"\"Tests for the db.api.quota_usage_refresh method. \"\"\""},{"line_number":1621,"context_line":""},{"line_number":1622,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_75e92414","line":1619,"range":{"start_line":1619,"start_character":42,"end_line":1619,"end_character":69},"updated":"2016-04-05 19:23:07.000000000","message":"I don\u0027t see you actually using any of the assertion methods from this....","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"62ce8d97968e59e8ea6752c9abe2e763d82e2b1c","unresolved":false,"context_lines":[{"line_number":1616,"context_line":"                          {\u0027key\u0027: \u0027value\u0027}, True)"},{"line_number":1617,"context_line":""},{"line_number":1618,"context_line":""},{"line_number":1619,"context_line":"class RefreshUsageTestCase(test.TestCase, ModelsObjectComparatorMixin):"},{"line_number":1620,"context_line":"    \"\"\"Tests for the db.api.quota_usage_refresh method. \"\"\""},{"line_number":1621,"context_line":""},{"line_number":1622,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_266c6c34","line":1619,"range":{"start_line":1619,"start_character":42,"end_line":1619,"end_character":69},"in_reply_to":"9a061dce_75e92414","updated":"2016-04-06 18:27:49.000000000","message":"Copy/paste error","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fc99357af784824e919564f804a3addac5f2445","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"        self.project_id \u003d \u0027project1\u0027"},{"line_number":1626,"context_line":"        self.user_id \u003d \u0027user1\u0027"},{"line_number":1627,"context_line":""},{"line_number":1628,"context_line":"    def _quota_refresh(self, context, project_id, user_id, keys):"},{"line_number":1629,"context_line":"        \"\"\"Refresh the in_use count on the QuotaUsage objects."},{"line_number":1630,"context_line":"           The QuotaUsage objects are created if they don\u0027t exist."},{"line_number":1631,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_953b189c","line":1628,"range":{"start_line":1628,"start_character":29,"end_line":1628,"end_character":57},"updated":"2016-04-05 19:23:07.000000000","message":"You don\u0027t need to pass these in if they are always just going to be the member variables you set in setUp.","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"62ce8d97968e59e8ea6752c9abe2e763d82e2b1c","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"        self.project_id \u003d \u0027project1\u0027"},{"line_number":1626,"context_line":"        self.user_id \u003d \u0027user1\u0027"},{"line_number":1627,"context_line":""},{"line_number":1628,"context_line":"    def _quota_refresh(self, context, project_id, user_id, keys):"},{"line_number":1629,"context_line":"        \"\"\"Refresh the in_use count on the QuotaUsage objects."},{"line_number":1630,"context_line":"           The QuotaUsage objects are created if they don\u0027t exist."},{"line_number":1631,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_06b4c87f","line":1628,"range":{"start_line":1628,"start_character":29,"end_line":1628,"end_character":57},"in_reply_to":"9a061dce_953b189c","updated":"2016-04-06 18:27:49.000000000","message":"Done","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fc99357af784824e919564f804a3addac5f2445","unresolved":false,"context_lines":[{"line_number":1647,"context_line":"            sync_name \u003d \u0027_sync_%s\u0027 % resource"},{"line_number":1648,"context_line":"            resources[resource] \u003d quota.ReservableResource("},{"line_number":1649,"context_line":"                resource, sync_name, \u0027quota_res_%d\u0027 % i)"},{"line_number":1650,"context_line":"            setattr(sqlalchemy_api, sync_name, get_sync(resource, i + 1))"},{"line_number":1651,"context_line":"            sqlalchemy_api.QUOTA_SYNC_FUNCTIONS[sync_name] \u003d getattr("},{"line_number":1652,"context_line":"                sqlalchemy_api, sync_name)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"        db.quota_usage_refresh(context, resources, keys, 3, 0,"},{"line_number":1655,"context_line":"                               project_id, user_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_15f6e8d6","line":1652,"range":{"start_line":1650,"start_character":12,"end_line":1652,"end_character":42},"updated":"2016-04-05 19:23:07.000000000","message":"I\u0027ve always disliked this in these tests, but I don\u0027t have a better solution, unless we mocked out sqlalchemy_api.QUOTA_SYNC_FUNCTIONS.","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fc99357af784824e919564f804a3addac5f2445","unresolved":false,"context_lines":[{"line_number":1651,"context_line":"            sqlalchemy_api.QUOTA_SYNC_FUNCTIONS[sync_name] \u003d getattr("},{"line_number":1652,"context_line":"                sqlalchemy_api, sync_name)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"        db.quota_usage_refresh(context, resources, keys, 3, 0,"},{"line_number":1655,"context_line":"                               project_id, user_id)"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"    def _compare_resource_usages(self, keys, expected, project_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_b5d45c20","line":1654,"range":{"start_line":1654,"start_character":57,"end_line":1654,"end_character":61},"updated":"2016-04-05 19:23:07.000000000","message":"Let\u0027s use kwargs for these so it\u0027s more clear from just looking at the test code, then I don\u0027t have to memorize the signature for the actual method.","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"62ce8d97968e59e8ea6752c9abe2e763d82e2b1c","unresolved":false,"context_lines":[{"line_number":1651,"context_line":"            sqlalchemy_api.QUOTA_SYNC_FUNCTIONS[sync_name] \u003d getattr("},{"line_number":1652,"context_line":"                sqlalchemy_api, sync_name)"},{"line_number":1653,"context_line":""},{"line_number":1654,"context_line":"        db.quota_usage_refresh(context, resources, keys, 3, 0,"},{"line_number":1655,"context_line":"                               project_id, user_id)"},{"line_number":1656,"context_line":""},{"line_number":1657,"context_line":"    def _compare_resource_usages(self, keys, expected, project_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_a90a0d88","line":1654,"range":{"start_line":1654,"start_character":57,"end_line":1654,"end_character":61},"in_reply_to":"9a061dce_b5d45c20","updated":"2016-04-06 18:27:49.000000000","message":"Done","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2fc99357af784824e919564f804a3addac5f2445","unresolved":false,"context_lines":[{"line_number":1672,"context_line":"        keys \u003d [\u0027fixed_ips\u0027, \u0027floating_ips\u0027]"},{"line_number":1673,"context_line":"        self._quota_refresh(self.ctxt, self.project_id, self.user_id, keys)"},{"line_number":1674,"context_line":"        expected \u003d {\u0027project_id\u0027: self.project_id,"},{"line_number":1675,"context_line":"                    \u0027user_id\u0027: None,"},{"line_number":1676,"context_line":"                    \u0027fixed_ips\u0027: {\u0027in_use\u0027: 3, \u0027reserved\u0027: 0,"},{"line_number":1677,"context_line":"                                  \u0027until_refresh\u0027: 3},"},{"line_number":1678,"context_line":"                    \u0027floating_ips\u0027: {\u0027in_use\u0027: 4, \u0027reserved\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_15926857","line":1675,"updated":"2016-04-05 19:23:07.000000000","message":"user_id is None because fixed_ips and floating_ips are per-project resources, might be a good comment in here.","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"},{"author":{"_account_id":17139,"name":"Chuck Carmack","email":"carmack@us.ibm.com","username":"ccarmack"},"change_message_id":"62ce8d97968e59e8ea6752c9abe2e763d82e2b1c","unresolved":false,"context_lines":[{"line_number":1672,"context_line":"        keys \u003d [\u0027fixed_ips\u0027, \u0027floating_ips\u0027]"},{"line_number":1673,"context_line":"        self._quota_refresh(self.ctxt, self.project_id, self.user_id, keys)"},{"line_number":1674,"context_line":"        expected \u003d {\u0027project_id\u0027: self.project_id,"},{"line_number":1675,"context_line":"                    \u0027user_id\u0027: None,"},{"line_number":1676,"context_line":"                    \u0027fixed_ips\u0027: {\u0027in_use\u0027: 3, \u0027reserved\u0027: 0,"},{"line_number":1677,"context_line":"                                  \u0027until_refresh\u0027: 3},"},{"line_number":1678,"context_line":"                    \u0027floating_ips\u0027: {\u0027in_use\u0027: 4, \u0027reserved\u0027: 0,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a061dce_e9ea4573","line":1675,"in_reply_to":"9a061dce_15926857","updated":"2016-04-06 18:27:49.000000000","message":"Done","commit_id":"8729a273c7a8dfd9e7d23dc7c356eabcd721b240"}]}
