)]}'
{"api-ref/source/os-quota-sets.inc":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"53b6f60dc7b4de8fd9afba9c50c9ceaafe35350e","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"- 400 - BadRequest - the tenant_id is not valid in your cloud, perhaps"},{"line_number":77,"context_line":"  because it was typoed."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"da36d5c6_7e302202","line":76,"updated":"2017-02-21 20:25:40.000000000","message":"nit: we can get a 400 for another reason here, I\u0027m not sure if we want to detail that reason or not though.","commit_id":"e938492c6664bd38af20f68164dcbfa0ad8ed947"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"74d7b7453a6787e3775ecb1bb4ecd8b30ccf1444","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"- 400 - BadRequest - the tenant_id is not valid in your cloud, perhaps"},{"line_number":77,"context_line":"  because it was typoed."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"da36d5c6_fbbfadf8","line":76,"in_reply_to":"da36d5c6_209593dd","updated":"2017-02-22 12:18:32.000000000","message":"I wouldn\u0027t talk about not backporting it, but we could probably say something like, \"Starting in the 16.0.0 Pike release...\" or something like that.","commit_id":"e938492c6664bd38af20f68164dcbfa0ad8ed947"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b9d2bf84ac5c74b6c43ee705444f0f27b4374b84","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"- 400 - BadRequest - the tenant_id is not valid in your cloud, perhaps"},{"line_number":77,"context_line":"  because it was typoed."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"da36d5c6_78457615","line":76,"in_reply_to":"da36d5c6_3b322511","updated":"2017-02-22 16:44:10.000000000","message":"Alex, I wasn\u0027t planning on backporting this.\n\nAlso, after talking with Sean, since this is the API it makes less sense to say \"Starting in Pike\" since a user shouldn\u0027t know or care which level of code the cloud is running - even though this is an admin API by default. But I\u0027m OK just not saying anything about the specific release.","commit_id":"e938492c6664bd38af20f68164dcbfa0ad8ed947"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e10546a623c715a02712c7fd27b9a237cfda12d8","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"- 400 - BadRequest - the tenant_id is not valid in your cloud, perhaps"},{"line_number":77,"context_line":"  because it was typoed."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"da36d5c6_28d2c35c","line":76,"in_reply_to":"da36d5c6_78457615","updated":"2017-02-22 19:56:39.000000000","message":"ok, that\u0027s fair.","commit_id":"e938492c6664bd38af20f68164dcbfa0ad8ed947"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"9908d8ff822afb0e9c9f23cea18a84294024c9cf","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"- 400 - BadRequest - the tenant_id is not valid in your cloud, perhaps"},{"line_number":77,"context_line":"  because it was typoed."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"da36d5c6_209593dd","line":76,"in_reply_to":"da36d5c6_7e302202","updated":"2017-02-22 11:16:53.000000000","message":"Should we mention that there isn\u0027t any validation before, then we fix it without Microversion in Pike release, and this fix won\u0027t backport to older release? I know the release note will talk about that. But I afraid people use the API wrong way before, and hope they can get answer from the API-ref easily.","commit_id":"e938492c6664bd38af20f68164dcbfa0ad8ed947"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"55a9ef561ddd81628d77add4037e4c84a7849040","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"Error response codes: badRequest(400), unauthorized(401), forbidden(403)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"- 400 - BadRequest - the tenant_id is not valid in your cloud, perhaps"},{"line_number":77,"context_line":"  because it was typoed."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"Request"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"da36d5c6_3b322511","line":76,"in_reply_to":"da36d5c6_fbbfadf8","updated":"2017-02-22 12:41:37.000000000","message":"yeah, agree with that. So for the fix which back-port to stable release, we will talk about the release number of stable release also? just a question, it isn\u0027t the case for this fix.","commit_id":"e938492c6664bd38af20f68164dcbfa0ad8ed947"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"53b6f60dc7b4de8fd9afba9c50c9ceaafe35350e","unresolved":false,"context_lines":[{"line_number":171,"context_line":""},{"line_number":172,"context_line":"Normal response codes: 200"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"Error response codes: unauthorized(401), forbidden(403)"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"Request"},{"line_number":177,"context_line":"-------"}],"source_content_type":"text/x-c++src","patch_set":12,"id":"da36d5c6_be637a19","line":174,"updated":"2017-02-21 20:25:40.000000000","message":"Missing 400 here right?","commit_id":"e938492c6664bd38af20f68164dcbfa0ad8ed947"}],"nova/api/openstack/compute/quota_sets.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"89649e7385ae45aafc0c4f981f39d011160b3229","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def delete(self, req, id):"},{"line_number":225,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":226,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027delete\u0027, {\u0027project_id\u0027: id})"},{"line_number":227,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":230,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_4a5d76eb","line":227,"updated":"2017-02-17 13:22:22.000000000","message":"We probably don\u0027t want this one, so we can let folks delete old entires after the project is deleted.","commit_id":"125fc975177c53b8109d47783b85d80f41089d3c"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"6bf893b766e669624b982f995c47930afbaa4b78","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def delete(self, req, id):"},{"line_number":225,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":226,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027delete\u0027, {\u0027project_id\u0027: id})"},{"line_number":227,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":230,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_fb843b5e","line":227,"in_reply_to":"fa31d9ce_32b7d8f6","updated":"2017-02-17 15:38:38.000000000","message":"Ah, good point, I assumed we already did that. Need to check the rows affected count, ensure its \u003e 0, I guess?","commit_id":"125fc975177c53b8109d47783b85d80f41089d3c"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"5b639b55f4e91e3107100ff93640c3dffd48b9bc","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def delete(self, req, id):"},{"line_number":225,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":226,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027delete\u0027, {\u0027project_id\u0027: id})"},{"line_number":227,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":230,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_32b7d8f6","line":227,"in_reply_to":"fa31d9ce_4a5d76eb","updated":"2017-02-17 14:36:51.000000000","message":"I was wondering that, I mostly wonder if we don\u0027t put it into delete if we\u0027ve got an issue where people think they deleted something, but it turns out they didn\u0027t.\n\nMaybe if we get more clever and check if a row exists first before deleting, and if it doesn\u0027t, then do the verify_project_id.","commit_id":"125fc975177c53b8109d47783b85d80f41089d3c"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"659e84dffaf4423dad32e910f60ba01c48ede4bf","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def delete(self, req, id):"},{"line_number":225,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":226,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027delete\u0027, {\u0027project_id\u0027: id})"},{"line_number":227,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":230,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_21a5c003","line":227,"in_reply_to":"fa31d9ce_fb843b5e","updated":"2017-02-17 16:18:43.000000000","message":"yeh, so I\u0027m going to move that into \"future enhancments\" idea, and just drop this, as you make a good point about deleting crud.","commit_id":"125fc975177c53b8109d47783b85d80f41089d3c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            return {k: v[\u0027limit\u0027] for k, v in values.items()}"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @wsgi.Controller.api_version(\"2.1\", MAX_PROXY_API_SUPPORT_VERSION)"},{"line_number":90,"context_line":"    @extensions.expected_errors(())"},{"line_number":91,"context_line":"    def show(self, req, id):"},{"line_number":92,"context_line":"        return self._show(req, id, [])"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_41eb9478","line":90,"updated":"2017-02-17 16:36:16.000000000","message":"This needs 400 now right?","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        return self._show(req, id, [])"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @wsgi.Controller.api_version(MIN_WITHOUT_PROXY_API_SUPPORT_VERSION)  # noqa"},{"line_number":95,"context_line":"    def show(self, req, id):"},{"line_number":96,"context_line":"        return self._show(req, id, FILTERED_QUOTAS)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def _show(self, req, id, filtered_quotas):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_81fd8c3d","line":95,"updated":"2017-02-17 16:36:16.000000000","message":"Hmm, why doesn\u0027t this have @extensions.expected_errors(())?","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        return self._detail(req, id, [])"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @wsgi.Controller.api_version(MIN_WITHOUT_PROXY_API_SUPPORT_VERSION)  # noqa"},{"line_number":115,"context_line":"    @extensions.expected_errors(())"},{"line_number":116,"context_line":"    def detail(self, req, id):"},{"line_number":117,"context_line":"        return self._detail(req, id, FILTERED_QUOTAS)"},{"line_number":118,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_01f19c6a","line":115,"updated":"2017-02-17 16:36:16.000000000","message":"This needs 400 now right?","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        return self._defaults(req, id, [])"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    @wsgi.Controller.api_version(MIN_WITHOUT_PROXY_API_SUPPORT_VERSION)  # noqa"},{"line_number":206,"context_line":"    @extensions.expected_errors(())"},{"line_number":207,"context_line":"    def defaults(self, req, id):"},{"line_number":208,"context_line":"        return self._defaults(req, id, FILTERED_QUOTAS)"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_41d474bc","line":206,"updated":"2017-02-17 16:36:16.000000000","message":"This needs 400 now right?","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def delete(self, req, id):"},{"line_number":225,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":226,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027delete\u0027, {\u0027project_id\u0027: id})"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":229,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"},{"line_number":230,"context_line":"        if user_id:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_c1e06499","line":227,"updated":"2017-02-17 16:36:16.000000000","message":"unrelated","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4f3eb072123d3d1f0b8a5f5e06bf42aaf991d2a4","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def _show(self, req, id, filtered_quotas):"},{"line_number":100,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":101,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027show\u0027, {\u0027project_id\u0027: id})"},{"line_number":102,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":105,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_e8b3c608","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":47},"updated":"2017-02-18 10:04:59.000000000","message":"We should catch \u0027exception.InvalidProject\u0027 explicitly at here, otherwise, the user will get 500 returned.\n\nAnd we need unittest at API layer for this.","commit_id":"ad6a6c69e39594ace9db4c97080ef383d3e49fb3"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"03e421ee1ad65e18f7e1cece5602645d3de381b4","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    def _show(self, req, id, filtered_quotas):"},{"line_number":100,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":101,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027show\u0027, {\u0027project_id\u0027: id})"},{"line_number":102,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":105,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_a87c5721","line":102,"range":{"start_line":102,"start_character":8,"end_line":102,"end_character":47},"in_reply_to":"da36d5c6_e8b3c608","updated":"2017-02-20 11:53:55.000000000","message":"Yeh, though I thought we had some upper level translation for that, I guess not.\n\nOriginally this function was throwing the webob exception directly, but Matt -1ed that. I can put the translation handler in here, but that seems a little odd.","commit_id":"ad6a6c69e39594ace9db4c97080ef383d3e49fb3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4f3eb072123d3d1f0b8a5f5e06bf42aaf991d2a4","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":105,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"},{"line_number":106,"context_line":"        return self._format_quota_set(id,"},{"line_number":107,"context_line":"            self._get_quotas(context, id, user_id\u003duser_id),"},{"line_number":108,"context_line":"            filtered_quotas\u003dfiltered_quotas)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_28f95ec9","line":105,"range":{"start_line":105,"start_character":29,"end_line":105,"end_character":38},"updated":"2017-02-18 10:04:59.000000000","message":"Should we validate the \u0027user_id\u0027 also?","commit_id":"ad6a6c69e39594ace9db4c97080ef383d3e49fb3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0f500b4676ee017c395b71721761d4f29bec9744","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":105,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"},{"line_number":106,"context_line":"        return self._format_quota_set(id,"},{"line_number":107,"context_line":"            self._get_quotas(context, id, user_id\u003duser_id),"},{"line_number":108,"context_line":"            filtered_quotas\u003dfiltered_quotas)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_0b51b90e","line":105,"range":{"start_line":105,"start_character":29,"end_line":105,"end_character":38},"in_reply_to":"da36d5c6_28a147aa","updated":"2017-02-21 11:14:49.000000000","message":"Got it, just want to ensure is there any explicitly reason not validate the user_id. I\u0027m cool with consider this later.","commit_id":"ad6a6c69e39594ace9db4c97080ef383d3e49fb3"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"03e421ee1ad65e18f7e1cece5602645d3de381b4","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"},{"line_number":105,"context_line":"        user_id \u003d params.get(\u0027user_id\u0027, [None])[0]"},{"line_number":106,"context_line":"        return self._format_quota_set(id,"},{"line_number":107,"context_line":"            self._get_quotas(context, id, user_id\u003duser_id),"},{"line_number":108,"context_line":"            filtered_quotas\u003dfiltered_quotas)"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_28a147aa","line":105,"range":{"start_line":105,"start_character":29,"end_line":105,"end_character":38},"in_reply_to":"da36d5c6_28f95ec9","updated":"2017-02-20 11:53:55.000000000","message":"We intended to only do this at the project_id level to start. We can consider the other as well.","commit_id":"ad6a6c69e39594ace9db4c97080ef383d3e49fb3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4f3eb072123d3d1f0b8a5f5e06bf42aaf991d2a4","unresolved":false,"context_lines":[{"line_number":120,"context_line":"    def _detail(self, req, id, filtered_quotas):"},{"line_number":121,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":122,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027detail\u0027, {\u0027project_id\u0027: id})"},{"line_number":123,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        user_id \u003d req.GET.get(\u0027user_id\u0027, None)"},{"line_number":126,"context_line":"        return self._format_quota_set("}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_08b9fae9","line":123,"updated":"2017-02-18 10:04:59.000000000","message":"We should catch \u0027exception.InvalidProject\u0027 explicitly at here","commit_id":"ad6a6c69e39594ace9db4c97080ef383d3e49fb3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4f3eb072123d3d1f0b8a5f5e06bf42aaf991d2a4","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    def _update(self, req, id, body, filtered_quotas):"},{"line_number":144,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":145,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027update\u0027, {\u0027project_id\u0027: id})"},{"line_number":146,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        project_id \u003d id"},{"line_number":149,"context_line":"        params \u003d urlparse.parse_qs(req.environ.get(\u0027QUERY_STRING\u0027, \u0027\u0027))"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_28cebe83","line":146,"updated":"2017-02-18 10:04:59.000000000","message":"We should catch \u0027exception.InvalidProject\u0027 explicitly at here","commit_id":"ad6a6c69e39594ace9db4c97080ef383d3e49fb3"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"4f3eb072123d3d1f0b8a5f5e06bf42aaf991d2a4","unresolved":false,"context_lines":[{"line_number":211,"context_line":"    def _defaults(self, req, id, filtered_quotas):"},{"line_number":212,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":213,"context_line":"        context.can(qs_policies.POLICY_ROOT % \u0027defaults\u0027, {\u0027project_id\u0027: id})"},{"line_number":214,"context_line":"        identity.verify_project_id(context, id)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        values \u003d QUOTAS.get_defaults(context)"},{"line_number":217,"context_line":"        return self._format_quota_set(id, values,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da36d5c6_48cbf272","line":214,"updated":"2017-02-18 10:04:59.000000000","message":"We should catch \u0027exception.InvalidProject\u0027 explicitly at here","commit_id":"ad6a6c69e39594ace9db4c97080ef383d3e49fb3"}],"nova/identity.py":[{"author":{"_account_id":20223,"name":"zhaolihui","email":"zhaolh@awcloud.com","username":"zhaolihui"},"change_message_id":"9cdcfccb2b4ca3c3b6d2f733c314f041bbfd082c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    except Exception:"},{"line_number":37,"context_line":"        # something is wrong, like there isn\u0027t a keystone v3 endpoint,"},{"line_number":38,"context_line":"        # we\u0027ll take the pass and default to everything being ok."},{"line_number":39,"context_line":"        LOG.exception(_LE(\"Unable to contact keystone to verify project_id\"))"},{"line_number":40,"context_line":"        return True"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    if resp:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa31d9ce_d4803a49","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":77},"updated":"2017-02-17 07:29:02.000000000","message":"Maybe LOG.exception(_LE(\"Unable to contact keystone to verify project_id: %s\"), project_id)","commit_id":"98234a51cc2aee20828e005afe13bf4e1a9eecf9"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"2b8b672f9f69ff8e4b88fb1399b04d2c6d168a57","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    except Exception:"},{"line_number":37,"context_line":"        # something is wrong, like there isn\u0027t a keystone v3 endpoint,"},{"line_number":38,"context_line":"        # we\u0027ll take the pass and default to everything being ok."},{"line_number":39,"context_line":"        LOG.exception(_LE(\"Unable to contact keystone to verify project_id\"))"},{"line_number":40,"context_line":"        return True"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    if resp:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa31d9ce_5417df53","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":77},"in_reply_to":"fa31d9ce_d4803a49","updated":"2017-02-17 12:52:23.000000000","message":"What project id will be pretty irelevant in this case, because this is a fundamental failure.","commit_id":"98234a51cc2aee20828e005afe13bf4e1a9eecf9"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"89649e7385ae45aafc0c4f981f39d011160b3229","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    an HTTPBadRequest is emitted."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    sess \u003d session.Session(auth\u003dcontext.get_auth_plugin())"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        resp \u003d sess.get(\u0027/v3/projects/%s\u0027 % project_id,"},{"line_number":34,"context_line":"                        endpoint_filter\u003d{\u0027service_type\u0027: \u0027identity\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_ea6e2a95","line":31,"updated":"2017-02-17 13:22:22.000000000","message":"Seems tempting to use a service token for this, or similar, but actually I guess this is usually OK.","commit_id":"125fc975177c53b8109d47783b85d80f41089d3c"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"5b639b55f4e91e3107100ff93640c3dffd48b9bc","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    an HTTPBadRequest is emitted."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    sess \u003d session.Session(auth\u003dcontext.get_auth_plugin())"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        resp \u003d sess.get(\u0027/v3/projects/%s\u0027 % project_id,"},{"line_number":34,"context_line":"                        endpoint_filter\u003d{\u0027service_type\u0027: \u0027identity\u0027},"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_527c4c20","line":31,"in_reply_to":"fa31d9ce_ea6e2a95","updated":"2017-02-17 14:36:51.000000000","message":"I kind of feel that the service tokens, and pushing out credentials to every node, is really weakening our security model.","commit_id":"125fc975177c53b8109d47783b85d80f41089d3c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    \"\"\"verify that a project_id exists."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    This attempts to verify that a project id exists. If it does not,"},{"line_number":28,"context_line":"    an HTTPBadRequest is emitted."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    sess \u003d session.Session(auth\u003dcontext.get_auth_plugin())"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_c1a8647a","line":28,"range":{"start_line":28,"start_character":7,"end_line":28,"end_character":21},"updated":"2017-02-17 16:36:16.000000000","message":"This really ties this to the REST API, which is kind of odd when it\u0027s not in the nova/api/openstack/ subtree.\n\nSo I\u0027d either move this, or have this raise up nova.exception.Invalid or something and then those can be translated to webob exceptions in the REST API code.","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    This attempts to verify that a project id exists. If it does not,"},{"line_number":28,"context_line":"    an HTTPBadRequest is emitted."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    sess \u003d session.Session(auth\u003dcontext.get_auth_plugin())"},{"line_number":32,"context_line":"    try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_a120d0f8","line":29,"updated":"2017-02-17 16:36:16.000000000","message":"You might want to explain the return booleans and what they mean since this is utility code.","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    sess \u003d session.Session(auth\u003dcontext.get_auth_plugin())"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        resp \u003d sess.get(\u0027/v3/projects/%s\u0027 % project_id,"},{"line_number":34,"context_line":"                        endpoint_filter\u003d{\u0027service_type\u0027: \u0027identity\u0027},"},{"line_number":35,"context_line":"                        raise_exc\u003dFalse)"},{"line_number":36,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_81ccac62","line":33,"range":{"start_line":33,"start_character":26,"end_line":33,"end_character":28},"updated":"2017-02-17 16:36:16.000000000","message":"Isn\u0027t keystone v2 still possible? I don\u0027t think we test with keystone v3 everywhere yet.","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"63a3c3ce792d62011a05425ae818647196aa6d9a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    \"\"\""},{"line_number":31,"context_line":"    sess \u003d session.Session(auth\u003dcontext.get_auth_plugin())"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        resp \u003d sess.get(\u0027/v3/projects/%s\u0027 % project_id,"},{"line_number":34,"context_line":"                        endpoint_filter\u003d{\u0027service_type\u0027: \u0027identity\u0027},"},{"line_number":35,"context_line":"                        raise_exc\u003dFalse)"},{"line_number":36,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_216dc004","line":33,"range":{"start_line":33,"start_character":26,"end_line":33,"end_character":28},"in_reply_to":"fa31d9ce_81ccac62","updated":"2017-02-17 19:08:50.000000000","message":"I think it\u0027s fine to not support v2 for this, it\u0027s deprecated, if v3 isn\u0027t available then it\u0027s just a pass.","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    sess \u003d session.Session(auth\u003dcontext.get_auth_plugin())"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        resp \u003d sess.get(\u0027/v3/projects/%s\u0027 % project_id,"},{"line_number":34,"context_line":"                        endpoint_filter\u003d{\u0027service_type\u0027: \u0027identity\u0027},"},{"line_number":35,"context_line":"                        raise_exc\u003dFalse)"},{"line_number":36,"context_line":"    except Exception:"},{"line_number":37,"context_line":"        # something is wrong, like there isn\u0027t a keystone v3 endpoint,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_4138f43d","line":34,"updated":"2017-02-17 16:36:16.000000000","message":"Thinking about the recent placement fracas, do we also need region_name and/or interface kwargs here?","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"63a3c3ce792d62011a05425ae818647196aa6d9a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    sess \u003d session.Session(auth\u003dcontext.get_auth_plugin())"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        resp \u003d sess.get(\u0027/v3/projects/%s\u0027 % project_id,"},{"line_number":34,"context_line":"                        endpoint_filter\u003d{\u0027service_type\u0027: \u0027identity\u0027},"},{"line_number":35,"context_line":"                        raise_exc\u003dFalse)"},{"line_number":36,"context_line":"    except Exception:"},{"line_number":37,"context_line":"        # something is wrong, like there isn\u0027t a keystone v3 endpoint,"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_413e34db","line":34,"in_reply_to":"fa31d9ce_4138f43d","updated":"2017-02-17 19:08:50.000000000","message":"I definitely don\u0027t think we need interface supported here, this is API -\u003e keystone, public interface is fine.\n\nRegion filters aren\u0027t really a thing for identity, right? Honestly, I\u0027d rather wait for someone to complain about that one before we fix it.","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        resp \u003d sess.get(\u0027/v3/projects/%s\u0027 % project_id,"},{"line_number":34,"context_line":"                        endpoint_filter\u003d{\u0027service_type\u0027: \u0027identity\u0027},"},{"line_number":35,"context_line":"                        raise_exc\u003dFalse)"},{"line_number":36,"context_line":"    except Exception:"},{"line_number":37,"context_line":"        # something is wrong, like there isn\u0027t a keystone v3 endpoint,"},{"line_number":38,"context_line":"        # we\u0027ll take the pass and default to everything being ok."},{"line_number":39,"context_line":"        LOG.exception(_LE(\"Unable to contact keystone to verify project_id\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_c144e4b8","line":36,"range":{"start_line":36,"start_character":11,"end_line":36,"end_character":20},"updated":"2017-02-17 16:36:16.000000000","message":"Could we make this keystoneauth1 exceptions?","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"63a3c3ce792d62011a05425ae818647196aa6d9a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        resp \u003d sess.get(\u0027/v3/projects/%s\u0027 % project_id,"},{"line_number":34,"context_line":"                        endpoint_filter\u003d{\u0027service_type\u0027: \u0027identity\u0027},"},{"line_number":35,"context_line":"                        raise_exc\u003dFalse)"},{"line_number":36,"context_line":"    except Exception:"},{"line_number":37,"context_line":"        # something is wrong, like there isn\u0027t a keystone v3 endpoint,"},{"line_number":38,"context_line":"        # we\u0027ll take the pass and default to everything being ok."},{"line_number":39,"context_line":"        LOG.exception(_LE(\"Unable to contact keystone to verify project_id\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_c1014408","line":36,"range":{"start_line":36,"start_character":11,"end_line":36,"end_character":20},"in_reply_to":"fa31d9ce_c144e4b8","updated":"2017-02-17 19:08:50.000000000","message":"That\u0027s possible, I\u0027ll look into it.","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    elif resp.status_code \u003d\u003d 404:"},{"line_number":46,"context_line":"        # we got access, and we know this project is not there"},{"line_number":47,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":48,"context_line":"            explanation\u003d_(\u0027Project_id %s is not a valid project\u0027) % project_id)"},{"line_number":49,"context_line":"    elif resp.status_code \u003d\u003d 403:"},{"line_number":50,"context_line":"        # we don\u0027t have enough permission to verify this, so default"},{"line_number":51,"context_line":"        # to \"it\u0027s ok\"."}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_c11b04c9","line":48,"range":{"start_line":48,"start_character":27,"end_line":48,"end_character":37},"updated":"2017-02-17 16:36:16.000000000","message":"Project ID","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"63a3c3ce792d62011a05425ae818647196aa6d9a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    elif resp.status_code \u003d\u003d 404:"},{"line_number":46,"context_line":"        # we got access, and we know this project is not there"},{"line_number":47,"context_line":"        raise webob.exc.HTTPBadRequest("},{"line_number":48,"context_line":"            explanation\u003d_(\u0027Project_id %s is not a valid project\u0027) % project_id)"},{"line_number":49,"context_line":"    elif resp.status_code \u003d\u003d 403:"},{"line_number":50,"context_line":"        # we don\u0027t have enough permission to verify this, so default"},{"line_number":51,"context_line":"        # to \"it\u0027s ok\"."}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_0c02b309","line":48,"range":{"start_line":48,"start_character":27,"end_line":48,"end_character":37},"in_reply_to":"fa31d9ce_c11b04c9","updated":"2017-02-17 19:08:50.000000000","message":"ACK","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        # we don\u0027t have enough permission to verify this, so default"},{"line_number":51,"context_line":"        # to \"it\u0027s ok\"."},{"line_number":52,"context_line":"        LOG.info("},{"line_number":53,"context_line":"            (\"Insufficient permissions for user %s to verify \""},{"line_number":54,"context_line":"             \"existence of project_id %s\"),"},{"line_number":55,"context_line":"            context.user_id, project_id)"},{"line_number":56,"context_line":"        return True"},{"line_number":57,"context_line":"    else:"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_81682c23","line":54,"range":{"start_line":53,"start_character":12,"end_line":54,"end_character":42},"updated":"2017-02-17 16:36:16.000000000","message":"This should be in _LI. I\u0027m surprised pep8 didn\u0027t fail on this hacking check.","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e03b7bede3f88b6bcc383aa95a33b60e90453bd","unresolved":false,"context_lines":[{"line_number":56,"context_line":"        return True"},{"line_number":57,"context_line":"    else:"},{"line_number":58,"context_line":"        LOG.warning("},{"line_number":59,"context_line":"            (\"Unexpected response from keystone trying to \""},{"line_number":60,"context_line":"             \"verify project_id %s - resp: %s %s\"),"},{"line_number":61,"context_line":"            project_id,"},{"line_number":62,"context_line":"            resp.status_code,"},{"line_number":63,"context_line":"            resp.content)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_61541854","line":60,"range":{"start_line":59,"start_character":12,"end_line":60,"end_character":51},"updated":"2017-02-17 16:36:16.000000000","message":"This should be in _LW.","commit_id":"e35029ccc25686a80690e8a506a03af5d2d8fb5c"}],"releasenotes/notes/project_id_validation-568d31c13c3ef735.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f2406a8d7318c7a721f95a4e8febfd840b8ee52b","unresolved":false,"context_lines":[{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    API calls to /os-quota-sets/* will now attempt to validate the"},{"line_number":5,"context_line":"    project_id being opperated on with keystone. If the user has"},{"line_number":6,"context_line":"    enough permissions in user, and the keystone project does not"},{"line_number":7,"context_line":"    exist, a 400 will be returned to prevent invalidate quota data"},{"line_number":8,"context_line":"    from being put in the Nova database. This fixes an effective"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"3f044301_4007071e","line":5,"range":{"start_line":5,"start_character":21,"end_line":5,"end_character":30},"updated":"2017-05-04 21:44:30.000000000","message":"operated, oops","commit_id":"f6fbfc7ff07b790ef052a759552c69429b3d79c7"}]}
