)]}'
{"keystone/api/domains.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c445f28d77a1cbc631ce55bf0182390b0660e9b2","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class DomainConfigResource(DomainConfigBase):"},{"line_number":191,"context_line":"    def __init__(self):"},{"line_number":192,"context_line":"        super(DomainConfigBase, self).__init__()"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def put(self, domain_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_2fefb61c","line":191,"updated":"2018-10-25 02:30:51.000000000","message":"This method is not needed. Remove.","commit_id":"7b85a272733a5a5655b92024919d94241beeab43"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"deafc0ef6abc24ed533b49adc7ffddb882cc0573","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class DomainConfigResource(DomainConfigBase):"},{"line_number":191,"context_line":"    def __init__(self):"},{"line_number":192,"context_line":"        super(DomainConfigBase, self).__init__()"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def put(self, domain_id):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_d5c0fd4d","line":191,"in_reply_to":"3f79a3b5_2fefb61c","updated":"2018-10-25 18:44:34.000000000","message":"Done","commit_id":"7b85a272733a5a5655b92024919d94241beeab43"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c445f28d77a1cbc631ce55bf0182390b0660e9b2","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            return {self.member_key: ref}, http_client.CREATED"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"class DomainConfigGroupResource(DomainConfigBase):"},{"line_number":215,"context_line":"    def __init__(self):"},{"line_number":216,"context_line":"        super(DomainConfigBase, self).__init__()"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_0f38ba9b","line":214,"updated":"2018-10-25 02:30:51.000000000","message":"This one and DomainConfigOptionResource can actually be even more clever if you want... you could just use the \"alternate_urls\"  (would need to look into additional json home entries) mechanism since it\u0027s all the same code. Obviously DomainConfigResource is *not* the same and could not use the same mechanism.","commit_id":"7b85a272733a5a5655b92024919d94241beeab43"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"deafc0ef6abc24ed533b49adc7ffddb882cc0573","unresolved":false,"context_lines":[{"line_number":211,"context_line":"            return {self.member_key: ref}, http_client.CREATED"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"class DomainConfigGroupResource(DomainConfigBase):"},{"line_number":215,"context_line":"    def __init__(self):"},{"line_number":216,"context_line":"        super(DomainConfigBase, self).__init__()"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_75a7a9bc","line":214,"in_reply_to":"3f79a3b5_0f38ba9b","updated":"2018-10-25 18:44:34.000000000","message":"I\u0027ll check out the \"alternate_urls\" and see if this could be cleaned up more","commit_id":"7b85a272733a5a5655b92024919d94241beeab43"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c445f28d77a1cbc631ce55bf0182390b0660e9b2","unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"class DomainConfigGroupResource(DomainConfigBase):"},{"line_number":215,"context_line":"    def __init__(self):"},{"line_number":216,"context_line":"        super(DomainConfigBase, self).__init__()"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_cfd72250","line":215,"updated":"2018-10-25 02:30:51.000000000","message":"Same as above, use a docstring if you need  to conform to python-isms.","commit_id":"7b85a272733a5a5655b92024919d94241beeab43"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"deafc0ef6abc24ed533b49adc7ffddb882cc0573","unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"class DomainConfigGroupResource(DomainConfigBase):"},{"line_number":215,"context_line":"    def __init__(self):"},{"line_number":216,"context_line":"        super(DomainConfigBase, self).__init__()"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_358db134","line":215,"in_reply_to":"3f79a3b5_cfd72250","updated":"2018-10-25 18:44:34.000000000","message":"Done","commit_id":"7b85a272733a5a5655b92024919d94241beeab43"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"c445f28d77a1cbc631ce55bf0182390b0660e9b2","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"class DomainConfigOptionResource(DomainConfigBase):"},{"line_number":220,"context_line":"    def __init__(self):"},{"line_number":221,"context_line":"        super(DomainConfigBase, self).__init__()"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_8fddaa6f","line":220,"updated":"2018-10-25 02:30:51.000000000","message":"See above.","commit_id":"7b85a272733a5a5655b92024919d94241beeab43"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"deafc0ef6abc24ed533b49adc7ffddb882cc0573","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"class DomainConfigOptionResource(DomainConfigBase):"},{"line_number":220,"context_line":"    def __init__(self):"},{"line_number":221,"context_line":"        super(DomainConfigBase, self).__init__()"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f79a3b5_f592d954","line":220,"in_reply_to":"3f79a3b5_8fddaa6f","updated":"2018-10-25 18:44:34.000000000","message":"Done","commit_id":"7b85a272733a5a5655b92024919d94241beeab43"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f5a5d6e3cf0a91e3bbf89d80cc0cbf755b8cb6d3","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"class DomainConfigResource(ks_flask.ResourceBase):"},{"line_number":129,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":130,"context_line":"    collection_key \u003d \u0027config\u0027"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get(self, domain_id\u003dNone):"},{"line_number":133,"context_line":"        \"\"\"Get domain config."}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_865d7d7d","side":"PARENT","line":130,"updated":"2018-10-25 21:18:32.000000000","message":"Was removing collection key intentional?","commit_id":"9f2b84608e7297cc7ed41497ddf45841325a8fd7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"2ad6e5aa00281902140953838f3be9b3a2050057","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"class DomainConfigResource(ks_flask.ResourceBase):"},{"line_number":129,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":130,"context_line":"    collection_key \u003d \u0027config\u0027"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get(self, domain_id\u003dNone):"},{"line_number":133,"context_line":"        \"\"\"Get domain config."}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_9b1e2f0b","side":"PARENT","line":130,"in_reply_to":"3f79a3b5_865d7d7d","updated":"2018-10-26 04:01:32.000000000","message":"Yes, it wasn\u0027t used anywhere any only there to avoid the exception raised if it wasn\u0027t there.","commit_id":"9f2b84608e7297cc7ed41497ddf45841325a8fd7"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f5a5d6e3cf0a91e3bbf89d80cc0cbf755b8cb6d3","unresolved":false,"context_lines":[{"line_number":210,"context_line":"# NOTE(gagehugo): These two classes inherit DomainConfigBase to allow"},{"line_number":211,"context_line":"# registering the same underlying functionality with flask"},{"line_number":212,"context_line":"class DomainConfigGroupResource(DomainConfigBase):"},{"line_number":213,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"class DomainConfigOptionResource(DomainConfigBase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_e6155196","line":213,"range":{"start_line":213,"start_character":2,"end_line":213,"end_character":24},"updated":"2018-10-25 21:18:32.000000000","message":"use a docstring here to make this work.\n\nI am being super nit-picky but this should be something like:\n\nclass DomainConfigGroupResource(DomainConfigBase):\n    \"\"\"Provides XXX functionality.\"\"\"\n\nThis means that if member_key needs to be changed on the base class, we\u0027re not accidently keeping this as is.\n\nalternatively, remove the definition of member_key from the base-class","commit_id":"965af3e786fc41fa6384aa649cfb4d53743a010c"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"2ad6e5aa00281902140953838f3be9b3a2050057","unresolved":false,"context_lines":[{"line_number":210,"context_line":"# NOTE(gagehugo): These two classes inherit DomainConfigBase to allow"},{"line_number":211,"context_line":"# registering the same underlying functionality with flask"},{"line_number":212,"context_line":"class DomainConfigGroupResource(DomainConfigBase):"},{"line_number":213,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"class DomainConfigOptionResource(DomainConfigBase):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_3bbcbbd9","line":213,"range":{"start_line":213,"start_character":2,"end_line":213,"end_character":24},"in_reply_to":"3f79a3b5_e6155196","updated":"2018-10-26 04:01:32.000000000","message":"Sure! I just put member_key here to get pep8 to stop complaining, but a docstring instead would be better.","commit_id":"965af3e786fc41fa6384aa649cfb4d53743a010c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f5a5d6e3cf0a91e3bbf89d80cc0cbf755b8cb6d3","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"class DomainConfigOptionResource(DomainConfigBase):"},{"line_number":217,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"class DefaultConfigResource(flask_restful.Resource):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_86749d05","line":217,"updated":"2018-10-25 21:18:32.000000000","message":"See above","commit_id":"965af3e786fc41fa6384aa649cfb4d53743a010c"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"249e73b9f021d53e60e31c1d3cf986f95057cc1d","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"class DomainConfigOptionResource(DomainConfigBase):"},{"line_number":217,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"class DefaultConfigResource(flask_restful.Resource):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_31549756","line":217,"in_reply_to":"3f79a3b5_86749d05","updated":"2018-10-30 18:12:03.000000000","message":"Done","commit_id":"965af3e786fc41fa6384aa649cfb4d53743a010c"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"7ee6b5fb870d30a5667a828e4455abe6645c05e3","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":130,"context_line":"    collection_key \u003d \u0027config\u0027"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get(self, domain_id\u003dNone):"},{"line_number":133,"context_line":"        \"\"\"Get domain config."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        GET/HEAD /v3/domains/{domain_id}/config"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_domain_config\u0027)"},{"line_number":138,"context_line":"        config \u003d PROVIDERS.domain_config_api.get_config(domain_id)"},{"line_number":139,"context_line":"        return {self.member_key: config}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def put(self, domain_id):"},{"line_number":142,"context_line":"        \"\"\"Create domain config."}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_a63c32c0","side":"PARENT","line":139,"range":{"start_line":132,"start_character":0,"end_line":139,"end_character":40},"updated":"2018-11-08 14:56:31.000000000","message":"If I\u0027m reading this right, it seems like DomainConfigResource now has a totally different get defined, \"GET/HEAD /v3/domains/{domain_id}/config/{group}/{option}\" which seems totally wrong.","commit_id":"9f2b84608e7297cc7ed41497ddf45841325a8fd7"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"0fd872c527697a32c2ba26e3e46dcd2de108158b","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":130,"context_line":"    collection_key \u003d \u0027config\u0027"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get(self, domain_id\u003dNone):"},{"line_number":133,"context_line":"        \"\"\"Get domain config."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        GET/HEAD /v3/domains/{domain_id}/config"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_domain_config\u0027)"},{"line_number":138,"context_line":"        config \u003d PROVIDERS.domain_config_api.get_config(domain_id)"},{"line_number":139,"context_line":"        return {self.member_key: config}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def put(self, domain_id):"},{"line_number":142,"context_line":"        \"\"\"Create domain config."}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_c137d8da","side":"PARENT","line":139,"range":{"start_line":132,"start_character":0,"end_line":139,"end_character":40},"in_reply_to":"3f79a3b5_a63c32c0","updated":"2018-11-08 15:32:13.000000000","message":"The difference is code is:\n\n1) domain existence is verified. (Might be superfluous)\n\nGroup and option are optional in _get_config and the way we wire it up, we don\u0027t pass group or option when routed to domains/{domain_id}/config\n\nThe docstring below is wrong(ish). I am ok with maintaining the split get here, but it is not required to ensure response consistency","commit_id":"9f2b84608e7297cc7ed41497ddf45841325a8fd7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"ab0d2ee1f977d466fb18c863403159f80dbea120","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    member_key \u003d \u0027config\u0027"},{"line_number":130,"context_line":"    collection_key \u003d \u0027config\u0027"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get(self, domain_id\u003dNone):"},{"line_number":133,"context_line":"        \"\"\"Get domain config."},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        GET/HEAD /v3/domains/{domain_id}/config"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:get_domain_config\u0027)"},{"line_number":138,"context_line":"        config \u003d PROVIDERS.domain_config_api.get_config(domain_id)"},{"line_number":139,"context_line":"        return {self.member_key: config}"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def put(self, domain_id):"},{"line_number":142,"context_line":"        \"\"\"Create domain config."}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_8b7eba17","side":"PARENT","line":139,"range":{"start_line":132,"start_character":0,"end_line":139,"end_character":40},"in_reply_to":"3f79a3b5_c137d8da","updated":"2018-11-11 00:57:42.000000000","message":"Yeah, the old controller worked the same, with group and option being optional[0]. I will fix the docstring.  \n\n[0] https://github.com/openstack/keystone/blob/stable/rocky/keystone/resource/controllers.py#L120","commit_id":"9f2b84608e7297cc7ed41497ddf45841325a8fd7"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"249e73b9f021d53e60e31c1d3cf986f95057cc1d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def put(self, domain_id):"},{"line_number":142,"context_line":"        \"\"\"Create domain config."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        POST /v3/domains/{domain_id}/config"},{"line_number":145,"context_line":"        \"\"\""},{"line_number":146,"context_line":"        ENFORCER.enforce_call(action\u003d\u0027identity:create_domain_config\u0027)"},{"line_number":147,"context_line":"        PROVIDERS.resource_api.get_domain(domain_id)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_915fab73","side":"PARENT","line":144,"range":{"start_line":144,"start_character":8,"end_line":144,"end_character":12},"updated":"2018-10-30 18:12:03.000000000","message":"s/post/put, fixed below","commit_id":"9f2b84608e7297cc7ed41497ddf45841325a8fd7"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"96a510422383e2eff8d818af8aeb322c4ae1a2c8","unresolved":false,"context_lines":[{"line_number":131,"context_line":"    def get(self, domain_id\u003dNone, group\u003dNone, option\u003dNone):"},{"line_number":132,"context_line":"        \"\"\"Check if config option exists."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        GET/HEAD /v3/domains/{domain_id}/config"},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        err \u003d None"},{"line_number":137,"context_line":"        config \u003d {}"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_98b0e0e1","line":134,"updated":"2018-11-19 15:16:38.000000000","message":"Uhm. This needs to have BOTH elements in the docstring not just replace. The method handles\n\n    GET/HEAD /v3/domains/{domain_id}/config\n    GET/HEAD /v3/domains/{domain_id}/config/{group}/{option}","commit_id":"d556afe00cc9f37378844b93412a0c7d387d54ff"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"0bc91fafcb05656d097e491647b94c9a03a44ce0","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        \"\"\"Check if config option exists."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        GET/HEAD /v3/domains/{domain_id}/config"},{"line_number":135,"context_line":"        GET/HEAD /v3/domains/{domain_id}/config/{group}/{option}"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        err \u003d None"},{"line_number":138,"context_line":"        config \u003d {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_e8df7f36","line":135,"updated":"2018-11-23 01:44:31.000000000","message":"And GET/HEAD /v3/domains/{domain_id}/config/{group}\n\nthe same as \"patch\" and \"delete\".","commit_id":"97279e34235a793194117d78d2c197bf6171e20d"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"0bc91fafcb05656d097e491647b94c9a03a44ce0","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        return None, http_client.NO_CONTENT"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"class DomainConfigResource(DomainConfigBase):"},{"line_number":191,"context_line":"    def put(self, domain_id):"},{"line_number":192,"context_line":"        \"\"\"Create domain config."},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_a8e5070a","line":190,"updated":"2018-11-23 01:44:31.000000000","message":"it\u0027s good to add a docstring like DomainConfigGroupResource or DomainConfigOptionResource does.","commit_id":"97279e34235a793194117d78d2c197bf6171e20d"}]}
