)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"318a3a1f926b45a5404796a637ae3467d688c444","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds the registed limit and project limit provider"},{"line_number":10,"context_line":"Class"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Colleen Murphy\u003ccolleen@gazlene.net\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I636cd9555ae6434b0e6dec958ae41ef852a48285"},{"line_number":15,"context_line":"bp: unified-limits"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"7f96bb07_7773ce4e","line":12,"updated":"2018-01-21 21:49:14.000000000","message":"Not sure why I have coauthor here, you can remove this","commit_id":"0cbcad968ac65798c8238c02837ac68dca02d462"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"c10e761bebb8379b4b02c8740f0e1454d176db68","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds the registed limit and project limit provider"},{"line_number":10,"context_line":"Class"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Colleen Murphy\u003ccolleen@gazlene.net\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I636cd9555ae6434b0e6dec958ae41ef852a48285"},{"line_number":15,"context_line":"bp: unified-limits"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":37,"id":"7f96bb07_29fc0a3d","line":12,"in_reply_to":"7f96bb07_7773ce4e","updated":"2018-01-22 01:42:21.000000000","message":"Oh, because I copied your original patch to start coding. I\u0027ll remove it if you still think so.","commit_id":"0cbcad968ac65798c8238c02837ac68dca02d462"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6ce6d3bf8f52cc70710364495bb16031205a6273","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add limit provider"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds the registed limit and project limit provider"},{"line_number":10,"context_line":"Class"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Colleen Murphy\u003ccolleen@gazlene.net\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"7f96bb07_eb432f12","line":9,"range":{"start_line":9,"start_character":20,"end_line":9,"end_character":28},"updated":"2018-01-23 23:20:59.000000000","message":"registered*","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"53d454cb19554665dc205ee587f96cb7448c219a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add limit provider"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds the registed limit and project limit provider"},{"line_number":10,"context_line":"Class"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Colleen Murphy\u003ccolleen@gazlene.net\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"7f96bb07_7d0da13c","line":9,"range":{"start_line":9,"start_character":20,"end_line":9,"end_character":28},"in_reply_to":"7f96bb07_eb432f12","updated":"2018-01-24 03:43:19.000000000","message":"Done","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9d2793b5f222b82aa51624851cc57599cfbd3a1b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds the registed limit and project limit provider"},{"line_number":10,"context_line":"Class"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Colleen Murphy\u003ccolleen@gazlene.net\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I636cd9555ae6434b0e6dec958ae41ef852a48285"},{"line_number":15,"context_line":"bp: unified-limits"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"7f96bb07_6be64247","line":12,"updated":"2018-01-23 21:24:25.000000000","message":"You can remove this :)","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"53d454cb19554665dc205ee587f96cb7448c219a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch adds the registed limit and project limit provider"},{"line_number":10,"context_line":"Class"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authored-By: Colleen Murphy\u003ccolleen@gazlene.net\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I636cd9555ae6434b0e6dec958ae41ef852a48285"},{"line_number":15,"context_line":"bp: unified-limits"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":40,"id":"7f96bb07_9d08ad2d","line":12,"in_reply_to":"7f96bb07_6be64247","updated":"2018-01-24 03:43:19.000000000","message":"Done","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"}],"keystone/conf/unified_limit.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"\"\"\"))"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"list_limit \u003d cfg.IntOpt("},{"line_number":42,"context_line":"    \u0027list_limit\u0027,"},{"line_number":43,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":44,"context_line":"Maximum number of entities that will be returned in a role collection. This may"},{"line_number":45,"context_line":"be useful to tune if you have a large number of discrete unified limit in your"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_63cc1b6a","line":42,"range":{"start_line":42,"start_character":5,"end_line":42,"end_character":15},"updated":"2018-01-16 01:05:42.000000000","message":"Is this for pagination support?","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":39,"context_line":"\"\"\"))"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"list_limit \u003d cfg.IntOpt("},{"line_number":42,"context_line":"    \u0027list_limit\u0027,"},{"line_number":43,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":44,"context_line":"Maximum number of entities that will be returned in a role collection. This may"},{"line_number":45,"context_line":"be useful to tune if you have a large number of discrete unified limit in your"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_59a3129f","line":42,"range":{"start_line":42,"start_character":5,"end_line":42,"end_character":15},"in_reply_to":"7f96bb07_63cc1b6a","updated":"2018-01-16 03:07:59.000000000","message":"yeah. To keep the same with other resources. I\u0027ll write a test for it.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \u0027list_limit\u0027,"},{"line_number":43,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":44,"context_line":"Maximum number of entities that will be returned in a role collection. This may"},{"line_number":45,"context_line":"be useful to tune if you have a large number of discrete unified limit in your"},{"line_number":46,"context_line":"deployment."},{"line_number":47,"context_line":"\"\"\"))"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_c3b5efce","line":45,"range":{"start_line":45,"start_character":48,"end_line":45,"end_character":70},"updated":"2018-01-16 01:05:42.000000000","message":"discrete unified limits*?","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    \u0027list_limit\u0027,"},{"line_number":43,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":44,"context_line":"Maximum number of entities that will be returned in a role collection. This may"},{"line_number":45,"context_line":"be useful to tune if you have a large number of discrete unified limit in your"},{"line_number":46,"context_line":"deployment."},{"line_number":47,"context_line":"\"\"\"))"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_b9ed768c","line":45,"range":{"start_line":45,"start_character":48,"end_line":45,"end_character":70},"in_reply_to":"7f96bb07_c3b5efce","updated":"2018-01-16 03:07:59.000000000","message":"Done","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aac96802c42190472db8928ea63230f070ce62e5","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027list_limit\u0027,"},{"line_number":44,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":45,"context_line":"Maximum number of entities that will be returned in a role collection. This may"},{"line_number":46,"context_line":"be useful to tune if you have a large number of unified limit in your"},{"line_number":47,"context_line":"deployment."},{"line_number":48,"context_line":"\"\"\"))"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"7f96bb07_d6b5967f","line":46,"range":{"start_line":46,"start_character":56,"end_line":46,"end_character":61},"updated":"2018-01-16 14:44:02.000000000","message":"limits*","commit_id":"127b655841043fab4089d73c4678c2f8617fd365"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027list_limit\u0027,"},{"line_number":44,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":45,"context_line":"Maximum number of entities that will be returned in a role collection. This may"},{"line_number":46,"context_line":"be useful to tune if you have a large number of unified limit in your"},{"line_number":47,"context_line":"deployment."},{"line_number":48,"context_line":"\"\"\"))"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_a12dc695","line":46,"range":{"start_line":46,"start_character":56,"end_line":46,"end_character":61},"updated":"2018-01-18 21:31:20.000000000","message":"limits*?","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"b4c5be8172777a32c35575555da26734f3da11f2","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027list_limit\u0027,"},{"line_number":44,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":45,"context_line":"Maximum number of entities that will be returned in a role collection. This may"},{"line_number":46,"context_line":"be useful to tune if you have a large number of unified limit in your"},{"line_number":47,"context_line":"deployment."},{"line_number":48,"context_line":"\"\"\"))"},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_55a359b2","line":46,"range":{"start_line":46,"start_character":56,"end_line":46,"end_character":61},"in_reply_to":"7f96bb07_a12dc695","updated":"2018-01-19 02:14:46.000000000","message":"Done","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d22d4e4c0051b339580e2f43786d4a50c4d4d333","unresolved":false,"context_lines":[{"line_number":33,"context_line":"\"\"\"))"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"cache_time \u003d cfg.IntOpt("},{"line_number":36,"context_line":"    \u0027cache_time\u0027,"},{"line_number":37,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":38,"context_line":"Time to cache unified limit data, in seconds. This has no effect unless both"},{"line_number":39,"context_line":"global caching and `[unified_limit] caching` are enabled."}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_3acd485d","line":36,"range":{"start_line":36,"start_character":5,"end_line":36,"end_character":15},"updated":"2018-01-24 22:21:38.000000000","message":"Some things in keystone have this set to a default and others don\u0027t. Do we want to include one here? We can follow this up with another patch to do this, too.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d15b83744ca88e3aa21401942091f8bf5a94a0d4","unresolved":false,"context_lines":[{"line_number":33,"context_line":"\"\"\"))"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"cache_time \u003d cfg.IntOpt("},{"line_number":36,"context_line":"    \u0027cache_time\u0027,"},{"line_number":37,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":38,"context_line":"Time to cache unified limit data, in seconds. This has no effect unless both"},{"line_number":39,"context_line":"global caching and `[unified_limit] caching` are enabled."}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_2e2425c6","line":36,"range":{"start_line":36,"start_character":5,"end_line":36,"end_character":15},"in_reply_to":"5f93b717_3acd485d","updated":"2018-01-25 02:54:11.000000000","message":"The default value depends on how often the APIs are called IMO, It\u0027s hard to say more now. maybe we can talk it later?","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"}],"keystone/exception.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Unable to create a limit that has no corresponding\""},{"line_number":469,"context_line":"                       \"registered limit\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_014d9a3c","line":468,"range":{"start_line":468,"start_character":61,"end_line":468,"end_character":74},"updated":"2018-01-18 21:31:20.000000000","message":"Need a space after corresponding","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":466,"context_line":""},{"line_number":467,"context_line":"class NoLimitReference(Forbidden):"},{"line_number":468,"context_line":"    message_format \u003d _(\"Unable to create a limit that has no corresponding\""},{"line_number":469,"context_line":"                       \"registered limit\")"},{"line_number":470,"context_line":""},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"class ReferencedLimitExist(Forbidden):"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_6129fe34","line":469,"range":{"start_line":469,"start_character":35,"end_line":469,"end_character":40},"updated":"2018-01-18 21:31:20.000000000","message":"The convention in most exception include punctuation in the message. We can end this with a period.\n\n  \"registered limit.\"","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":470,"context_line":""},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"class ReferencedLimitExist(Forbidden):"},{"line_number":473,"context_line":"    message_format \u003d _(\"Unable to update or delete the registered limit that\""},{"line_number":474,"context_line":"                       \"have corresponding limits\")"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_e14d0e3b","line":473,"range":{"start_line":473,"start_character":72,"end_line":473,"end_character":76},"updated":"2018-01-18 21:31:20.000000000","message":"Need a space after that","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":471,"context_line":""},{"line_number":472,"context_line":"class ReferencedLimitExist(Forbidden):"},{"line_number":473,"context_line":"    message_format \u003d _(\"Unable to update or delete the registered limit that\""},{"line_number":474,"context_line":"                       \"have corresponding limits\")"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"class DomainConfigNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_211f7608","line":474,"range":{"start_line":474,"start_character":43,"end_line":474,"end_character":49},"updated":"2018-01-18 21:31:20.000000000","message":"Same comment here about punctuation.","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"b4c5be8172777a32c35575555da26734f3da11f2","unresolved":false,"context_lines":[{"line_number":472,"context_line":"class ReferencedLimitExist(Forbidden):"},{"line_number":473,"context_line":"    message_format \u003d _(\"Unable to update or delete the registered limit that\""},{"line_number":474,"context_line":"                       \"have corresponding limits\")"},{"line_number":475,"context_line":""},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"class DomainConfigNotFound(NotFound):"},{"line_number":478,"context_line":"    message_format \u003d _(\u0027Could not find %(group_or_option)s in domain \u0027"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_f51e250a","line":475,"updated":"2018-01-19 02:14:46.000000000","message":"I\u0027ll move the change in this file to the new patch as well.","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"}],"keystone/limit/__init__.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"318a3a1f926b45a5404796a637ae3467d688c444","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2017 SUSE Linux Gmbh"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f96bb07_17b7eada","line":1,"updated":"2018-01-21 21:49:14.000000000","message":"copypaste error","commit_id":"0cbcad968ac65798c8238c02837ac68dca02d462"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9d2793b5f222b82aa51624851cc57599cfbd3a1b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 SUSE Linux Gmbh"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_4b3a6698","line":1,"updated":"2018-01-23 21:24:25.000000000","message":"Wrong copyright","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"53d454cb19554665dc205ee587f96cb7448c219a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 SUSE Linux Gmbh"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_3d07191f","line":1,"in_reply_to":"7f96bb07_4b3a6698","updated":"2018-01-24 03:43:19.000000000","message":"Done","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"}],"keystone/limit/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027registered_limit\u0027)"},{"line_number":135,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":136,"context_line":"        try:"},{"line_number":137,"context_line":"            with sql.session_for_write() as session:"},{"line_number":138,"context_line":"                for registered_limit in registered_limits:"},{"line_number":139,"context_line":"                    ref \u003d self._get_registered_limit(session,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_61ac9e9e","line":136,"updated":"2018-01-18 21:31:20.000000000","message":"I think the changes in this file could probably be pulled out into their own change before we land the manager logic, which should help make patches smaller and easier to review.","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"b4c5be8172777a32c35575555da26734f3da11f2","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027registered_limit\u0027)"},{"line_number":135,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":136,"context_line":"        try:"},{"line_number":137,"context_line":"            with sql.session_for_write() as session:"},{"line_number":138,"context_line":"                for registered_limit in registered_limits:"},{"line_number":139,"context_line":"                    ref \u003d self._get_registered_limit(session,"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_b5fbbdbb","line":136,"in_reply_to":"7f96bb07_61ac9e9e","updated":"2018-01-19 02:14:46.000000000","message":"sure","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"}],"keystone/limit/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"71b61ef5370fc7b7deec02300ec74cc7fcb38f7c","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    def __init__(self):"},{"line_number":75,"context_line":"        super(LimitManager, self).__init__(\u0027sql\u0027)"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def _assert_service_exist(self, service_id):"},{"line_number":78,"context_line":"        try:"},{"line_number":79,"context_line":"            self.catalog_api.get_service(service_id)"},{"line_number":80,"context_line":"        except exception.ServiceNotFound:"},{"line_number":81,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027service_id\u0027,"},{"line_number":82,"context_line":"                                            target\u003d\u0027limits\u0027)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _assert_region_exist(self, region_id):"},{"line_number":85,"context_line":"        try:"},{"line_number":86,"context_line":"            if region_id is not None:"},{"line_number":87,"context_line":"                self.catalog_api.get_region(region_id)"},{"line_number":88,"context_line":"        except exception.RegionNotFound:"},{"line_number":89,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027region_id\u0027,"},{"line_number":90,"context_line":"                                            target\u003d\u0027limits\u0027)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def _assert_project_exist(self, project_id):"},{"line_number":93,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"df87a7cf_3b104e00","line":90,"range":{"start_line":77,"start_character":0,"end_line":90,"end_character":60},"updated":"2017-12-19 20:34:59.000000000","message":"This looks duplicated from above, we could pull this into a common utility class somewhere and make it available to both Managers.\n\nOr, we could have a single manager that is responsible for all limits.","commit_id":"b6d916a841c2d0a64f0aaaab8258d9fe753c3898"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ef3c660e763a1ae1b26dd8fb560cd355ece4bb3f","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class RegisteredLimitManager(manager.Manager):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    driver_namespace \u003d \u0027keystone.registered_limit\u0027"},{"line_number":27,"context_line":"    _provides_api \u003d \u0027registered_limit_api\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_54a53703","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":28},"updated":"2017-12-26 21:31:22.000000000","message":"I\u0027m wondering if we need two different managers here, or if a single UnifiedLimitManager would suffice.\n\nI\u0027m not sure it makes sense to have two pluggable implementations for something that\u0027s tightly coupled like registered limits and limits (e.g. is there ever a case where a registered limit and a project limit come from two different sources)?","commit_id":"52a080b52c2fe85aaabf66a100f8fa8b79a1db3a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e8d8651aac350bd0d326aee45851ac2a8c2f2132","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class UnifiedLimitManager(manager.Manager):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    driver_namespace \u003d \u0027keystone.unified_limit\u0027"},{"line_number":27,"context_line":"    _provides_api \u003d \u0027unified_limit_api\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"bf8cb3f7_0e29d336","line":24,"range":{"start_line":24,"start_character":6,"end_line":24,"end_character":25},"updated":"2017-12-27 20:21:18.000000000","message":"Nice - thanks for consolidating this.","commit_id":"17dec0a4ed07e47609afbf762b0197464790061a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e8d8651aac350bd0d326aee45851ac2a8c2f2132","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            service_id \u003d unified_limit.get(\u0027service_id\u0027)"},{"line_number":35,"context_line":"            if service_id is not None:"},{"line_number":36,"context_line":"                self.catalog_api.get_service(service_id)"},{"line_number":37,"context_line":"            region_id \u003d unified_limit.get(\u0027region_id\u0027)"},{"line_number":38,"context_line":"            if region_id is not None:"},{"line_number":39,"context_line":"                self.catalog_api.get_region(region_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"bf8cb3f7_ae69c78b","line":36,"range":{"start_line":36,"start_character":16,"end_line":36,"end_character":20},"updated":"2017-12-27 20:21:18.000000000","message":"We should update this to the new way of referencing other managers:\n\n  from keystone.common import provider_api\n  PROVIDERS \u003d provider_api.ProviderAPIs\n  ...\n  PROVIDERS.catalog_api.get_service(service_id)","commit_id":"17dec0a4ed07e47609afbf762b0197464790061a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1cab3e549752f3d6919e966e446268a8af5de5e7","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            service_id \u003d unified_limit.get(\u0027service_id\u0027)"},{"line_number":35,"context_line":"            if service_id is not None:"},{"line_number":36,"context_line":"                self.catalog_api.get_service(service_id)"},{"line_number":37,"context_line":"            region_id \u003d unified_limit.get(\u0027region_id\u0027)"},{"line_number":38,"context_line":"            if region_id is not None:"},{"line_number":39,"context_line":"                self.catalog_api.get_region(region_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_ece61745","line":36,"range":{"start_line":36,"start_character":16,"end_line":36,"end_character":20},"in_reply_to":"9f91af0f_622d7845","updated":"2018-01-03 19:31:44.000000000","message":"Yeah - we are going to be removing that eventually. That way everything uses PROVIDERS instead of making managers attributes of each other.","commit_id":"17dec0a4ed07e47609afbf762b0197464790061a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"bf11a9db92b701c7dfb431c268bcb7e5d5cfbf47","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            service_id \u003d unified_limit.get(\u0027service_id\u0027)"},{"line_number":35,"context_line":"            if service_id is not None:"},{"line_number":36,"context_line":"                self.catalog_api.get_service(service_id)"},{"line_number":37,"context_line":"            region_id \u003d unified_limit.get(\u0027region_id\u0027)"},{"line_number":38,"context_line":"            if region_id is not None:"},{"line_number":39,"context_line":"                self.catalog_api.get_region(region_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"9f91af0f_622d7845","line":36,"range":{"start_line":36,"start_character":16,"end_line":36,"end_character":20},"in_reply_to":"bf8cb3f7_ae69c78b","updated":"2017-12-28 03:04:07.000000000","message":"Sure. I\u0027ll.\nBTW, I\u0027d lie to know why we\u0027d better do this since that we have this: https://github.com/openstack/keystone/blob/master/keystone/common/provider_api.py#L79-L84\nIs it will be removed in the future?","commit_id":"17dec0a4ed07e47609afbf762b0197464790061a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e8d8651aac350bd0d326aee45851ac2a8c2f2132","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        return self.list_limits(driver_hints.Hints(), project_id)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @manager.response_truncated"},{"line_number":96,"context_line":"    def list_limits(self, hints, project_id):"},{"line_number":97,"context_line":"        return self.driver.list_limits(hints or driver_hints.Hints(),"},{"line_number":98,"context_line":"                                       project_id)"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"bf8cb3f7_ae1787ed","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":19},"updated":"2017-12-27 20:21:18.000000000","message":"nit: since we always require a project ID here, maybe we should change the method name to be more descriptive.\n\n  def list_limits_for_project(self, hints, project_id)","commit_id":"17dec0a4ed07e47609afbf762b0197464790061a"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"958dc02b6d62aad4120cd0ca93d25d6bee353fd7","unresolved":false,"context_lines":[{"line_number":17,"context_line":"from keystone.common import provider_api"},{"line_number":18,"context_line":"import keystone.conf"},{"line_number":19,"context_line":"from keystone import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"CONF \u003d keystone.conf.CONF"},{"line_number":23,"context_line":"PROVIDERS \u003d provider_api.ProviderAPIs"}],"source_content_type":"text/x-python","patch_set":24,"id":"9f91af0f_1f5e9f43","line":20,"updated":"2018-01-08 22:56:00.000000000","message":"Add in caching either in this patch or a followup. My -1 will be re-scored after we have caching implemented.","commit_id":"72f98d2cb309120b014477fca4ad8504934b896a"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"958dc02b6d62aad4120cd0ca93d25d6bee353fd7","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return self.driver.list_registered_limits("},{"line_number":70,"context_line":"            hints or driver_hints.Hints())"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def get_registered_limit(self, registered_limit_id):"},{"line_number":73,"context_line":"        return self.driver.get_registered_limit(registered_limit_id)"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def delete_registered_limit(self, registered_limit_id):"},{"line_number":76,"context_line":"        return self.driver.delete_registered_limit(registered_limit_id)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def check_reference_exist(self, limit):"},{"line_number":79,"context_line":"        return self.driver.check_reference_exist(limit)"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def create_limits(self, limits):"},{"line_number":82,"context_line":"        for limit in limits:"}],"source_content_type":"text/x-python","patch_set":24,"id":"9f91af0f_df283798","line":79,"range":{"start_line":72,"start_character":0,"end_line":79,"end_character":55},"updated":"2018-01-08 22:56:00.000000000","message":"Technically, if caching is not implemented, these are not needed the manager automatically forwards to the methods on the driver.\n\nImplement caching.","commit_id":"72f98d2cb309120b014477fca4ad8504934b896a"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"958dc02b6d62aad4120cd0ca93d25d6bee353fd7","unresolved":false,"context_lines":[{"line_number":94,"context_line":"    def list_limits(self, hints\u003dNone):"},{"line_number":95,"context_line":"        return self.driver.list_limits(hints or driver_hints.Hints())"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def get_limit(self, limit_id):"},{"line_number":98,"context_line":"        return self.driver.get_limit(limit_id)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def delete_limit(self, limit_id):"},{"line_number":101,"context_line":"        return self.driver.delete_limit(limit_id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"9f91af0f_3f11235e","line":101,"range":{"start_line":97,"start_character":0,"end_line":101,"end_character":49},"updated":"2018-01-08 22:56:00.000000000","message":"Same as above comment.","commit_id":"72f98d2cb309120b014477fca4ad8504934b896a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"MEMOIZE \u003d cache.get_memoization_decorator(group\u003d\u0027unified_limit\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class UnifiedLimitManager(manager.Manager):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    driver_namespace \u003d \u0027keystone.unified_limit\u0027"},{"line_number":32,"context_line":"    _provides_api \u003d \u0027unified_limit_api\u0027"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_23c6134a","line":29,"range":{"start_line":29,"start_character":6,"end_line":29,"end_character":18},"updated":"2018-01-16 01:05:42.000000000","message":"We typically just do:\n\n  class Manager\n\nsince the unified limit bit is usually implied by the name of the module.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":26,"context_line":"MEMOIZE \u003d cache.get_memoization_decorator(group\u003d\u0027unified_limit\u0027)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class UnifiedLimitManager(manager.Manager):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    driver_namespace \u003d \u0027keystone.unified_limit\u0027"},{"line_number":32,"context_line":"    _provides_api \u003d \u0027unified_limit_api\u0027"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_19feea36","line":29,"range":{"start_line":29,"start_character":6,"end_line":29,"end_character":18},"in_reply_to":"7f96bb07_23c6134a","updated":"2018-01-16 03:07:59.000000000","message":"Done","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            project_id \u003d unified_limit.get(\u0027project_id\u0027)"},{"line_number":46,"context_line":"            if project_id is not None:"},{"line_number":47,"context_line":"                PROVIDERS.resource_api.get_project(project_id)"},{"line_number":48,"context_line":"        except exception.ServiceNotFound:"},{"line_number":49,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027service_id\u0027,"},{"line_number":50,"context_line":"                                            target\u003dtarget)"},{"line_number":51,"context_line":"        except exception.RegionNotFound:"},{"line_number":52,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027region_id\u0027,"},{"line_number":53,"context_line":"                                            target\u003dtarget)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_e3c7cb11","line":50,"range":{"start_line":48,"start_character":8,"end_line":50,"end_character":58},"updated":"2018-01-16 01:05:42.000000000","message":"I just spent way too much time looking for the API WG guideline document that describes what to do here, but for this we\u0027re supposed to return a 400 instead of a 404, right?","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            project_id \u003d unified_limit.get(\u0027project_id\u0027)"},{"line_number":46,"context_line":"            if project_id is not None:"},{"line_number":47,"context_line":"                PROVIDERS.resource_api.get_project(project_id)"},{"line_number":48,"context_line":"        except exception.ServiceNotFound:"},{"line_number":49,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027service_id\u0027,"},{"line_number":50,"context_line":"                                            target\u003dtarget)"},{"line_number":51,"context_line":"        except exception.RegionNotFound:"},{"line_number":52,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027region_id\u0027,"},{"line_number":53,"context_line":"                                            target\u003dtarget)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_7984ceb1","line":50,"range":{"start_line":48,"start_character":8,"end_line":50,"end_character":58},"in_reply_to":"7f96bb07_e3c7cb11","updated":"2018-01-16 03:07:59.000000000","message":"yeah. If the input resource doesn\u0027t exist, we should return 400.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.driver.update_registered_limits(registered_limits)"},{"line_number":68,"context_line":"        for registered_limit in registered_limits:"},{"line_number":69,"context_line":"            self.get_registered_limit.invalidate(self, registered_limit[\u0027id\u0027])"},{"line_number":70,"context_line":"        return self.list_registered_limits()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @manager.response_truncated"},{"line_number":73,"context_line":"    def list_registered_limits(self, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_c3a2cf4b","line":70,"range":{"start_line":70,"start_character":20,"end_line":70,"end_character":42},"updated":"2018-01-16 01:05:42.000000000","message":"Can\u0027t this be cached, too?","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5773652f54d638f6eeb8ee127a8b9e48fe449ef5","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.driver.update_registered_limits(registered_limits)"},{"line_number":68,"context_line":"        for registered_limit in registered_limits:"},{"line_number":69,"context_line":"            self.get_registered_limit.invalidate(self, registered_limit[\u0027id\u0027])"},{"line_number":70,"context_line":"        return self.list_registered_limits()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @manager.response_truncated"},{"line_number":73,"context_line":"    def list_registered_limits(self, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_1608de8f","line":70,"range":{"start_line":70,"start_character":20,"end_line":70,"end_character":42},"in_reply_to":"7f96bb07_2e459743","updated":"2018-01-16 14:34:35.000000000","message":"I\u0027m not 100% sure this is the reason, but it might be that it makes cache invalidation harder since any update or delete is going to invalidate the cache or cache region.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.driver.update_registered_limits(registered_limits)"},{"line_number":68,"context_line":"        for registered_limit in registered_limits:"},{"line_number":69,"context_line":"            self.get_registered_limit.invalidate(self, registered_limit[\u0027id\u0027])"},{"line_number":70,"context_line":"        return self.list_registered_limits()"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @manager.response_truncated"},{"line_number":73,"context_line":"    def list_registered_limits(self, hints\u003dNone):"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_2e459743","line":70,"range":{"start_line":70,"start_character":20,"end_line":70,"end_character":42},"in_reply_to":"7f96bb07_c3a2cf4b","updated":"2018-01-16 03:07:59.000000000","message":"Actually I think we should, but I\u0027m not sure because I find that other resources doesn\u0027t cache for list APIs. Do you know why?","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def delete_registered_limit(self, registered_limit_id):"},{"line_number":82,"context_line":"        self.driver.delete_registered_limit(registered_limit_id)"},{"line_number":83,"context_line":"        self.get_registered_limit.invalidate(self, registered_limit_id)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def create_limits(self, limits):"},{"line_number":86,"context_line":"        for limit in limits:"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_43a79f50","line":83,"range":{"start_line":83,"start_character":13,"end_line":83,"end_character":33},"updated":"2018-01-16 01:05:42.000000000","message":"If we ever cache list responses for unified limits we\u0027ll have to incorporate that into this invalidation.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"318a3a1f926b45a5404796a637ae3467d688c444","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2017 SUSE Linux Gmbh"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f96bb07_37bc66ba","line":1,"updated":"2018-01-21 21:49:14.000000000","message":"copypaste error","commit_id":"0cbcad968ac65798c8238c02837ac68dca02d462"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9d2793b5f222b82aa51624851cc57599cfbd3a1b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 SUSE Linux Gmbh"},{"line_number":2,"context_line":"# Copyright 2018 Huawei"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_cb451617","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":32},"updated":"2018-01-23 21:24:25.000000000","message":"You can delete this","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"53d454cb19554665dc205ee587f96cb7448c219a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2018 SUSE Linux Gmbh"},{"line_number":2,"context_line":"# Copyright 2018 Huawei"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_af08cc27","line":1,"range":{"start_line":1,"start_character":0,"end_line":1,"end_character":32},"in_reply_to":"7f96bb07_cb451617","updated":"2018-01-24 03:43:19.000000000","message":"Done","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6ce6d3bf8f52cc70710364495bb16031205a6273","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def __init__(self):"},{"line_number":36,"context_line":"        unified_limit_driver \u003d CONF.unified_limit.driver"},{"line_number":37,"context_line":"        super(Manager, self).__init__(unified_limit_driver)"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _assert_resource_exist(self, unified_limit, target):"},{"line_number":40,"context_line":"        try:"},{"line_number":41,"context_line":"            service_id \u003d unified_limit.get(\u0027service_id\u0027)"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_8b270b13","line":38,"updated":"2018-01-23 23:20:59.000000000","message":"In the future, once keystone starts supporting other models of enforcement, this module will likely contain some sort of model processing. That could based on flat project structures, hierarchies, and so on. We should be sure to include the model in configuration so that people know what they\u0027re using even if we only support the flat model initially.","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"bfca4c99ffec87e540946e66de548c47e9bc7c69","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _assert_resource_exist(self, unified_limit, target):"},{"line_number":39,"context_line":"        try:"},{"line_number":40,"context_line":"            service_id \u003d unified_limit.get(\u0027service_id\u0027)"},{"line_number":41,"context_line":"            if service_id is not None:"},{"line_number":42,"context_line":"                PROVIDERS.catalog_api.get_service(service_id)"},{"line_number":43,"context_line":"            region_id \u003d unified_limit.get(\u0027region_id\u0027)"},{"line_number":44,"context_line":"            if region_id is not None:"},{"line_number":45,"context_line":"                PROVIDERS.catalog_api.get_region(region_id)"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_e6b42f38","line":42,"range":{"start_line":40,"start_character":12,"end_line":42,"end_character":61},"updated":"2018-01-24 20:02:20.000000000","message":"The schema validation makes this a required property, is there any reason this would be empty?","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d15b83744ca88e3aa21401942091f8bf5a94a0d4","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _assert_resource_exist(self, unified_limit, target):"},{"line_number":39,"context_line":"        try:"},{"line_number":40,"context_line":"            service_id \u003d unified_limit.get(\u0027service_id\u0027)"},{"line_number":41,"context_line":"            if service_id is not None:"},{"line_number":42,"context_line":"                PROVIDERS.catalog_api.get_service(service_id)"},{"line_number":43,"context_line":"            region_id \u003d unified_limit.get(\u0027region_id\u0027)"},{"line_number":44,"context_line":"            if region_id is not None:"},{"line_number":45,"context_line":"                PROVIDERS.catalog_api.get_region(region_id)"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_6b83ff05","line":42,"range":{"start_line":40,"start_character":12,"end_line":42,"end_character":61},"in_reply_to":"5f93b717_e6b42f38","updated":"2018-01-25 02:54:11.000000000","message":"yeah. As you said below. For update, the service_id could be empty.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"bfca4c99ffec87e540946e66de548c47e9bc7c69","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            region_id \u003d unified_limit.get(\u0027region_id\u0027)"},{"line_number":44,"context_line":"            if region_id is not None:"},{"line_number":45,"context_line":"                PROVIDERS.catalog_api.get_region(region_id)"},{"line_number":46,"context_line":"            project_id \u003d unified_limit.get(\u0027project_id\u0027)"},{"line_number":47,"context_line":"            if project_id is not None:"},{"line_number":48,"context_line":"                PROVIDERS.resource_api.get_project(project_id)"},{"line_number":49,"context_line":"        except exception.ServiceNotFound:"},{"line_number":50,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027service_id\u0027,"},{"line_number":51,"context_line":"                                            target\u003dtarget)"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_a6886771","line":48,"range":{"start_line":46,"start_character":12,"end_line":48,"end_character":62},"updated":"2018-01-24 20:02:20.000000000","message":"Same here","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8a9039453a09c7e3e02379b81eb3417ac9859f3e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            region_id \u003d unified_limit.get(\u0027region_id\u0027)"},{"line_number":44,"context_line":"            if region_id is not None:"},{"line_number":45,"context_line":"                PROVIDERS.catalog_api.get_region(region_id)"},{"line_number":46,"context_line":"            project_id \u003d unified_limit.get(\u0027project_id\u0027)"},{"line_number":47,"context_line":"            if project_id is not None:"},{"line_number":48,"context_line":"                PROVIDERS.resource_api.get_project(project_id)"},{"line_number":49,"context_line":"        except exception.ServiceNotFound:"},{"line_number":50,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027service_id\u0027,"},{"line_number":51,"context_line":"                                            target\u003dtarget)"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_dabea4fe","line":48,"range":{"start_line":46,"start_character":12,"end_line":48,"end_character":62},"in_reply_to":"5f93b717_a6886771","updated":"2018-01-24 22:05:59.000000000","message":"Well - this is used to assert resources exist for both registered limits and project limits. Registered limits don\u0027t require this attribute.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"03d3cde4075ed2f7a2e52fcd565522aa6fee670e","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            region_id \u003d unified_limit.get(\u0027region_id\u0027)"},{"line_number":44,"context_line":"            if region_id is not None:"},{"line_number":45,"context_line":"                PROVIDERS.catalog_api.get_region(region_id)"},{"line_number":46,"context_line":"            project_id \u003d unified_limit.get(\u0027project_id\u0027)"},{"line_number":47,"context_line":"            if project_id is not None:"},{"line_number":48,"context_line":"                PROVIDERS.resource_api.get_project(project_id)"},{"line_number":49,"context_line":"        except exception.ServiceNotFound:"},{"line_number":50,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027service_id\u0027,"},{"line_number":51,"context_line":"                                            target\u003dtarget)"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_fa17e0ec","line":48,"range":{"start_line":46,"start_character":12,"end_line":48,"end_character":62},"in_reply_to":"5f93b717_dabea4fe","updated":"2018-01-24 22:11:15.000000000","message":"You\u0027re right, and I guess for updates there won\u0027t always be a service id or project id, so this makes sense and is reusable everywhere.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"bfca4c99ffec87e540946e66de548c47e9bc7c69","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":60,"context_line":"        for registered_limit in registered_limits:"},{"line_number":61,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":62,"context_line":"        self.driver.create_registered_limits(registered_limits)"},{"line_number":63,"context_line":"        return self.list_registered_limits()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_registered_limits(self, registered_limits):"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_86e8cb16","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":63},"updated":"2018-01-24 20:02:20.000000000","message":"This create operation returns a list. Would be better to capture that in a variable than to make another list call.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"bb6325399c4745a660793fe10251d8a0095abbc6","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":60,"context_line":"        for registered_limit in registered_limits:"},{"line_number":61,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":62,"context_line":"        self.driver.create_registered_limits(registered_limits)"},{"line_number":63,"context_line":"        return self.list_registered_limits()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_registered_limits(self, registered_limits):"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_00b57231","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":63},"in_reply_to":"5f93b717_0b74bb34","updated":"2018-01-25 06:20:49.000000000","message":"Oh, since we\u0027ll get all limits, not only the created ones. So I think call it here is better.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8a9039453a09c7e3e02379b81eb3417ac9859f3e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":60,"context_line":"        for registered_limit in registered_limits:"},{"line_number":61,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":62,"context_line":"        self.driver.create_registered_limits(registered_limits)"},{"line_number":63,"context_line":"        return self.list_registered_limits()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_registered_limits(self, registered_limits):"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_9a049cc8","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":63},"in_reply_to":"5f93b717_86e8cb16","updated":"2018-01-24 22:05:59.000000000","message":"++ I thought I looked into that earlier. That\u0027d be a nice improvement.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d15b83744ca88e3aa21401942091f8bf5a94a0d4","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    def create_registered_limits(self, registered_limits):"},{"line_number":60,"context_line":"        for registered_limit in registered_limits:"},{"line_number":61,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":62,"context_line":"        self.driver.create_registered_limits(registered_limits)"},{"line_number":63,"context_line":"        return self.list_registered_limits()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_registered_limits(self, registered_limits):"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_0b74bb34","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":63},"in_reply_to":"5f93b717_9a049cc8","updated":"2018-01-25 02:54:11.000000000","message":"sure","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"bfca4c99ffec87e540946e66de548c47e9bc7c69","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":66,"context_line":"        for registered_limit in registered_limits:"},{"line_number":67,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":68,"context_line":"        self.driver.update_registered_limits(registered_limits)"},{"line_number":69,"context_line":"        for registered_limit in registered_limits:"},{"line_number":70,"context_line":"            self.get_registered_limit.invalidate(self, registered_limit[\u0027id\u0027])"},{"line_number":71,"context_line":"        return self.list_registered_limits()"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_a6d6274f","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":63},"updated":"2018-01-24 20:02:20.000000000","message":"Would be good if this driver method could return a list","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d15b83744ca88e3aa21401942091f8bf5a94a0d4","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":66,"context_line":"        for registered_limit in registered_limits:"},{"line_number":67,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":68,"context_line":"        self.driver.update_registered_limits(registered_limits)"},{"line_number":69,"context_line":"        for registered_limit in registered_limits:"},{"line_number":70,"context_line":"            self.get_registered_limit.invalidate(self, registered_limit[\u0027id\u0027])"},{"line_number":71,"context_line":"        return self.list_registered_limits()"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_ab8ee724","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":63},"in_reply_to":"5f93b717_a6d6274f","updated":"2018-01-25 02:54:11.000000000","message":"sure","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"bb6325399c4745a660793fe10251d8a0095abbc6","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def update_registered_limits(self, registered_limits):"},{"line_number":66,"context_line":"        for registered_limit in registered_limits:"},{"line_number":67,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":68,"context_line":"        self.driver.update_registered_limits(registered_limits)"},{"line_number":69,"context_line":"        for registered_limit in registered_limits:"},{"line_number":70,"context_line":"            self.get_registered_limit.invalidate(self, registered_limit[\u0027id\u0027])"},{"line_number":71,"context_line":"        return self.list_registered_limits()"}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_a0835e56","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":63},"in_reply_to":"5f93b717_ab8ee724","updated":"2018-01-25 06:20:49.000000000","message":"ditto","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"bfca4c99ffec87e540946e66de548c47e9bc7c69","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        for registered_limit in registered_limits:"},{"line_number":67,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":68,"context_line":"        self.driver.update_registered_limits(registered_limits)"},{"line_number":69,"context_line":"        for registered_limit in registered_limits:"},{"line_number":70,"context_line":"            self.get_registered_limit.invalidate(self, registered_limit[\u0027id\u0027])"},{"line_number":71,"context_line":"        return self.list_registered_limits()"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_06211b4e","line":69,"updated":"2018-01-24 20:02:20.000000000","message":"I feel like there might be some inefficiencies with how we\u0027re looping over limits once or twice per manager call and then also looping again in the driver. We can try to optimize later.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d15b83744ca88e3aa21401942091f8bf5a94a0d4","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        for registered_limit in registered_limits:"},{"line_number":67,"context_line":"            self._assert_resource_exist(registered_limit, \u0027registered_limit\u0027)"},{"line_number":68,"context_line":"        self.driver.update_registered_limits(registered_limits)"},{"line_number":69,"context_line":"        for registered_limit in registered_limits:"},{"line_number":70,"context_line":"            self.get_registered_limit.invalidate(self, registered_limit[\u0027id\u0027])"},{"line_number":71,"context_line":"        return self.list_registered_limits()"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"5f93b717_d193e64e","line":69,"in_reply_to":"5f93b717_06211b4e","updated":"2018-01-25 02:54:11.000000000","message":"yeah. But it\u0027s not easy to change since all step should be in order.","commit_id":"16b6db40a21d7967358916e13fa2efc3bdb03bd0"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"8026ce9c7aa89779d7f26c429bf02dce017a2224","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            self._assert_resource_exist(limit, \u0027limit\u0027)"},{"line_number":88,"context_line":"        self.driver.create_limits(limits)"},{"line_number":89,"context_line":"        return self.list_limits()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def update_limits(self, limits):"},{"line_number":92,"context_line":"        for limit in limits:"},{"line_number":93,"context_line":"            self._assert_resource_exist(limit, \u0027limit\u0027)"}],"source_content_type":"text/x-python","patch_set":45,"id":"5f93b717_80ebc2ae","line":90,"updated":"2018-01-25 06:39:44.000000000","message":"I find a bug here, if the request is project scoped, he should not get all the limits, but only the limit for the specified project. I\u0027ll fix it in the next ps.","commit_id":"f7e265751e350e21f40015deb6e571c67f62fc5e"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"99a0b389f99c2c09dfad6bdfc394148ae4905179","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            self._assert_resource_exist(limit, \u0027limit\u0027)"},{"line_number":88,"context_line":"        self.driver.create_limits(limits)"},{"line_number":89,"context_line":"        return self.list_limits()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def update_limits(self, limits):"},{"line_number":92,"context_line":"        for limit in limits:"},{"line_number":93,"context_line":"            self._assert_resource_exist(limit, \u0027limit\u0027)"}],"source_content_type":"text/x-python","patch_set":45,"id":"5f93b717_f7d60d50","line":90,"in_reply_to":"5f93b717_80ebc2ae","updated":"2018-01-25 07:54:39.000000000","message":"well, create/update limits are system level APIs. They don\u0027t have this problem. My brain is in a mess now. ;(","commit_id":"f7e265751e350e21f40015deb6e571c67f62fc5e"}],"keystone/tests/unit/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ef3c660e763a1ae1b26dd8fb560cd355ece4bb3f","unresolved":false,"context_lines":[{"line_number":464,"context_line":"def new_registered_limit_ref(**kwargs):"},{"line_number":465,"context_line":"    ref \u003d {"},{"line_number":466,"context_line":"        \u0027service_id\u0027: uuid.uuid4().hex,"},{"line_number":467,"context_line":"        \u0027resource_name\u0027: \u0027test_resource\u0027,"},{"line_number":468,"context_line":"        \u0027default_limit\u0027: 10"},{"line_number":469,"context_line":"    }"},{"line_number":470,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_b487e361","line":467,"range":{"start_line":467,"start_character":25,"end_line":467,"end_character":40},"updated":"2017-12-26 21:31:22.000000000","message":"nit: this could just be a uuid as well, mainly for consistency with the rest of the ref methods:\n\n  \u0027resource_name\u0027: uuid.uuid4().hex,","commit_id":"52a080b52c2fe85aaabf66a100f8fa8b79a1db3a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ef3c660e763a1ae1b26dd8fb560cd355ece4bb3f","unresolved":false,"context_lines":[{"line_number":476,"context_line":"    ref \u003d {"},{"line_number":477,"context_line":"        \u0027project_id\u0027: uuid.uuid4().hex,"},{"line_number":478,"context_line":"        \u0027service_id\u0027: uuid.uuid4().hex,"},{"line_number":479,"context_line":"        \u0027resource_name\u0027: \u0027test_resource\u0027,"},{"line_number":480,"context_line":"        \u0027resource_limit\u0027: 10"},{"line_number":481,"context_line":"    }"},{"line_number":482,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_54f3f70a","line":479,"range":{"start_line":479,"start_character":26,"end_line":479,"end_character":39},"updated":"2017-12-26 21:31:22.000000000","message":"nit: Same comment here as above.","commit_id":"52a080b52c2fe85aaabf66a100f8fa8b79a1db3a"}],"keystone/tests/unit/default_fixtures.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ef3c660e763a1ae1b26dd8fb560cd355ece4bb3f","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            \u0027name\u0027: u\u0027Default\u0027}]"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"SERVICES \u003d [{\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":169,"context_line":"             \u0027type\u0027: \u0027volumev3\u0027,"},{"line_number":170,"context_line":"             \u0027enabled\u0027: True,"},{"line_number":171,"context_line":"             \u0027extra\u0027: {\u0027description\u0027: \u0027Cinder Volume Service V3\u0027,"},{"line_number":172,"context_line":"                       \u0027name\u0027: \u0027cinderv3\u0027}"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_74f63bfc","line":169,"range":{"start_line":169,"start_character":22,"end_line":169,"end_character":30},"updated":"2017-12-26 21:31:22.000000000","message":"Does this have to be specific to volumev3? We should be able to make it as general as possible, right?","commit_id":"52a080b52c2fe85aaabf66a100f8fa8b79a1db3a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c672d9e0319cbd3e04e2543ff3548c8b97d49563","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            \u0027id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":166,"context_line":"            \u0027name\u0027: u\u0027Default\u0027}]"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"SERVICES \u003d [{\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":169,"context_line":"             \u0027type\u0027: \u0027type_one\u0027,"},{"line_number":170,"context_line":"             \u0027enabled\u0027: True,"},{"line_number":171,"context_line":"             \u0027extra\u0027: {\u0027description\u0027: \u0027This is a service for test.\u0027,"},{"line_number":172,"context_line":"                       \u0027name\u0027: \u0027ServiceOne\u0027}"},{"line_number":173,"context_line":"             }]"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"REGIONS \u003d [{\u0027id\u0027: \u0027RegionOne\u0027}, {\u0027id\u0027: \u0027RegionTwo\u0027}]"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_08ac679e","line":175,"range":{"start_line":168,"start_character":0,"end_line":175,"end_character":52},"updated":"2018-01-05 03:03:25.000000000","message":"If I recall correctly, these might get created on every test run... Something that might be more optimal from a test execution perspective would be to leverage setUpClass to bootstrap these resources specifically for unified limit tests and then tear them down accordingly.","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"}],"keystone/tests/unit/limit/test_backends.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ef3c660e763a1ae1b26dd8fb560cd355ece4bb3f","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                          self.registered_limit_api.create_registered_limits,"},{"line_number":89,"context_line":"                          [new_registered_limit1])"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def test_create_registered_limit_invalid_input_returns_bad_request(self):"},{"line_number":92,"context_line":"        new_registered_limit1 \u003d unit.new_registered_limit_ref("},{"line_number":93,"context_line":"            service_id\u003duuid.uuid4().hex,"},{"line_number":94,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_54cc57bb","line":91,"range":{"start_line":91,"start_character":4,"end_line":91,"end_character":77},"updated":"2017-12-26 21:31:22.000000000","message":"We could break this out into separate tests to highlight each case.\n\nOne for an invalid region and one for an invalid service.","commit_id":"52a080b52c2fe85aaabf66a100f8fa8b79a1db3a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ef3c660e763a1ae1b26dd8fb560cd355ece4bb3f","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                          [update_ref])"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def test_update_registered_limit_duplicate(self):"},{"line_number":129,"context_line":"        new_registered_limit1 \u003d unit.new_registered_limit_ref("},{"line_number":130,"context_line":"            service_id\u003dself.service_volumev3[\u0027id\u0027],"},{"line_number":131,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":132,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_34c19381","line":129,"range":{"start_line":129,"start_character":8,"end_line":129,"end_character":29},"updated":"2017-12-26 21:31:22.000000000","message":"nit: For easier readability these could just be:\n\n  limit_1 \u003d unit.new_registered_limit_ref(...","commit_id":"52a080b52c2fe85aaabf66a100f8fa8b79a1db3a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e8d8651aac350bd0d326aee45851ac2a8c2f2132","unresolved":false,"context_lines":[{"line_number":25,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":26,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":27,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":28,"context_line":"        res1 \u003d self.unified_limit_api.create_registered_limits("},{"line_number":29,"context_line":"            [registered_limit_1])"},{"line_number":30,"context_line":"        self.assertDictEqual(registered_limit_1, res1[0])"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"bf8cb3f7_aeec67f3","line":28,"range":{"start_line":28,"start_character":15,"end_line":28,"end_character":19},"updated":"2017-12-27 20:21:18.000000000","message":"Same comment here about using keystone.common.provider_api module.","commit_id":"17dec0a4ed07e47609afbf762b0197464790061a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c672d9e0319cbd3e04e2543ff3548c8b97d49563","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        res2 \u003d PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":42,"context_line":"            [registered_limit_2])"},{"line_number":43,"context_line":"        registered_limit_ids \u003d [re[\u0027id\u0027] for re in res2]"},{"line_number":44,"context_line":"        self.assertIn(registered_limit_1[\u0027id\u0027], registered_limit_ids)"},{"line_number":45,"context_line":"        self.assertIn(registered_limit_2[\u0027id\u0027], registered_limit_ids)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # list"},{"line_number":48,"context_line":"        reg_limits \u003d PROVIDERS.unified_limit_api.list_registered_limits()"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_88f157d0","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":69},"updated":"2018-01-05 03:03:25.000000000","message":"nit: we might be able to make these assertions a little more robust by asserting the entire reference is in the response, instead of just the id.","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"adbb5c2a68eca19bdb33dd575399a9bdb9a6c570","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        res2 \u003d PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":42,"context_line":"            [registered_limit_2])"},{"line_number":43,"context_line":"        registered_limit_ids \u003d [re[\u0027id\u0027] for re in res2]"},{"line_number":44,"context_line":"        self.assertIn(registered_limit_1[\u0027id\u0027], registered_limit_ids)"},{"line_number":45,"context_line":"        self.assertIn(registered_limit_2[\u0027id\u0027], registered_limit_ids)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # list"},{"line_number":48,"context_line":"        reg_limits \u003d PROVIDERS.unified_limit_api.list_registered_limits()"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_e83a6332","line":45,"range":{"start_line":44,"start_character":0,"end_line":45,"end_character":69},"in_reply_to":"9f91af0f_88f157d0","updated":"2018-01-05 03:34:20.000000000","message":"Sure","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c672d9e0319cbd3e04e2543ff3548c8b97d49563","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.assertIn(registered_limit_1[\u0027id\u0027], registered_limit_ids)"},{"line_number":45,"context_line":"        self.assertIn(registered_limit_2[\u0027id\u0027], registered_limit_ids)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # list"},{"line_number":48,"context_line":"        reg_limits \u003d PROVIDERS.unified_limit_api.list_registered_limits()"},{"line_number":49,"context_line":"        self.assertEqual(2, len(reg_limits))"},{"line_number":50,"context_line":"        registered_limit_ids \u003d [registered_limit[\u0027id\u0027] for registered_limit"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_68c09351","line":47,"updated":"2018-01-05 03:03:25.000000000","message":"nit: we could break these into their own test cases","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"adbb5c2a68eca19bdb33dd575399a9bdb9a6c570","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.assertIn(registered_limit_1[\u0027id\u0027], registered_limit_ids)"},{"line_number":45,"context_line":"        self.assertIn(registered_limit_2[\u0027id\u0027], registered_limit_ids)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # list"},{"line_number":48,"context_line":"        reg_limits \u003d PROVIDERS.unified_limit_api.list_registered_limits()"},{"line_number":49,"context_line":"        self.assertEqual(2, len(reg_limits))"},{"line_number":50,"context_line":"        registered_limit_ids \u003d [registered_limit[\u0027id\u0027] for registered_limit"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_88fe3735","line":47,"in_reply_to":"9f91af0f_68c09351","updated":"2018-01-05 03:34:20.000000000","message":"sure","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c672d9e0319cbd3e04e2543ff3548c8b97d49563","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                          PROVIDERS.unified_limit_api.get_registered_limit,"},{"line_number":78,"context_line":"                          registered_limit_1[\u0027id\u0027])"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def test_create_registered_limit_duplicate(self):"},{"line_number":81,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("},{"line_number":82,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":83,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_28afeb94","line":80,"updated":"2018-01-05 03:03:25.000000000","message":"For the common resources here, like service and region, we should be able to use a setUpClass to create those things if they don\u0027t need to be recreated between test cases.","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c672d9e0319cbd3e04e2543ff3548c8b97d49563","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":108,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":109,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":110,"context_line":"        registered_limit_3 \u003d unit.new_registered_limit_ref("},{"line_number":111,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":112,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":113,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":114,"context_line":"        self.assertRaises(exception.Conflict,"},{"line_number":115,"context_line":"                          PROVIDERS.unified_limit_api.create_registered_limits,"},{"line_number":116,"context_line":"                          [registered_limit_2, registered_limit_3])"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_e879032f","line":113,"range":{"start_line":110,"start_character":0,"end_line":113,"end_character":76},"updated":"2018-01-05 03:03:25.000000000","message":"why doesn\u0027t this one get created?","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"adbb5c2a68eca19bdb33dd575399a9bdb9a6c570","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":108,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":109,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":110,"context_line":"        registered_limit_3 \u003d unit.new_registered_limit_ref("},{"line_number":111,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":112,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":113,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":114,"context_line":"        self.assertRaises(exception.Conflict,"},{"line_number":115,"context_line":"                          PROVIDERS.unified_limit_api.create_registered_limits,"},{"line_number":116,"context_line":"                          [registered_limit_2, registered_limit_3])"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_e8ffc331","line":113,"range":{"start_line":110,"start_character":0,"end_line":113,"end_character":76},"in_reply_to":"9f91af0f_e879032f","updated":"2018-01-05 03:34:20.000000000","message":"Here I want to test a case that when create more than one registered limit in one request, if one of the registered limits is wrong, all of them will not be created.","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"85ab9e24e8767542a2c9c4d7a21d43fcad0e343c","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":108,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":109,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":110,"context_line":"        registered_limit_3 \u003d unit.new_registered_limit_ref("},{"line_number":111,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":112,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":113,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":114,"context_line":"        self.assertRaises(exception.Conflict,"},{"line_number":115,"context_line":"                          PROVIDERS.unified_limit_api.create_registered_limits,"},{"line_number":116,"context_line":"                          [registered_limit_2, registered_limit_3])"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_4bf49f86","line":113,"range":{"start_line":110,"start_character":0,"end_line":113,"end_character":76},"in_reply_to":"9f91af0f_e8ffc331","updated":"2018-01-05 16:13:47.000000000","message":"Oh nice, good call. We could work that into the test name somehow, too.","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c672d9e0319cbd3e04e2543ff3548c8b97d49563","unresolved":false,"context_lines":[{"line_number":111,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":112,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":113,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":114,"context_line":"        self.assertRaises(exception.Conflict,"},{"line_number":115,"context_line":"                          PROVIDERS.unified_limit_api.create_registered_limits,"},{"line_number":116,"context_line":"                          [registered_limit_2, registered_limit_3])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        reg_limits \u003d PROVIDERS.unified_limit_api.list_registered_limits()"},{"line_number":119,"context_line":"        self.assertEqual(1, len(reg_limits))"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_688e532f","line":116,"range":{"start_line":114,"start_character":0,"end_line":116,"end_character":67},"updated":"2018-01-05 03:03:25.000000000","message":"It might be easier to tell that both of them fail creation by pulling them out into their own statements:\n\n  self.assertRaises(exception.Conflict, ..., [registered_limit_2])\n  self.assertRaises(exception.Conflict, ..., [registered_limit_3])","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c672d9e0319cbd3e04e2543ff3548c8b97d49563","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        res1 \u003d PROVIDERS.unified_limit_api.create_limits([limit_1])"},{"line_number":237,"context_line":"        self.assertDictEqual(limit_1, res1[0])"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        # create another, return all limits"},{"line_number":240,"context_line":"        limit_2 \u003d unit.new_limit_ref("},{"line_number":241,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":242,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":23,"id":"9f91af0f_c8a3df9d","line":239,"updated":"2018-01-05 03:03:25.000000000","message":"nit: same comment here about pulling these out into their own test cases","commit_id":"3056bd01f5919c5430eddcf19222b68922c4a6d3"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":40,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d5, id\u003duuid.uuid4().hex)"},{"line_number":41,"context_line":"        res2 \u003d PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":42,"context_line":"            [registered_limit_2])"},{"line_number":43,"context_line":"        for re in res2:"},{"line_number":44,"context_line":"            if re[\u0027id\u0027] \u003d\u003d registered_limit_1[\u0027id\u0027]:"},{"line_number":45,"context_line":"                self.assertDictEqual(registered_limit_1, re)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_e31a6b7b","line":42,"updated":"2018-01-16 01:05:42.000000000","message":"We could add another assertion here to make sure we only get two limits back in the response.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":39,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":40,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d5, id\u003duuid.uuid4().hex)"},{"line_number":41,"context_line":"        res2 \u003d PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":42,"context_line":"            [registered_limit_2])"},{"line_number":43,"context_line":"        for re in res2:"},{"line_number":44,"context_line":"            if re[\u0027id\u0027] \u003d\u003d registered_limit_1[\u0027id\u0027]:"},{"line_number":45,"context_line":"                self.assertDictEqual(registered_limit_1, re)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_94ab9f87","line":42,"in_reply_to":"7f96bb07_e31a6b7b","updated":"2018-01-16 03:07:59.000000000","message":"Done","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            [registered_limit_1])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        # Create with a duplicated one and a normal one. Both of them will not"},{"line_number":74,"context_line":"        # be created."},{"line_number":75,"context_line":"        registered_limit_2 \u003d unit.new_registered_limit_ref("},{"line_number":76,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":77,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_fe020409","line":74,"updated":"2018-01-16 01:05:42.000000000","message":"Nice - thanks for adding this case.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                          [registered_limit_2, registered_limit_3])"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        reg_limits \u003d PROVIDERS.unified_limit_api.list_registered_limits()"},{"line_number":88,"context_line":"        self.assertEqual(1, len(reg_limits))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_create_registered_limit_invalid_service(self):"},{"line_number":91,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_9e22e0a3","line":88,"updated":"2018-01-16 01:05:42.000000000","message":"We could add another assertion here just to make sure we did get back the only limit we should be getting back:\n\n  self.assertEqual(registered_limit_1[\u0027id\u0027], reg_limit[0][\u0027id\u0027])","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                          [registered_limit_2, registered_limit_3])"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        reg_limits \u003d PROVIDERS.unified_limit_api.list_registered_limits()"},{"line_number":88,"context_line":"        self.assertEqual(1, len(reg_limits))"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def test_create_registered_limit_invalid_service(self):"},{"line_number":91,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_d48a8719","line":88,"in_reply_to":"7f96bb07_9e22e0a3","updated":"2018-01-16 03:07:59.000000000","message":"Done","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":180,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":181,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d5, id\u003duuid.uuid4().hex)"},{"line_number":182,"context_line":"        PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":183,"context_line":"            [registered_limit_1, registered_limit_2])"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        # list"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_de84e860","line":182,"updated":"2018-01-16 01:05:42.000000000","message":"We could save the response from this call and use it in the assertion later to, comparing it to the result from list_registered_limits().","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d6e75aebb8b3b64bf678a1a5435488597d3f42b4","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":180,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":181,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d5, id\u003duuid.uuid4().hex)"},{"line_number":182,"context_line":"        PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":183,"context_line":"            [registered_limit_1, registered_limit_2])"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        # list"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_289ca768","line":182,"in_reply_to":"7f96bb07_de84e860","updated":"2018-01-16 07:35:52.000000000","message":"Done","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            registered_limit_1[\u0027id\u0027])"},{"line_number":261,"context_line":"        self.assertRaises(exception.RegisteredLimitNotFound,"},{"line_number":262,"context_line":"                          PROVIDERS.unified_limit_api.get_registered_limit,"},{"line_number":263,"context_line":"                          registered_limit_1[\u0027id\u0027])"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def test_delete_registered_limit_returns_not_found(self):"},{"line_number":266,"context_line":"        self.assertRaises(exception.RegisteredLimitNotFound,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_feec442a","line":263,"updated":"2018-01-16 01:05:42.000000000","message":"We can list the remaining limit to make sure it was removed from the system.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":260,"context_line":"            registered_limit_1[\u0027id\u0027])"},{"line_number":261,"context_line":"        self.assertRaises(exception.RegisteredLimitNotFound,"},{"line_number":262,"context_line":"                          PROVIDERS.unified_limit_api.get_registered_limit,"},{"line_number":263,"context_line":"                          registered_limit_1[\u0027id\u0027])"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def test_delete_registered_limit_returns_not_found(self):"},{"line_number":266,"context_line":"        self.assertRaises(exception.RegisteredLimitNotFound,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_54cc3769","line":263,"in_reply_to":"7f96bb07_feec442a","updated":"2018-01-16 03:07:59.000000000","message":"Done","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":280,"context_line":"            [registered_limit_1, registered_limit_2])"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def test_limit_crud(self):"},{"line_number":283,"context_line":"        self._create_default_registered_limits()"},{"line_number":284,"context_line":"        # create one, return all limits"},{"line_number":285,"context_line":"        limit_1 \u003d unit.new_limit_ref("}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_7ec11480","line":282,"range":{"start_line":282,"start_character":18,"end_line":282,"end_character":23},"updated":"2018-01-16 01:05:42.000000000","message":"Since this isn\u0027t testing all aspects of CRUD, we should rename the test to be more specific to the test:\n\n  def test_create_and_list_limits(self)\n\nOr we could even break them up a bit into:\n\n  def test_create_limit(self):\n      self._create_default_registered_limits()\n      limit \u003d unit.new_limit_ref(\n          project_id\u003dself.tenant_bar[\u0027id\u0027],\n          service_id\u003dself.service_ServiceOne[\u0027id\u0027],\n          region_id\u003dself.region_RegionOne[\u0027id\u0027],\n          resource_name\u003d\u0027volume\u0027, resource_limit\u003d10,\n          id\u003duuid.uuid4().hex)\n      result \u003d PROVIDERS.unified_limit_api.create_limits([limit])\n      self.assertDictEqual(limit, result[0])\n\nand\n\n  def test_list_limit(self):\n      self._create_default_registered_limits()\n      # create one or multiple\n      limit \u003d unit.new_limit_ref(\n          project_id\u003dself.tenant_bar[\u0027id\u0027],\n          service_id\u003dself.service_ServiceOne[\u0027id\u0027],\n          region_id\u003dself.region_RegionOne[\u0027id\u0027],\n          resource_name\u003d\u0027volume\u0027, resource_limit\u003d10,\n          id\u003duuid.uuid4().hex)\n      create_result \u003d PROVIDERS.unified_limit_api.create_limits([limit])\n      list_result \u003d PROVIDERS.unified_limit_api.list_limits()\n      # make sure they are equal","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":280,"context_line":"            [registered_limit_1, registered_limit_2])"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def test_limit_crud(self):"},{"line_number":283,"context_line":"        self._create_default_registered_limits()"},{"line_number":284,"context_line":"        # create one, return all limits"},{"line_number":285,"context_line":"        limit_1 \u003d unit.new_limit_ref("}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_74ccd360","line":282,"range":{"start_line":282,"start_character":18,"end_line":282,"end_character":23},"in_reply_to":"7f96bb07_7ec11480","updated":"2018-01-16 03:07:59.000000000","message":"Done, It tests for limit creation. I separated CRUD into some single tests but forget to change this test name.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                self.assertDictEqual(limit_1, re)"},{"line_number":303,"context_line":"            if re[\u0027id\u0027] \u003d\u003d limit_2[\u0027id\u0027]:"},{"line_number":304,"context_line":"                self.assertDictEqual(limit_2, re)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_create_limit_duplicate(self):"},{"line_number":307,"context_line":"        self._create_default_registered_limits()"},{"line_number":308,"context_line":"        limit_1 \u003d unit.new_limit_ref("}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_5ed0d81f","line":305,"updated":"2018-01-16 01:05:42.000000000","message":"Do we test creating a limit that doesn\u0027t correspond to a registered limit?","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"d6e75aebb8b3b64bf678a1a5435488597d3f42b4","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                self.assertDictEqual(limit_1, re)"},{"line_number":303,"context_line":"            if re[\u0027id\u0027] \u003d\u003d limit_2[\u0027id\u0027]:"},{"line_number":304,"context_line":"                self.assertDictEqual(limit_2, re)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_create_limit_duplicate(self):"},{"line_number":307,"context_line":"        self._create_default_registered_limits()"},{"line_number":308,"context_line":"        limit_1 \u003d unit.new_limit_ref("}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_d5435b12","line":305,"in_reply_to":"7f96bb07_0e8f7b75","updated":"2018-01-16 07:35:52.000000000","message":"It\u0027s strange that the FK doesn\u0027t work for the test code:\nI wrote a test like:\n\ndef test_create_limit_without_reference_registered_limit(self):\n\tlimit_1 \u003d unit.new_limit_ref(\n\t\tproject_id\u003dself.tenant_bar[\u0027id\u0027],\n\t\tservice_id\u003dself.service_ServiceOne[\u0027id\u0027],\n\t\tregion_id\u003dself.region_RegionOne[\u0027id\u0027],\n\t\tresource_name\u003d\u0027volume\u0027, resource_limit\u003d10, id\u003duuid.uuid4().hex)\n\tself.assertRaises(exception.NoLimitReference,\n\t\t\t\t\t  PROVIDERS.unified_limit_api.create_limits,\n\t\t\t\t\t  [limit_1])\n\nBut I\u0027m sure the FK works since I test those APIs in my env many times. Have no idea here now.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"9735fd51d2fec47e7d4aa087fc1819d567595383","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                self.assertDictEqual(limit_1, re)"},{"line_number":303,"context_line":"            if re[\u0027id\u0027] \u003d\u003d limit_2[\u0027id\u0027]:"},{"line_number":304,"context_line":"                self.assertDictEqual(limit_2, re)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_create_limit_duplicate(self):"},{"line_number":307,"context_line":"        self._create_default_registered_limits()"},{"line_number":308,"context_line":"        limit_1 \u003d unit.new_limit_ref("}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_0e8f7b75","line":305,"in_reply_to":"7f96bb07_5ed0d81f","updated":"2018-01-16 03:11:14.000000000","message":"Done","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5773652f54d638f6eeb8ee127a8b9e48fe449ef5","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                self.assertDictEqual(limit_1, re)"},{"line_number":303,"context_line":"            if re[\u0027id\u0027] \u003d\u003d limit_2[\u0027id\u0027]:"},{"line_number":304,"context_line":"                self.assertDictEqual(limit_2, re)"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"    def test_create_limit_duplicate(self):"},{"line_number":307,"context_line":"        self._create_default_registered_limits()"},{"line_number":308,"context_line":"        limit_1 \u003d unit.new_limit_ref("}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_16645e49","line":305,"in_reply_to":"7f96bb07_d5435b12","updated":"2018-01-16 14:34:35.000000000","message":"That might be a result of keystone using sqlite for testing purposes. I don\u0027t think sqlite honors FK constraints.\n\nDavid had a patch up to fix that a long time ago but it has never merged.\n\nhttps://review.openstack.org/#/c/126030/","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                          PROVIDERS.unified_limit_api.create_limits,"},{"line_number":323,"context_line":"                          [limit_1])"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def test_create_limit_invalid_input_returns_bad_request(self):"},{"line_number":326,"context_line":"        limit_1 \u003d unit.new_limit_ref("},{"line_number":327,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":328,"context_line":"            service_id\u003duuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_1e1c9010","line":325,"range":{"start_line":325,"start_character":8,"end_line":325,"end_character":60},"updated":"2018-01-16 01:05:42.000000000","message":"We could break these into more specific tests:\n\n  def test_create_limit_with_invalid_region_raises_validation_error(self):\n\nand the same thing for the service case.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7a177a2ef58cfacde70e21094f06fc3ece1e5563","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                          PROVIDERS.unified_limit_api.create_limits,"},{"line_number":323,"context_line":"                          [limit_1])"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def test_create_limit_invalid_input_returns_bad_request(self):"},{"line_number":326,"context_line":"        limit_1 \u003d unit.new_limit_ref("},{"line_number":327,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":328,"context_line":"            service_id\u003duuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_543f5724","line":325,"range":{"start_line":325,"start_character":8,"end_line":325,"end_character":60},"in_reply_to":"7f96bb07_1e1c9010","updated":"2018-01-16 03:07:59.000000000","message":"Done","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def test_create_registered_limit_crud(self):"},{"line_number":27,"context_line":"        # create one, return all registered_limits"},{"line_number":28,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("},{"line_number":29,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":30,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":31,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":32,"context_line":"        res1 \u003d PROVIDERS.unified_limit_api.create_registered_limits("}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_c146d2c0","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":46},"updated":"2018-01-18 21:31:20.000000000","message":"nit: the naming here is a bit redundant.","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"b4c5be8172777a32c35575555da26734f3da11f2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def test_create_registered_limit_crud(self):"},{"line_number":27,"context_line":"        # create one, return all registered_limits"},{"line_number":28,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("},{"line_number":29,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":30,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":31,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":32,"context_line":"        res1 \u003d PROVIDERS.unified_limit_api.create_registered_limits("}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_d5052947","line":29,"range":{"start_line":29,"start_character":28,"end_line":29,"end_character":46},"in_reply_to":"7f96bb07_c146d2c0","updated":"2018-01-19 02:14:46.000000000","message":"Done","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # create one, return all registered_limits"},{"line_number":28,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("},{"line_number":29,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":30,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":31,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":32,"context_line":"        res1 \u003d PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":33,"context_line":"            [registered_limit_1])"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_e1418ea7","line":30,"range":{"start_line":30,"start_character":27,"end_line":30,"end_character":43},"updated":"2018-01-18 21:31:20.000000000","message":"nit: same comment here.","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"b4c5be8172777a32c35575555da26734f3da11f2","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        # create one, return all registered_limits"},{"line_number":28,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("},{"line_number":29,"context_line":"            service_id\u003dself.service_ServiceOne[\u0027id\u0027],"},{"line_number":30,"context_line":"            region_id\u003dself.region_RegionOne[\u0027id\u0027],"},{"line_number":31,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":32,"context_line":"        res1 \u003d PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":33,"context_line":"            [registered_limit_1])"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_35eb2d78","line":30,"range":{"start_line":30,"start_character":27,"end_line":30,"end_character":43},"in_reply_to":"7f96bb07_e1418ea7","updated":"2018-01-19 02:14:46.000000000","message":"Done","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        hints.add_filter(\u0027region_id\u0027, self.region_RegionOne[\u0027id\u0027])"},{"line_number":479,"context_line":"        hints.add_filter(\u0027project_id\u0027, self.tenant_bar[\u0027id\u0027])"},{"line_number":480,"context_line":"        res \u003d PROVIDERS.unified_limit_api.list_limits(hints)"},{"line_number":481,"context_line":"        self.assertEqual(1, len(res))"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":484,"context_line":"        hints.add_filter(\u0027resource_name\u0027, \u0027backup\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_6c78158f","line":481,"updated":"2018-01-18 21:31:20.000000000","message":"We could add another assertion here to make sure it\u0027s actually limit_1.","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"b4c5be8172777a32c35575555da26734f3da11f2","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        hints.add_filter(\u0027region_id\u0027, self.region_RegionOne[\u0027id\u0027])"},{"line_number":479,"context_line":"        hints.add_filter(\u0027project_id\u0027, self.tenant_bar[\u0027id\u0027])"},{"line_number":480,"context_line":"        res \u003d PROVIDERS.unified_limit_api.list_limits(hints)"},{"line_number":481,"context_line":"        self.assertEqual(1, len(res))"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":484,"context_line":"        hints.add_filter(\u0027resource_name\u0027, \u0027backup\u0027)"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_d58a09bd","line":481,"in_reply_to":"7f96bb07_6c78158f","updated":"2018-01-19 02:14:46.000000000","message":"Done","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":550,"context_line":"            resource_name\u003d\u0027volume\u0027, resource_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":551,"context_line":"        PROVIDERS.unified_limit_api.create_limits([limit_1])"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        self.assertRaises(exception.ReferencedLimitExist,"},{"line_number":554,"context_line":"                          PROVIDERS.unified_limit_api.delete_registered_limit,"},{"line_number":555,"context_line":"                          registered_limit_1[\u0027id\u0027])"},{"line_number":556,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_8cd80153","line":553,"updated":"2018-01-18 21:31:20.000000000","message":"Just to clarify, this means all limits associated to a registered limit must be removed before removing the registered limit.","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9aba9734c85a36ded2d0475ed28b5d1503d3e7d6","unresolved":false,"context_lines":[{"line_number":550,"context_line":"            resource_name\u003d\u0027volume\u0027, resource_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":551,"context_line":"        PROVIDERS.unified_limit_api.create_limits([limit_1])"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        self.assertRaises(exception.ReferencedLimitExist,"},{"line_number":554,"context_line":"                          PROVIDERS.unified_limit_api.delete_registered_limit,"},{"line_number":555,"context_line":"                          registered_limit_1[\u0027id\u0027])"},{"line_number":556,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_b8709441","line":553,"in_reply_to":"7f96bb07_356ecdff","updated":"2018-01-19 02:49:41.000000000","message":"Yeah - I\u0027m not opposed to that. We do have other things in keystone that require flows like this. For example, when deleting a domain you have to disable it and then delete it. This kinda feels like that. I think there was also logic to prevent you from deleting a project if there were projects underneath it.\n\nI guess this functionality could come later, if needed. For now, I don\u0027t think it\u0027s a terrible idea for operators to do limit cleanup manually before deleting the registered limit.","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"b4c5be8172777a32c35575555da26734f3da11f2","unresolved":false,"context_lines":[{"line_number":550,"context_line":"            resource_name\u003d\u0027volume\u0027, resource_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":551,"context_line":"        PROVIDERS.unified_limit_api.create_limits([limit_1])"},{"line_number":552,"context_line":""},{"line_number":553,"context_line":"        self.assertRaises(exception.ReferencedLimitExist,"},{"line_number":554,"context_line":"                          PROVIDERS.unified_limit_api.delete_registered_limit,"},{"line_number":555,"context_line":"                          registered_limit_1[\u0027id\u0027])"},{"line_number":556,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_356ecdff","line":553,"in_reply_to":"7f96bb07_8cd80153","updated":"2018-01-19 02:14:46.000000000","message":"yes. So I came up with an idea that we can support deleting the registered limit and related limits together in one request. Such as: ``delete {registered_limit} --cascade``","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9d2793b5f222b82aa51624851cc57599cfbd3a1b","unresolved":false,"context_lines":[{"line_number":210,"context_line":"            hints\u003dhints)"},{"line_number":211,"context_line":"        self.assertEqual(1, len(reg_limits))"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        if reg_limits[0][\u0027id\u0027] \u003d\u003d registered_limit_1[\u0027id\u0027]:"},{"line_number":214,"context_line":"            self.assertDictEqual(registered_limit_1, reg_limits[0])"},{"line_number":215,"context_line":"        else:"},{"line_number":216,"context_line":"            self.assertDictEqual(registered_limit_2, reg_limits[0])"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def test_list_registered_limit_by_filter(self):"},{"line_number":219,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_4bca661a","line":216,"range":{"start_line":213,"start_character":8,"end_line":216,"end_character":67},"updated":"2018-01-23 21:24:25.000000000","message":"It worries me a little that this is possible with our use of list_limit and no pagination links, but that is probably a discussion for later since we already have this pattern in keystone","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9d2793b5f222b82aa51624851cc57599cfbd3a1b","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                          PROVIDERS.unified_limit_api.delete_registered_limit,"},{"line_number":294,"context_line":"                          uuid.uuid4().hex)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def _create_default_registered_limits(self):"},{"line_number":297,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("},{"line_number":298,"context_line":"            service_id\u003dself.service_one[\u0027id\u0027],"},{"line_number":299,"context_line":"            region_id\u003dself.region_one[\u0027id\u0027],"},{"line_number":300,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":301,"context_line":"        registered_limit_2 \u003d unit.new_registered_limit_ref("},{"line_number":302,"context_line":"            service_id\u003dself.service_one[\u0027id\u0027],"},{"line_number":303,"context_line":"            region_id\u003dself.region_two[\u0027id\u0027],"},{"line_number":304,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":305,"context_line":"        PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":306,"context_line":"            [registered_limit_1, registered_limit_2])"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def test_create_limit(self):"},{"line_number":309,"context_line":"        self._create_default_registered_limits()"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_cbfe7637","line":306,"range":{"start_line":296,"start_character":4,"end_line":306,"end_character":53},"updated":"2018-01-23 21:24:25.000000000","message":"Might be useful to split registered limits and limits into two test classes and put this in the setUp() of the limits test class. Definitely not required though.","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"53d454cb19554665dc205ee587f96cb7448c219a","unresolved":false,"context_lines":[{"line_number":293,"context_line":"                          PROVIDERS.unified_limit_api.delete_registered_limit,"},{"line_number":294,"context_line":"                          uuid.uuid4().hex)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    def _create_default_registered_limits(self):"},{"line_number":297,"context_line":"        registered_limit_1 \u003d unit.new_registered_limit_ref("},{"line_number":298,"context_line":"            service_id\u003dself.service_one[\u0027id\u0027],"},{"line_number":299,"context_line":"            region_id\u003dself.region_one[\u0027id\u0027],"},{"line_number":300,"context_line":"            resource_name\u003d\u0027volume\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":301,"context_line":"        registered_limit_2 \u003d unit.new_registered_limit_ref("},{"line_number":302,"context_line":"            service_id\u003dself.service_one[\u0027id\u0027],"},{"line_number":303,"context_line":"            region_id\u003dself.region_two[\u0027id\u0027],"},{"line_number":304,"context_line":"            resource_name\u003d\u0027snapshot\u0027, default_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":305,"context_line":"        PROVIDERS.unified_limit_api.create_registered_limits("},{"line_number":306,"context_line":"            [registered_limit_1, registered_limit_2])"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"    def test_create_limit(self):"},{"line_number":309,"context_line":"        self._create_default_registered_limits()"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_6fcba452","line":306,"range":{"start_line":296,"start_character":4,"end_line":306,"end_character":53},"in_reply_to":"7f96bb07_cbfe7637","updated":"2018-01-24 03:43:19.000000000","message":"Done","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6ce6d3bf8f52cc70710364495bb16031205a6273","unresolved":false,"context_lines":[{"line_number":602,"context_line":"            resource_name\u003d\u0027volume\u0027, resource_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":603,"context_line":"        PROVIDERS.unified_limit_api.create_limits([limit_2])"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        registered_limit_update \u003d {\u0027id\u0027: registered_limit_2[\u0027id\u0027],"},{"line_number":606,"context_line":"                                   \u0027region_id\u0027: \u0027region_two\u0027}"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        self.assertRaises(exception.RegisteredLimitError,"},{"line_number":609,"context_line":"                          PROVIDERS.unified_limit_api.update_registered_limits,"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_ab39a73f","line":606,"range":{"start_line":605,"start_character":0,"end_line":606,"end_character":61},"updated":"2018-01-23 23:20:59.000000000","message":"What happens if all you want to update is the default_limit? In that case are we going to require administrator to remove all project limits to update the registered limit, then recreate the project limits?\n\nI\u0027m wondering what options operators have if they realize they want to change a registered limit after they\u0027ve started using it.","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"03617528638f07979a262e77a6b5827c4aac50c4","unresolved":false,"context_lines":[{"line_number":602,"context_line":"            resource_name\u003d\u0027volume\u0027, resource_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":603,"context_line":"        PROVIDERS.unified_limit_api.create_limits([limit_2])"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        registered_limit_update \u003d {\u0027id\u0027: registered_limit_2[\u0027id\u0027],"},{"line_number":606,"context_line":"                                   \u0027region_id\u0027: \u0027region_two\u0027}"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        self.assertRaises(exception.RegisteredLimitError,"},{"line_number":609,"context_line":"                          PROVIDERS.unified_limit_api.update_registered_limits,"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_eef57dee","line":606,"range":{"start_line":605,"start_character":0,"end_line":606,"end_character":61},"in_reply_to":"7f96bb07_ab39a73f","updated":"2018-01-23 23:43:02.000000000","message":"I think that wouldn\u0027t trigger this dbreference error since the default_limit isn\u0027t a foreign key for anything. Maybe a test showing that would be useful.","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"53d454cb19554665dc205ee587f96cb7448c219a","unresolved":false,"context_lines":[{"line_number":602,"context_line":"            resource_name\u003d\u0027volume\u0027, resource_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":603,"context_line":"        PROVIDERS.unified_limit_api.create_limits([limit_2])"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        registered_limit_update \u003d {\u0027id\u0027: registered_limit_2[\u0027id\u0027],"},{"line_number":606,"context_line":"                                   \u0027region_id\u0027: \u0027region_two\u0027}"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        self.assertRaises(exception.RegisteredLimitError,"},{"line_number":609,"context_line":"                          PROVIDERS.unified_limit_api.update_registered_limits,"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_2fc59c3c","line":606,"range":{"start_line":605,"start_character":0,"end_line":606,"end_character":61},"in_reply_to":"7f96bb07_aef3f5e6","updated":"2018-01-24 03:43:19.000000000","message":"Cool","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4b01fc4a6a35ed989566d5ef8d0af4ba5a86d99a","unresolved":false,"context_lines":[{"line_number":602,"context_line":"            resource_name\u003d\u0027volume\u0027, resource_limit\u003d10, id\u003duuid.uuid4().hex)"},{"line_number":603,"context_line":"        PROVIDERS.unified_limit_api.create_limits([limit_2])"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        registered_limit_update \u003d {\u0027id\u0027: registered_limit_2[\u0027id\u0027],"},{"line_number":606,"context_line":"                                   \u0027region_id\u0027: \u0027region_two\u0027}"},{"line_number":607,"context_line":""},{"line_number":608,"context_line":"        self.assertRaises(exception.RegisteredLimitError,"},{"line_number":609,"context_line":"                          PROVIDERS.unified_limit_api.update_registered_limits,"}],"source_content_type":"text/x-python","patch_set":40,"id":"7f96bb07_aef3f5e6","line":606,"range":{"start_line":605,"start_character":0,"end_line":606,"end_character":61},"in_reply_to":"7f96bb07_eef57dee","updated":"2018-01-23 23:52:05.000000000","message":"The clarification on the previous patch makes sense. The test would be good though.","commit_id":"e2226c26bc3d3af63e6df7f25406850d44e37b19"}],"keystone/tests/unit/test_backend_endpoint_policy_sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    test_backend_sql.SqlTests,"},{"line_number":34,"context_line":"        test_backend_endpoint_policy.PolicyAssociationTests):"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def load_fixtures(self, fixtures, enable_sqlite_foreign_key\u003dFalse):"},{"line_number":37,"context_line":"        super(SqlPolicyAssociationTests, self).load_fixtures(fixtures)"},{"line_number":38,"context_line":"        self.load_sample_data()"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_2ce8cd79","line":36,"range":{"start_line":36,"start_character":64,"end_line":36,"end_character":69},"updated":"2018-01-18 21:31:20.000000000","message":"When I test with this locally and set this to True, I can\u0027t seem to get things to fail. Am I supposed to?","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b53336efd0b78bb18e270bf6e5cc7b5c3d3dbd07","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def load_fixtures(self, fixtures, enable_sqlite_foreign_key\u003dFalse):"},{"line_number":37,"context_line":"        super(SqlPolicyAssociationTests, self).load_fixtures(fixtures)"},{"line_number":38,"context_line":"        self.load_sample_data()"}],"source_content_type":"text/x-python","patch_set":35,"id":"7f96bb07_8cbd61b8","line":38,"range":{"start_line":38,"start_character":29,"end_line":38,"end_character":31},"updated":"2018-01-18 21:31:20.000000000","message":"Don\u0027t we have to pass the enable_sqlite_foreign_key logic through to this method?","commit_id":"e2fc0848b2f40dd1ebcb80017ff20b6f8d212a99"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"318a3a1f926b45a5404796a637ae3467d688c444","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    test_backend_sql.SqlTests,"},{"line_number":34,"context_line":"        test_backend_endpoint_policy.PolicyAssociationTests):"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def load_fixtures(self, fixtures, enable_sqlite_foreign_key\u003dFalse):"},{"line_number":37,"context_line":"        super(SqlPolicyAssociationTests, self).load_fixtures(fixtures)"},{"line_number":38,"context_line":"        self.load_sample_data()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f96bb07_97ca1a4d","line":36,"updated":"2018-01-21 21:49:14.000000000","message":"This seems unrelated","commit_id":"0cbcad968ac65798c8238c02837ac68dca02d462"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"53d454cb19554665dc205ee587f96cb7448c219a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    test_backend_sql.SqlTests,"},{"line_number":34,"context_line":"        test_backend_endpoint_policy.PolicyAssociationTests):"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def load_fixtures(self, fixtures, enable_sqlite_foreign_key\u003dFalse):"},{"line_number":37,"context_line":"        super(SqlPolicyAssociationTests, self).load_fixtures(fixtures)"},{"line_number":38,"context_line":"        self.load_sample_data()"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f96bb07_0c9fdcb4","line":36,"in_reply_to":"7f96bb07_97ca1a4d","updated":"2018-01-24 03:43:19.000000000","message":"Done","commit_id":"0cbcad968ac65798c8238c02837ac68dca02d462"}],"keystone/tests/unit/test_backend_sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":1271,"context_line":"        for service in default_fixtures.SERVICES:"},{"line_number":1272,"context_line":"            service_id \u003d service[\u0027id\u0027]"},{"line_number":1273,"context_line":"            rv \u003d self.catalog_api.create_service(service_id, service)"},{"line_number":1274,"context_line":"            attrname \u003d \u0027service_%s\u0027 % service[\u0027extra\u0027][\u0027name\u0027]"},{"line_number":1275,"context_line":"            setattr(self, attrname, rv)"},{"line_number":1276,"context_line":""},{"line_number":1277,"context_line":"        for region in default_fixtures.REGIONS:"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_3ec5cc5b","line":1274,"range":{"start_line":1274,"start_character":24,"end_line":1274,"end_character":34},"updated":"2018-01-16 01:05:42.000000000","message":"any reason to do this versus just expecting to use self.serviceOne?","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"9735fd51d2fec47e7d4aa087fc1819d567595383","unresolved":false,"context_lines":[{"line_number":1271,"context_line":"        for service in default_fixtures.SERVICES:"},{"line_number":1272,"context_line":"            service_id \u003d service[\u0027id\u0027]"},{"line_number":1273,"context_line":"            rv \u003d self.catalog_api.create_service(service_id, service)"},{"line_number":1274,"context_line":"            attrname \u003d \u0027service_%s\u0027 % service[\u0027extra\u0027][\u0027name\u0027]"},{"line_number":1275,"context_line":"            setattr(self, attrname, rv)"},{"line_number":1276,"context_line":""},{"line_number":1277,"context_line":"        for region in default_fixtures.REGIONS:"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_4e9903c2","line":1274,"range":{"start_line":1274,"start_character":24,"end_line":1274,"end_character":34},"in_reply_to":"7f96bb07_3ec5cc5b","updated":"2018-01-16 03:11:14.000000000","message":"Here I want to tell that it\u0027s a service and called serviceOne, so the name is like service_serviceOne. Of cause I can change it to just serviceOne.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6559340d014c57cdce308fae563acd7e722453d9","unresolved":false,"context_lines":[{"line_number":1276,"context_line":""},{"line_number":1277,"context_line":"        for region in default_fixtures.REGIONS:"},{"line_number":1278,"context_line":"            rv \u003d self.catalog_api.create_region(region)"},{"line_number":1279,"context_line":"            attrname \u003d \u0027region_%s\u0027 % region[\u0027id\u0027]"},{"line_number":1280,"context_line":"            setattr(self, attrname, rv)"}],"source_content_type":"text/x-python","patch_set":26,"id":"7f96bb07_9eabc087","line":1279,"range":{"start_line":1279,"start_character":24,"end_line":1279,"end_character":31},"updated":"2018-01-16 01:05:42.000000000","message":"Same comment here... as I was writing a couple tests I noticed the names are a bit redundant.","commit_id":"74967c272da9cb21ee47bfe8f52b11b608ae5f64"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"318a3a1f926b45a5404796a637ae3467d688c444","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class SqlTests(unit.SQLDriverOverrides, unit.TestCase):"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def setUp(self, enable_sqlite_foreign_key\u003dFalse):"},{"line_number":57,"context_line":"        super(SqlTests, self).setUp()"},{"line_number":58,"context_line":"        self.useFixture(database.Database("},{"line_number":59,"context_line":"            enable_sqlite_foreign_key\u003denable_sqlite_foreign_key))"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f96bb07_57c49240","line":56,"updated":"2018-01-21 21:49:14.000000000","message":"This affects all the tests in this module, would be better to split this into its own commit or roll it into the former commit","commit_id":"0cbcad968ac65798c8238c02837ac68dca02d462"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"53d454cb19554665dc205ee587f96cb7448c219a","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"class SqlTests(unit.SQLDriverOverrides, unit.TestCase):"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def setUp(self, enable_sqlite_foreign_key\u003dFalse):"},{"line_number":57,"context_line":"        super(SqlTests, self).setUp()"},{"line_number":58,"context_line":"        self.useFixture(database.Database("},{"line_number":59,"context_line":"            enable_sqlite_foreign_key\u003denable_sqlite_foreign_key))"}],"source_content_type":"text/x-python","patch_set":37,"id":"7f96bb07_ec9950d0","line":56,"in_reply_to":"7f96bb07_57c49240","updated":"2018-01-24 03:43:19.000000000","message":"Done","commit_id":"0cbcad968ac65798c8238c02837ac68dca02d462"}],"setup.cfg":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"71b61ef5370fc7b7deec02300ec74cc7fcb38f7c","unresolved":false,"context_lines":[{"line_number":139,"context_line":"keystone.identity.shadow_users \u003d"},{"line_number":140,"context_line":"    sql \u003d keystone.identity.shadow_backends.sql:ShadowUsers"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"keystone.registered_limit \u003d"},{"line_number":143,"context_line":"    sql \u003d keystone.limit.backends.sql:RegisteredLimit"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"keystone.limit \u003d"},{"line_number":146,"context_line":"    sql \u003d keystone.limit.backends.sql:Limit"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"keystone.policy \u003d"},{"line_number":149,"context_line":"    rules \u003d keystone.policy.backends.rules:Policy"}],"source_content_type":"text/x-ttcn-cfg","patch_set":7,"id":"df87a7cf_3bde0e3e","line":146,"range":{"start_line":142,"start_character":0,"end_line":146,"end_character":43},"updated":"2017-12-19 20:34:59.000000000","message":"In another patch we should make it so that people can write their own limit backends and make it pluggable with configuration.","commit_id":"b6d916a841c2d0a64f0aaaab8258d9fe753c3898"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ef3c660e763a1ae1b26dd8fb560cd355ece4bb3f","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"keystone.limit \u003d"},{"line_number":146,"context_line":"    sql \u003d keystone.limit.backends.sql:Limit"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"keystone.policy \u003d"},{"line_number":149,"context_line":"    rules \u003d keystone.policy.backends.rules:Policy"},{"line_number":150,"context_line":"    sql \u003d keystone.policy.backends.sql:Policy"}],"source_content_type":"text/x-ttcn-cfg","patch_set":15,"id":"bf8cb3f7_d4bf07f9","line":147,"updated":"2017-12-26 21:31:22.000000000","message":"I\u0027m wondering if splitting these makes sense. Would there ever be a case where registered limits and limit come from different sources?","commit_id":"52a080b52c2fe85aaabf66a100f8fa8b79a1db3a"}]}
