)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a0c75abbfc5727aeeaa2e89667a13c7b147410c9","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-04-17 16:56:01 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change project name constraint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- Remove the old constraint \u0027domain_id + name\u0027"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"- Create a new constraint \u0027domain_id + name + is_domain\u0027"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"3ab451fb_55406a56","line":8,"updated":"2015-04-17 17:35:48.000000000","message":"It\u0027s easy enough to see what you did my looking at the commit. Can you add why you need to do this to the commit message?","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"45db1e62dc05fefa0088a6af6f9c4acd41dc2bfb","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2015-04-17 16:56:01 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change project name constraint"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"- Remove the old constraint \u0027domain_id + name\u0027"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"- Create a new constraint \u0027domain_id + name + is_domain\u0027"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"3ab451fb_67305d57","line":8,"in_reply_to":"3ab451fb_55406a56","updated":"2015-04-17 19:34:20.000000000","message":"Ok, i\u0027ll add the reason for this.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a0c75abbfc5727aeeaa2e89667a13c7b147410c9","unresolved":false,"context_lines":[{"line_number":13,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":14,"context_line":"  with the same name"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch is part from the Reseller spec. Next patches of the"},{"line_number":17,"context_line":"series include:"},{"line_number":18,"context_line":"  - Honor domain operations in project table"},{"line_number":19,"context_line":"  - Migrate domains to project table (and drop domain table)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"3ab451fb_b518ce85","line":16,"updated":"2015-04-17 17:35:48.000000000","message":"Is all of the dep patch listing useful to anyone?","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0864b0c2d67edb5ea2394c32f0001cc67556e1cd","unresolved":false,"context_lines":[{"line_number":13,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":14,"context_line":"  with the same name"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch is part from the Reseller spec. Next patches of the"},{"line_number":17,"context_line":"series include:"},{"line_number":18,"context_line":"  - Honor domain operations in project table"},{"line_number":19,"context_line":"  - Migrate domains to project table (and drop domain table)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"3ab451fb_3263aade","line":16,"in_reply_to":"3ab451fb_87eec989","updated":"2015-04-17 21:08:59.000000000","message":"If it helps others, then I don\u0027t have an issue with it. Seems that using gerrit to see the deps is easier because it\u0027s always correct.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"45db1e62dc05fefa0088a6af6f9c4acd41dc2bfb","unresolved":false,"context_lines":[{"line_number":13,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":14,"context_line":"  with the same name"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"This patch is part from the Reseller spec. Next patches of the"},{"line_number":17,"context_line":"series include:"},{"line_number":18,"context_line":"  - Honor domain operations in project table"},{"line_number":19,"context_line":"  - Migrate domains to project table (and drop domain table)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"3ab451fb_87eec989","line":16,"in_reply_to":"3ab451fb_b518ce85","updated":"2015-04-17 19:34:20.000000000","message":"You mean, put all the next patches here? We put this just for the reviewers have some view about what we will do after this patch, since we have many patches for the all implementation.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"a2e556b10761bb3c58a033c26da79fe616e1f661","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Previous patches include:"},{"line_number":22,"context_line":"  - Add is_domain field in Project Table"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Partially-Implements: bp reseller"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"3ab451fb_362ba132","line":24,"updated":"2015-04-17 20:16:35.000000000","message":"Is this your twin? :) You\u0027re already the author","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"4b1603e9973f9ffc5a5803a615b135dc7c398864","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Previous patches include:"},{"line_number":22,"context_line":"  - Add is_domain field in Project Table"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Co-Authored-By: Raildo Mascena \u003craildo@lsd.ufcg.edu.br\u003e"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Partially-Implements: bp reseller"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":41,"id":"3ab451fb_f1d8a3f1","line":24,"in_reply_to":"3ab451fb_362ba132","updated":"2015-04-22 12:25:56.000000000","message":"haha sorry about that, rodrigods is the author and I\u0027m the co-author. We will fix this.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a5e3faaf09dd7b8158681756794562409b48a9ec","unresolved":false,"context_lines":[{"line_number":16,"context_line":"- Remove the old constraint \u0027domain_id + name\u0027"},{"line_number":17,"context_line":"- Create a new constraint \u0027domain_id + name + is_domain\u0027"},{"line_number":18,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":19,"context_line":"  with the same name"},{"line_number":20,"context_line":"- Handle project scoped tokens by project name in case of name"},{"line_number":21,"context_line":"  clashing"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":58,"id":"ba3cc151_781569e3","line":19,"updated":"2015-07-07 15:28:31.000000000","message":"What\u0027s the different between the two above?","commit_id":"6d7b50fee68e82178fe223c3c5bb9d5446b4549a"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"52b86ea52f6f6e64088506d420896497fa7b5df6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"- Remove the old constraint \u0027domain_id + name\u0027"},{"line_number":17,"context_line":"- Create a new constraint \u0027domain_id + name + is_domain\u0027"},{"line_number":18,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":19,"context_line":"  with the same name"},{"line_number":20,"context_line":"- Handle project scoped tokens by project name in case of name"},{"line_number":21,"context_line":"  clashing"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":58,"id":"ba3cc151_4c0e523c","line":19,"in_reply_to":"ba3cc151_781569e3","updated":"2015-07-08 13:33:14.000000000","message":"In the first one, we could create two is_domain projects with diferent names, since the domain_id will be always different for is_domain projects.","commit_id":"6d7b50fee68e82178fe223c3c5bb9d5446b4549a"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"539efa73ae6a6aa7c9545642b5805ff55948d0ce","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The domain table will be dropped in the following patches,"},{"line_number":10,"context_line":"so the domain resource will be moved to the project table."},{"line_number":11,"context_line":"We will also allow the creation of a domain and a project with"},{"line_number":12,"context_line":"the same name."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch does:"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":96,"id":"fa1b9901_0b8e5878","line":12,"updated":"2015-08-18 10:24:59.000000000","message":"I\u0027d rephrase this paragraph to say the main reason of the patch - the information of the table drop can be added in the end of the paragraph.","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"497b70142b4bb7a5fb39c53432a45281e3faee79","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The domain table will be dropped in the following patches,"},{"line_number":10,"context_line":"so the domain resource will be moved to the project table."},{"line_number":11,"context_line":"We will also allow the creation of a domain and a project with"},{"line_number":12,"context_line":"the same name."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch does:"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":96,"id":"fa1b9901_08809345","line":12,"in_reply_to":"fa1b9901_0b8e5878","updated":"2015-08-18 13:52:24.000000000","message":"Done. Put it in a more detailed way","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"539efa73ae6a6aa7c9545642b5805ff55948d0ce","unresolved":false,"context_lines":[{"line_number":16,"context_line":"- Remove the old constraint \u0027domain_id + name\u0027"},{"line_number":17,"context_line":"- Makes the project.domain_id column nullable"},{"line_number":18,"context_line":"- Enforces the constraint \u0027domain_id + name + is_domain\u0027 in the code,"},{"line_number":19,"context_line":"  not in backend"},{"line_number":20,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":21,"context_line":"  with the same name"},{"line_number":22,"context_line":"- Handle project scoped tokens by project name in case of name"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":96,"id":"fa1b9901_8b7348b1","line":19,"updated":"2015-08-18 10:24:59.000000000","message":"not in the backend driver","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"497b70142b4bb7a5fb39c53432a45281e3faee79","unresolved":false,"context_lines":[{"line_number":16,"context_line":"- Remove the old constraint \u0027domain_id + name\u0027"},{"line_number":17,"context_line":"- Makes the project.domain_id column nullable"},{"line_number":18,"context_line":"- Enforces the constraint \u0027domain_id + name + is_domain\u0027 in the code,"},{"line_number":19,"context_line":"  not in backend"},{"line_number":20,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":21,"context_line":"  with the same name"},{"line_number":22,"context_line":"- Handle project scoped tokens by project name in case of name"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":96,"id":"fa1b9901_2506e0ce","line":19,"in_reply_to":"fa1b9901_8b7348b1","updated":"2015-08-18 13:52:24.000000000","message":"Done","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"539efa73ae6a6aa7c9545642b5805ff55948d0ce","unresolved":false,"context_lines":[{"line_number":18,"context_line":"- Enforces the constraint \u0027domain_id + name + is_domain\u0027 in the code,"},{"line_number":19,"context_line":"  not in backend"},{"line_number":20,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":21,"context_line":"  with the same name"},{"line_number":22,"context_line":"- Handle project scoped tokens by project name in case of name"},{"line_number":23,"context_line":"  clashing"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":96,"id":"fa1b9901_0b6098cd","line":21,"updated":"2015-08-18 10:24:59.000000000","message":"add: (current domain names constraint)","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"497b70142b4bb7a5fb39c53432a45281e3faee79","unresolved":false,"context_lines":[{"line_number":18,"context_line":"- Enforces the constraint \u0027domain_id + name + is_domain\u0027 in the code,"},{"line_number":19,"context_line":"  not in backend"},{"line_number":20,"context_line":"- Also add a constraint to avoid creating two is_domain projects"},{"line_number":21,"context_line":"  with the same name"},{"line_number":22,"context_line":"- Handle project scoped tokens by project name in case of name"},{"line_number":23,"context_line":"  clashing"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":96,"id":"fa1b9901_e5ab0888","line":21,"in_reply_to":"fa1b9901_0b6098cd","updated":"2015-08-18 13:52:24.000000000","message":"Done","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d7656afdeef20f6bb69e39b05b2e408e8624f915","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change project name constraints"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch does:"},{"line_number":10,"context_line":"- Change the project unique constraint to include the is_domain"},{"line_number":11,"context_line":"  attribute, resulting in the new constraint (name, domain_id, is_domain)"},{"line_number":12,"context_line":"- Make the project.domain_id column nullable at manager level"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":128,"id":"fa69d971_73188ed3","line":9,"updated":"2016-01-06 21:53:09.000000000","message":"This is a good summary, but nothing says why these changes are being made and why they are necessary.","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5f9982800e8824ea961331b4ae094c05a41a9545","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Change project name constraints"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch does:"},{"line_number":10,"context_line":"- Change the project unique constraint to include the is_domain"},{"line_number":11,"context_line":"  attribute, resulting in the new constraint (name, domain_id, is_domain)"},{"line_number":12,"context_line":"- Make the project.domain_id column nullable at manager level"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":128,"id":"fa69d971_52921af7","line":9,"in_reply_to":"fa69d971_73188ed3","updated":"2016-01-07 03:37:02.000000000","message":"ok. I\u0027ll explain that","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"01bfdbd0c7fdaab568d095b41d464aefcdd84661","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"With the creation of projects acting as domains, represented"},{"line_number":10,"context_line":"by the flag \u0027is_domain\u0027, the fields \u0027name\u0027 and \u0027domain_id\u0027"},{"line_number":11,"context_line":"should still be enough to uniquely identify a rpoject, since"},{"line_number":12,"context_line":"all projects acting as a domain have a null domain_id."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch adds testing to validate this, as well as provides"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":151,"id":"dae33548_31de8111","line":11,"range":{"start_line":11,"start_character":46,"end_line":11,"end_character":53},"updated":"2016-02-17 01:10:50.000000000","message":"(nit) project","commit_id":"a3491fc855f70f934bd5f7227fda5732a67c08de"}],"keystone/auth/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"56cfa9d7c28d26f01f72043e1f98f80330493c9a","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                                    target\u003d\u0027project\u0027)"},{"line_number":201,"context_line":"                domain_ref \u003d self._lookup_domain(project_info[\u0027domain\u0027])"},{"line_number":202,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":203,"context_line":"                    project_name, domain_ref[\u0027id\u0027], is_domain)"},{"line_number":204,"context_line":"            else:"},{"line_number":205,"context_line":"                project_ref \u003d self.resource_api.get_project(project_id)"},{"line_number":206,"context_line":"                # NOTE(morganfainberg): The _lookup_domain method will raise"}],"source_content_type":"text/x-python","patch_set":51,"id":"1aca2d91_1ac1ab80","line":203,"updated":"2015-05-08 13:03:52.000000000","message":"this should be passed as a kwarg since it is defined that way in the method signature: \n\n    self.resource_api.get_project_by_name(project_name, domain_ref[\u0027id\u0027], is_domain\u003dis_domain):","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"33cfd25886fb643df39f056142cc26c85665a233","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                                                    target\u003d\u0027project\u0027)"},{"line_number":201,"context_line":"                domain_ref \u003d self._lookup_domain(project_info[\u0027domain\u0027])"},{"line_number":202,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":203,"context_line":"                    project_name, domain_ref[\u0027id\u0027], is_domain)"},{"line_number":204,"context_line":"            else:"},{"line_number":205,"context_line":"                project_ref \u003d self.resource_api.get_project(project_id)"},{"line_number":206,"context_line":"                # NOTE(morganfainberg): The _lookup_domain method will raise"}],"source_content_type":"text/x-python","patch_set":51,"id":"9a0c5dc1_de9593e4","line":203,"in_reply_to":"1aca2d91_1ac1ab80","updated":"2015-05-12 23:40:25.000000000","message":"see my comment on the resource_api.","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"92efc964333cdeabc285009c2781fe4efb8f6dd8","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                if \u0027domain\u0027 not in project_info:"},{"line_number":197,"context_line":"                    raise exception.ValidationError(attribute\u003d\u0027domain\u0027,"},{"line_number":198,"context_line":"                                                    target\u003d\u0027project\u0027)"},{"line_number":199,"context_line":"                domain_ref \u003d self._lookup_domain(project_info[\u0027domain\u0027])"},{"line_number":200,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":201,"context_line":"                    project_name, domain_ref[\u0027id\u0027], False)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"ba3cc151_1a3fd8b4","line":199,"updated":"2015-07-09 11:23:43.000000000","message":"add a comment here about the token request behavior","commit_id":"601803cf4ed1b5d17c38da26212dc4f46ff1e1d7"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"1dba2adcc89b05f50c629aed35f646062ced2203","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                if \u0027domain\u0027 not in project_info:"},{"line_number":197,"context_line":"                    raise exception.ValidationError(attribute\u003d\u0027domain\u0027,"},{"line_number":198,"context_line":"                                                    target\u003d\u0027project\u0027)"},{"line_number":199,"context_line":"                domain_ref \u003d self._lookup_domain(project_info[\u0027domain\u0027])"},{"line_number":200,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":201,"context_line":"                    project_name, domain_ref[\u0027id\u0027], False)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":59,"id":"ba3cc151_c22de546","line":199,"in_reply_to":"ba3cc151_1a3fd8b4","updated":"2015-07-09 22:47:04.000000000","message":"Done","commit_id":"601803cf4ed1b5d17c38da26212dc4f46ff1e1d7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7d715a6d9f553e16ddb1c436b8f5688a47c6dad5","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                # the same name, inside a domain, where one has the is_domain"},{"line_number":202,"context_line":"                # feature enabled and the other doess not. In case there is a"},{"line_number":203,"context_line":"                # name clashing, Keystone will always return the project which"},{"line_number":204,"context_line":"                # has the domain feature disabled."},{"line_number":205,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":206,"context_line":"                    project_name, domain_ref[\u0027id\u0027], False)"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"ba3cc151_3985ce06","line":204,"updated":"2015-07-10 12:21:44.000000000","message":"\"in the face of ambiguity refuse the temptation to guess\" - I thought we decided that this would lead to an error? How can we validate scope data if we are guessing?","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a899f6030dfff737b407d29389c45e6e216a2a9e","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                # the same name, inside a domain, where one has the is_domain"},{"line_number":202,"context_line":"                # feature enabled and the other doess not. In case there is a"},{"line_number":203,"context_line":"                # name clashing, Keystone will always return the project which"},{"line_number":204,"context_line":"                # has the domain feature disabled."},{"line_number":205,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":206,"context_line":"                    project_name, domain_ref[\u0027id\u0027], False)"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"ba3cc151_5c80c049","line":204,"in_reply_to":"ba3cc151_3985ce06","updated":"2015-07-10 12:30:06.000000000","message":"The argument for doing it this way is that we are preserving the existing functionality - i.e. if, today, you have a domain called \"test\" containing a project called \"test\", if you request a token by project name, you will always get the project, not the domain.","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c2428ed9ac55de895d2cb3f435872de0a6fe841d","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                # the same name, inside a domain, where one has the is_domain"},{"line_number":202,"context_line":"                # feature enabled and the other doess not. In case there is a"},{"line_number":203,"context_line":"                # name clashing, Keystone will always return the project which"},{"line_number":204,"context_line":"                # has the domain feature disabled."},{"line_number":205,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":206,"context_line":"                    project_name, domain_ref[\u0027id\u0027], False)"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"ba3cc151_d23d972d","line":204,"in_reply_to":"ba3cc151_5c80c049","updated":"2015-07-10 13:15:05.000000000","message":"Henry talked me off of the ledge for this one. I was worried that a user could have a script that scopes to project X, but in the mean time X was turned into a domain with a new sub-project X, the wrong project id would be returned. It turns out in this case that the only way to change project domain-ness is to delete and recreate with that feature.","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"0d235a1657f7e473ddaa703a8a7154a26bc43e32","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                # the same name, inside a domain, where one has the is_domain"},{"line_number":202,"context_line":"                # feature enabled and the other doess not. In case there is a"},{"line_number":203,"context_line":"                # name clashing, Keystone will always return the project which"},{"line_number":204,"context_line":"                # has the domain feature disabled."},{"line_number":205,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":206,"context_line":"                    project_name, domain_ref[\u0027id\u0027], False)"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":60,"id":"ba3cc151_797ca4eb","line":204,"in_reply_to":"ba3cc151_d23d972d","updated":"2015-07-10 17:52:50.000000000","message":"Yes, that\u0027s exactly what Henry explained.","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d2a7740e296eecf4ff9311221e26610e418bf6a2","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                                                    target\u003d\u0027project\u0027)"},{"line_number":199,"context_line":"                domain_ref \u003d self._lookup_domain(project_info[\u0027domain\u0027])"},{"line_number":200,"context_line":"                # NOTE(htruta): It is now possible to have two projects with"},{"line_number":201,"context_line":"                # the same name, inside a domain, where one has the is_domain"},{"line_number":202,"context_line":"                # feature enabled and the other does not. In case there is a"},{"line_number":203,"context_line":"                # name clashing, Keystone will always return the project which"},{"line_number":204,"context_line":"                # has the domain feature disabled."}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_2c1aca7d","line":201,"updated":"2015-07-22 19:38:46.000000000","message":"perhaps better worded:....inside a domain, where one is acting as a domain (is_domain\u003dTrue) and the other....","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"9aea3cbc941394f444f7a906cf31826d8bad68a1","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                                                    target\u003d\u0027project\u0027)"},{"line_number":199,"context_line":"                domain_ref \u003d self._lookup_domain(project_info[\u0027domain\u0027])"},{"line_number":200,"context_line":"                # NOTE(htruta): It is now possible to have two projects with"},{"line_number":201,"context_line":"                # the same name, inside a domain, where one has the is_domain"},{"line_number":202,"context_line":"                # feature enabled and the other does not. In case there is a"},{"line_number":203,"context_line":"                # name clashing, Keystone will always return the project which"},{"line_number":204,"context_line":"                # has the domain feature disabled."}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_3d1f526d","line":201,"in_reply_to":"3a50d1a3_2c1aca7d","updated":"2015-07-22 20:24:31.000000000","message":"Done","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d2a7740e296eecf4ff9311221e26610e418bf6a2","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                # the same name, inside a domain, where one has the is_domain"},{"line_number":202,"context_line":"                # feature enabled and the other does not. In case there is a"},{"line_number":203,"context_line":"                # name clashing, Keystone will always return the project which"},{"line_number":204,"context_line":"                # has the domain feature disabled."},{"line_number":205,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":206,"context_line":"                    project_name, domain_ref[\u0027id\u0027], False)"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_9f153e41","line":204,"updated":"2015-07-22 19:38:46.000000000","message":"s/has the domain feature disabled/is not acting as a domain (is_domain\u003dFalse)/","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"9aea3cbc941394f444f7a906cf31826d8bad68a1","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                # the same name, inside a domain, where one has the is_domain"},{"line_number":202,"context_line":"                # feature enabled and the other does not. In case there is a"},{"line_number":203,"context_line":"                # name clashing, Keystone will always return the project which"},{"line_number":204,"context_line":"                # has the domain feature disabled."},{"line_number":205,"context_line":"                project_ref \u003d self.resource_api.get_project_by_name("},{"line_number":206,"context_line":"                    project_name, domain_ref[\u0027id\u0027], False)"},{"line_number":207,"context_line":""}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_dd0f4e37","line":204,"in_reply_to":"3a50d1a3_9f153e41","updated":"2015-07-22 20:24:31.000000000","message":"Done","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"01a4a9562c9eb40cf5b87f6e1c088d28ad4bb18b","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                if \u0027domain\u0027 not in project_info:"},{"line_number":197,"context_line":"                    raise exception.ValidationError(attribute\u003d\u0027domain\u0027,"},{"line_number":198,"context_line":"                                                    target\u003d\u0027project\u0027)"},{"line_number":199,"context_line":"                domain_ref \u003d self._lookup_domain(project_info[\u0027domain\u0027])"},{"line_number":200,"context_line":"                # NOTE(htruta): It is possible to have two projects with the"},{"line_number":201,"context_line":"                # same name, inside a domain, where one acts as a domain"},{"line_number":202,"context_line":"                # (is_domain\u003dTrue) and the other does not (is_domain\u003dFalse)."}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_b7848fb1","line":199,"updated":"2015-07-30 07:24:58.000000000","message":"there is some changes that were made in the follow up patch and should be done *here*","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2ec925580d978a229a21ca2d9fe43fadf713b035","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                if \u0027domain\u0027 not in project_info:"},{"line_number":197,"context_line":"                    raise exception.ValidationError(attribute\u003d\u0027domain\u0027,"},{"line_number":198,"context_line":"                                                    target\u003d\u0027project\u0027)"},{"line_number":199,"context_line":"                domain_ref \u003d self._lookup_domain(project_info[\u0027domain\u0027])"},{"line_number":200,"context_line":"                # NOTE(htruta): It is possible to have two projects with the"},{"line_number":201,"context_line":"                # same name, inside a domain, where one acts as a domain"},{"line_number":202,"context_line":"                # (is_domain\u003dTrue) and the other does not (is_domain\u003dFalse)."}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_540df0e6","line":199,"in_reply_to":"3a50d1a3_b7848fb1","updated":"2015-07-30 14:52:19.000000000","message":"Done","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"539efa73ae6a6aa7c9545642b5805ff55948d0ce","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"                # NOTE(htruta): It is possible to have two projects with the"},{"line_number":201,"context_line":"                # same name inside a domain, where one acts as a domain"},{"line_number":202,"context_line":"                # (is_domain\u003dTrue) and the other does not (is_domain\u003dFalse)."},{"line_number":203,"context_line":"                # In case there is a name clashing, keystone will always"},{"line_number":204,"context_line":"                # scope the token to the project which is not acting as a"},{"line_number":205,"context_line":"                # domain."}],"source_content_type":"text/x-python","patch_set":96,"id":"fa1b9901_2bdebc6d","line":202,"updated":"2015-08-18 10:24:59.000000000","message":"remove (is_domain\u003dTrue) and (is_domain\u003dFalse)","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"497b70142b4bb7a5fb39c53432a45281e3faee79","unresolved":false,"context_lines":[{"line_number":199,"context_line":""},{"line_number":200,"context_line":"                # NOTE(htruta): It is possible to have two projects with the"},{"line_number":201,"context_line":"                # same name inside a domain, where one acts as a domain"},{"line_number":202,"context_line":"                # (is_domain\u003dTrue) and the other does not (is_domain\u003dFalse)."},{"line_number":203,"context_line":"                # In case there is a name clashing, keystone will always"},{"line_number":204,"context_line":"                # scope the token to the project which is not acting as a"},{"line_number":205,"context_line":"                # domain."}],"source_content_type":"text/x-python","patch_set":96,"id":"fa1b9901_c2acba37","line":202,"in_reply_to":"fa1b9901_2bdebc6d","updated":"2015-08-18 13:52:24.000000000","message":"Done","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"}],"keystone/common/sql/migrate_repo/versions/067_update_project_name_constraint.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"f7abb19802124686c559665583b64631e599eefe","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                             project_table.c.name,"},{"line_number":46,"context_line":"                             name\u003d_PROJECT_NAME_OLD_CONSTRAINT).drop()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    if migrate_engine.name !\u003d \u0027sqlite\u0027:"},{"line_number":49,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"},{"line_number":50,"context_line":"                                                           project_table))"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_10b52531","line":48,"updated":"2015-03-10 16:25:16.000000000","message":"Does it fail with sqlite? If yes, it should be fixed in migration_helpers I think. Copypasting \"if migrate_engine.name !\u003d \u0027sqlite\u0027:\" doesn\u0027t look nice.","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c96cae0ccef2d4e2376ed9d99e7f1f63654f3497","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                             project_table.c.name,"},{"line_number":46,"context_line":"                             name\u003d_PROJECT_NAME_OLD_CONSTRAINT).drop()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    if migrate_engine.name !\u003d \u0027sqlite\u0027:"},{"line_number":49,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"},{"line_number":50,"context_line":"                                                           project_table))"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_93ce7fb3","line":48,"in_reply_to":"9a80dd14_10b52531","updated":"2015-03-10 16:37:10.000000000","message":"fixed where? this is how its done throughout all migration scripts. If you are suggesting to add this logic in migration_helpers, I agree but believe that should be in a different change to fix all occurrences of such \"hack\".","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e499efd90b9377d23af66c3b558943725c831130","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                             project_table.c.name,"},{"line_number":46,"context_line":"                             name\u003d_PROJECT_NAME_OLD_CONSTRAINT).drop()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    if migrate_engine.name !\u003d \u0027sqlite\u0027:"},{"line_number":49,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"},{"line_number":50,"context_line":"                                                           project_table))"},{"line_number":51,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_a6ad03ed","line":48,"in_reply_to":"9a80dd14_93ce7fb3","updated":"2015-03-10 16:48:13.000000000","message":"oh. Ok then.","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"}],"keystone/common/sql/migrate_repo/versions/068_update_project_name_constraint.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"388a17e8a49821b16641ef21125993e396dfa86d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                             name\u003d_PROJECT_NAME_NEW_CONSTRAINT).create()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def downgrade(migrate_engine):"},{"line_number":59,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":60,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"baa041b7_512bda30","line":58,"updated":"2015-04-02 10:48:16.000000000","message":"can drop this now","commit_id":"40bc456fa7dc05b877c2a2320202c6a99d843c2a"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"8cbd7831cd7a4933306be97ce0fbbc34f48a4ed1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                             name\u003d_PROJECT_NAME_NEW_CONSTRAINT).create()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def downgrade(migrate_engine):"},{"line_number":59,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":60,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"baa041b7_f73e5bb7","line":58,"in_reply_to":"baa041b7_512bda30","updated":"2015-04-02 13:11:31.000000000","message":"Sure, i\u0027ll update the reseller patches removing all the downgrades","commit_id":"40bc456fa7dc05b877c2a2320202c6a99d843c2a"}],"keystone/common/sql/migrate_repo/versions/069_update_project_name_constraint.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"0e634518212eff4bb3c352ccd2170f9beae86508","unresolved":false,"context_lines":[{"line_number":22,"context_line":"_DOMAIN_ID_COLUMN_NAME \u003d \u0027domain_id\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def list_constraints(domain_table, project_table):"},{"line_number":26,"context_line":"    constraints \u003d [{\u0027table\u0027: project_table,"},{"line_number":27,"context_line":"                    \u0027fk_column\u0027: _DOMAIN_ID_COLUMN_NAME,"},{"line_number":28,"context_line":"                    \u0027ref_column\u0027: domain_table.c.id}]"}],"source_content_type":"text/x-python","patch_set":33,"id":"baa041b7_abc184e6","line":25,"updated":"2015-04-02 18:46:32.000000000","message":"the method name is confusing and hard to understand what it supposed to do.\n\nnot sure if we really need this function, we call this twice but with same arguments.  You could just have a constraint variable in the upgrade method. Maybe just remove it?","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"244ff072456bc94b0f75570ced350f08aaf2fe85","unresolved":false,"context_lines":[{"line_number":22,"context_line":"_DOMAIN_ID_COLUMN_NAME \u003d \u0027domain_id\u0027"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def list_constraints(domain_table, project_table):"},{"line_number":26,"context_line":"    constraints \u003d [{\u0027table\u0027: project_table,"},{"line_number":27,"context_line":"                    \u0027fk_column\u0027: _DOMAIN_ID_COLUMN_NAME,"},{"line_number":28,"context_line":"                    \u0027ref_column\u0027: domain_table.c.id}]"}],"source_content_type":"text/x-python","patch_set":33,"id":"9aa53dc9_34f3bc75","line":25,"in_reply_to":"baa041b7_abc184e6","updated":"2015-04-06 19:42:14.000000000","message":"I implemented in this way because I was following the pattern in previous scripts but I agree with you, I\u0027ll send a new patch with your suggestion.","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"0e634518212eff4bb3c352ccd2170f9beae86508","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"},{"line_number":50,"context_line":"                                                           project_table))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    migrate.UniqueConstraint(project_table.c.domain_id,"},{"line_number":53,"context_line":"                             project_table.c.name,"},{"line_number":54,"context_line":"                             project_table.c.is_domain,"},{"line_number":55,"context_line":"                             name\u003d_PROJECT_NAME_NEW_CONSTRAINT).create()"}],"source_content_type":"text/x-python","patch_set":33,"id":"baa041b7_6b725ce7","line":52,"updated":"2015-04-02 18:46:32.000000000","message":"same question, the domain_id seems unnecessary","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"244ff072456bc94b0f75570ced350f08aaf2fe85","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"},{"line_number":50,"context_line":"                                                           project_table))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    migrate.UniqueConstraint(project_table.c.domain_id,"},{"line_number":53,"context_line":"                             project_table.c.name,"},{"line_number":54,"context_line":"                             project_table.c.is_domain,"},{"line_number":55,"context_line":"                             name\u003d_PROJECT_NAME_NEW_CONSTRAINT).create()"}],"source_content_type":"text/x-python","patch_set":33,"id":"9aa53dc9_744b84b1","line":52,"in_reply_to":"baa041b7_6b725ce7","updated":"2015-04-06 19:42:14.000000000","message":"This is not unnecessary, since we can create a project and a domain with the same name, we can\u0027t create two domains with the same name.","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"}],"keystone/common/sql/migrate_repo/versions/074_update_project_name_constraint.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a0c75abbfc5727aeeaa2e89667a13c7b147410c9","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_PROJECT_NAME_OLD_CONSTRAINT \u003d \u0027ixu_project_name_domain_id\u0027"},{"line_number":19,"context_line":"_PROJECT_NAME_NEW_CONSTRAINT \u003d \u0027ixu_project_name_domain_id_is_domain\u0027"},{"line_number":20,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_150ae226","line":17,"updated":"2015-04-17 17:35:48.000000000","message":"(nit) should be an extra newline here","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"45db1e62dc05fefa0088a6af6f9c4acd41dc2bfb","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_PROJECT_NAME_OLD_CONSTRAINT \u003d \u0027ixu_project_name_domain_id\u0027"},{"line_number":19,"context_line":"_PROJECT_NAME_NEW_CONSTRAINT \u003d \u0027ixu_project_name_domain_id_is_domain\u0027"},{"line_number":20,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_db4ee8c0","line":17,"in_reply_to":"3ab451fb_150ae226","updated":"2015-04-17 19:34:20.000000000","message":"Done","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"}],"keystone/common/sql/migrate_repo/versions/075_update_project_name_constraint.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a5e3faaf09dd7b8158681756794562409b48a9ec","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_PROJECT_NAME_OLD_CONSTRAINT \u003d \u0027ixu_project_name_domain_id\u0027"},{"line_number":19,"context_line":"_PROJECT_NAME_NEW_CONSTRAINT \u003d \u0027ixu_project_name_domain_id_is_domain\u0027"},{"line_number":20,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"}],"source_content_type":"text/x-python","patch_set":58,"id":"ba3cc151_fa7df0b1","line":17,"updated":"2015-07-07 15:28:31.000000000","message":"(nit) newline missing","commit_id":"6d7b50fee68e82178fe223c3c5bb9d5446b4549a"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"52b86ea52f6f6e64088506d420896497fa7b5df6","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from keystone.common.sql import migration_helpers"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"_PROJECT_NAME_OLD_CONSTRAINT \u003d \u0027ixu_project_name_domain_id\u0027"},{"line_number":19,"context_line":"_PROJECT_NAME_NEW_CONSTRAINT \u003d \u0027ixu_project_name_domain_id_is_domain\u0027"},{"line_number":20,"context_line":"_PROJECT_TABLE_NAME \u003d \u0027project\u0027"}],"source_content_type":"text/x-python","patch_set":58,"id":"ba3cc151_5f127258","line":17,"in_reply_to":"ba3cc151_fa7df0b1","updated":"2015-07-08 13:33:14.000000000","message":"Done","commit_id":"6d7b50fee68e82178fe223c3c5bb9d5446b4549a"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"1e9589855e654afd214481a1d4b436f82e00133b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                                                              project_table))"},{"line_number":43,"context_line":"    migrate.UniqueConstraint(project_table.c.domain_id,"},{"line_number":44,"context_line":"                             project_table.c.name,"},{"line_number":45,"context_line":"                             name\u003d_PROJECT_NAME_OLD_CONSTRAINT).drop()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    if migrate_engine.name !\u003d \u0027sqlite\u0027:"},{"line_number":48,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_0501b104","line":45,"updated":"2015-07-29 15:21:26.000000000","message":"The drop of this constraint looks not tested. I see a test in test_sql_upgrade, but I don\u0027t understand how it tests this drop.","commit_id":"b13e88fe86f743b0de085c2878092318738d2288"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6a5610cca61a5dba3699c903db8dc5e6d076fc88","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                                                              project_table))"},{"line_number":43,"context_line":"    migrate.UniqueConstraint(project_table.c.domain_id,"},{"line_number":44,"context_line":"                             project_table.c.name,"},{"line_number":45,"context_line":"                             name\u003d_PROJECT_NAME_OLD_CONSTRAINT).drop()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    if migrate_engine.name !\u003d \u0027sqlite\u0027:"},{"line_number":48,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_cb84210d","line":45,"in_reply_to":"3a50d1a3_0501b104","updated":"2015-07-30 03:35:02.000000000","message":"Done","commit_id":"b13e88fe86f743b0de085c2878092318738d2288"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3094fdce678acf9d44d781970787ac9e96a5852f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"},{"line_number":49,"context_line":"                                                           project_table))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # The domain_id column is now nullable, since root is_domain\u003dTrue projects"},{"line_number":52,"context_line":"    # will have no domain_id"},{"line_number":53,"context_line":"    project_table.c.domain_id.alter(nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_78d0e5c9","line":51,"updated":"2015-07-31 17:12:31.000000000","message":"remove the word \"now\"....comments shouldn\u0027t be time dependant, that\u0027s what git is for.","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8f84272899783fe4e687703cdd4c5cfa06a7df4a","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        migration_helpers.add_constraints(list_constraints(domain_table,"},{"line_number":49,"context_line":"                                                           project_table))"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    # The domain_id column is now nullable, since root is_domain\u003dTrue projects"},{"line_number":52,"context_line":"    # will have no domain_id"},{"line_number":53,"context_line":"    project_table.c.domain_id.alter(nullable\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_4ab3c10a","line":51,"in_reply_to":"3a50d1a3_78d0e5c9","updated":"2015-08-01 00:16:13.000000000","message":"Done. Removed the whole comment. the rest of the phrase is pretty time dependant too","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"}],"keystone/common/sql/migrate_repo/versions/088_update_project_name_constraint.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4a063cfb09933d4f807cd292fc27099ac9ab7c38","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    migrate.UniqueConstraint(project_table.c.domain_id,"},{"line_number":52,"context_line":"                             project_table.c.name,"},{"line_number":53,"context_line":"                             project_table.c.is_domain,"},{"line_number":54,"context_line":"                             name\u003d_PROJECT_NAME_OLD_CONSTRAINT).create()"}],"source_content_type":"text/x-python","patch_set":129,"id":"fa69d971_16c28453","line":54,"range":{"start_line":54,"start_character":34,"end_line":54,"end_character":62},"updated":"2016-01-11 21:39:40.000000000","message":"would it really be called the same thing?","commit_id":"6647f2184dd57bfec0755ca85e2fdd43e4bb53fc"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a48af62cf2ff2249f99f91b30475ddfa6ce554ec","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    migrate.UniqueConstraint(project_table.c.domain_id,"},{"line_number":52,"context_line":"                             project_table.c.name,"},{"line_number":53,"context_line":"                             project_table.c.is_domain,"},{"line_number":54,"context_line":"                             name\u003d_PROJECT_NAME_OLD_CONSTRAINT).create()"}],"source_content_type":"text/x-python","patch_set":129,"id":"da6ed579_91d5571d","line":54,"range":{"start_line":54,"start_character":34,"end_line":54,"end_character":62},"in_reply_to":"fa69d971_16c28453","updated":"2016-01-14 03:02:08.000000000","message":"renamed","commit_id":"6647f2184dd57bfec0755ca85e2fdd43e4bb53fc"}],"keystone/resource/backends/ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"56cfa9d7c28d26f01f72043e1f98f80330493c9a","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        # any domain specified"},{"line_number":127,"context_line":"        return [x.id for x in self.list_projects(driver_hints.Hints())]"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain\u003dNone):"},{"line_number":130,"context_line":"        self._validate_default_domain_id(domain_id)"},{"line_number":131,"context_line":"        return self._set_default_attributes("},{"line_number":132,"context_line":"            self.project.get_by_name(tenant_name))"}],"source_content_type":"text/x-python","patch_set":51,"id":"1aca2d91_7a59bffd","line":129,"updated":"2015-05-08 13:03:52.000000000","message":"is_domain reads like it\u0027s a boolean, should it default to False?","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"33cfd25886fb643df39f056142cc26c85665a233","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        # any domain specified"},{"line_number":127,"context_line":"        return [x.id for x in self.list_projects(driver_hints.Hints())]"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain\u003dNone):"},{"line_number":130,"context_line":"        self._validate_default_domain_id(domain_id)"},{"line_number":131,"context_line":"        return self._set_default_attributes("},{"line_number":132,"context_line":"            self.project.get_by_name(tenant_name))"}],"source_content_type":"text/x-python","patch_set":51,"id":"9a0c5dc1_be9adf12","line":129,"in_reply_to":"1aca2d91_7a59bffd","updated":"2015-05-12 23:40:25.000000000","message":"See my comment on resource_api","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"}],"keystone/resource/backends/sql.py":[{"author":{"_account_id":7491,"name":"Viktor Serhieiev","email":"viktor.sergeyev@gmail.com","username":"vsergeyev"},"change_message_id":"68cff9bcf347b6f03a3f8627fea03262d82752f2","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def _get_children(self, session, project_ids):"},{"line_number":86,"context_line":"        query \u003d session.query(Project)"},{"line_number":87,"context_line":"        query \u003d query.filter(Project.parent_id.in_(project_ids))"},{"line_number":88,"context_line":"        projects \u003d [project_ref.to_dict() for project_ref in query.all()]"},{"line_number":89,"context_line":"        # Also return projects without parent"},{"line_number":90,"context_line":"        if None in project_ids:"},{"line_number":91,"context_line":"            projects +\u003d self._get_root_projects(session)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_c97606a4","line":88,"updated":"2015-02-24 16:35:35.000000000","message":"IMO, it\u0027s better to use a single DB query here","commit_id":"b45b3316b30cbb86d826d0ad38c92d1a0a9fb8a7"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"0e634518212eff4bb3c352ccd2170f9beae86508","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":256,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":257,"context_line":"    parent_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027project.id\u0027))"},{"line_number":258,"context_line":"    is_domain \u003d sql.Column(sql.Boolean, default\u003dFalse, nullable\u003dFalse)"},{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique. We can not have two"},{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"}],"source_content_type":"text/x-python","patch_set":33,"id":"baa041b7_4b0d583d","line":258,"updated":"2015-04-02 18:46:32.000000000","message":"I\u0027m just curious why are we using Boolean column here?  Would using the string that stores a type be more flexible?  In case we want to introduce more type  projects (other than the domain-ness feature)","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"244ff072456bc94b0f75570ced350f08aaf2fe85","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":256,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":257,"context_line":"    parent_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027project.id\u0027))"},{"line_number":258,"context_line":"    is_domain \u003d sql.Column(sql.Boolean, default\u003dFalse, nullable\u003dFalse)"},{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique. We can not have two"},{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"}],"source_content_type":"text/x-python","patch_set":33,"id":"9aa53dc9_3794de35","line":258,"in_reply_to":"baa041b7_4b0d583d","updated":"2015-04-06 19:42:14.000000000","message":"I don\u0027t think that we have a strong reason, we decide to use this as a boolean during the spec, but in IMO we have to use a boolean here since we are enabled/disable a functionality, in every moment this will be a project, but can provide or not a domain capability","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"0e634518212eff4bb3c352ccd2170f9beae86508","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"},{"line_number":262,"context_line":"    # can have the same name as its domain."},{"line_number":263,"context_line":"    __table_args__ \u003d ("},{"line_number":264,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027, \u0027is_domain\u0027), {})"}],"source_content_type":"text/x-python","patch_set":33,"id":"baa041b7_0be630b4","line":264,"updated":"2015-04-02 18:46:32.000000000","message":"The less unique columns we have to check the better for performance.\n\nis \"domain_id\" necessary?  seems like having name and is_domain is all enough to check that a domain name is unique in the table.","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"244ff072456bc94b0f75570ced350f08aaf2fe85","unresolved":false,"context_lines":[{"line_number":261,"context_line":"    # projects with the same name in the same domain, but a project"},{"line_number":262,"context_line":"    # can have the same name as its domain."},{"line_number":263,"context_line":"    __table_args__ \u003d ("},{"line_number":264,"context_line":"        sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027, \u0027is_domain\u0027), {})"}],"source_content_type":"text/x-python","patch_set":33,"id":"9aa53dc9_77aa6672","line":264,"in_reply_to":"baa041b7_0be630b4","updated":"2015-04-06 19:42:14.000000000","message":"It\u0027s necessary, since we can have a project and a domain with the same name, so I need to use this to prohib have two domains with the same name.","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fdfc2ce5d6039d5737e270aafad1040857842136","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            query \u003d session.query(Project)"},{"line_number":45,"context_line":"            query \u003d query.filter_by(name\u003dtenant_name)"},{"line_number":46,"context_line":"            query \u003d query.filter_by(domain_id\u003ddomain_id)"},{"line_number":47,"context_line":"            if is_domain is not None:"},{"line_number":48,"context_line":"                query \u003d query.filter_by(is_domain\u003dis_domain)"},{"line_number":49,"context_line":"            try:"},{"line_number":50,"context_line":"                project_ref \u003d query.one()"}],"source_content_type":"text/x-python","patch_set":50,"id":"3acd31a7_35b7bff6","line":47,"updated":"2015-05-05 08:16:44.000000000","message":"I\u0027m not sure if this is right. In the case where we the top level project (which is acting as a domain) and a project in its hierarchy that share the same name....if the user does not specify the is_domain attribute in the scope we want to default to the project that is NOT the domain (to keep compatibility with how it works now). Given that you can have two such projects..wouldn\u0027t this method fail in the query.one() step since it would get two results?","commit_id":"08a9ee69ccc7c65f9324c94fa4d5347b163ee441"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ffb07d9ec4d854aa21243f6344888463b16c5678","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            query \u003d session.query(Project)"},{"line_number":45,"context_line":"            query \u003d query.filter_by(name\u003dtenant_name)"},{"line_number":46,"context_line":"            query \u003d query.filter_by(domain_id\u003ddomain_id)"},{"line_number":47,"context_line":"            if is_domain is not None:"},{"line_number":48,"context_line":"                query \u003d query.filter_by(is_domain\u003dis_domain)"},{"line_number":49,"context_line":"            try:"},{"line_number":50,"context_line":"                project_ref \u003d query.one()"}],"source_content_type":"text/x-python","patch_set":50,"id":"3acd31a7_b04cf69e","line":47,"in_reply_to":"3acd31a7_35b7bff6","updated":"2015-05-05 12:38:32.000000000","message":"So, I will change the the default value to False, so if the user does not specify the is_domain attibute, we will return the project with is_domain flag disable.","commit_id":"08a9ee69ccc7c65f9324c94fa4d5347b163ee441"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d2a7740e296eecf4ff9311221e26610e418bf6a2","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":255,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":256,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":257,"context_line":"    parent_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027project.id\u0027))"},{"line_number":258,"context_line":"    is_domain \u003d sql.Column(sql.Boolean, default\u003dFalse, nullable\u003dFalse)"},{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique"}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_5f49f65e","line":257,"updated":"2015-07-22 19:38:46.000000000","message":"parent_id should be nullable as well?  Not sure where this should have been set that way?","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"9aea3cbc941394f444f7a906cf31826d8bad68a1","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":255,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":256,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":257,"context_line":"    parent_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027project.id\u0027))"},{"line_number":258,"context_line":"    is_domain \u003d sql.Column(sql.Boolean, default\u003dFalse, nullable\u003dFalse)"},{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique"}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_62c21936","line":257,"in_reply_to":"3a50d1a3_5f49f65e","updated":"2015-07-22 20:24:31.000000000","message":"yes, it should. The root is_domain\u003dTrue project has parent_id and domain_id None","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"05bbe4b0ea2d91be384b0a48a77a0e4784f7645b","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":255,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":256,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":257,"context_line":"    parent_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027project.id\u0027))"},{"line_number":258,"context_line":"    is_domain \u003d sql.Column(sql.Boolean, default\u003dFalse, nullable\u003dFalse)"},{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_f0c81657","line":257,"updated":"2015-07-23 08:42:21.000000000","message":"just checking (as per my previous comment): this already allows null values due to the fact that nullable\u003dTrue is the default?","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8671ba05d61f0f0fb0907af52d70fc0d63e04a90","unresolved":false,"context_lines":[{"line_number":254,"context_line":"    description \u003d sql.Column(sql.Text())"},{"line_number":255,"context_line":"    enabled \u003d sql.Column(sql.Boolean)"},{"line_number":256,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":257,"context_line":"    parent_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027project.id\u0027))"},{"line_number":258,"context_line":"    is_domain \u003d sql.Column(sql.Boolean, default\u003dFalse, nullable\u003dFalse)"},{"line_number":259,"context_line":"    # Unique constraint across two columns to create the separation"},{"line_number":260,"context_line":"    # rather than just only \u0027name\u0027 being unique"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_fd569fcc","line":257,"in_reply_to":"3a50d1a3_f0c81657","updated":"2015-07-23 14:05:01.000000000","message":"yes, exactly. Since HMT, we have parent_id\u003dNone por root projects","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cfc7b3b0de3bd44c907efce1d70bfa512172766f","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @driver_hints.truncated"},{"line_number":58,"context_line":"    def list_projects(self, hints):"},{"line_number":59,"context_line":"        # If there is a filter on domain_id and the value is None, then to"},{"line_number":60,"context_line":"        # ensure that the sql filtering works correctly, we need to patch"},{"line_number":61,"context_line":"        # the value to be NULL_DOMAIN_ID. This is safe to do here since we"},{"line_number":62,"context_line":"        # know we are able to satisfy any filter of this type here, so it"},{"line_number":63,"context_line":"        # will be removed from the hints as part of the call to"},{"line_number":64,"context_line":"        # filter_limit_query() below."},{"line_number":65,"context_line":"        for f in hints.filters:"},{"line_number":66,"context_line":"            if (f[\u0027name\u0027] \u003d\u003d \u0027domain_id\u0027 and f[\u0027value\u0027] is None):"},{"line_number":67,"context_line":"                f[\u0027value\u0027] \u003d NULL_DOMAIN_ID"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_11fe0eae","line":64,"range":{"start_line":59,"start_character":10,"end_line":64,"end_character":36},"updated":"2016-01-06 07:46:02.000000000","message":"see slight modified wording in where you copied this from...that explains this a little better...","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5f9982800e8824ea961331b4ae094c05a41a9545","unresolved":false,"context_lines":[{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    @driver_hints.truncated"},{"line_number":58,"context_line":"    def list_projects(self, hints):"},{"line_number":59,"context_line":"        # If there is a filter on domain_id and the value is None, then to"},{"line_number":60,"context_line":"        # ensure that the sql filtering works correctly, we need to patch"},{"line_number":61,"context_line":"        # the value to be NULL_DOMAIN_ID. This is safe to do here since we"},{"line_number":62,"context_line":"        # know we are able to satisfy any filter of this type here, so it"},{"line_number":63,"context_line":"        # will be removed from the hints as part of the call to"},{"line_number":64,"context_line":"        # filter_limit_query() below."},{"line_number":65,"context_line":"        for f in hints.filters:"},{"line_number":66,"context_line":"            if (f[\u0027name\u0027] \u003d\u003d \u0027domain_id\u0027 and f[\u0027value\u0027] is None):"},{"line_number":67,"context_line":"                f[\u0027value\u0027] \u003d NULL_DOMAIN_ID"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_15d32c61","line":64,"range":{"start_line":59,"start_character":10,"end_line":64,"end_character":36},"in_reply_to":"fa69d971_11fe0eae","updated":"2016-01-07 03:37:02.000000000","message":"Done","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d7656afdeef20f6bb69e39b05b2e408e8624f915","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    # CRUD"},{"line_number":152,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":153,"context_line":"    def create_project(self, tenant_id, tenant):"},{"line_number":154,"context_line":"        def _ensure_domain_id_not_none(role):"},{"line_number":155,"context_line":"            if \u0027domain_id\u0027 not in tenant or tenant[\u0027domain_id\u0027] is None:"},{"line_number":156,"context_line":"                new_tenant \u003d tenant.copy()"},{"line_number":157,"context_line":"                new_tenant[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_33ea1675","line":154,"updated":"2016-01-06 21:53:09.000000000","message":"(nit) _ensure_domain_id may be a better name since this isn\u0027t just check None, but that it also exists.\n\nAlso why is the param named role when a tenant is passed in? Due to scoping this works on accident?","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5f9982800e8824ea961331b4ae094c05a41a9545","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    # CRUD"},{"line_number":152,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":153,"context_line":"    def create_project(self, tenant_id, tenant):"},{"line_number":154,"context_line":"        def _ensure_domain_id_not_none(role):"},{"line_number":155,"context_line":"            if \u0027domain_id\u0027 not in tenant or tenant[\u0027domain_id\u0027] is None:"},{"line_number":156,"context_line":"                new_tenant \u003d tenant.copy()"},{"line_number":157,"context_line":"                new_tenant[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_554a0456","line":154,"in_reply_to":"fa69d971_33ea1675","updated":"2016-01-07 03:37:02.000000000","message":"Done. It was a copy-paste errror","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d7656afdeef20f6bb69e39b05b2e408e8624f915","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":170,"context_line":"    def update_project(self, tenant_id, tenant):"},{"line_number":171,"context_line":"        def _ensure_domain_id_not_none(role):"},{"line_number":172,"context_line":"            if \u0027domain_id\u0027 in tenant and tenant[\u0027domain_id\u0027] is None:"},{"line_number":173,"context_line":"                new_tenant \u003d tenant.copy()"},{"line_number":174,"context_line":"                new_tenant[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_b3a4c64a","line":171,"updated":"2016-01-06 21:53:09.000000000","message":"Why is this copied?","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"088823b55096b799896b099a595d8efaed500fb3","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":170,"context_line":"    def update_project(self, tenant_id, tenant):"},{"line_number":171,"context_line":"        def _ensure_domain_id_not_none(role):"},{"line_number":172,"context_line":"            if \u0027domain_id\u0027 in tenant and tenant[\u0027domain_id\u0027] is None:"},{"line_number":173,"context_line":"                new_tenant \u003d tenant.copy()"},{"line_number":174,"context_line":"                new_tenant[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_e036d44f","line":171,"in_reply_to":"fa69d971_3531905a","updated":"2016-01-07 03:52:02.000000000","message":"Ah, I see. I wonder if there is a pattern to simplify this.","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5f9982800e8824ea961331b4ae094c05a41a9545","unresolved":false,"context_lines":[{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027project\u0027)"},{"line_number":170,"context_line":"    def update_project(self, tenant_id, tenant):"},{"line_number":171,"context_line":"        def _ensure_domain_id_not_none(role):"},{"line_number":172,"context_line":"            if \u0027domain_id\u0027 in tenant and tenant[\u0027domain_id\u0027] is None:"},{"line_number":173,"context_line":"                new_tenant \u003d tenant.copy()"},{"line_number":174,"context_line":"                new_tenant[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_3531905a","line":171,"in_reply_to":"fa69d971_b3a4c64a","updated":"2016-01-07 03:37:02.000000000","message":"they\u0027re different. see lines 155 and 172","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d7656afdeef20f6bb69e39b05b2e408e8624f915","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            old_project_dict \u003d tenant_ref.to_dict()"},{"line_number":186,"context_line":"            for k in update_tenant:"},{"line_number":187,"context_line":"                old_project_dict[k] \u003d update_tenant[k]"},{"line_number":188,"context_line":"            if old_project_dict[\u0027domain_id\u0027] is None:"},{"line_number":189,"context_line":"                old_project_dict[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"},{"line_number":190,"context_line":"            new_project \u003d Project.from_dict(old_project_dict)"},{"line_number":191,"context_line":"            for attr in Project.attributes:"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_731e4e71","line":188,"updated":"2016-01-06 21:53:09.000000000","message":"Is this actually needed? Won\u0027t your use of _ensure_domain_id_not_none foce update_tenant to contain a domain_id and because of that old_project_dict will have one too?","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5f9982800e8824ea961331b4ae094c05a41a9545","unresolved":false,"context_lines":[{"line_number":185,"context_line":"            old_project_dict \u003d tenant_ref.to_dict()"},{"line_number":186,"context_line":"            for k in update_tenant:"},{"line_number":187,"context_line":"                old_project_dict[k] \u003d update_tenant[k]"},{"line_number":188,"context_line":"            if old_project_dict[\u0027domain_id\u0027] is None:"},{"line_number":189,"context_line":"                old_project_dict[\u0027domain_id\u0027] \u003d NULL_DOMAIN_ID"},{"line_number":190,"context_line":"            new_project \u003d Project.from_dict(old_project_dict)"},{"line_number":191,"context_line":"            for attr in Project.attributes:"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_957f1c14","line":188,"in_reply_to":"fa69d971_731e4e71","updated":"2016-01-07 03:37:02.000000000","message":"actually, no... because it comes from update_tenant, that did not come from DB, so it does not necesseraly have a domain_id, if it is not being updated.","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cfc7b3b0de3bd44c907efce1d70bfa512172766f","unresolved":false,"context_lines":[{"line_number":281,"context_line":"    # configurations, it is better to still use the sql uniqueness constraint."},{"line_number":282,"context_line":"    # Since the support for a nullable component of a uniqueness constraint"},{"line_number":283,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":284,"context_line":"    # to represent null, as sdefined in NULL_DOMAIN_ID above."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":287,"context_line":"        d \u003d super(Project, self).to_dict("}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_3176b270","line":284,"range":{"start_line":284,"start_character":28,"end_line":284,"end_character":36},"updated":"2016-01-06 07:46:02.000000000","message":"s/sdefined/defined/","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5f9982800e8824ea961331b4ae094c05a41a9545","unresolved":false,"context_lines":[{"line_number":281,"context_line":"    # configurations, it is better to still use the sql uniqueness constraint."},{"line_number":282,"context_line":"    # Since the support for a nullable component of a uniqueness constraint"},{"line_number":283,"context_line":"    # across different sql databases is mixed, we instead store a special value"},{"line_number":284,"context_line":"    # to represent null, as sdefined in NULL_DOMAIN_ID above."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":287,"context_line":"        d \u003d super(Project, self).to_dict("}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_f5cbf8a1","line":284,"range":{"start_line":284,"start_character":28,"end_line":284,"end_character":36},"in_reply_to":"fa69d971_3176b270","updated":"2016-01-07 03:37:02.000000000","message":"Done","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d7656afdeef20f6bb69e39b05b2e408e8624f915","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":287,"context_line":"        d \u003d super(Project, self).to_dict("},{"line_number":288,"context_line":"            include_extra_dict\u003dinclude_extra_dict)"},{"line_number":289,"context_line":"        if d[\u0027domain_id\u0027] \u003d\u003d NULL_DOMAIN_ID:"},{"line_number":290,"context_line":"            d[\u0027domain_id\u0027] \u003d None"},{"line_number":291,"context_line":"        return d"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_e51ef15d","line":289,"updated":"2016-01-06 21:53:09.000000000","message":"Is this needed? Why is this column still nullable?","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2e37e4ce2049b23cc567d7c79a591994504062b6","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":287,"context_line":"        d \u003d super(Project, self).to_dict("},{"line_number":288,"context_line":"            include_extra_dict\u003dinclude_extra_dict)"},{"line_number":289,"context_line":"        if d[\u0027domain_id\u0027] \u003d\u003d NULL_DOMAIN_ID:"},{"line_number":290,"context_line":"            d[\u0027domain_id\u0027] \u003d None"},{"line_number":291,"context_line":"        return d"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_c03950f3","line":289,"in_reply_to":"fa69d971_8057d856","updated":"2016-01-07 03:56:48.000000000","message":"not sure if I follow... In the whole life, the column was not nullable. But since the previous patch, it will be nullable. So, we need this check","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"5f9982800e8824ea961331b4ae094c05a41a9545","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":287,"context_line":"        d \u003d super(Project, self).to_dict("},{"line_number":288,"context_line":"            include_extra_dict\u003dinclude_extra_dict)"},{"line_number":289,"context_line":"        if d[\u0027domain_id\u0027] \u003d\u003d NULL_DOMAIN_ID:"},{"line_number":290,"context_line":"            d[\u0027domain_id\u0027] \u003d None"},{"line_number":291,"context_line":"        return d"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_f5277860","line":289,"in_reply_to":"fa69d971_e51ef15d","updated":"2016-01-07 03:37:02.000000000","message":"it is only nullable now, preparing for root projects acting as domains, that will have no domain_id. This patch was split into two and the part that makes it null is here: https://review.openstack.org/#/c/264533/","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"088823b55096b799896b099a595d8efaed500fb3","unresolved":false,"context_lines":[{"line_number":286,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":287,"context_line":"        d \u003d super(Project, self).to_dict("},{"line_number":288,"context_line":"            include_extra_dict\u003dinclude_extra_dict)"},{"line_number":289,"context_line":"        if d[\u0027domain_id\u0027] \u003d\u003d NULL_DOMAIN_ID:"},{"line_number":290,"context_line":"            d[\u0027domain_id\u0027] \u003d None"},{"line_number":291,"context_line":"        return d"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_8057d856","line":289,"in_reply_to":"fa69d971_f5277860","updated":"2016-01-07 03:52:02.000000000","message":"OK. So really that patch should remove this code?","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"}],"keystone/resource/controllers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0bdc5d08ba6d8875d0104635a7d1c2e24b4a74fd","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        # TODO(termie): this stuff should probably be moved to middleware"},{"line_number":61,"context_line":"        self.assert_admin(context)"},{"line_number":62,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":63,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(ref)}"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @controller.v2_deprecated"},{"line_number":66,"context_line":"    def get_project_by_name(self, context, tenant_name):"}],"source_content_type":"text/x-python","patch_set":60,"id":"ba3cc151_efcc7863","line":63,"updated":"2015-07-10 12:56:02.000000000","message":"to dstanek\u0027s point, I think this should return Not found if the project has is_domain\u003dTrue","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2d90121b64d9c82381835d3a66d79ef2a7b672f4","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        # TODO(termie): this stuff should probably be moved to middleware"},{"line_number":61,"context_line":"        self.assert_admin(context)"},{"line_number":62,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":63,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(ref)}"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @controller.v2_deprecated"},{"line_number":66,"context_line":"    def get_project_by_name(self, context, tenant_name):"}],"source_content_type":"text/x-python","patch_set":60,"id":"9a41bdd9_a8ac3a36","line":63,"in_reply_to":"ba3cc151_efcc7863","updated":"2015-07-16 16:16:11.000000000","message":"Done.","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"7d715a6d9f553e16ddb1c436b8f5688a47c6dad5","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    @controller.v2_deprecated"},{"line_number":66,"context_line":"    def get_project_by_name(self, context, tenant_name):"},{"line_number":67,"context_line":"        self.assert_admin(context)"},{"line_number":68,"context_line":"        # In Identity API v2.0, every project has the is_domain flag"},{"line_number":69,"context_line":"        # set to False"},{"line_number":70,"context_line":"        ref \u003d self.resource_api.get_project_by_name("},{"line_number":71,"context_line":"            tenant_name, CONF.identity.default_domain_id, False)"}],"source_content_type":"text/x-python","patch_set":60,"id":"ba3cc151_d924e20f","line":68,"updated":"2015-07-10 12:21:44.000000000","message":"Does this mean that a user can\u0027t access an is_domain project from V2? Do we have a test showing that we expect a 404 from this?","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"0d235a1657f7e473ddaa703a8a7154a26bc43e32","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    @controller.v2_deprecated"},{"line_number":66,"context_line":"    def get_project_by_name(self, context, tenant_name):"},{"line_number":67,"context_line":"        self.assert_admin(context)"},{"line_number":68,"context_line":"        # In Identity API v2.0, every project has the is_domain flag"},{"line_number":69,"context_line":"        # set to False"},{"line_number":70,"context_line":"        ref \u003d self.resource_api.get_project_by_name("},{"line_number":71,"context_line":"            tenant_name, CONF.identity.default_domain_id, False)"}],"source_content_type":"text/x-python","patch_set":60,"id":"ba3cc151_5993e000","line":68,"in_reply_to":"ba3cc151_3c861cdc","updated":"2015-07-10 17:52:50.000000000","message":"In v2, I think the user should only be able to see the first level of projects under the is_domain project default (current behaviour, I suppose)","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0bdc5d08ba6d8875d0104635a7d1c2e24b4a74fd","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    @controller.v2_deprecated"},{"line_number":66,"context_line":"    def get_project_by_name(self, context, tenant_name):"},{"line_number":67,"context_line":"        self.assert_admin(context)"},{"line_number":68,"context_line":"        # In Identity API v2.0, every project has the is_domain flag"},{"line_number":69,"context_line":"        # set to False"},{"line_number":70,"context_line":"        ref \u003d self.resource_api.get_project_by_name("},{"line_number":71,"context_line":"            tenant_name, CONF.identity.default_domain_id, False)"}],"source_content_type":"text/x-python","patch_set":60,"id":"ba3cc151_3c861cdc","line":68,"in_reply_to":"ba3cc151_d924e20f","updated":"2015-07-10 12:56:02.000000000","message":"I think that\u0027s right, you shouldn\u0027t be able to see an is_domain project via V2.","commit_id":"98136830a633aa20442091527a350ce30dade648"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"54cebc9a96573c01cef5c2b45d90f742392be443","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                context, context[\u0027query_string\u0027].get(\u0027name\u0027))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        self.assert_admin(context)"},{"line_number":48,"context_line":"        tenant_refs \u003d self.resource_api.list_projects_in_domain("},{"line_number":49,"context_line":"            CONF.identity.default_domain_id)"},{"line_number":50,"context_line":"        for tenant_ref in tenant_refs:"},{"line_number":51,"context_line":"            tenant_ref \u003d self.v3_to_v2_project(tenant_ref)"}],"source_content_type":"text/x-python","patch_set":66,"id":"9a41bdd9_9daa8984","line":48,"updated":"2015-07-18 00:07:21.000000000","message":"Conceptually this could return an is_domain project in the list (i.e.  a domain that is a child of the default domain, which was created via the v3 api).  We need to strip any such projects from the list.","commit_id":"94c21bb56c1c4372d9fd7e39c73a582566ded6eb"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"026ed4700a91dff11d7f8575e742f55a53c07592","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                context, context[\u0027query_string\u0027].get(\u0027name\u0027))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        self.assert_admin(context)"},{"line_number":48,"context_line":"        tenant_refs \u003d self.resource_api.list_projects_in_domain("},{"line_number":49,"context_line":"            CONF.identity.default_domain_id)"},{"line_number":50,"context_line":"        for tenant_ref in tenant_refs:"},{"line_number":51,"context_line":"            tenant_ref \u003d self.v3_to_v2_project(tenant_ref)"}],"source_content_type":"text/x-python","patch_set":66,"id":"3a50d1a3_d0f7ecf3","line":48,"in_reply_to":"9a41bdd9_9daa8984","updated":"2015-07-19 04:04:42.000000000","message":"Done","commit_id":"94c21bb56c1c4372d9fd7e39c73a582566ded6eb"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"54cebc9a96573c01cef5c2b45d90f742392be443","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            self._normalize_domain_id(context, tenant_ref))"},{"line_number":90,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(tenant)}"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @controller.v2_deprecated"},{"line_number":93,"context_line":"    def update_project(self, context, tenant_id, tenant):"},{"line_number":94,"context_line":"        self.assert_admin(context)"},{"line_number":95,"context_line":"        # Remove domain_id if specified - a v2 api caller should not"}],"source_content_type":"text/x-python","patch_set":66,"id":"9a41bdd9_ddd25134","line":92,"updated":"2015-07-18 00:07:21.000000000","message":"Although a corner case - you shouldn\u0027t able to update an is_domain project via the v2 API...i.e. if you get the tenant_id via the v3 API and then issued a v2 call to update it, that should fail.","commit_id":"94c21bb56c1c4372d9fd7e39c73a582566ded6eb"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"026ed4700a91dff11d7f8575e742f55a53c07592","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            self._normalize_domain_id(context, tenant_ref))"},{"line_number":90,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(tenant)}"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @controller.v2_deprecated"},{"line_number":93,"context_line":"    def update_project(self, context, tenant_id, tenant):"},{"line_number":94,"context_line":"        self.assert_admin(context)"},{"line_number":95,"context_line":"        # Remove domain_id if specified - a v2 api caller should not"}],"source_content_type":"text/x-python","patch_set":66,"id":"3a50d1a3_30e73042","line":92,"in_reply_to":"9a41bdd9_ddd25134","updated":"2015-07-19 04:04:42.000000000","message":"Done","commit_id":"94c21bb56c1c4372d9fd7e39c73a582566ded6eb"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"54cebc9a96573c01cef5c2b45d90f742392be443","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            tenant_id, clean_tenant)"},{"line_number":102,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(tenant_ref)}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    @controller.v2_deprecated"},{"line_number":105,"context_line":"    def delete_project(self, context, tenant_id):"},{"line_number":106,"context_line":"        self.assert_admin(context)"},{"line_number":107,"context_line":"        self.resource_api.delete_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":66,"id":"9a41bdd9_fdd5d51a","line":104,"updated":"2015-07-18 00:07:21.000000000","message":"same here.","commit_id":"94c21bb56c1c4372d9fd7e39c73a582566ded6eb"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"026ed4700a91dff11d7f8575e742f55a53c07592","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            tenant_id, clean_tenant)"},{"line_number":102,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(tenant_ref)}"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    @controller.v2_deprecated"},{"line_number":105,"context_line":"    def delete_project(self, context, tenant_id):"},{"line_number":106,"context_line":"        self.assert_admin(context)"},{"line_number":107,"context_line":"        self.resource_api.delete_project(tenant_id)"}],"source_content_type":"text/x-python","patch_set":66,"id":"3a50d1a3_f0cf88b1","line":104,"in_reply_to":"9a41bdd9_fdd5d51a","updated":"2015-07-19 04:04:42.000000000","message":"Done","commit_id":"94c21bb56c1c4372d9fd7e39c73a582566ded6eb"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ed65758f532f2753d4e5232d2c1fde1221e8416f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        tenant_refs \u003d self.resource_api.list_projects_in_domain("},{"line_number":49,"context_line":"            CONF.identity.default_domain_id)"},{"line_number":50,"context_line":"        for tenant_ref in tenant_refs:"},{"line_number":51,"context_line":"            if not tenant_ref.get(\u0027is_domain\u0027):"},{"line_number":52,"context_line":"                tenant_ref \u003d self.v3_to_v2_project(tenant_ref)"},{"line_number":53,"context_line":"        params \u003d {"},{"line_number":54,"context_line":"            \u0027limit\u0027: context[\u0027query_string\u0027].get(\u0027limit\u0027),"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_9de5d8a9","line":51,"updated":"2015-07-20 14:52:43.000000000","message":"does this do the right thing?  Won\u0027t it leave is_domain projects in v3 format in the list?","commit_id":"400c3a4c86d16e6c4584550a511c755a9827e5d4"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"d5203c32e027ab2cb3c0fdd7cc171813fb441966","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        tenant_refs \u003d self.resource_api.list_projects_in_domain("},{"line_number":49,"context_line":"            CONF.identity.default_domain_id)"},{"line_number":50,"context_line":"        for tenant_ref in tenant_refs:"},{"line_number":51,"context_line":"            if not tenant_ref.get(\u0027is_domain\u0027):"},{"line_number":52,"context_line":"                tenant_ref \u003d self.v3_to_v2_project(tenant_ref)"},{"line_number":53,"context_line":"        params \u003d {"},{"line_number":54,"context_line":"            \u0027limit\u0027: context[\u0027query_string\u0027].get(\u0027limit\u0027),"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_cdd5e043","line":51,"in_reply_to":"3a50d1a3_9de5d8a9","updated":"2015-07-20 20:01:26.000000000","message":"Done","commit_id":"400c3a4c86d16e6c4584550a511c755a9827e5d4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ed65758f532f2753d4e5232d2c1fde1221e8416f","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":120,"context_line":"            raise exception.ProjectNotFound(tenant_id)"},{"line_number":121,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":122,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":123,"context_line":"            raise exception.ProjectNotFound(tenant_id)"},{"line_number":124,"context_line":"        self.resource_api.delete_project(tenant_id)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_9d4e38c0","line":122,"updated":"2015-07-20 14:52:43.000000000","message":"copy \u0026 paste error?","commit_id":"400c3a4c86d16e6c4584550a511c755a9827e5d4"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"d5203c32e027ab2cb3c0fdd7cc171813fb441966","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":120,"context_line":"            raise exception.ProjectNotFound(tenant_id)"},{"line_number":121,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":122,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":123,"context_line":"            raise exception.ProjectNotFound(tenant_id)"},{"line_number":124,"context_line":"        self.resource_api.delete_project(tenant_id)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_ede77c3e","line":122,"in_reply_to":"3a50d1a3_9d4e38c0","updated":"2015-07-20 20:01:26.000000000","message":"Done","commit_id":"400c3a4c86d16e6c4584550a511c755a9827e5d4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d2a7740e296eecf4ff9311221e26610e418bf6a2","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":121,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":122,"context_line":"            raise exception.ProjectNotFound(tenant_id)"},{"line_number":123,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":124,"context_line":"        self.resource_api.delete_project(tenant_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_df798683","line":123,"updated":"2015-07-22 19:38:46.000000000","message":"do we need to re-read the project again?","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"9aea3cbc941394f444f7a906cf31826d8bad68a1","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":121,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":122,"context_line":"            raise exception.ProjectNotFound(tenant_id)"},{"line_number":123,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":124,"context_line":"        self.resource_api.delete_project(tenant_id)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_02ea35ac","line":123,"in_reply_to":"3a50d1a3_df798683","updated":"2015-07-22 20:24:31.000000000","message":"Done","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"05bbe4b0ea2d91be384b0a48a77a0e4784f7645b","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assert_admin(context)"},{"line_number":65,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":66,"context_line":"        # Checking whether the project has the is_domain property set True. If"},{"line_number":67,"context_line":"        # so, it cannot be shown in v2"},{"line_number":68,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":69,"context_line":"            raise exception.ProjectNotFound(tenant_id)"},{"line_number":70,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(ref)}"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_706406b8","line":67,"updated":"2015-07-23 08:42:21.000000000","message":"(opionion): I personally prefer to use a comment to provide a rationale for the code.  E.g. I would prefer we say:\n\n\"Projects acting as a domain should not be visible via v2\", as opposed to the comments effectively repeating he wording of the test we are about to make (i.e. is_domain is True\").\n\nAlthough in this case the difference is rather trivial, it makes for better understanding of code","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8671ba05d61f0f0fb0907af52d70fc0d63e04a90","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        self.assert_admin(context)"},{"line_number":65,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":66,"context_line":"        # Checking whether the project has the is_domain property set True. If"},{"line_number":67,"context_line":"        # so, it cannot be shown in v2"},{"line_number":68,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":69,"context_line":"            raise exception.ProjectNotFound(tenant_id)"},{"line_number":70,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(ref)}"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_6fbe56af","line":67,"in_reply_to":"3a50d1a3_706406b8","updated":"2015-07-23 14:05:01.000000000","message":"Done","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"05bbe4b0ea2d91be384b0a48a77a0e4784f7645b","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def get_project_by_name(self, context, tenant_name):"},{"line_number":74,"context_line":"        self.assert_admin(context)"},{"line_number":75,"context_line":"        # In Identity API v2.0, every project has the is_domain flag"},{"line_number":76,"context_line":"        # set to False"},{"line_number":77,"context_line":"        ref \u003d self.resource_api.get_project_by_name("},{"line_number":78,"context_line":"            tenant_name, CONF.identity.default_domain_id, False)"},{"line_number":79,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(ref)}"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_d06b9ab5","line":76,"updated":"2015-07-23 08:42:21.000000000","message":"perhaps more precisely, the wording is: In \"Projects acting as a domain should not be visible via v2\"","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8671ba05d61f0f0fb0907af52d70fc0d63e04a90","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def get_project_by_name(self, context, tenant_name):"},{"line_number":74,"context_line":"        self.assert_admin(context)"},{"line_number":75,"context_line":"        # In Identity API v2.0, every project has the is_domain flag"},{"line_number":76,"context_line":"        # set to False"},{"line_number":77,"context_line":"        ref \u003d self.resource_api.get_project_by_name("},{"line_number":78,"context_line":"            tenant_name, CONF.identity.default_domain_id, False)"},{"line_number":79,"context_line":"        return {\u0027tenant\u0027: self.v3_to_v2_project(ref)}"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_0fe0f2cb","line":76,"in_reply_to":"3a50d1a3_d06b9ab5","updated":"2015-07-23 14:05:01.000000000","message":"Done","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"05bbe4b0ea2d91be384b0a48a77a0e4784f7645b","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        clean_tenant.pop(\u0027domain_id\u0027, None)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # Checking whether the project has the is_domain property set True. If"},{"line_number":106,"context_line":"        # so, it cannot be updated from v2"},{"line_number":107,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":108,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":109,"context_line":"            raise exception.ProjectNotFound(tenant_id)"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_90751233","line":106,"updated":"2015-07-23 08:42:21.000000000","message":"ditto","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8671ba05d61f0f0fb0907af52d70fc0d63e04a90","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        clean_tenant.pop(\u0027domain_id\u0027, None)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # Checking whether the project has the is_domain property set True. If"},{"line_number":106,"context_line":"        # so, it cannot be updated from v2"},{"line_number":107,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":108,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":109,"context_line":"            raise exception.ProjectNotFound(tenant_id)"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_6fec16bb","line":106,"in_reply_to":"3a50d1a3_90751233","updated":"2015-07-23 14:05:01.000000000","message":"Done","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"05bbe4b0ea2d91be384b0a48a77a0e4784f7645b","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def delete_project(self, context, tenant_id):"},{"line_number":117,"context_line":"        self.assert_admin(context)"},{"line_number":118,"context_line":"        # Checking whether the project has the is_domain property set True. If"},{"line_number":119,"context_line":"        # so, it cannot be deleted from v2"},{"line_number":120,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":121,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":122,"context_line":"            raise exception.ProjectNotFound(tenant_id)"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_50922a4d","line":119,"updated":"2015-07-23 08:42:21.000000000","message":"ditto","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8671ba05d61f0f0fb0907af52d70fc0d63e04a90","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    def delete_project(self, context, tenant_id):"},{"line_number":117,"context_line":"        self.assert_admin(context)"},{"line_number":118,"context_line":"        # Checking whether the project has the is_domain property set True. If"},{"line_number":119,"context_line":"        # so, it cannot be deleted from v2"},{"line_number":120,"context_line":"        ref \u003d self.resource_api.get_project(tenant_id)"},{"line_number":121,"context_line":"        if ref.get(\u0027is_domain\u0027):"},{"line_number":122,"context_line":"            raise exception.ProjectNotFound(tenant_id)"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_2f312e5a","line":119,"in_reply_to":"3a50d1a3_50922a4d","updated":"2015-07-23 14:05:01.000000000","message":"Done","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"}],"keystone/resource/core.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"f7abb19802124686c559665583b64631e599eefe","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # The whole hierarchy must be enabled"},{"line_number":129,"context_line":"        if parent_id:"},{"line_number":130,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"},{"line_number":131,"context_line":"            parents_list.append(parent_ref)"},{"line_number":132,"context_line":"            for ref in parents_list:"},{"line_number":133,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_7025815b","line":130,"updated":"2015-03-10 16:25:16.000000000","message":"Line 121 assumes that parent_ref can be None, so this will cause TypeError.","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"568f863c8f309f94bd4e544cab574b65e2b1ae26","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # The whole hierarchy must be enabled"},{"line_number":129,"context_line":"        if parent_id:"},{"line_number":130,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"},{"line_number":131,"context_line":"            parents_list.append(parent_ref)"},{"line_number":132,"context_line":"            for ref in parents_list:"},{"line_number":133,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_66822bca","line":130,"in_reply_to":"9a80dd14_4651a70d","updated":"2015-03-10 17:01:07.000000000","message":"yeah, seems like a problem during the rebase, will undo the change","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c96cae0ccef2d4e2376ed9d99e7f1f63654f3497","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # The whole hierarchy must be enabled"},{"line_number":129,"context_line":"        if parent_id:"},{"line_number":130,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"},{"line_number":131,"context_line":"            parents_list.append(parent_ref)"},{"line_number":132,"context_line":"            for ref in parents_list:"},{"line_number":133,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_935cbfef","line":130,"in_reply_to":"9a80dd14_7025815b","updated":"2015-03-10 16:37:10.000000000","message":"no... this can only be None if parent_id is also None so it wouldn\u0027t enter the conditional branch.\n\nDo you see any other case here?","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e499efd90b9377d23af66c3b558943725c831130","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        # The whole hierarchy must be enabled"},{"line_number":129,"context_line":"        if parent_id:"},{"line_number":130,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"},{"line_number":131,"context_line":"            parents_list.append(parent_ref)"},{"line_number":132,"context_line":"            for ref in parents_list:"},{"line_number":133,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_4651a70d","line":130,"in_reply_to":"9a80dd14_935cbfef","updated":"2015-03-10 16:48:13.000000000","message":"you are right, there is no other case.\n\nAnyway, I don\u0027t see a reason for this change in this patch. Maybe is should be reverted?\n\nNot a show stopper anyway.","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"388a17e8a49821b16641ef21125993e396dfa86d","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        for ref in project_refs:"},{"line_number":110,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":111,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"},{"line_number":112,"context_line":"                        \u0027Domain names are unique.\u0027) % project[\u0027name\u0027]"},{"line_number":113,"context_line":"                raise exception.Conflict(type\u003d\u0027project\u0027,"},{"line_number":114,"context_line":"                                         details\u003dmsg)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"baa041b7_5114faf3","line":112,"updated":"2015-04-02 10:48:16.000000000","message":"Perhaps s/names are/names need to be/","commit_id":"40bc456fa7dc05b877c2a2320202c6a99d843c2a"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"8cbd7831cd7a4933306be97ce0fbbc34f48a4ed1","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        for ref in project_refs:"},{"line_number":110,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":111,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"},{"line_number":112,"context_line":"                        \u0027Domain names are unique.\u0027) % project[\u0027name\u0027]"},{"line_number":113,"context_line":"                raise exception.Conflict(type\u003d\u0027project\u0027,"},{"line_number":114,"context_line":"                                         details\u003dmsg)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"baa041b7_b748d35c","line":112,"in_reply_to":"baa041b7_5114faf3","updated":"2015-04-02 13:11:31.000000000","message":"Done","commit_id":"40bc456fa7dc05b877c2a2320202c6a99d843c2a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d262285872208ebb329b21ac5ca2591f13666805","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        for ref in project_refs:"},{"line_number":110,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":111,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"},{"line_number":112,"context_line":"                        \u0027Domain names are unique.\u0027) % project[\u0027name\u0027]"},{"line_number":113,"context_line":"                raise exception.Conflict(type\u003d\u0027project\u0027,"},{"line_number":114,"context_line":"                                         details\u003dmsg)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"baa041b7_95581dfc","line":112,"updated":"2015-04-02 17:34:34.000000000","message":"I don\u0027t think the change mentioned in comments on the previous patch has been made....","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"244ff072456bc94b0f75570ced350f08aaf2fe85","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        for ref in project_refs:"},{"line_number":110,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":111,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"},{"line_number":112,"context_line":"                        \u0027Domain names are unique.\u0027) % project[\u0027name\u0027]"},{"line_number":113,"context_line":"                raise exception.Conflict(type\u003d\u0027project\u0027,"},{"line_number":114,"context_line":"                                         details\u003dmsg)"},{"line_number":115,"context_line":""}],"source_content_type":"text/x-python","patch_set":33,"id":"9aa53dc9_d7d132fd","line":112,"in_reply_to":"baa041b7_95581dfc","updated":"2015-04-06 19:42:14.000000000","message":"Sorry, I\u0027ll update in the next patch.","commit_id":"5368cfd3dba4c80898a9e7e48bdbf7947c398fd3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a0c75abbfc5727aeeaa2e89667a13c7b147410c9","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                action\u003d_(\u0027cannot create a project within a \u0027"},{"line_number":104,"context_line":"                         \u0027different domain than its parent.\u0027))"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _assert_project_name_constraint(self, project):"},{"line_number":107,"context_line":"        project_refs \u003d self.list_projects()"},{"line_number":108,"context_line":"        for ref in project_refs:"},{"line_number":109,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_672bbd83","line":106,"updated":"2015-04-17 17:35:48.000000000","message":"These is a possibility of a race condition here. What would happen is we did create two projects with the same name?","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":15359,"name":"Erickson Filipe Guedes dos Santos","email":"erickson@lsd.ufcg.edu.br","username":"ericksonfilipe"},"change_message_id":"b3463d83d2e927ca17e6afd52e464020a894f3ce","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                action\u003d_(\u0027cannot create a project within a \u0027"},{"line_number":104,"context_line":"                         \u0027different domain than its parent.\u0027))"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _assert_project_name_constraint(self, project):"},{"line_number":107,"context_line":"        project_refs \u003d self.list_projects()"},{"line_number":108,"context_line":"        for ref in project_refs:"},{"line_number":109,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"}],"source_content_type":"text/x-python","patch_set":41,"id":"7ad32947_b1afe7e2","line":106,"in_reply_to":"3ab451fb_672bbd83","updated":"2015-04-27 17:41:04.000000000","message":"Actually, this method is not necessary at all, because the constraint is already doing it.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"a2e556b10761bb3c58a033c26da79fe616e1f661","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                         \u0027different domain than its parent.\u0027))"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _assert_project_name_constraint(self, project):"},{"line_number":107,"context_line":"        project_refs \u003d self.list_projects()"},{"line_number":108,"context_line":"        for ref in project_refs:"},{"line_number":109,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":110,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_f1ce6359","line":107,"updated":"2015-04-17 20:16:35.000000000","message":"Seems like this whole check is only required for ref[\u0027is_domain\u0027], you\u0027re fetching unnecessarily here.\n\nIf the project is not a Domain you can skip the whole check","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"a2e556b10761bb3c58a033c26da79fe616e1f661","unresolved":false,"context_lines":[{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _assert_project_name_constraint(self, project):"},{"line_number":107,"context_line":"        project_refs \u003d self.list_projects()"},{"line_number":108,"context_line":"        for ref in project_refs:"},{"line_number":109,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":110,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"},{"line_number":111,"context_line":"                        \u0027Domain names are unique.\u0027) % project[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_71949336","line":108,"updated":"2015-04-17 20:16:35.000000000","message":"This check is terribly slow since you are fetching all project and comparing to all of them.\n\nTry to leverage the backend filtering for this check.\n\n\n1. Use list_domains, and only compare the name from there\nOR \n2. Get projects by name and see if there any of this projects exists in the same domain.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"a2e556b10761bb3c58a033c26da79fe616e1f661","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        project_refs \u003d self.list_projects()"},{"line_number":108,"context_line":"        for ref in project_refs:"},{"line_number":109,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":110,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"},{"line_number":111,"context_line":"                        \u0027Domain names are unique.\u0027) % project[\u0027name\u0027]"},{"line_number":112,"context_line":"                raise exception.Conflict(type\u003d\u0027project\u0027,"},{"line_number":113,"context_line":"                                         details\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_b1521bdc","line":110,"updated":"2015-04-17 20:16:35.000000000","message":"Using \"is_domain project\"  in this message is not user friendly.  Would like something less technical name for this.\n\nWould something like \"Domain name already exists.\" suffice?","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a0c75abbfc5727aeeaa2e89667a13c7b147410c9","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":110,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"},{"line_number":111,"context_line":"                        \u0027Domain names are unique.\u0027) % project[\u0027name\u0027]"},{"line_number":112,"context_line":"                raise exception.Conflict(type\u003d\u0027project\u0027,"},{"line_number":113,"context_line":"                                         details\u003dmsg)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _enforce_project_hierarchy_constraints(self, project_ref):"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_47f3210b","line":112,"updated":"2015-04-17 17:35:48.000000000","message":"I don\u0027t think this is the right error code. To me it\u0027s a ValidationError and no different than the validation error you would get when the DB enforces uniqueness. A forbidden is usually used when controlling access to a single resource that may have change while a user was performing an operation on it.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"45db1e62dc05fefa0088a6af6f9c4acd41dc2bfb","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            if ref[\u0027is_domain\u0027] and project[\u0027name\u0027] \u003d\u003d ref[\u0027name\u0027]:"},{"line_number":110,"context_line":"                msg \u003d _(\u0027Cannot create is_domain project with name %s. \u0027"},{"line_number":111,"context_line":"                        \u0027Domain names are unique.\u0027) % project[\u0027name\u0027]"},{"line_number":112,"context_line":"                raise exception.Conflict(type\u003d\u0027project\u0027,"},{"line_number":113,"context_line":"                                         details\u003dmsg)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def _enforce_project_hierarchy_constraints(self, project_ref):"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_fd687cbc","line":112,"in_reply_to":"3ab451fb_47f3210b","updated":"2015-04-17 19:34:20.000000000","message":"++. i\u0027ll change this for a ValidationError","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fdfc2ce5d6039d5737e270aafad1040857842136","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        # The whole hierarchy must be enabled"},{"line_number":119,"context_line":"        if parent_id:"},{"line_number":120,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"},{"line_number":121,"context_line":"            parents_list.append(parent_ref)"},{"line_number":122,"context_line":"            for ref in parents_list:"},{"line_number":123,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":50,"id":"3acd31a7_55aebb81","line":120,"updated":"2015-05-05 08:16:44.000000000","message":"is this a related change?","commit_id":"08a9ee69ccc7c65f9324c94fa4d5347b163ee441"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ffb07d9ec4d854aa21243f6344888463b16c5678","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        # The whole hierarchy must be enabled"},{"line_number":119,"context_line":"        if parent_id:"},{"line_number":120,"context_line":"            parents_list \u003d self.list_project_parents(parent_ref[\u0027id\u0027])"},{"line_number":121,"context_line":"            parents_list.append(parent_ref)"},{"line_number":122,"context_line":"            for ref in parents_list:"},{"line_number":123,"context_line":"                if not ref.get(\u0027enabled\u0027, True):"}],"source_content_type":"text/x-python","patch_set":50,"id":"3acd31a7_0bca5f4e","line":120,"in_reply_to":"3acd31a7_55aebb81","updated":"2015-05-05 12:38:32.000000000","message":"Not with this patch... I think that this code was merge in the rebase... I take a look on that.","commit_id":"08a9ee69ccc7c65f9324c94fa4d5347b163ee441"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fdfc2ce5d6039d5737e270aafad1040857842136","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        return self.driver.get_project(project_id)"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    @MEMOIZE"},{"line_number":563,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain\u003dNone):"},{"line_number":564,"context_line":"        return self.driver.get_project_by_name(tenant_name,"},{"line_number":565,"context_line":"                                               domain_id,"},{"line_number":566,"context_line":"                                               is_domain)"}],"source_content_type":"text/x-python","patch_set":50,"id":"3acd31a7_f5af0728","line":563,"updated":"2015-05-05 08:16:44.000000000","message":"we should modify the unit tests so that we test this extra parameter...","commit_id":"08a9ee69ccc7c65f9324c94fa4d5347b163ee441"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ffb07d9ec4d854aa21243f6344888463b16c5678","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        return self.driver.get_project(project_id)"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    @MEMOIZE"},{"line_number":563,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain\u003dNone):"},{"line_number":564,"context_line":"        return self.driver.get_project_by_name(tenant_name,"},{"line_number":565,"context_line":"                                               domain_id,"},{"line_number":566,"context_line":"                                               is_domain)"}],"source_content_type":"text/x-python","patch_set":50,"id":"3acd31a7_505da277","line":563,"in_reply_to":"3acd31a7_f5af0728","updated":"2015-05-05 12:38:32.000000000","message":"Ok, I will do that.","commit_id":"08a9ee69ccc7c65f9324c94fa4d5347b163ee441"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fdfc2ce5d6039d5737e270aafad1040857842136","unresolved":false,"context_lines":[{"line_number":580,"context_line":"    def _get_list_limit(self):"},{"line_number":581,"context_line":"        return CONF.resource.list_limit or CONF.list_limit"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    @abc.abstractmethod"},{"line_number":584,"context_line":"    def get_project_by_name(self, tenant_name, domain_id):"},{"line_number":585,"context_line":"        \"\"\"Get a tenant by name."},{"line_number":586,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"3acd31a7_95f0d368","line":583,"updated":"2015-05-05 08:16:44.000000000","message":"This needs to be updated...","commit_id":"08a9ee69ccc7c65f9324c94fa4d5347b163ee441"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ffb07d9ec4d854aa21243f6344888463b16c5678","unresolved":false,"context_lines":[{"line_number":580,"context_line":"    def _get_list_limit(self):"},{"line_number":581,"context_line":"        return CONF.resource.list_limit or CONF.list_limit"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    @abc.abstractmethod"},{"line_number":584,"context_line":"    def get_project_by_name(self, tenant_name, domain_id):"},{"line_number":585,"context_line":"        \"\"\"Get a tenant by name."},{"line_number":586,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"3acd31a7_5047e276","line":583,"in_reply_to":"3acd31a7_95f0d368","updated":"2015-05-05 12:38:32.000000000","message":"Done","commit_id":"08a9ee69ccc7c65f9324c94fa4d5347b163ee441"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"33cfd25886fb643df39f056142cc26c85665a233","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        return self.driver.get_project(project_id)"},{"line_number":561,"context_line":""},{"line_number":562,"context_line":"    @MEMOIZE"},{"line_number":563,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain\u003dNone):"},{"line_number":564,"context_line":"        # If the user does not specify the is_domain attribute, we set the"},{"line_number":565,"context_line":"        # default value to false."},{"line_number":566,"context_line":"        if is_domain is None:"}],"source_content_type":"text/x-python","patch_set":51,"id":"9a0c5dc1_1efd6b3a","line":563,"updated":"2015-05-12 23:40:25.000000000","message":"This cannot be a KWARG with @MEMOIZE.\n\nDue to the way decorators see arguments and how python handles default args, you cannot memoize with default arguments (or pass as KWARGS).\n\nThis is because if \"is_domain\" is not passed directly on the call, the variable is just applied to locals() and is never seen by the memoizer. This results in a case where the cached value is hard to determine (and/or may be stale depending on cache stores).\n\nThe second issue is that kwargs can be in any order, and the arg processing for the key-generator needs to be consistent, in dogpile parlance: get_project_by_name(self, tenant_name\u003d\u0027foo\u0027, domain_id\u003d\u0027foo\u0027, is_domain\u003dTrue) and get_project_by_name(self, domain_id\u003d\u0027foo\u0027, is_domain\u003dTrue, tenant_name\u003d\u0027foo\u0027) are different cache keys, making invalidation near impossible. In python, those two method calls are the same thing.\n\nThere are approaches to solve this, but stack inspection, argspec inspection, etc can end up becoming expensive and prone to errors if done incorrectly.  It is much easier/safer to just memoize with positional args only.","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"56cfa9d7c28d26f01f72043e1f98f80330493c9a","unresolved":false,"context_lines":[{"line_number":564,"context_line":"        # If the user does not specify the is_domain attribute, we set the"},{"line_number":565,"context_line":"        # default value to false."},{"line_number":566,"context_line":"        if is_domain is None:"},{"line_number":567,"context_line":"            is_domain \u003d False"},{"line_number":568,"context_line":"        return self.driver.get_project_by_name(tenant_name,"},{"line_number":569,"context_line":"                                               domain_id,"},{"line_number":570,"context_line":"                                               is_domain)"}],"source_content_type":"text/x-python","patch_set":51,"id":"1aca2d91_9a093be0","line":567,"updated":"2015-05-08 13:03:52.000000000","message":"Do we need this if we default the value of is_domain to False? Or is that a bad idea?","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"be725fce0cfaeea044ebf8fffeafbece4a95e992","unresolved":false,"context_lines":[{"line_number":564,"context_line":"        # If the user does not specify the is_domain attribute, we set the"},{"line_number":565,"context_line":"        # default value to false."},{"line_number":566,"context_line":"        if is_domain is None:"},{"line_number":567,"context_line":"            is_domain \u003d False"},{"line_number":568,"context_line":"        return self.driver.get_project_by_name(tenant_name,"},{"line_number":569,"context_line":"                                               domain_id,"},{"line_number":570,"context_line":"                                               is_domain)"}],"source_content_type":"text/x-python","patch_set":51,"id":"9a0c5dc1_18b47af0","line":567,"in_reply_to":"1aca2d91_9a093be0","updated":"2015-05-12 14:21:52.000000000","message":"Turns out this makes get_project_by_name() blow up: \n\nhttp://cdn.pasteraw.com/d09b8ohopempuoquehcd5on9b29zzm4\n\nThis has been raised with the dogpile community [0].\n\n[0] https://bitbucket.org/zzzeek/dogpile.cache/issue/24/cache-invalidation-for-class-or-instance","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1bf7aa35812f9c02f0ceb8a887486bffd2db3ca1","unresolved":false,"context_lines":[{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain\u003dFalse):"},{"line_number":578,"context_line":"        # If the user does not specify the is_domain attribute, we set the"},{"line_number":579,"context_line":"        # default value to false."},{"line_number":580,"context_line":"        if is_domain is None:"},{"line_number":581,"context_line":"            is_domain \u003d False"},{"line_number":582,"context_line":"        return self._get_project_by_name(tenant_name, domain_id, is_domain)"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_e9ede3b7","line":579,"updated":"2015-06-09 15:31:08.000000000","message":"I think this comment is a bit confusing...since if the caller doesn\u0027t specify is_domain, then it will default to False.  I think the point you are making is that if the caller explicitly passes None in, then we want to override it to False.\n\nI wonder if it would be better to do the \"None check\" in the controller?  Open to either way.","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ec601befb07531fd7b6a512da390db148e6dc72b","unresolved":false,"context_lines":[{"line_number":576,"context_line":""},{"line_number":577,"context_line":"    def get_project_by_name(self, tenant_name, domain_id, is_domain\u003dFalse):"},{"line_number":578,"context_line":"        # If the user does not specify the is_domain attribute, we set the"},{"line_number":579,"context_line":"        # default value to false."},{"line_number":580,"context_line":"        if is_domain is None:"},{"line_number":581,"context_line":"            is_domain \u003d False"},{"line_number":582,"context_line":"        return self._get_project_by_name(tenant_name, domain_id, is_domain)"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_57ea41dc","line":579,"in_reply_to":"3afb71cf_e9ede3b7","updated":"2015-06-09 17:22:20.000000000","message":"I agree, I\u0027ll rewrite the comment.\n\nthe \"none check\", need to be here, since this method is called here: https://review.openstack.org/#/c/158372/54/keystone/auth/controllers.py \n\nDo you see a better implementation for this case?","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b56616204ad8406429b0c9bad4515c065e779268","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                tenant_to_check[\u0027name\u0027] \u003d tenant[\u0027name\u0027]"},{"line_number":283,"context_line":"            if \u0027domain_id\u0027 in tenant:"},{"line_number":284,"context_line":"                tenant_to_check[\u0027domain_id\u0027] \u003d tenant[\u0027domain_id\u0027]"},{"line_number":285,"context_line":"            self._enforce_project_name_constraint(tenant_to_check)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":288,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_e072337c","line":285,"updated":"2015-07-20 15:01:12.000000000","message":"What happens if someone updates the domain_id (assuming the CONF domain_id_immutable options is False)....won\u0027t that mean that we need change the parent_id?  Which would mean you are effectively \"moving\" a project in the hierarchy....which I\u0027m not sure we want to support.  I\u0027d suggest that if hierarchy is enabled then we make domain_id immutable.","commit_id":"400c3a4c86d16e6c4584550a511c755a9827e5d4"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"d5203c32e027ab2cb3c0fdd7cc171813fb441966","unresolved":false,"context_lines":[{"line_number":282,"context_line":"                tenant_to_check[\u0027name\u0027] \u003d tenant[\u0027name\u0027]"},{"line_number":283,"context_line":"            if \u0027domain_id\u0027 in tenant:"},{"line_number":284,"context_line":"                tenant_to_check[\u0027domain_id\u0027] \u003d tenant[\u0027domain_id\u0027]"},{"line_number":285,"context_line":"            self._enforce_project_name_constraint(tenant_to_check)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":288,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"}],"source_content_type":"text/x-python","patch_set":70,"id":"3a50d1a3_cd63a0b0","line":285,"in_reply_to":"3a50d1a3_e072337c","updated":"2015-07-20 20:01:26.000000000","message":"that\u0027s true. I\u0027ll do that","commit_id":"400c3a4c86d16e6c4584550a511c755a9827e5d4"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"d2a7740e296eecf4ff9311221e26610e418bf6a2","unresolved":false,"context_lines":[{"line_number":1484,"context_line":"        or a specific option. The driver is silent if there are no options"},{"line_number":1485,"context_line":"        to delete."},{"line_number":1486,"context_line":""},{"line_number":1487,"context_line":"        or a specific option. The driver is silent if there are no options"},{"line_number":1488,"context_line":"        to delete."},{"line_number":1489,"context_line":""},{"line_number":1490,"context_line":"        :param domain_id: the domain for this option"}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_5f749634","line":1487,"updated":"2015-07-22 19:38:46.000000000","message":"is this meant to be joined up with the previous paragraph?","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"9aea3cbc941394f444f7a906cf31826d8bad68a1","unresolved":false,"context_lines":[{"line_number":1484,"context_line":"        or a specific option. The driver is silent if there are no options"},{"line_number":1485,"context_line":"        to delete."},{"line_number":1486,"context_line":""},{"line_number":1487,"context_line":"        or a specific option. The driver is silent if there are no options"},{"line_number":1488,"context_line":"        to delete."},{"line_number":1489,"context_line":""},{"line_number":1490,"context_line":"        :param domain_id: the domain for this option"}],"source_content_type":"text/x-python","patch_set":73,"id":"3a50d1a3_fd59ea35","line":1487,"in_reply_to":"3a50d1a3_5f749634","updated":"2015-07-22 20:24:31.000000000","message":"yes,  it is... removed","commit_id":"4a2a7dc6e305815af329c495a6c7dd70fe9634a9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                   \u0027parent_id\u0027: project_ref[\u0027parent_id\u0027]})"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":107,"context_line":"        # NOTE(htruta): Called when is_domain is false, hence the project"},{"line_number":108,"context_line":"        # must contain a valid parent_id or domain_id. If the parent is an"},{"line_number":109,"context_line":"        # is_domain\u003dfalse project, this project must be in the same domain of"},{"line_number":110,"context_line":"        # its parent. If the parent is an is_domain\u003dtrue project, this"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_8e54d2ca","line":107,"updated":"2015-07-24 09:31:49.000000000","message":"do we check that at least one of these is set?","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                   \u0027parent_id\u0027: project_ref[\u0027parent_id\u0027]})"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def _assert_project_constraints(self, project_ref, parent_ref):"},{"line_number":107,"context_line":"        # NOTE(htruta): Called when is_domain is false, hence the project"},{"line_number":108,"context_line":"        # must contain a valid parent_id or domain_id. If the parent is an"},{"line_number":109,"context_line":"        # is_domain\u003dfalse project, this project must be in the same domain of"},{"line_number":110,"context_line":"        # its parent. If the parent is an is_domain\u003dtrue project, this"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_07f2ca9a","line":107,"in_reply_to":"3a50d1a3_8e54d2ca","updated":"2015-07-27 16:17:59.000000000","message":"the full checking is made in the follow up patch. This check is maintained as it is in the previous patchset: only checking for not is_domain projects","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":130,"context_line":"            raise exception.ValidationError("},{"line_number":131,"context_line":"                message\u003d_(\u0027cannot create an is_domain\u003dfalse project within \u0027"},{"line_number":132,"context_line":"                          \u0027domain %(domain_id)s. Since its parent has the \u0027"},{"line_number":133,"context_line":"                          \u0027is_domain property enabled, the domain_id must \u0027"},{"line_number":134,"context_line":"                          \u0027match its parent_id (%(parent_id)s).\u0027)"},{"line_number":135,"context_line":"                % {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_2e2a5e2d","line":132,"updated":"2015-07-24 09:31:49.000000000","message":"maybe better wording would be \"...Since its parent is acting as a domain...\"","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                parent_ref.get(\u0027domain_id\u0027) !\u003d project_ref[\u0027domain_id\u0027]):"},{"line_number":130,"context_line":"            raise exception.ValidationError("},{"line_number":131,"context_line":"                message\u003d_(\u0027cannot create an is_domain\u003dfalse project within \u0027"},{"line_number":132,"context_line":"                          \u0027domain %(domain_id)s. Since its parent has the \u0027"},{"line_number":133,"context_line":"                          \u0027is_domain property enabled, the domain_id must \u0027"},{"line_number":134,"context_line":"                          \u0027match its parent_id (%(parent_id)s).\u0027)"},{"line_number":135,"context_line":"                % {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_27efc6b1","line":132,"in_reply_to":"3a50d1a3_2e2a5e2d","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # TODO(htruta): Update domain_id checking when \u0027immutable\u0027 property is"},{"line_number":303,"context_line":"        # deprecated. If the \u0027immutable\u0027 property is disabled, the update of"},{"line_number":304,"context_line":"        # domain_id will only be allowed if the project is immediately under"},{"line_number":305,"context_line":"        # the root."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":308,"context_line":"        # a project with this configuration already exists"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_f508c52f","line":305,"updated":"2015-07-24 09:31:49.000000000","message":"...and has no children of its own (i.e. we are just supporting the situation that would have existed before we has is_domain projects)","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # TODO(htruta): Update domain_id checking when \u0027immutable\u0027 property is"},{"line_number":303,"context_line":"        # deprecated. If the \u0027immutable\u0027 property is disabled, the update of"},{"line_number":304,"context_line":"        # domain_id will only be allowed if the project is immediately under"},{"line_number":305,"context_line":"        # the root."},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":308,"context_line":"        # a project with this configuration already exists"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_87825ac7","line":305,"in_reply_to":"3a50d1a3_f508c52f","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":307,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":308,"context_line":"        # a project with this configuration already exists"},{"line_number":309,"context_line":"        if (\u0027name\u0027 in tenant and tenant[\u0027name\u0027] !\u003d original_tenant.get(\u0027name\u0027)"},{"line_number":310,"context_line":"                or \u0027domain\u0027 in tenant and tenant[\u0027domain_id\u0027] !\u003d"},{"line_number":311,"context_line":"                original_tenant.get(\u0027domain_id\u0027)):"},{"line_number":312,"context_line":"            tenant_to_check \u003d original_tenant.copy()"},{"line_number":313,"context_line":"            if tenant[\u0027name\u0027] !\u003d original_tenant.get(\u0027name\u0027):"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_d8406038","line":310,"updated":"2015-07-24 09:31:49.000000000","message":"I think you mean \"domain_id\" not \u0027domain\u0027 ?","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":307,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":308,"context_line":"        # a project with this configuration already exists"},{"line_number":309,"context_line":"        if (\u0027name\u0027 in tenant and tenant[\u0027name\u0027] !\u003d original_tenant.get(\u0027name\u0027)"},{"line_number":310,"context_line":"                or \u0027domain\u0027 in tenant and tenant[\u0027domain_id\u0027] !\u003d"},{"line_number":311,"context_line":"                original_tenant.get(\u0027domain_id\u0027)):"},{"line_number":312,"context_line":"            tenant_to_check \u003d original_tenant.copy()"},{"line_number":313,"context_line":"            if tenant[\u0027name\u0027] !\u003d original_tenant.get(\u0027name\u0027):"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_2774a6fb","line":310,"in_reply_to":"3a50d1a3_d8406038","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            tenant_to_check \u003d original_tenant.copy()"},{"line_number":313,"context_line":"            if tenant[\u0027name\u0027] !\u003d original_tenant.get(\u0027name\u0027):"},{"line_number":314,"context_line":"                tenant_to_check[\u0027name\u0027] \u003d tenant[\u0027name\u0027]"},{"line_number":315,"context_line":"            if (tenant.get(\u0027domain_id\u0027) and tenant[\u0027domain_id\u0027]"},{"line_number":316,"context_line":"                    !\u003d original_tenant.get(\u0027domain_id\u0027)):"},{"line_number":317,"context_line":"                    tenant_to_check[\u0027domain_id\u0027] \u003d tenant[\u0027domain_id\u0027]"},{"line_number":318,"context_line":"            self._enforce_project_name_constraint(tenant_to_check)"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_1857a8cb","line":315,"updated":"2015-07-24 09:31:49.000000000","message":"it\u0027s a bit confusing when we something use tenant.get(\u0027domain_id\u0027) and other times, \u0027domain_id\" in tenant (see check above).....I suggest we stick to one way or the other","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            tenant_to_check \u003d original_tenant.copy()"},{"line_number":313,"context_line":"            if tenant[\u0027name\u0027] !\u003d original_tenant.get(\u0027name\u0027):"},{"line_number":314,"context_line":"                tenant_to_check[\u0027name\u0027] \u003d tenant[\u0027name\u0027]"},{"line_number":315,"context_line":"            if (tenant.get(\u0027domain_id\u0027) and tenant[\u0027domain_id\u0027]"},{"line_number":316,"context_line":"                    !\u003d original_tenant.get(\u0027domain_id\u0027)):"},{"line_number":317,"context_line":"                    tenant_to_check[\u0027domain_id\u0027] \u003d tenant[\u0027domain_id\u0027]"},{"line_number":318,"context_line":"            self._enforce_project_name_constraint(tenant_to_check)"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_27034611","line":315,"in_reply_to":"3a50d1a3_1857a8cb","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":316,"context_line":"                    !\u003d original_tenant.get(\u0027domain_id\u0027)):"},{"line_number":317,"context_line":"                    tenant_to_check[\u0027domain_id\u0027] \u003d tenant[\u0027domain_id\u0027]"},{"line_number":318,"context_line":"            self._enforce_project_name_constraint(tenant_to_check)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":321,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":322,"context_line":""}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_b8c4745f","line":319,"updated":"2015-07-24 09:31:49.000000000","message":"Where do we check that changing the domain_id is only supported for direct children of a domain?","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":316,"context_line":"                    !\u003d original_tenant.get(\u0027domain_id\u0027)):"},{"line_number":317,"context_line":"                    tenant_to_check[\u0027domain_id\u0027] \u003d tenant[\u0027domain_id\u0027]"},{"line_number":318,"context_line":"            self._enforce_project_name_constraint(tenant_to_check)"},{"line_number":319,"context_line":""},{"line_number":320,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":321,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"},{"line_number":322,"context_line":""}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_1931ceec","line":319,"in_reply_to":"3a50d1a3_b8c4745f","updated":"2015-07-27 16:17:59.000000000","message":"this is in a follow up patch, the same that will remove the TODO in line 302","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0493b618d63f4b58b040801c5b654a20f88695ab","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                        message\u003d_(\u0027cannot create an is_domain\u003dfalse project \u0027"},{"line_number":120,"context_line":"                                  \u0027within domain %(domain_id)s, which is a \u0027"},{"line_number":121,"context_line":"                                  \u0027different domain than its parent \u0027"},{"line_number":122,"context_line":"                                  \u0027(%(parent_domain_id)s).\u0027)"},{"line_number":123,"context_line":"                        % {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"},{"line_number":124,"context_line":"                           \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})"},{"line_number":125,"context_line":"            # TODO(rodrigods): If the parent project acts as a domain, the"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_57faeb44","line":122,"updated":"2015-07-30 10:56:22.000000000","message":"This error message still sounds confusing. Here\u0027s an example of what I think it should say:\n\n\"Cannot create project X, since it specifies its owner as domain Y, but specifies a parent in a different domain\"","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2ec925580d978a229a21ca2d9fe43fadf713b035","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                        message\u003d_(\u0027cannot create an is_domain\u003dfalse project \u0027"},{"line_number":120,"context_line":"                                  \u0027within domain %(domain_id)s, which is a \u0027"},{"line_number":121,"context_line":"                                  \u0027different domain than its parent \u0027"},{"line_number":122,"context_line":"                                  \u0027(%(parent_domain_id)s).\u0027)"},{"line_number":123,"context_line":"                        % {\u0027domain_id\u0027: project_ref[\u0027domain_id\u0027],"},{"line_number":124,"context_line":"                           \u0027parent_domain_id\u0027: parent_ref.get(\u0027domain_id\u0027)})"},{"line_number":125,"context_line":"            # TODO(rodrigods): If the parent project acts as a domain, the"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_346e2497","line":122,"in_reply_to":"3a50d1a3_57faeb44","updated":"2015-07-30 14:52:19.000000000","message":"fixed in the previous patch","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3094fdce678acf9d44d781970787ac9e96a5852f","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":94,"context_line":"        hints.add_filter(name\u003d\u0027is_domain\u0027, value\u003dproject_ref[\u0027is_domain\u0027])"},{"line_number":95,"context_line":"        projects \u003d [p for p in self.list_projects(hints)"},{"line_number":96,"context_line":"                    if p.get(\u0027name\u0027) \u003d\u003d project_ref.get(\u0027name\u0027)]"},{"line_number":97,"context_line":"        msg \u003d None"},{"line_number":98,"context_line":"        if project_ref[\u0027is_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_fb338ff4","line":95,"updated":"2015-07-31 17:12:31.000000000","message":"so in general we have said that supporting hints is optional of for a backend driver.  Either we must change that, or you need to provide a specific backend method, e.g. \"list_projects_acting_as_domain()\"","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8f84272899783fe4e687703cdd4c5cfa06a7df4a","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        hints \u003d driver_hints.Hints()"},{"line_number":94,"context_line":"        hints.add_filter(name\u003d\u0027is_domain\u0027, value\u003dproject_ref[\u0027is_domain\u0027])"},{"line_number":95,"context_line":"        projects \u003d [p for p in self.list_projects(hints)"},{"line_number":96,"context_line":"                    if p.get(\u0027name\u0027) \u003d\u003d project_ref.get(\u0027name\u0027)]"},{"line_number":97,"context_line":"        msg \u003d None"},{"line_number":98,"context_line":"        if project_ref[\u0027is_domain\u0027]:"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_0a54d951","line":95,"in_reply_to":"3a50d1a3_fb338ff4","updated":"2015-08-01 00:16:13.000000000","message":"Done","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3094fdce678acf9d44d781970787ac9e96a5852f","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        # TODO(htruta): Update domain_id checking when \u0027immutable\u0027 property is"},{"line_number":296,"context_line":"        # deprecated. If the \u0027immutable\u0027 property is disabled, the update of"},{"line_number":297,"context_line":"        # domain_id will only be allowed if the project is immediately under"},{"line_number":298,"context_line":"        # the root and has no children of its own."},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":301,"context_line":"        # a project with this configuration already exists"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_3b6817ba","line":298,"updated":"2015-07-31 17:12:31.000000000","message":"is there a bp or defect for this deprecation?  If not, there should be - and we should reference it in this TODO.\n\nAlso, surely this all relates to when we add checking for this...if we are not doing it in this patch, then having this TODO here make no sense.","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8f84272899783fe4e687703cdd4c5cfa06a7df4a","unresolved":false,"context_lines":[{"line_number":295,"context_line":"        # TODO(htruta): Update domain_id checking when \u0027immutable\u0027 property is"},{"line_number":296,"context_line":"        # deprecated. If the \u0027immutable\u0027 property is disabled, the update of"},{"line_number":297,"context_line":"        # domain_id will only be allowed if the project is immediately under"},{"line_number":298,"context_line":"        # the root and has no children of its own."},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":301,"context_line":"        # a project with this configuration already exists"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_2a8435af","line":298,"in_reply_to":"3a50d1a3_3b6817ba","updated":"2015-08-01 00:16:13.000000000","message":"yes, there is a bug for it. the patch that fixes it is already submitted and is depending on the next reseller patch (honor domain operations). I decided to put the warning here, since this is where we specifically treat the changing of domain_id. I\u0027lll refer to the bug in here","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4a811f550a3e0277112e9932dd00761baf79e268","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we can\u0027t"},{"line_number":91,"context_line":"        have two or more projects acting as a domain with the same name."},{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        projects \u003d [p for p in self.list_projects()"},{"line_number":94,"context_line":"                    if p.get(\u0027name\u0027) \u003d\u003d project_ref.get(\u0027name\u0027) and"},{"line_number":95,"context_line":"                    p.get(\u0027is_domain\u0027) \u003d\u003d project_ref[\u0027is_domain\u0027]]"},{"line_number":96,"context_line":"        msg \u003d None"}],"source_content_type":"text/x-python","patch_set":84,"id":"3a50d1a3_840458c6","line":93,"updated":"2015-08-01 08:10:47.000000000","message":"I guess this is a case of be careful for what you wish for :-)\n\nThis could be fairly inefficient for large installations, so we probably do need to provide a specific backend method.  However, I\u0027m Ok with that being in a follow on patch","commit_id":"47810ed09bcbe0f34fad47a22f8ac3907c4ff1c0"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"163e772831764df42a9d9cb9fe30d7bba0d60359","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we can\u0027t"},{"line_number":91,"context_line":"        have two or more projects acting as a domain with the same name."},{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        projects \u003d [p for p in self.list_projects()"},{"line_number":94,"context_line":"                    if p.get(\u0027name\u0027) \u003d\u003d project_ref.get(\u0027name\u0027) and"},{"line_number":95,"context_line":"                    p.get(\u0027is_domain\u0027) \u003d\u003d project_ref[\u0027is_domain\u0027]]"},{"line_number":96,"context_line":"        msg \u003d None"}],"source_content_type":"text/x-python","patch_set":84,"id":"3a50d1a3_1407131e","line":93,"in_reply_to":"3a50d1a3_840458c6","updated":"2015-08-01 16:23:54.000000000","message":"ok. I\u0027ll do that in another patch creating another backend call","commit_id":"47810ed09bcbe0f34fad47a22f8ac3907c4ff1c0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a643e2b1103e678531f5df8c68118c8d84c8998e","unresolved":false,"context_lines":[{"line_number":654,"context_line":"    def list_projects_in_domain(self, domain_id):"},{"line_number":655,"context_line":"        return self.driver.list_projects_in_domain(domain_id)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"    def list_projects_acting_as_domain(self):"},{"line_number":658,"context_line":"        return self.driver.list_projects_acting_as_domain()"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    @MEMOIZE"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_82a465a6","line":657,"updated":"2015-08-04 22:23:47.000000000","message":"is this needed or defined in this patch?","commit_id":"343048c3adfbbaad9c45789eed2fdd793d976b8d"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"86d69f609bff84620c142906d12f47079b339369","unresolved":false,"context_lines":[{"line_number":654,"context_line":"    def list_projects_in_domain(self, domain_id):"},{"line_number":655,"context_line":"        return self.driver.list_projects_in_domain(domain_id)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"    def list_projects_acting_as_domain(self):"},{"line_number":658,"context_line":"        return self.driver.list_projects_acting_as_domain()"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    @MEMOIZE"}],"source_content_type":"text/x-python","patch_set":85,"id":"1a4dcd0f_b8b66e88","line":657,"in_reply_to":"1a4dcd0f_82a465a6","updated":"2015-08-04 23:30:50.000000000","message":"oops, maybe a rebase error. It is only needed in the Honor domain operations patch","commit_id":"343048c3adfbbaad9c45789eed2fdd793d976b8d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ab520fc8cfffcb1d4e639348bdad38d1267a034f","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        # deprecated. If the \u0027immutable\u0027 property is disabled, the update of"},{"line_number":301,"context_line":"        # domain_id will only be allowed if the project is immediately under"},{"line_number":302,"context_line":"        # the root and has no children of its own. See Bug 1479452 for more"},{"line_number":303,"context_line":"        # information."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":306,"context_line":"        # a project with this configuration already exists"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_e0696e8d","line":303,"updated":"2015-08-11 17:58:02.000000000","message":"I\u0027m not clear why we don\u0027t add this check now?  Surely we deprecate mutability, there will be no need for the check.  We need it now where someone *could* set the domain_id to be mutable and then try and change the it....in which we should refuse if it is not a direct descendant or has children.","commit_id":"afb51613d4abc59511900822b972e885dae7d917"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6506f6d4c7b7d445598ad958cd050ab99ef5d24d","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        # deprecated. If the \u0027immutable\u0027 property is disabled, the update of"},{"line_number":301,"context_line":"        # domain_id will only be allowed if the project is immediately under"},{"line_number":302,"context_line":"        # the root and has no children of its own. See Bug 1479452 for more"},{"line_number":303,"context_line":"        # information."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":306,"context_line":"        # a project with this configuration already exists"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_55c25054","line":303,"in_reply_to":"1a4dcd0f_e0696e8d","updated":"2015-08-12 03:22:21.000000000","message":"Henry, this check is done at this patch: https://review.openstack.org/#/c/207218/ I wanted to move it to after the HOnor operations one, because putting it before, we\u0027d have to change it all after the honor was merged.","commit_id":"afb51613d4abc59511900822b972e885dae7d917"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ab520fc8cfffcb1d4e639348bdad38d1267a034f","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # the root and has no children of its own. See Bug 1479452 for more"},{"line_number":303,"context_line":"        # information."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":306,"context_line":"        # a project with this configuration already exists"},{"line_number":307,"context_line":"        update_name \u003d (\u0027name\u0027 in tenant and"},{"line_number":308,"context_line":"                       tenant[\u0027name\u0027] !\u003d original_tenant[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_002fba88","line":305,"updated":"2015-08-11 17:58:02.000000000","message":"nit: s/wheter/whether/","commit_id":"afb51613d4abc59511900822b972e885dae7d917"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1af59adf840458653ca05b678d426568544b0998","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # the root and has no children of its own. See Bug 1479452 for more"},{"line_number":303,"context_line":"        # information."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":306,"context_line":"        # a project with this configuration already exists"},{"line_number":307,"context_line":"        update_name \u003d (\u0027name\u0027 in tenant and"},{"line_number":308,"context_line":"                       tenant[\u0027name\u0027] !\u003d original_tenant[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_b1c09651","line":305,"in_reply_to":"1a4dcd0f_002fba88","updated":"2015-08-12 12:58:17.000000000","message":"Done","commit_id":"afb51613d4abc59511900822b972e885dae7d917"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6506f6d4c7b7d445598ad958cd050ab99ef5d24d","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        # the root and has no children of its own. See Bug 1479452 for more"},{"line_number":303,"context_line":"        # information."},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        # When updating name and/or domain_id, it is necessary to check wheter"},{"line_number":306,"context_line":"        # a project with this configuration already exists"},{"line_number":307,"context_line":"        update_name \u003d (\u0027name\u0027 in tenant and"},{"line_number":308,"context_line":"                       tenant[\u0027name\u0027] !\u003d original_tenant[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_f5a11caa","line":305,"in_reply_to":"1a4dcd0f_002fba88","updated":"2015-08-12 03:22:21.000000000","message":"Done","commit_id":"afb51613d4abc59511900822b972e885dae7d917"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ab520fc8cfffcb1d4e639348bdad38d1267a034f","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        return self.driver.list_projects_in_domain(domain_id)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"    def list_projects_acting_as_domain(self):"},{"line_number":658,"context_line":"        return self.driver.list_projects_acting_as_domain()"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    @MEMOIZE"},{"line_number":661,"context_line":"    def get_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_8028aa34","line":658,"updated":"2015-08-11 17:58:02.000000000","message":"I\u0027m not sure why we need this....there is no backend method for this....","commit_id":"afb51613d4abc59511900822b972e885dae7d917"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"1af59adf840458653ca05b678d426568544b0998","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        return self.driver.list_projects_in_domain(domain_id)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"    def list_projects_acting_as_domain(self):"},{"line_number":658,"context_line":"        return self.driver.list_projects_acting_as_domain()"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    @MEMOIZE"},{"line_number":661,"context_line":"    def get_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_71b68efa","line":658,"in_reply_to":"1a4dcd0f_8028aa34","updated":"2015-08-12 12:58:17.000000000","message":"Done","commit_id":"afb51613d4abc59511900822b972e885dae7d917"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6506f6d4c7b7d445598ad958cd050ab99ef5d24d","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        return self.driver.list_projects_in_domain(domain_id)"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"    def list_projects_acting_as_domain(self):"},{"line_number":658,"context_line":"        return self.driver.list_projects_acting_as_domain()"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    @MEMOIZE"},{"line_number":661,"context_line":"    def get_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":91,"id":"1a4dcd0f_b5fab475","line":658,"in_reply_to":"1a4dcd0f_8028aa34","updated":"2015-08-12 03:22:21.000000000","message":"Done","commit_id":"afb51613d4abc59511900822b972e885dae7d917"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"539efa73ae6a6aa7c9545642b5805ff55948d0ce","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \"\"\"Enforce project name constraint."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        The domain_id is nullable, so this check must be enforced in"},{"line_number":89,"context_line":"        the code, instead of the backend. There can not be two projects with"},{"line_number":90,"context_line":"        the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we can\u0027t"},{"line_number":91,"context_line":"        have two or more projects acting as a domain with the same name."},{"line_number":92,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":96,"id":"fa1b9901_eb03e4b6","line":89,"updated":"2015-08-18 10:24:59.000000000","message":"instead of in the backend driver.","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"497b70142b4bb7a5fb39c53432a45281e3faee79","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \"\"\"Enforce project name constraint."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        The domain_id is nullable, so this check must be enforced in"},{"line_number":89,"context_line":"        the code, instead of the backend. There can not be two projects with"},{"line_number":90,"context_line":"        the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we can\u0027t"},{"line_number":91,"context_line":"        have two or more projects acting as a domain with the same name."},{"line_number":92,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":96,"id":"fa1b9901_c2735ae6","line":89,"in_reply_to":"fa1b9901_eb03e4b6","updated":"2015-08-18 13:52:24.000000000","message":"Done","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5307f986f1fc82673f35c308740135cf6b2658d3","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        the code, instead of the backend. There can not be two projects with"},{"line_number":90,"context_line":"        the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we can\u0027t"},{"line_number":91,"context_line":"        have two or more projects acting as a domain with the same name."},{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        msg \u003d None"},{"line_number":94,"context_line":"        if project_ref[\u0027is_domain\u0027]:"},{"line_number":95,"context_line":"            projects \u003d [p for p in self.list_projects()"}],"source_content_type":"text/x-python","patch_set":96,"id":"fa1b9901_8b8828e9","line":92,"updated":"2015-08-18 10:31:20.000000000","message":"if we follow the suggestion in the previous patch (that adds the is_domain parameter to get_project_by_name()) we can refactor this method to something like:\n\n  domain_id \u003d project_ref[\u0027domain_id\u0027] if project_ref[\u0027is_domain\u0027] else None\n  projects \u003d self.driver.get_project_by_name(project[\u0027name\u0027], domain_id, project[\u0027is_domain\u0027])\n  if any(projects):\n      ...","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"497b70142b4bb7a5fb39c53432a45281e3faee79","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        the code, instead of the backend. There can not be two projects with"},{"line_number":90,"context_line":"        the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we can\u0027t"},{"line_number":91,"context_line":"        have two or more projects acting as a domain with the same name."},{"line_number":92,"context_line":"        \"\"\""},{"line_number":93,"context_line":"        msg \u003d None"},{"line_number":94,"context_line":"        if project_ref[\u0027is_domain\u0027]:"},{"line_number":95,"context_line":"            projects \u003d [p for p in self.list_projects()"}],"source_content_type":"text/x-python","patch_set":96,"id":"fa1b9901_a56990c0","line":92,"in_reply_to":"fa1b9901_8b8828e9","updated":"2015-08-18 13:52:24.000000000","message":"Done","commit_id":"ce8a1c4e48e59d39e55165769c24e3f9cc565e65"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8e9a415f2c05d480dda3a73271b14e42054536e1","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        msg \u003d None"},{"line_number":94,"context_line":"        domain_id \u003d project_ref.get(\u0027domain_id\u0027)"},{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            self.driver.get_project_by_name("},{"line_number":97,"context_line":"                project_ref[\u0027name\u0027], domain_id, project_ref[\u0027is_domain\u0027])"},{"line_number":98,"context_line":"            if project_ref[\u0027is_domain\u0027]:"},{"line_number":99,"context_line":"                msg \u003d _(\u0027cannot create two or more projects \u0027"}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_a28f3bcb","line":96,"updated":"2015-08-18 16:48:55.000000000","message":"I think the comment was useful, since we are calling the driver directly and not using the Manager method.","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4c88686d0dbf0f70ca1439c08947c45b486ce9d5","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        msg \u003d None"},{"line_number":94,"context_line":"        domain_id \u003d project_ref.get(\u0027domain_id\u0027)"},{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            self.driver.get_project_by_name("},{"line_number":97,"context_line":"                project_ref[\u0027name\u0027], domain_id, project_ref[\u0027is_domain\u0027])"},{"line_number":98,"context_line":"            if project_ref[\u0027is_domain\u0027]:"},{"line_number":99,"context_line":"                msg \u003d _(\u0027cannot create two or more projects \u0027"}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_04e93e14","line":96,"in_reply_to":"fa1b9901_a28f3bcb","updated":"2015-08-19 03:42:46.000000000","message":"Done","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"74e805458351f86a70522ca7d6c7d8daae26c8c9","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        \u0027acting as domains with the same \u0027"},{"line_number":103,"context_line":"                        \u0027name: %s\u0027) % project_ref[\u0027name\u0027]"},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                msg \u003d _(\u0027cannot create two or more regular \u0027"},{"line_number":106,"context_line":"                        \u0027projects with the same name (%s) in the \u0027"},{"line_number":107,"context_line":"                        \u0027same domain.\u0027) % project_ref[\u0027name\u0027]"},{"line_number":108,"context_line":"            raise exception.Conflict(type\u003d\u0027project\u0027, details\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":114,"id":"1a26ad4f_ebd8d51f","line":105,"updated":"2015-10-28 07:47:18.000000000","message":"What is a regular project? Also the message is a little confusing for the case when you try to create a project that has the same name as the domain that it is in.","commit_id":"2d38d47abbfbd9b877f77d8f08f0a6a6d113e097"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ad674bb3f226f251566218c0c853e753a5ed72c8","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        \u0027acting as domains with the same \u0027"},{"line_number":103,"context_line":"                        \u0027name: %s\u0027) % project_ref[\u0027name\u0027]"},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                msg \u003d _(\u0027cannot create two or more regular \u0027"},{"line_number":106,"context_line":"                        \u0027projects with the same name (%s) in the \u0027"},{"line_number":107,"context_line":"                        \u0027same domain.\u0027) % project_ref[\u0027name\u0027]"},{"line_number":108,"context_line":"            raise exception.Conflict(type\u003d\u0027project\u0027, details\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":114,"id":"1a26ad4f_05f382d7","line":105,"in_reply_to":"1a26ad4f_01a87b1e","updated":"2015-10-30 01:27:08.000000000","message":"http://paste.openstack.org/show/477675/ is the test and the failure that shows the error message is misleading.","commit_id":"2d38d47abbfbd9b877f77d8f08f0a6a6d113e097"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"aa5e917962c1d402422256fe84d1d7d38c148443","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        \u0027acting as domains with the same \u0027"},{"line_number":103,"context_line":"                        \u0027name: %s\u0027) % project_ref[\u0027name\u0027]"},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                msg \u003d _(\u0027cannot create two or more regular \u0027"},{"line_number":106,"context_line":"                        \u0027projects with the same name (%s) in the \u0027"},{"line_number":107,"context_line":"                        \u0027same domain.\u0027) % project_ref[\u0027name\u0027]"},{"line_number":108,"context_line":"            raise exception.Conflict(type\u003d\u0027project\u0027, details\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":114,"id":"1a26ad4f_e19431e3","line":105,"in_reply_to":"1a26ad4f_05f382d7","updated":"2015-11-03 22:21:18.000000000","message":"I got it... but why do you think the message is confusing? any suggestion?","commit_id":"2d38d47abbfbd9b877f77d8f08f0a6a6d113e097"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"51f9708f6c840f9cb525103e3dffa2933c53d620","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        \u0027acting as domains with the same \u0027"},{"line_number":103,"context_line":"                        \u0027name: %s\u0027) % project_ref[\u0027name\u0027]"},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                msg \u003d _(\u0027cannot create two or more regular \u0027"},{"line_number":106,"context_line":"                        \u0027projects with the same name (%s) in the \u0027"},{"line_number":107,"context_line":"                        \u0027same domain.\u0027) % project_ref[\u0027name\u0027]"},{"line_number":108,"context_line":"            raise exception.Conflict(type\u003d\u0027project\u0027, details\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":114,"id":"1a26ad4f_01a87b1e","line":105,"in_reply_to":"1a26ad4f_ebd8d51f","updated":"2015-10-29 00:04:30.000000000","message":"a regular project is a project that does not act as a domain. but with our new approach, looks like we can remove the \"regular\" from this phrase. I don\u0027t think I got your point about the same name as the domain","commit_id":"2d38d47abbfbd9b877f77d8f08f0a6a6d113e097"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"19aacb375b695dd9f7957909d6491b8f245618c8","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\"Enforce project name constraint."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        The domain_id is nullable, so this check must be enforced in"},{"line_number":88,"context_line":"        the code, instead of the backend driver. There can not be two projects"},{"line_number":89,"context_line":"        with the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we"},{"line_number":90,"context_line":"        can\u0027t have two or more projects acting as a domain with the same name."},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":119,"id":"da85f559_9c1bf180","line":88,"updated":"2015-11-11 21:40:29.000000000","message":"s/can not/cannot/","commit_id":"625b6152de0956e6f37ff59ba75aeee8d56415ad"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"ad7c5d5e6a672b0675f37f2af8c9cabac703dc6f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        \"\"\"Enforce project name constraint."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        The domain_id is nullable, so this check must be enforced in"},{"line_number":88,"context_line":"        the code, instead of the backend driver. There can not be two projects"},{"line_number":89,"context_line":"        with the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we"},{"line_number":90,"context_line":"        can\u0027t have two or more projects acting as a domain with the same name."},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":119,"id":"da85f559_a1cbca1d","line":88,"in_reply_to":"da85f559_9c1bf180","updated":"2015-11-13 12:57:06.000000000","message":"Done","commit_id":"625b6152de0956e6f37ff59ba75aeee8d56415ad"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"19aacb375b695dd9f7957909d6491b8f245618c8","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            # NOTE(rodrigods): calling the driver directly, we don\u0027t"},{"line_number":97,"context_line":"            # want to hit the cache here"},{"line_number":98,"context_line":"            self.driver.get_project_by_name("},{"line_number":99,"context_line":"                project_ref[\u0027name\u0027], domain_id, project_ref[\u0027is_domain\u0027])"},{"line_number":100,"context_line":"            if project_ref[\u0027is_domain\u0027]:"},{"line_number":101,"context_line":"                msg \u003d _(\u0027cannot create two or more projects \u0027"}],"source_content_type":"text/x-python","patch_set":119,"id":"da85f559_df33abf4","line":98,"updated":"2015-11-11 21:40:29.000000000","message":"Since you are not acting on the item returned by this call but the project_ref passed as an argument this code would read better IMHO like this:\n\n    try:\n        self.driver.get_project_by_name()\n    except exception.ProjectNotFound:\n        return\n\n    # make the msg here\n    raise Conflict(msg)","commit_id":"625b6152de0956e6f37ff59ba75aeee8d56415ad"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"ad7c5d5e6a672b0675f37f2af8c9cabac703dc6f","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        try:"},{"line_number":96,"context_line":"            # NOTE(rodrigods): calling the driver directly, we don\u0027t"},{"line_number":97,"context_line":"            # want to hit the cache here"},{"line_number":98,"context_line":"            self.driver.get_project_by_name("},{"line_number":99,"context_line":"                project_ref[\u0027name\u0027], domain_id, project_ref[\u0027is_domain\u0027])"},{"line_number":100,"context_line":"            if project_ref[\u0027is_domain\u0027]:"},{"line_number":101,"context_line":"                msg \u003d _(\u0027cannot create two or more projects \u0027"}],"source_content_type":"text/x-python","patch_set":119,"id":"da85f559_81c6c614","line":98,"in_reply_to":"da85f559_df33abf4","updated":"2015-11-13 12:57:06.000000000","message":"Done","commit_id":"625b6152de0956e6f37ff59ba75aeee8d56415ad"},{"author":{"_account_id":15359,"name":"Erickson Filipe Guedes dos Santos","email":"erickson@lsd.ufcg.edu.br","username":"ericksonfilipe"},"change_message_id":"573335cf9f03bfd7a1a13d848d4cd1c36b2bbe61","unresolved":false,"context_lines":[{"line_number":314,"context_line":""},{"line_number":315,"context_line":"        # When updating name and/or domain_id, it is necessary to check whether"},{"line_number":316,"context_line":"        # a project with this configuration already exists"},{"line_number":317,"context_line":"        update_name \u003d (\u0027name\u0027 in tenant and"},{"line_number":318,"context_line":"                       tenant[\u0027name\u0027] !\u003d original_tenant[\u0027name\u0027])"},{"line_number":319,"context_line":"        update_domain \u003d (\u0027domain_id\u0027 in tenant and"},{"line_number":320,"context_line":"                         tenant[\u0027domain_id\u0027] !\u003d original_tenant[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":124,"id":"7a740942_e842930e","line":317,"updated":"2015-12-11 21:05:05.000000000","message":"It would be simpler and fit in one line if you replace this by:\n\nupdate_domain \u003d tenant.get(\u0027name\u0027, None) !\u003d original_tenant[\u0027name\u0027]","commit_id":"509774a7ef9b219aa30824ba34cde8d63a2edc3d"},{"author":{"_account_id":15359,"name":"Erickson Filipe Guedes dos Santos","email":"erickson@lsd.ufcg.edu.br","username":"ericksonfilipe"},"change_message_id":"573335cf9f03bfd7a1a13d848d4cd1c36b2bbe61","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        # a project with this configuration already exists"},{"line_number":317,"context_line":"        update_name \u003d (\u0027name\u0027 in tenant and"},{"line_number":318,"context_line":"                       tenant[\u0027name\u0027] !\u003d original_tenant[\u0027name\u0027])"},{"line_number":319,"context_line":"        update_domain \u003d (\u0027domain_id\u0027 in tenant and"},{"line_number":320,"context_line":"                         tenant[\u0027domain_id\u0027] !\u003d original_tenant[\u0027domain_id\u0027])"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"        if update_name or update_domain:"}],"source_content_type":"text/x-python","patch_set":124,"id":"7a740942_c80b17d4","line":319,"updated":"2015-12-11 21:05:05.000000000","message":"same here:\n\nupdate_domain \u003d tenant.get(\u0027domain_id\u0027, None) !\u003d original_tenant[\u0027domain_id\u0027]","commit_id":"509774a7ef9b219aa30824ba34cde8d63a2edc3d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"847d22a702def5ec8e30012b8d80eb5e86d46d43","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def _enforce_project_name_constraint(self, project_ref):"},{"line_number":85,"context_line":"        \"\"\"Enforce project name constraint."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        The domain_id is nullable, so this check must be enforced in"},{"line_number":88,"context_line":"        the code, instead of the backend driver. There cannot be two projects"},{"line_number":89,"context_line":"        with the same values of \u0027name\u0027, \u0027domain_id\u0027 and \u0027is_domain\u0027. Also, we"},{"line_number":90,"context_line":"        can\u0027t have two or more projects acting as a domain with the same name."},{"line_number":91,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":125,"id":"1a7b0d38_8762f93c","line":88,"range":{"start_line":87,"start_character":8,"end_line":88,"end_character":16},"updated":"2015-12-28 00:29:55.000000000","message":"I don\u0027t think this is true - and in fact doing it in code here is not multi-process safe.  See my patch of domain specific roles for one way of doing this: https://review.openstack.org/#/c/261870/2/keystone/assignment/role_backends/sql.py","commit_id":"1ab520f618554e3b47a1be220cb3126427e15f67"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d7656afdeef20f6bb69e39b05b2e408e8624f915","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # When updating name and/or domain_id, it is necessary to check whether"},{"line_number":337,"context_line":"        # a project with this configuration already exists"},{"line_number":338,"context_line":"        update_name \u003d (\u0027name\u0027 in tenant and"},{"line_number":339,"context_line":"                       tenant[\u0027name\u0027] !\u003d original_tenant[\u0027name\u0027])"},{"line_number":340,"context_line":"        update_domain \u003d (\u0027domain_id\u0027 in tenant and"},{"line_number":341,"context_line":"                         tenant[\u0027domain_id\u0027] !\u003d original_tenant[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_2585e958","line":338,"updated":"2016-01-06 21:53:09.000000000","message":"(nit) renaming to name_updated so it\u0027s a better indicator that this is a boolean value and it makes the \u0027if\u0027 statement on line 343 read better. Same goes for renaming update_domain.","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2e37e4ce2049b23cc567d7c79a591994504062b6","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"        # When updating name and/or domain_id, it is necessary to check whether"},{"line_number":337,"context_line":"        # a project with this configuration already exists"},{"line_number":338,"context_line":"        update_name \u003d (\u0027name\u0027 in tenant and"},{"line_number":339,"context_line":"                       tenant[\u0027name\u0027] !\u003d original_tenant[\u0027name\u0027])"},{"line_number":340,"context_line":"        update_domain \u003d (\u0027domain_id\u0027 in tenant and"},{"line_number":341,"context_line":"                         tenant[\u0027domain_id\u0027] !\u003d original_tenant[\u0027domain_id\u0027])"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_00ca081b","line":338,"in_reply_to":"fa69d971_2585e958","updated":"2016-01-07 03:56:48.000000000","message":"actually, this whole block is not necessary anymore, since we\u0027re back to the enforcement of the constraint at the backend","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d7656afdeef20f6bb69e39b05b2e408e8624f915","unresolved":false,"context_lines":[{"line_number":346,"context_line":"                if original_tenant[\u0027is_domain\u0027]:"},{"line_number":347,"context_line":"                    self._assert_unique_is_domain_project_name("},{"line_number":348,"context_line":"                        tenant[\u0027name\u0027])"},{"line_number":349,"context_line":"                tenant_to_check[\u0027name\u0027] \u003d tenant[\u0027name\u0027]"},{"line_number":350,"context_line":"            if update_domain:"},{"line_number":351,"context_line":"                tenant_to_check[\u0027domain_id\u0027] \u003d tenant[\u0027domain_id\u0027]"},{"line_number":352,"context_line":""}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_e5f11102","line":349,"updated":"2016-01-06 21:53:09.000000000","message":"We are making changes to this dictionary, but I don\u0027t see it being used anywhere.","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d7656afdeef20f6bb69e39b05b2e408e8624f915","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                        tenant[\u0027name\u0027])"},{"line_number":349,"context_line":"                tenant_to_check[\u0027name\u0027] \u003d tenant[\u0027name\u0027]"},{"line_number":350,"context_line":"            if update_domain:"},{"line_number":351,"context_line":"                tenant_to_check[\u0027domain_id\u0027] \u003d tenant[\u0027domain_id\u0027]"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"        if \u0027enabled\u0027 in tenant:"},{"line_number":354,"context_line":"            tenant[\u0027enabled\u0027] \u003d clean.project_enabled(tenant[\u0027enabled\u0027])"}],"source_content_type":"text/x-python","patch_set":128,"id":"fa69d971_c5dbad7a","line":351,"updated":"2016-01-06 21:53:09.000000000","message":"Same here","commit_id":"43a2a1bf51f8eb55ef8b120f217097e45f40cba6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4a063cfb09933d4f807cd292fc27099ac9ab7c38","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \"\"\"Assert names of projects acting as domains are unique in the cloud."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        We can\u0027t have two or more projects acting as a domain with the same"},{"line_number":97,"context_line":"        name, no matter which place they are in the hierarchy."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        :raises keystone.exception.Conflict: If one project acting as a domain"},{"line_number":100,"context_line":"            with the same name already exists."}],"source_content_type":"text/x-python","patch_set":129,"id":"fa69d971_363d48c4","line":97,"range":{"start_line":97,"start_character":14,"end_line":97,"end_character":61},"updated":"2016-01-11 21:39:40.000000000","message":"should remove this bit, since all projects acting as domains are (currently) top level projects","commit_id":"6647f2184dd57bfec0755ca85e2fdd43e4bb53fc"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a48af62cf2ff2249f99f91b30475ddfa6ce554ec","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        \"\"\"Assert names of projects acting as domains are unique in the cloud."},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        We can\u0027t have two or more projects acting as a domain with the same"},{"line_number":97,"context_line":"        name, no matter which place they are in the hierarchy."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        :raises keystone.exception.Conflict: If one project acting as a domain"},{"line_number":100,"context_line":"            with the same name already exists."}],"source_content_type":"text/x-python","patch_set":129,"id":"da6ed579_71e0e3fa","line":97,"range":{"start_line":97,"start_character":14,"end_line":97,"end_character":61},"in_reply_to":"fa69d971_363d48c4","updated":"2016-01-14 03:02:08.000000000","message":"Done","commit_id":"6647f2184dd57bfec0755ca85e2fdd43e4bb53fc"},{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"66a4147505d9f77e90a70cf5ec0aa277137a6e11","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                msg \u003d _(\u0027cannot create two or more projects \u0027"},{"line_number":215,"context_line":"                        \u0027acting as domains with the same \u0027"},{"line_number":216,"context_line":"                        \u0027name: %s\u0027) % tenant[\u0027name\u0027]"},{"line_number":217,"context_line":"            else:"},{"line_number":218,"context_line":"                msg \u003d _(\u0027cannot create two or more projects \u0027"},{"line_number":219,"context_line":"                        \u0027within a domain with the same name : %s\u0027"},{"line_number":220,"context_line":"                        ) % tenant[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":139,"id":"9a68dd71_1814f69d","line":217,"updated":"2016-01-24 18:59:56.000000000","message":"We could do similar kind of thing while updating a project also. Check if it\u0027s a domain being updated and change the error message accordingly.","commit_id":"1ed6ed66bf547f57589ac69c60f4ef07bbb79894"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f85d7f075b7af446b212cdab86201245b2776ac1","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                msg \u003d _(\u0027cannot create two or more projects \u0027"},{"line_number":215,"context_line":"                        \u0027acting as domains with the same \u0027"},{"line_number":216,"context_line":"                        \u0027name: %s\u0027) % tenant[\u0027name\u0027]"},{"line_number":217,"context_line":"            else:"},{"line_number":218,"context_line":"                msg \u003d _(\u0027cannot create two or more projects \u0027"},{"line_number":219,"context_line":"                        \u0027within a domain with the same name : %s\u0027"},{"line_number":220,"context_line":"                        ) % tenant[\u0027name\u0027]"}],"source_content_type":"text/x-python","patch_set":139,"id":"9a68dd71_78e09296","line":217,"in_reply_to":"9a68dd71_1814f69d","updated":"2016-01-24 19:04:14.000000000","message":"yep, good idea.","commit_id":"1ed6ed66bf547f57589ac69c60f4ef07bbb79894"},{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"1bf6617867de42250f9ac9ea9b221f57fe2074c8","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                \u0027chars\u0027: utils.list_url_unsafe_chars(name)"},{"line_number":177,"context_line":"            })"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _generate_conflict_msg(self, project):"},{"line_number":180,"context_line":"        if project[\u0027is_domain\u0027]:"},{"line_number":181,"context_line":"            return _(\u0027it is not permitted to have two or more projects \u0027"},{"line_number":182,"context_line":"                     \u0027acting as domains with the same name: %s\u0027"}],"source_content_type":"text/x-python","patch_set":140,"id":"9a68dd71_94e98ab9","line":179,"range":{"start_line":179,"start_character":8,"end_line":179,"end_character":30},"updated":"2016-01-25 05:21:42.000000000","message":"neat! We could make this a classmethod so that we are not binding this method to every instance of this class.","commit_id":"3d670ba2c9373855c3aba1a8260ed6a58d925d04"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb234eb1d92861dd4c8be3c00e43ad723b08219c","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                \u0027chars\u0027: utils.list_url_unsafe_chars(name)"},{"line_number":177,"context_line":"            })"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _generate_conflict_msg(self, project):"},{"line_number":180,"context_line":"        if project[\u0027is_domain\u0027]:"},{"line_number":181,"context_line":"            return _(\u0027it is not permitted to have two or more projects \u0027"},{"line_number":182,"context_line":"                     \u0027acting as domains with the same name: %s\u0027"}],"source_content_type":"text/x-python","patch_set":141,"id":"9a68dd71_25861b14","line":179,"range":{"start_line":179,"start_character":8,"end_line":179,"end_character":30},"updated":"2016-01-26 14:53:51.000000000","message":"this name is too generic. _generate_project_name_conflict_message() would be better","commit_id":"913e4b8f7bef1163756405477b4e02a537216748"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"009b32ee732961062fd206880ba10b68757c90de","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                \u0027chars\u0027: utils.list_url_unsafe_chars(name)"},{"line_number":177,"context_line":"            })"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def _generate_conflict_msg(self, project):"},{"line_number":180,"context_line":"        if project[\u0027is_domain\u0027]:"},{"line_number":181,"context_line":"            return _(\u0027it is not permitted to have two or more projects \u0027"},{"line_number":182,"context_line":"                     \u0027acting as domains with the same name: %s\u0027"}],"source_content_type":"text/x-python","patch_set":141,"id":"9a68dd71_d219f67a","line":179,"range":{"start_line":179,"start_character":8,"end_line":179,"end_character":30},"in_reply_to":"9a68dd71_25861b14","updated":"2016-01-26 19:23:30.000000000","message":"Done","commit_id":"913e4b8f7bef1163756405477b4e02a537216748"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb234eb1d92861dd4c8be3c00e43ad723b08219c","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                     ) % project[\u0027name\u0027]"},{"line_number":184,"context_line":"        else:"},{"line_number":185,"context_line":"            return _(\u0027it is not permitted to have two or more projects \u0027"},{"line_number":186,"context_line":"                     \u0027within a domain with the same name : %s\u0027"},{"line_number":187,"context_line":"                     ) % project[\u0027name\u0027]"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"}],"source_content_type":"text/x-python","patch_set":141,"id":"9a68dd71_25029b70","line":186,"range":{"start_line":186,"start_character":31,"end_line":186,"end_character":37},"updated":"2016-01-26 14:53:51.000000000","message":"you could put the domain name here","commit_id":"913e4b8f7bef1163756405477b4e02a537216748"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"009b32ee732961062fd206880ba10b68757c90de","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                     ) % project[\u0027name\u0027]"},{"line_number":184,"context_line":"        else:"},{"line_number":185,"context_line":"            return _(\u0027it is not permitted to have two or more projects \u0027"},{"line_number":186,"context_line":"                     \u0027within a domain with the same name : %s\u0027"},{"line_number":187,"context_line":"                     ) % project[\u0027name\u0027]"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def create_project(self, tenant_id, tenant, initiator\u003dNone):"}],"source_content_type":"text/x-python","patch_set":141,"id":"9a68dd71_2fd588b8","line":186,"range":{"start_line":186,"start_character":31,"end_line":186,"end_character":37},"in_reply_to":"9a68dd71_25029b70","updated":"2016-01-26 19:23:30.000000000","message":"WE could, although I think it is probably OK as is given the caller probably knows the domain they are creating it in","commit_id":"913e4b8f7bef1163756405477b4e02a537216748"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6c7e9822f05ea5c9d28e417ba873efcb1ec6916c","unresolved":false,"context_lines":[{"line_number":336,"context_line":"        self.get_project.invalidate(self, project_id)"},{"line_number":337,"context_line":"        self.get_project_by_name.invalidate(self, original_project[\u0027name\u0027],"},{"line_number":338,"context_line":"                                            original_project[\u0027domain_id\u0027])"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        if (\u0027domain_id\u0027 in project and"},{"line_number":341,"context_line":"           project[\u0027domain_id\u0027] !\u003d original_project[\u0027domain_id\u0027]):"},{"line_number":342,"context_line":"            # If the project\u0027s domain_id has been updated, invalidate user"},{"line_number":343,"context_line":"            # role assignments cache region, as it may be caching inherited"},{"line_number":344,"context_line":"            # assignments from the old domain to the specified project"},{"line_number":345,"context_line":"            assignment.COMPUTED_ASSIGNMENTS_REGION.invalidate()"},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        return ret"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def _pre_delete_cleanup_project(self, project_id, project, initiator\u003dNone):"}],"source_content_type":"text/x-python","patch_set":151,"id":"dae33548_51b865e5","side":"PARENT","line":346,"range":{"start_line":339,"start_character":0,"end_line":346,"end_character":0},"updated":"2016-02-17 01:09:39.000000000","message":"Why has this code been removed ? I have no clue on why we\u0027re doing this","commit_id":"24b5dd021d33b7c18a5ab147939128a4a378925e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6c7e9822f05ea5c9d28e417ba873efcb1ec6916c","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _generate_project_name_conflict_msg(self, project):"},{"line_number":181,"context_line":"        if project[\u0027is_domain\u0027]:"},{"line_number":182,"context_line":"            return _(\u0027it is not permitted to have two or more projects \u0027"},{"line_number":183,"context_line":"                     \u0027acting as domains with the same name: %s\u0027"},{"line_number":184,"context_line":"                     ) % project[\u0027name\u0027]"},{"line_number":185,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":151,"id":"dae33548_d130f5ea","line":182,"range":{"start_line":182,"start_character":53,"end_line":182,"end_character":61},"updated":"2016-02-17 01:09:39.000000000","message":"(nit) don\u0027t need \u0027or more\u0027","commit_id":"a3491fc855f70f934bd5f7227fda5732a67c08de"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6c7e9822f05ea5c9d28e417ba873efcb1ec6916c","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                     \u0027acting as domains with the same name: %s\u0027"},{"line_number":184,"context_line":"                     ) % project[\u0027name\u0027]"},{"line_number":185,"context_line":"        else:"},{"line_number":186,"context_line":"            return _(\u0027it is not permitted to have two or more projects \u0027"},{"line_number":187,"context_line":"                     \u0027within a domain with the same name : %s\u0027"},{"line_number":188,"context_line":"                     ) % project[\u0027name\u0027]"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-python","patch_set":151,"id":"dae33548_1151bd0e","line":186,"range":{"start_line":186,"start_character":53,"end_line":186,"end_character":61},"updated":"2016-02-17 01:09:39.000000000","message":"(nit) ditto","commit_id":"a3491fc855f70f934bd5f7227fda5732a67c08de"}],"keystone/tests/unit/test_auth.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"56cfa9d7c28d26f01f72043e1f98f80330493c9a","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def _build_user_auth(token\u003dNone, user_id\u003dNone, username\u003dNone,"},{"line_number":46,"context_line":"                     password\u003dNone, tenant_id\u003dNone, tenant_name\u003dNone,"},{"line_number":47,"context_line":"                     trust_id\u003dNone, is_domain\u003dNone):"},{"line_number":48,"context_line":"    \"\"\"Build auth dictionary."},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    It will create an auth dictionary based on all the arguments"}],"source_content_type":"text/x-python","patch_set":51,"id":"1aca2d91_da1693f0","line":47,"updated":"2015-05-08 13:03:52.000000000","message":"same comment applies here.","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"}],"keystone/tests/unit/test_backend.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3363fe6e95a8a7c88bc64b9ca3ca91a32c6b179d","unresolved":false,"context_lines":[{"line_number":2195,"context_line":"        self.assertEqual(project_id, ref.get(\u0027domain_id\u0027))"},{"line_number":2196,"context_line":""},{"line_number":2197,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2198,"context_line":"    def test_cannot_create_projects_same_name_and_domain_id(self):"},{"line_number":2199,"context_line":"        parent_project_id \u003d uuid.uuid4().hex"},{"line_number":2200,"context_line":"        parent_project \u003d {\u0027id\u0027: parent_project_id,"},{"line_number":2201,"context_line":"                          \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"3acd31a7_fcd4d6bd","line":2198,"updated":"2015-05-01 13:25:33.000000000","message":"nit: \n\n    def test_cannot_create_projects_with_same_name_and_domain_id(self):\n\nif we have the room for it.","commit_id":"c9584f81b90fc56f77b1f56170f8272b98b0e9c4"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3363fe6e95a8a7c88bc64b9ca3ca91a32c6b179d","unresolved":false,"context_lines":[{"line_number":2263,"context_line":"                          self.resource_api.update_project,"},{"line_number":2264,"context_line":"                          project2[\u0027id\u0027],"},{"line_number":2265,"context_line":"                          project2)"},{"line_number":2266,"context_line":""},{"line_number":2267,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2268,"context_line":"    def test_delete_is_domain_project(self):"},{"line_number":2269,"context_line":"        project_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":48,"id":"3acd31a7_7ca68654","line":2266,"updated":"2015-05-01 13:25:33.000000000","message":"Do we have a test case that tests the golden path?","commit_id":"c9584f81b90fc56f77b1f56170f8272b98b0e9c4"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"56cfa9d7c28d26f01f72043e1f98f80330493c9a","unresolved":false,"context_lines":[{"line_number":2259,"context_line":"                    \u0027enabled\u0027: True,"},{"line_number":2260,"context_line":"                    \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2261,"context_line":"                    \u0027parent_id\u0027: None,"},{"line_number":2262,"context_line":"                    \u0027is_domain\u0027: True}"},{"line_number":2263,"context_line":"        self.resource_api.create_project(project2[\u0027id\u0027], project2)"},{"line_number":2264,"context_line":""},{"line_number":2265,"context_line":"        # Update project2 name to a non existent name"}],"source_content_type":"text/x-python","patch_set":51,"id":"1aca2d91_1ae40b0b","line":2262,"updated":"2015-05-08 13:03:52.000000000","message":"according to the tests, it looks like we only ever pass True or False as is_domain.","commit_id":"a26e4d60ec00fa7997a038531054ed28df0781e9"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1bf7aa35812f9c02f0ceb8a887486bffd2db3ca1","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.assertDictEqual(tenant_ref, self.tenant_bar)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    # TODO(raildo): Include the test for is_domain true when the"},{"line_number":174,"context_line":"    # domain operations be replicated to Project Table."},{"line_number":175,"context_line":"    def test_get_project_by_name_with_is_domain_flag_disable(self):"},{"line_number":176,"context_line":"        tenant_ref \u003d self.resource_api.get_project_by_name("},{"line_number":177,"context_line":"            self.tenant_bar[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_8deaf4aa","line":174,"updated":"2015-06-09 15:31:08.000000000","message":"nit: s/be replicated/are replicated/","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ec601befb07531fd7b6a512da390db148e6dc72b","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.assertDictEqual(tenant_ref, self.tenant_bar)"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    # TODO(raildo): Include the test for is_domain true when the"},{"line_number":174,"context_line":"    # domain operations be replicated to Project Table."},{"line_number":175,"context_line":"    def test_get_project_by_name_with_is_domain_flag_disable(self):"},{"line_number":176,"context_line":"        tenant_ref \u003d self.resource_api.get_project_by_name("},{"line_number":177,"context_line":"            self.tenant_bar[\u0027name\u0027],"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_97a9d992","line":174,"in_reply_to":"3afb71cf_8deaf4aa","updated":"2015-06-09 17:22:20.000000000","message":"Done","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1bf7aa35812f9c02f0ceb8a887486bffd2db3ca1","unresolved":false,"context_lines":[{"line_number":2205,"context_line":"        self.assertEqual(project_id, ref.get(\u0027domain_id\u0027))"},{"line_number":2206,"context_line":""},{"line_number":2207,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2208,"context_line":"    def test_cannot_create_projects_with_same_name_and_domain_id(self):"},{"line_number":2209,"context_line":"        parent_project_id \u003d uuid.uuid4().hex"},{"line_number":2210,"context_line":"        parent_project \u003d {\u0027id\u0027: parent_project_id,"},{"line_number":2211,"context_line":"                          \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_8d479476","line":2208,"updated":"2015-06-09 15:31:08.000000000","message":"is this test any different to the existing: test_create_duplicate_project_name_fails() ?","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ec601befb07531fd7b6a512da390db148e6dc72b","unresolved":false,"context_lines":[{"line_number":2205,"context_line":"        self.assertEqual(project_id, ref.get(\u0027domain_id\u0027))"},{"line_number":2206,"context_line":""},{"line_number":2207,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2208,"context_line":"    def test_cannot_create_projects_with_same_name_and_domain_id(self):"},{"line_number":2209,"context_line":"        parent_project_id \u003d uuid.uuid4().hex"},{"line_number":2210,"context_line":"        parent_project \u003d {\u0027id\u0027: parent_project_id,"},{"line_number":2211,"context_line":"                          \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_b206231b","line":2208,"in_reply_to":"3afb71cf_8d479476","updated":"2015-06-09 17:22:20.000000000","message":"hum... the essential is the same, here we just dealing with the problem in a hierarchy. I didn\u0027t have seen this other test before, can I remove this test?","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1bf7aa35812f9c02f0ceb8a887486bffd2db3ca1","unresolved":false,"context_lines":[{"line_number":2244,"context_line":"                          child_project_2)"},{"line_number":2245,"context_line":""},{"line_number":2246,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2247,"context_line":"    def test_update_domain_name(self):"},{"line_number":2248,"context_line":"        project1 \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2249,"context_line":"                    \u0027description\u0027: \u0027\u0027,"},{"line_number":2250,"context_line":"                    \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_d054ffff","line":2247,"updated":"2015-06-09 15:31:08.000000000","message":"are we updating the domain name or the project name?","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ec601befb07531fd7b6a512da390db148e6dc72b","unresolved":false,"context_lines":[{"line_number":2244,"context_line":"                          child_project_2)"},{"line_number":2245,"context_line":""},{"line_number":2246,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2247,"context_line":"    def test_update_domain_name(self):"},{"line_number":2248,"context_line":"        project1 \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2249,"context_line":"                    \u0027description\u0027: \u0027\u0027,"},{"line_number":2250,"context_line":"                    \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_527fef14","line":2247,"in_reply_to":"3afb71cf_d054ffff","updated":"2015-06-09 17:22:20.000000000","message":"Since i\u0027m creating a project with is_domain\u003dTrue, and following the ayoung suggestion in the previous patch, I decide to change the name to represent a domain. What do you think?","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98e6540df7a278336147d3a73f8d419ec22b307d","unresolved":false,"context_lines":[{"line_number":2207,"context_line":"        self.assertEqual(project_id, ref.get(\u0027domain_id\u0027))"},{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2210,"context_line":"    def test_update_domain_name(self):"},{"line_number":2211,"context_line":"        project1 \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2212,"context_line":"                    \u0027description\u0027: \u0027\u0027,"},{"line_number":2213,"context_line":"                    \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"}],"source_content_type":"text/x-python","patch_set":57,"id":"ba3cc151_bb6ec094","line":2210,"updated":"2015-07-04 17:25:57.000000000","message":"nit: as per previous comments, I think I\u0027d prefer this be called something like \" test_update_name_of_project_acting_as_a_domain\" or similar","commit_id":"1ed3d8ba9a8bb69d2e912062f90c99594e8b0769"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"58d281f3cf6caef86faddb2e2ebde2df049cae66","unresolved":false,"context_lines":[{"line_number":2207,"context_line":"        self.assertEqual(project_id, ref.get(\u0027domain_id\u0027))"},{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2210,"context_line":"    def test_update_domain_name(self):"},{"line_number":2211,"context_line":"        project1 \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2212,"context_line":"                    \u0027description\u0027: \u0027\u0027,"},{"line_number":2213,"context_line":"                    \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"}],"source_content_type":"text/x-python","patch_set":57,"id":"ba3cc151_4b6f7892","line":2210,"in_reply_to":"ba3cc151_bb6ec094","updated":"2015-07-06 20:18:09.000000000","message":"Done","commit_id":"1ed3d8ba9a8bb69d2e912062f90c99594e8b0769"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"92efc964333cdeabc285009c2781fe4efb8f6dd8","unresolved":false,"context_lines":[{"line_number":2238,"context_line":"                          project2)"},{"line_number":2239,"context_line":""},{"line_number":2240,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2241,"context_line":"    def test_delete_domaint(self):"},{"line_number":2242,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2243,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2244,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba3cc151_57e9b97d","line":2241,"updated":"2015-07-09 11:23:43.000000000","message":"remove this","commit_id":"601803cf4ed1b5d17c38da26212dc4f46ff1e1d7"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"1dba2adcc89b05f50c629aed35f646062ced2203","unresolved":false,"context_lines":[{"line_number":2238,"context_line":"                          project2)"},{"line_number":2239,"context_line":""},{"line_number":2240,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2241,"context_line":"    def test_delete_domaint(self):"},{"line_number":2242,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2243,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2244,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":59,"id":"ba3cc151_021bcd73","line":2241,"in_reply_to":"ba3cc151_57e9b97d","updated":"2015-07-09 22:47:04.000000000","message":"Done","commit_id":"601803cf4ed1b5d17c38da26212dc4f46ff1e1d7"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"05bbe4b0ea2d91be384b0a48a77a0e4784f7645b","unresolved":false,"context_lines":[{"line_number":2237,"context_line":"                       \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2238,"context_line":"                       \u0027parent_id\u0027: project_id,"},{"line_number":2239,"context_line":"                       \u0027is_domain\u0027: True}"},{"line_number":2240,"context_line":"        self.resource_api.create_project(sub_project[\u0027id\u0027], sub_project)"},{"line_number":2241,"context_line":""},{"line_number":2242,"context_line":"        # Creating it again fails"},{"line_number":2243,"context_line":"        self.assertRaises(exception.Conflict,"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_306f5efd","line":2240,"updated":"2015-07-23 08:42:21.000000000","message":"we should probably check that the domain_id was correctly set to the domain of the parent...maybe that needs to be a separate test....","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8671ba05d61f0f0fb0907af52d70fc0d63e04a90","unresolved":false,"context_lines":[{"line_number":2237,"context_line":"                       \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2238,"context_line":"                       \u0027parent_id\u0027: project_id,"},{"line_number":2239,"context_line":"                       \u0027is_domain\u0027: True}"},{"line_number":2240,"context_line":"        self.resource_api.create_project(sub_project[\u0027id\u0027], sub_project)"},{"line_number":2241,"context_line":""},{"line_number":2242,"context_line":"        # Creating it again fails"},{"line_number":2243,"context_line":"        self.assertRaises(exception.Conflict,"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_b2f6018d","line":2240,"in_reply_to":"3a50d1a3_306f5efd","updated":"2015-07-23 14:05:01.000000000","message":"Ok. I\u0027ll create it in the next patch, which is where domain operations are replicated.","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"05bbe4b0ea2d91be384b0a48a77a0e4784f7645b","unresolved":false,"context_lines":[{"line_number":2244,"context_line":"                          self.resource_api.create_project,"},{"line_number":2245,"context_line":"                          project[\u0027id\u0027],"},{"line_number":2246,"context_line":"                          project)"},{"line_number":2247,"context_line":""},{"line_number":2248,"context_line":"        # TODO(htruta): add more cases when operations are replicated in"},{"line_number":2249,"context_line":"        # project tabe"},{"line_number":2250,"context_line":"        # Changing is_domain must work"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_7decde29","line":2247,"updated":"2015-07-23 08:42:21.000000000","message":"Is there enough testing here now domain_id is nullable.  E.g. creating two top level domain\u003dTrue projects of the same name...both of which would have no domainID?","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8671ba05d61f0f0fb0907af52d70fc0d63e04a90","unresolved":false,"context_lines":[{"line_number":2244,"context_line":"                          self.resource_api.create_project,"},{"line_number":2245,"context_line":"                          project[\u0027id\u0027],"},{"line_number":2246,"context_line":"                          project)"},{"line_number":2247,"context_line":""},{"line_number":2248,"context_line":"        # TODO(htruta): add more cases when operations are replicated in"},{"line_number":2249,"context_line":"        # project tabe"},{"line_number":2250,"context_line":"        # Changing is_domain must work"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_2505cd0f","line":2247,"in_reply_to":"3a50d1a3_7decde29","updated":"2015-07-23 14:05:01.000000000","message":"Done","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2209,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2210,"context_line":"    def test_project_name_domain_constraint(self):"},{"line_number":2211,"context_line":"        # The check of the name constraint (name, domain_id, is_domain) is not"},{"line_number":2212,"context_line":"        # made by the backend anymore, because domain_id is now nullable."},{"line_number":2213,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_38baa46f","line":2212,"updated":"2015-07-24 09:31:49.000000000","message":"Comments, in general, shouldn\u0027t reference old and new version of keystone code (that\u0027s what git is for).  So the comment should be simply say:\n\nCheck the uniqueness constraint of (name, domain_id, is_domain)","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2209,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2210,"context_line":"    def test_project_name_domain_constraint(self):"},{"line_number":2211,"context_line":"        # The check of the name constraint (name, domain_id, is_domain) is not"},{"line_number":2212,"context_line":"        # made by the backend anymore, because domain_id is now nullable."},{"line_number":2213,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_59ac36ed","line":2212,"in_reply_to":"3a50d1a3_38baa46f","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2210,"context_line":"    def test_project_name_domain_constraint(self):"},{"line_number":2211,"context_line":"        # The check of the name constraint (name, domain_id, is_domain) is not"},{"line_number":2212,"context_line":"        # made by the backend anymore, because domain_id is now nullable."},{"line_number":2213,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_4b879c12","line":2213,"updated":"2015-07-24 09:31:49.000000000","message":"why bother assigning this to a variable...why not just assign it in the dict, and then reference it from there?","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2210,"context_line":"    def test_project_name_domain_constraint(self):"},{"line_number":2211,"context_line":"        # The check of the name constraint (name, domain_id, is_domain) is not"},{"line_number":2212,"context_line":"        # made by the backend anymore, because domain_id is now nullable."},{"line_number":2213,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_f9198223","line":2213,"in_reply_to":"3a50d1a3_4b879c12","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2212,"context_line":"        # made by the backend anymore, because domain_id is now nullable."},{"line_number":2213,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"},{"line_number":2217,"context_line":"                   \u0027enabled\u0027: True,"},{"line_number":2218,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_2bced0b4","line":2215,"updated":"2015-07-24 09:31:49.000000000","message":"don\u0027t need this","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2212,"context_line":"        # made by the backend anymore, because domain_id is now nullable."},{"line_number":2213,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"},{"line_number":2217,"context_line":"                   \u0027enabled\u0027: True,"},{"line_number":2218,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_19178eee","line":2215,"in_reply_to":"3a50d1a3_2bced0b4","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2213,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"},{"line_number":2217,"context_line":"                   \u0027enabled\u0027: True,"},{"line_number":2218,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2219,"context_line":"                   \u0027parent_id\u0027: None,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_ebc0e87e","line":2216,"updated":"2015-07-24 09:31:49.000000000","message":"don\u0027t need this","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2213,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"},{"line_number":2217,"context_line":"                   \u0027enabled\u0027: True,"},{"line_number":2218,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2219,"context_line":"                   \u0027parent_id\u0027: None,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_39ca8a50","line":2216,"in_reply_to":"3a50d1a3_ebc0e87e","updated":"2015-07-27 16:17:59.000000000","message":"This is actually wrong, the domain_id can\u0027t be None yet","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"},{"line_number":2217,"context_line":"                   \u0027enabled\u0027: True,"},{"line_number":2218,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2219,"context_line":"                   \u0027parent_id\u0027: None,"},{"line_number":2220,"context_line":"                   \u0027is_domain\u0027: True}"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_6b6298af","line":2217,"updated":"2015-07-24 09:31:49.000000000","message":"don\u0027t need this (it\u0027s the default)","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2214,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2215,"context_line":"                   \u0027description\u0027: \u0027\u0027,"},{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"},{"line_number":2217,"context_line":"                   \u0027enabled\u0027: True,"},{"line_number":2218,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2219,"context_line":"                   \u0027parent_id\u0027: None,"},{"line_number":2220,"context_line":"                   \u0027is_domain\u0027: True}"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_19c1ce2e","line":2217,"in_reply_to":"3a50d1a3_6b6298af","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"},{"line_number":2217,"context_line":"                   \u0027enabled\u0027: True,"},{"line_number":2218,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2219,"context_line":"                   \u0027parent_id\u0027: None,"},{"line_number":2220,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2221,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2222,"context_line":""}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_ebf548cb","line":2219,"updated":"2015-07-24 09:31:49.000000000","message":"don\u0027t need this","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2216,"context_line":"                   \u0027domain_id\u0027: None,"},{"line_number":2217,"context_line":"                   \u0027enabled\u0027: True,"},{"line_number":2218,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2219,"context_line":"                   \u0027parent_id\u0027: None,"},{"line_number":2220,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2221,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2222,"context_line":""}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_b9dc5a19","line":2219,"in_reply_to":"3a50d1a3_ebf548cb","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2221,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"        # Cannot create the same project"},{"line_number":2224,"context_line":"        new_project_id \u003d uuid.uuid4().hex"},{"line_number":2225,"context_line":"        new_project \u003d project.copy()"},{"line_number":2226,"context_line":"        new_project[\u0027id\u0027] \u003d new_project_id"},{"line_number":2227,"context_line":""}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_6b861867","line":2224,"updated":"2015-07-24 09:31:49.000000000","message":"is there a reason to have this variable...we only seem to use it once...","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2221,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2222,"context_line":""},{"line_number":2223,"context_line":"        # Cannot create the same project"},{"line_number":2224,"context_line":"        new_project_id \u003d uuid.uuid4().hex"},{"line_number":2225,"context_line":"        new_project \u003d project.copy()"},{"line_number":2226,"context_line":"        new_project[\u0027id\u0027] \u003d new_project_id"},{"line_number":2227,"context_line":""}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_59ce765b","line":2224,"in_reply_to":"3a50d1a3_6b861867","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2231,"context_line":"                          new_project)"},{"line_number":2232,"context_line":""},{"line_number":2233,"context_line":"        # Creating a sub is_domain project"},{"line_number":2234,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"},{"line_number":2235,"context_line":"        # domain table"},{"line_number":2236,"context_line":"        sub_project_id \u003d uuid.uuid4().hex"},{"line_number":2237,"context_line":"        sub_project \u003d {\u0027id\u0027: sub_project_id,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_d85dc049","line":2234,"updated":"2015-07-24 09:31:49.000000000","message":"I don\u0027t really understand this TODO....and I\u0027m not sure it adds a lot anyway....","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2231,"context_line":"                          new_project)"},{"line_number":2232,"context_line":""},{"line_number":2233,"context_line":"        # Creating a sub is_domain project"},{"line_number":2234,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"},{"line_number":2235,"context_line":"        # domain table"},{"line_number":2236,"context_line":"        sub_project_id \u003d uuid.uuid4().hex"},{"line_number":2237,"context_line":"        sub_project \u003d {\u0027id\u0027: sub_project_id,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_d91606a7","line":2234,"in_reply_to":"3a50d1a3_d85dc049","updated":"2015-07-27 16:17:59.000000000","message":"although the domain_id column can be nullable at this point, in subprojects it must point to another project, which is not possible yet since we haven\u0027t migrated the domain data to the project table","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2233,"context_line":"        # Creating a sub is_domain project"},{"line_number":2234,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"},{"line_number":2235,"context_line":"        # domain table"},{"line_number":2236,"context_line":"        sub_project_id \u003d uuid.uuid4().hex"},{"line_number":2237,"context_line":"        sub_project \u003d {\u0027id\u0027: sub_project_id,"},{"line_number":2238,"context_line":"                       \u0027description\u0027: \u0027\u0027,"},{"line_number":2239,"context_line":"                       \u0027domain_id\u0027: None,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_ab8c2080","line":2236,"updated":"2015-07-24 09:31:49.000000000","message":"same here, regarding variable use","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2233,"context_line":"        # Creating a sub is_domain project"},{"line_number":2234,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"},{"line_number":2235,"context_line":"        # domain table"},{"line_number":2236,"context_line":"        sub_project_id \u003d uuid.uuid4().hex"},{"line_number":2237,"context_line":"        sub_project \u003d {\u0027id\u0027: sub_project_id,"},{"line_number":2238,"context_line":"                       \u0027description\u0027: \u0027\u0027,"},{"line_number":2239,"context_line":"                       \u0027domain_id\u0027: None,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_790b327e","line":2236,"in_reply_to":"3a50d1a3_ab8c2080","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2244,"context_line":"        self.resource_api.create_project(sub_project[\u0027id\u0027], sub_project)"},{"line_number":2245,"context_line":""},{"line_number":2246,"context_line":"        # Creating it again fails"},{"line_number":2247,"context_line":"        new_sub_project_id \u003d uuid.uuid4().hex"},{"line_number":2248,"context_line":"        new_sub_project \u003d sub_project.copy()"},{"line_number":2249,"context_line":"        new_sub_project[\u0027id\u0027] \u003d new_sub_project_id"},{"line_number":2250,"context_line":"        self.assertRaises(exception.Conflict,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_2bf7b0f6","line":2247,"updated":"2015-07-24 09:31:49.000000000","message":"....and here...","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2244,"context_line":"        self.resource_api.create_project(sub_project[\u0027id\u0027], sub_project)"},{"line_number":2245,"context_line":""},{"line_number":2246,"context_line":"        # Creating it again fails"},{"line_number":2247,"context_line":"        new_sub_project_id \u003d uuid.uuid4().hex"},{"line_number":2248,"context_line":"        new_sub_project \u003d sub_project.copy()"},{"line_number":2249,"context_line":"        new_sub_project[\u0027id\u0027] \u003d new_sub_project_id"},{"line_number":2250,"context_line":"        self.assertRaises(exception.Conflict,"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_99107eaa","line":2247,"in_reply_to":"3a50d1a3_2bf7b0f6","updated":"2015-07-27 16:17:59.000000000","message":"Done","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2251,"context_line":"                          self.resource_api.create_project,"},{"line_number":2252,"context_line":"                          new_sub_project[\u0027id\u0027],"},{"line_number":2253,"context_line":"                          new_sub_project)"},{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"        # TODO(htruta): Test whether not providing domain_id and providing"},{"line_number":2256,"context_line":"        # parent_id, the domain_id is set as the closest project acting as a"},{"line_number":2257,"context_line":"        # domain when domain operations are replicated to project table"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_4e81ea4c","line":2254,"updated":"2015-07-24 09:31:49.000000000","message":"There are probably a few extra tests we should add, e.g.:\n\n- another top level domain project with a different name is OK\n- another 2nd level domain project with a different name is OK\n- another 2nd level regular project with the same name is OK","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e2b0f033ad2913ae6cea7cd9eb537ba7392e0ccc","unresolved":false,"context_lines":[{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"        # TODO(htruta): Test whether not providing domain_id and providing"},{"line_number":2256,"context_line":"        # parent_id, the domain_id is set as the closest project acting as a"},{"line_number":2257,"context_line":"        # domain when domain operations are replicated to project table"},{"line_number":2258,"context_line":""},{"line_number":2259,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2260,"context_line":"    def test_is_domain_sub_project_has_parent_domain_id(self):"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_b8a9d47d","line":2257,"updated":"2015-07-24 09:31:49.000000000","message":"I think this test (for optional domain_id) at the manager level should be in the previous patch, which is where support for it was introduced.","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"30322efe03259a0fb9ca0f26c284b7ea9b5e26d3","unresolved":false,"context_lines":[{"line_number":2254,"context_line":""},{"line_number":2255,"context_line":"        # TODO(htruta): Test whether not providing domain_id and providing"},{"line_number":2256,"context_line":"        # parent_id, the domain_id is set as the closest project acting as a"},{"line_number":2257,"context_line":"        # domain when domain operations are replicated to project table"},{"line_number":2258,"context_line":""},{"line_number":2259,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2260,"context_line":"    def test_is_domain_sub_project_has_parent_domain_id(self):"}],"source_content_type":"text/x-python","patch_set":76,"id":"3a50d1a3_798252ca","line":2257,"in_reply_to":"3a50d1a3_b8a9d47d","updated":"2015-07-27 16:17:59.000000000","message":"Done in the previous patch","commit_id":"dc5ab63d28fd29d6d0b204a4da67b38c3c1f9c2b"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"1e9589855e654afd214481a1d4b436f82e00133b","unresolved":false,"context_lines":[{"line_number":2273,"context_line":"                   \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":2274,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2275,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2276,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2277,"context_line":""},{"line_number":2278,"context_line":"        # Creating another sub is_domain project"},{"line_number":2279,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_f2ab2986","line":2276,"updated":"2015-07-29 15:21:26.000000000","message":"I don\u0027t understand, what this test and the test below have to do with constraints","commit_id":"b13e88fe86f743b0de085c2878092318738d2288"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6a5610cca61a5dba3699c903db8dc5e6d076fc88","unresolved":false,"context_lines":[{"line_number":2273,"context_line":"                   \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":2274,"context_line":"                   \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2275,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2276,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2277,"context_line":""},{"line_number":2278,"context_line":"        # Creating another sub is_domain project"},{"line_number":2279,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_43ef95e9","line":2276,"in_reply_to":"3a50d1a3_f2ab2986","updated":"2015-07-30 03:35:02.000000000","message":"That\u0027s just to show that we are able to create other is_domain projects aside the others. Anyway, I\u0027ll improve this using the name of the domain from the other side :)","commit_id":"b13e88fe86f743b0de085c2878092318738d2288"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0493b618d63f4b58b040801c5b654a20f88695ab","unresolved":false,"context_lines":[{"line_number":2245,"context_line":""},{"line_number":2246,"context_line":"        # Creating a sub project that acts as a domain"},{"line_number":2247,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"},{"line_number":2248,"context_line":"        # domain table"},{"line_number":2249,"context_line":"        sub_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2250,"context_line":"                       \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":2251,"context_line":"                       \u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_a3520a67","line":2248,"updated":"2015-07-30 10:56:22.000000000","message":"TODOs really aren\u0027t for keeping reminders of what\u0027s coming in the next patch....This doesn\u0027t help the reviewer at all.","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2ec925580d978a229a21ca2d9fe43fadf713b035","unresolved":false,"context_lines":[{"line_number":2245,"context_line":""},{"line_number":2246,"context_line":"        # Creating a sub project that acts as a domain"},{"line_number":2247,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"},{"line_number":2248,"context_line":"        # domain table"},{"line_number":2249,"context_line":"        sub_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2250,"context_line":"                       \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":2251,"context_line":"                       \u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_945cd8f1","line":2248,"in_reply_to":"3a50d1a3_a3520a67","updated":"2015-07-30 14:52:19.000000000","message":"Done","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0493b618d63f4b58b040801c5b654a20f88695ab","unresolved":false,"context_lines":[{"line_number":2273,"context_line":"        # Creating another regular project with the same name of the existing"},{"line_number":2274,"context_line":"        # in the other domain"},{"line_number":2275,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"},{"line_number":2276,"context_line":"        # domain table"},{"line_number":2277,"context_line":"        sub_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2278,"context_line":"                       \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":2279,"context_line":"                       \u0027name\u0027: sub_project_name,"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_634c02c9","line":2276,"updated":"2015-07-30 10:56:22.000000000","message":"TODOs really aren\u0027t for keeping reminders of what\u0027s coming in the next patch....This doesn\u0027t help the reviewer at all.","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2ec925580d978a229a21ca2d9fe43fadf713b035","unresolved":false,"context_lines":[{"line_number":2273,"context_line":"        # Creating another regular project with the same name of the existing"},{"line_number":2274,"context_line":"        # in the other domain"},{"line_number":2275,"context_line":"        # TODO(htruta): pass project_id as domain_id when operations are off"},{"line_number":2276,"context_line":"        # domain table"},{"line_number":2277,"context_line":"        sub_project \u003d {\u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2278,"context_line":"                       \u0027domain_id\u0027: DEFAULT_DOMAIN_ID,"},{"line_number":2279,"context_line":"                       \u0027name\u0027: sub_project_name,"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_b461d4aa","line":2276,"in_reply_to":"3a50d1a3_634c02c9","updated":"2015-07-30 14:52:19.000000000","message":"Done","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8e9a415f2c05d480dda3a73271b14e42054536e1","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"        self.assertEqual(DEFAULT_DOMAIN_ID, ref[\u0027domain_id\u0027])"},{"line_number":2219,"context_line":""},{"line_number":2220,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2221,"context_line":"    def test_project_name_domain_constraint(self):"},{"line_number":2222,"context_line":"        \"\"\"Tests project name constraints."},{"line_number":2223,"context_line":""},{"line_number":2224,"context_line":"        Check the project name constraints: if its a regular project, we"}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_9d1e1c62","line":2221,"updated":"2015-08-18 16:48:55.000000000","message":"needs a test for regular projects","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4c88686d0dbf0f70ca1439c08947c45b486ce9d5","unresolved":false,"context_lines":[{"line_number":2218,"context_line":"        self.assertEqual(DEFAULT_DOMAIN_ID, ref[\u0027domain_id\u0027])"},{"line_number":2219,"context_line":""},{"line_number":2220,"context_line":"    @tests.skip_if_no_multiple_domains_support"},{"line_number":2221,"context_line":"    def test_project_name_domain_constraint(self):"},{"line_number":2222,"context_line":"        \"\"\"Tests project name constraints."},{"line_number":2223,"context_line":""},{"line_number":2224,"context_line":"        Check the project name constraints: if its a regular project, we"}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_64511a62","line":2221,"in_reply_to":"fa1b9901_9d1e1c62","updated":"2015-08-19 03:42:46.000000000","message":"Done","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8e9a415f2c05d480dda3a73271b14e42054536e1","unresolved":false,"context_lines":[{"line_number":2234,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2235,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2236,"context_line":""},{"line_number":2237,"context_line":"        # Cannot create two projects acting as a domain with the same name"},{"line_number":2238,"context_line":"        new_project \u003d project.copy()"},{"line_number":2239,"context_line":"        new_project[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":2240,"context_line":""}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_a27dfbb2","line":2237,"updated":"2015-08-18 16:48:55.000000000","message":"to really test this you\u0027d need to change the domain_id as well","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4c88686d0dbf0f70ca1439c08947c45b486ce9d5","unresolved":false,"context_lines":[{"line_number":2234,"context_line":"                   \u0027is_domain\u0027: True}"},{"line_number":2235,"context_line":"        self.resource_api.create_project(project[\u0027id\u0027], project)"},{"line_number":2236,"context_line":""},{"line_number":2237,"context_line":"        # Cannot create two projects acting as a domain with the same name"},{"line_number":2238,"context_line":"        new_project \u003d project.copy()"},{"line_number":2239,"context_line":"        new_project[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":2240,"context_line":""}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_24eec2ec","line":2237,"in_reply_to":"fa1b9901_a27dfbb2","updated":"2015-08-19 03:42:46.000000000","message":"Done","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb234eb1d92861dd4c8be3c00e43ad723b08219c","unresolved":false,"context_lines":[{"line_number":2466,"context_line":""},{"line_number":2467,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2468,"context_line":"    def test_project_as_a_domain_uniqueness_constraints(self):"},{"line_number":2469,"context_line":"        \"\"\"Tests project uniqueness for those acting a domains."},{"line_number":2470,"context_line":""},{"line_number":2471,"context_line":"        If it is a project acting as a domain, we can\u0027t have two or more with"},{"line_number":2472,"context_line":"        the same name."}],"source_content_type":"text/x-python","patch_set":141,"id":"9a68dd71_05343748","line":2469,"range":{"start_line":2469,"start_character":54,"end_line":2469,"end_character":55},"updated":"2016-01-26 14:53:51.000000000","message":"nit: as","commit_id":"913e4b8f7bef1163756405477b4e02a537216748"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"009b32ee732961062fd206880ba10b68757c90de","unresolved":false,"context_lines":[{"line_number":2466,"context_line":""},{"line_number":2467,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2468,"context_line":"    def test_project_as_a_domain_uniqueness_constraints(self):"},{"line_number":2469,"context_line":"        \"\"\"Tests project uniqueness for those acting a domains."},{"line_number":2470,"context_line":""},{"line_number":2471,"context_line":"        If it is a project acting as a domain, we can\u0027t have two or more with"},{"line_number":2472,"context_line":"        the same name."}],"source_content_type":"text/x-python","patch_set":141,"id":"9a68dd71_520d0636","line":2469,"range":{"start_line":2469,"start_character":54,"end_line":2469,"end_character":55},"in_reply_to":"9a68dd71_05343748","updated":"2016-01-26 19:23:30.000000000","message":"Done","commit_id":"913e4b8f7bef1163756405477b4e02a537216748"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"eb234eb1d92861dd4c8be3c00e43ad723b08219c","unresolved":false,"context_lines":[{"line_number":2502,"context_line":""},{"line_number":2503,"context_line":"        # Finally, it should be OK to create a project in a domain that has the"},{"line_number":2504,"context_line":"        # same name as one of these acting as a domain."},{"line_number":2505,"context_line":"        project3 \u003d unit.new_project_ref(domain_id\u003dDEFAULT_DOMAIN_ID,"},{"line_number":2506,"context_line":"                                        name\u003dproject2[\u0027name\u0027])"},{"line_number":2507,"context_line":"        self.resource_api.create_project(project3[\u0027id\u0027], project3)"},{"line_number":2508,"context_line":""}],"source_content_type":"text/x-python","patch_set":141,"id":"9a68dd71_0511975d","line":2505,"range":{"start_line":2505,"start_character":5,"end_line":2505,"end_character":67},"updated":"2016-01-26 14:53:51.000000000","message":"we should be able to create this inside project2 (when it\u0027s in fact acting as a domain). I think it is worth to have a comment saying that here","commit_id":"913e4b8f7bef1163756405477b4e02a537216748"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"009b32ee732961062fd206880ba10b68757c90de","unresolved":false,"context_lines":[{"line_number":2502,"context_line":""},{"line_number":2503,"context_line":"        # Finally, it should be OK to create a project in a domain that has the"},{"line_number":2504,"context_line":"        # same name as one of these acting as a domain."},{"line_number":2505,"context_line":"        project3 \u003d unit.new_project_ref(domain_id\u003dDEFAULT_DOMAIN_ID,"},{"line_number":2506,"context_line":"                                        name\u003dproject2[\u0027name\u0027])"},{"line_number":2507,"context_line":"        self.resource_api.create_project(project3[\u0027id\u0027], project3)"},{"line_number":2508,"context_line":""}],"source_content_type":"text/x-python","patch_set":141,"id":"9a68dd71_f212fa57","line":2505,"range":{"start_line":2505,"start_character":5,"end_line":2505,"end_character":67},"in_reply_to":"9a68dd71_0511975d","updated":"2016-01-26 19:23:30.000000000","message":"Done","commit_id":"913e4b8f7bef1163756405477b4e02a537216748"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"6c7e9822f05ea5c9d28e417ba873efcb1ec6916c","unresolved":false,"context_lines":[{"line_number":2615,"context_line":"        # has the matching name."},{"line_number":2616,"context_line":"        # TODO(henry-nash): Once we fully support projects acting as a domain,"},{"line_number":2617,"context_line":"        # add a test here to create a sub-project with a name that matches its"},{"line_number":2618,"context_line":"        # projact acting as a domain"},{"line_number":2619,"context_line":""},{"line_number":2620,"context_line":"    @unit.skip_if_no_multiple_domains_support"},{"line_number":2621,"context_line":"    @test_utils.wip(\u0027waiting for sub projects acting as domains support\u0027)"}],"source_content_type":"text/x-python","patch_set":151,"id":"dae33548_91d94d86","line":2618,"range":{"start_line":2618,"start_character":10,"end_line":2618,"end_character":17},"updated":"2016-02-17 01:09:39.000000000","message":"(nit) project","commit_id":"a3491fc855f70f934bd5f7227fda5732a67c08de"}],"keystone/tests/unit/test_backend_ldap.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a0c75abbfc5727aeeaa2e89667a13c7b147410c9","unresolved":false,"context_lines":[{"line_number":1666,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1669,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1670,"context_line":""},{"line_number":1671,"context_line":"    def test_check_leaf_projects(self):"},{"line_number":1672,"context_line":"        projects \u003d self._assert_create_hierarchy_not_allowed()"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_c7b97130","line":1669,"updated":"2015-04-17 17:35:48.000000000","message":"How is this test any different than the one above?","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":15359,"name":"Erickson Filipe Guedes dos Santos","email":"erickson@lsd.ufcg.edu.br","username":"ericksonfilipe"},"change_message_id":"b3463d83d2e927ca17e6afd52e464020a894f3ce","unresolved":false,"context_lines":[{"line_number":1666,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1669,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1670,"context_line":""},{"line_number":1671,"context_line":"    def test_check_leaf_projects(self):"},{"line_number":1672,"context_line":"        projects \u003d self._assert_create_hierarchy_not_allowed()"}],"source_content_type":"text/x-python","patch_set":41,"id":"7ad32947_71494fd0","line":1669,"in_reply_to":"3ab451fb_72425240","updated":"2015-04-27 17:41:04.000000000","message":"Maybe we could skip once domains are read-only in LDAP.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"45db1e62dc05fefa0088a6af6f9c4acd41dc2bfb","unresolved":false,"context_lines":[{"line_number":1666,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1669,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1670,"context_line":""},{"line_number":1671,"context_line":"    def test_check_leaf_projects(self):"},{"line_number":1672,"context_line":"        projects \u003d self._assert_create_hierarchy_not_allowed()"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_fb5be452","line":1669,"in_reply_to":"3ab451fb_c7b97130","updated":"2015-04-17 19:34:20.000000000","message":"The idea is the same, but I\u0027ll update this test to call the update_project.","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0864b0c2d67edb5ea2394c32f0001cc67556e1cd","unresolved":false,"context_lines":[{"line_number":1666,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1667,"context_line":""},{"line_number":1668,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1669,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1670,"context_line":""},{"line_number":1671,"context_line":"    def test_check_leaf_projects(self):"},{"line_number":1672,"context_line":"        projects \u003d self._assert_create_hierarchy_not_allowed()"}],"source_content_type":"text/x-python","patch_set":41,"id":"3ab451fb_72425240","line":1669,"in_reply_to":"3ab451fb_fb5be452","updated":"2015-04-17 21:08:59.000000000","message":"So this test still needs to be completed?","commit_id":"769a1266c5c33955f8c077d94e3f72286b71bc55"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"a5e3faaf09dd7b8158681756794562409b48a9ec","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"    def test_create_is_domain_project(self):"},{"line_number":1664,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1665,"context_line":""},{"line_number":1666,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1667,"context_line":"        default_domain \u003d self._get_domain_fixture()"},{"line_number":1668,"context_line":"        default_domain[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1669,"context_line":"        self.assertRaises(exception.Forbidden,"}],"source_content_type":"text/x-python","patch_set":58,"id":"ba3cc151_5890a595","line":1666,"updated":"2015-07-07 15:28:31.000000000","message":"This test needs a more descriptive name or a docstring saying why this will fail. Also is \"project_name\" correct? It looks like it modifieds domain_name.","commit_id":"6d7b50fee68e82178fe223c3c5bb9d5446b4549a"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"52b86ea52f6f6e64088506d420896497fa7b5df6","unresolved":false,"context_lines":[{"line_number":1663,"context_line":"    def test_create_is_domain_project(self):"},{"line_number":1664,"context_line":"        self._assert_create_is_domain_project_not_allowed()"},{"line_number":1665,"context_line":""},{"line_number":1666,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1667,"context_line":"        default_domain \u003d self._get_domain_fixture()"},{"line_number":1668,"context_line":"        default_domain[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1669,"context_line":"        self.assertRaises(exception.Forbidden,"}],"source_content_type":"text/x-python","patch_set":58,"id":"ba3cc151_9359d137","line":1666,"in_reply_to":"ba3cc151_5890a595","updated":"2015-07-08 13:33:14.000000000","message":"Yes, the name is correct... is an \"is_doman_project\". I\u0027ll add a docstring","commit_id":"6d7b50fee68e82178fe223c3c5bb9d5446b4549a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3094fdce678acf9d44d781970787ac9e96a5852f","unresolved":false,"context_lines":[{"line_number":1670,"context_line":"        self._assert_create_hierarchy_not_allowed()"},{"line_number":1671,"context_line":""},{"line_number":1672,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1673,"context_line":"        # As domains were, is_domain projects are read-only in LDAP"},{"line_number":1674,"context_line":"        default_domain \u003d self._get_domain_fixture()"},{"line_number":1675,"context_line":"        default_domain[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1676,"context_line":"        self.assertRaises(exception.Forbidden,"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_5bcc0361","line":1673,"updated":"2015-07-31 17:12:31.000000000","message":"not sure I understand \"As domains were..\"?","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8f84272899783fe4e687703cdd4c5cfa06a7df4a","unresolved":false,"context_lines":[{"line_number":1670,"context_line":"        self._assert_create_hierarchy_not_allowed()"},{"line_number":1671,"context_line":""},{"line_number":1672,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1673,"context_line":"        # As domains were, is_domain projects are read-only in LDAP"},{"line_number":1674,"context_line":"        default_domain \u003d self._get_domain_fixture()"},{"line_number":1675,"context_line":"        default_domain[\u0027name\u0027] \u003d uuid.uuid4().hex"},{"line_number":1676,"context_line":"        self.assertRaises(exception.Forbidden,"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_8ab549d1","line":1673,"in_reply_to":"3a50d1a3_5bcc0361","updated":"2015-08-01 00:16:13.000000000","message":"Done. rephrased","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8e9a415f2c05d480dda3a73271b14e42054536e1","unresolved":false,"context_lines":[{"line_number":1673,"context_line":"        self._assert_create_hierarchy_not_allowed()"},{"line_number":1674,"context_line":""},{"line_number":1675,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1676,"context_line":"        # Projects that act as domains are read-only in LDAP, keeping the"},{"line_number":1677,"context_line":"        # domains behavior"},{"line_number":1678,"context_line":"        default_domain \u003d self._get_domain_fixture()"},{"line_number":1679,"context_line":"        default_domain[\u0027name\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_7d78e88f","line":1676,"updated":"2015-08-18 16:48:55.000000000","message":"remove the comma","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4c88686d0dbf0f70ca1439c08947c45b486ce9d5","unresolved":false,"context_lines":[{"line_number":1673,"context_line":"        self._assert_create_hierarchy_not_allowed()"},{"line_number":1674,"context_line":""},{"line_number":1675,"context_line":"    def test_update_is_domain_project_name(self):"},{"line_number":1676,"context_line":"        # Projects that act as domains are read-only in LDAP, keeping the"},{"line_number":1677,"context_line":"        # domains behavior"},{"line_number":1678,"context_line":"        default_domain \u003d self._get_domain_fixture()"},{"line_number":1679,"context_line":"        default_domain[\u0027name\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_245242de","line":1676,"in_reply_to":"fa1b9901_7d78e88f","updated":"2015-08-19 03:42:46.000000000","message":"only if you really want to replace it for a period :P","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"f7abb19802124686c559665583b64631e599eefe","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                   \u0027enabled\u0027: True}"},{"line_number":1653,"context_line":"        project2[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":1654,"context_line":"        project2[\u0027domain_id\u0027] \u003d domain2[\u0027id\u0027]"},{"line_number":1655,"context_line":"        # It is also possible to create in a different domain"},{"line_number":1656,"context_line":"        self.insert_dict(session, \u0027domain\u0027, domain2)"},{"line_number":1657,"context_line":"        self.insert_dict(session, \u0027project\u0027, project2)"},{"line_number":1658,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_507ddde6","line":1655,"updated":"2015-03-10 16:25:16.000000000","message":"I think you forgot to do \"project2[\u0027is_domain\u0027] \u003d project1[\u0027name\u0027]\" here","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"568f863c8f309f94bd4e544cab574b65e2b1ae26","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                   \u0027enabled\u0027: True}"},{"line_number":1653,"context_line":"        project2[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":1654,"context_line":"        project2[\u0027domain_id\u0027] \u003d domain2[\u0027id\u0027]"},{"line_number":1655,"context_line":"        # It is also possible to create in a different domain"},{"line_number":1656,"context_line":"        self.insert_dict(session, \u0027domain\u0027, domain2)"},{"line_number":1657,"context_line":"        self.insert_dict(session, \u0027project\u0027, project2)"},{"line_number":1658,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_26bbd376","line":1655,"in_reply_to":"9a80dd14_13544f20","updated":"2015-03-10 17:01:07.000000000","message":"ah... yes, in the first case we set is_domain to False to test if we can add a project with the same name and domain but with the is_domain property different.\n\nthe second insert is to check if we can create the same project in a different domain (it should succeed).","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c96cae0ccef2d4e2376ed9d99e7f1f63654f3497","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                   \u0027enabled\u0027: True}"},{"line_number":1653,"context_line":"        project2[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":1654,"context_line":"        project2[\u0027domain_id\u0027] \u003d domain2[\u0027id\u0027]"},{"line_number":1655,"context_line":"        # It is also possible to create in a different domain"},{"line_number":1656,"context_line":"        self.insert_dict(session, \u0027domain\u0027, domain2)"},{"line_number":1657,"context_line":"        self.insert_dict(session, \u0027project\u0027, project2)"},{"line_number":1658,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_d3c9d77a","line":1655,"in_reply_to":"9a80dd14_507ddde6","updated":"2015-03-10 16:37:10.000000000","message":"sorry, didn\u0027t get the comment","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"e499efd90b9377d23af66c3b558943725c831130","unresolved":false,"context_lines":[{"line_number":1652,"context_line":"                   \u0027enabled\u0027: True}"},{"line_number":1653,"context_line":"        project2[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":1654,"context_line":"        project2[\u0027domain_id\u0027] \u003d domain2[\u0027id\u0027]"},{"line_number":1655,"context_line":"        # It is also possible to create in a different domain"},{"line_number":1656,"context_line":"        self.insert_dict(session, \u0027domain\u0027, domain2)"},{"line_number":1657,"context_line":"        self.insert_dict(session, \u0027project\u0027, project2)"},{"line_number":1658,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_13544f20","line":1655,"in_reply_to":"9a80dd14_d3c9d77a","updated":"2015-03-10 16:48:13.000000000","message":"on line 1647 you set project2[\u0027is_domain\u0027] to False, try inserting, it succeds. After that you check creating in a different domain. But project2[\u0027is_domain\u0027] is still False here. Is it normal?","commit_id":"ae9f17163bf5d30004ead4bb9c3ef5814884d003"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0493b618d63f4b58b040801c5b654a20f88695ab","unresolved":false,"context_lines":[{"line_number":647,"context_line":"            \u0027parent_id\u0027: None"},{"line_number":648,"context_line":"        }"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        # It is now possible to insert an is_domain project with no domain_id"},{"line_number":651,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"        # And, at backend level, it is possible to insert two projects with"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_43f1c669","line":650,"updated":"2015-07-30 10:56:22.000000000","message":"remove the word \"now\"....this won\u0027t makes sense outside of this patch.","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2ec925580d978a229a21ca2d9fe43fadf713b035","unresolved":false,"context_lines":[{"line_number":647,"context_line":"            \u0027parent_id\u0027: None"},{"line_number":648,"context_line":"        }"},{"line_number":649,"context_line":""},{"line_number":650,"context_line":"        # It is now possible to insert an is_domain project with no domain_id"},{"line_number":651,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"        # And, at backend level, it is possible to insert two projects with"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_d4e58038","line":650,"in_reply_to":"3a50d1a3_43f1c669","updated":"2015-07-30 14:52:19.000000000","message":"Done","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3094fdce678acf9d44d781970787ac9e96a5852f","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        # It is possible to insert an is_domain project with no domain_id"},{"line_number":651,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"        # And, at backend level, it is possible to insert two projects with"},{"line_number":654,"context_line":"        # the same (name, domain_id, is_domain) values"},{"line_number":655,"context_line":"        other_project \u003d {"},{"line_number":656,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_3b2577c1","line":653,"updated":"2015-07-31 17:12:31.000000000","message":"\"backend\" is a bit overused...you don\u0027t mean the keystone backend, you mean, I assume, then the SQL level itself?","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8f84272899783fe4e687703cdd4c5cfa06a7df4a","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        # It is possible to insert an is_domain project with no domain_id"},{"line_number":651,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":652,"context_line":""},{"line_number":653,"context_line":"        # And, at backend level, it is possible to insert two projects with"},{"line_number":654,"context_line":"        # the same (name, domain_id, is_domain) values"},{"line_number":655,"context_line":"        other_project \u003d {"},{"line_number":656,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":83,"id":"3a50d1a3_eabe4dad","line":653,"in_reply_to":"3a50d1a3_3b2577c1","updated":"2015-08-01 00:16:13.000000000","message":"yes, that\u0027s it. done","commit_id":"bf0f168b78bc2f6cb33d0a266d585fff7d627e25"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"da8a66b7fa558218f968ee7a1741bcf12e4da350","unresolved":false,"context_lines":[{"line_number":648,"context_line":"            \u0027parent_id\u0027: None"},{"line_number":649,"context_line":"        }"},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"        # It is possible to insert an is_domain project with no domain_id"},{"line_number":652,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        # At database level, it is possible to insert two projects with"}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_bd8c4080","line":651,"updated":"2015-08-18 16:49:53.000000000","message":"actually, it is possible to insert any kind of project, right?","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"4c88686d0dbf0f70ca1439c08947c45b486ce9d5","unresolved":false,"context_lines":[{"line_number":648,"context_line":"            \u0027parent_id\u0027: None"},{"line_number":649,"context_line":"        }"},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"        # It is possible to insert an is_domain project with no domain_id"},{"line_number":652,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"        # At database level, it is possible to insert two projects with"}],"source_content_type":"text/x-python","patch_set":97,"id":"fa1b9901_0405beba","line":651,"in_reply_to":"fa1b9901_bd8c4080","updated":"2015-08-19 03:42:46.000000000","message":"yeah, right","commit_id":"a64ebcc7a1a05a3694ce85db20c5bc039c069c69"},{"author":{"_account_id":17026,"name":"Sean Perry","email":"sean.perry@hpe.com","username":"sean_perry"},"change_message_id":"19aacb375b695dd9f7957909d6491b8f245618c8","unresolved":false,"context_lines":[{"line_number":680,"context_line":"        # It is possible to insert a project with no domain_id"},{"line_number":681,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"        # At database level, it is possible to insert two projects with"},{"line_number":684,"context_line":"        # the same (name, domain_id, is_domain) values"},{"line_number":685,"context_line":"        other_project \u003d {"},{"line_number":686,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":119,"id":"da85f559_7c85edcc","line":683,"updated":"2015-11-11 21:40:29.000000000","message":"But \u0027other_project\u0027 does not have the same (name, domain_id, is_domain) values as \u0027project\u0027 or any other project because \u0027name\u0027 is a generated UUID.","commit_id":"625b6152de0956e6f37ff59ba75aeee8d56415ad"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"ad7c5d5e6a672b0675f37f2af8c9cabac703dc6f","unresolved":false,"context_lines":[{"line_number":680,"context_line":"        # It is possible to insert a project with no domain_id"},{"line_number":681,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":682,"context_line":""},{"line_number":683,"context_line":"        # At database level, it is possible to insert two projects with"},{"line_number":684,"context_line":"        # the same (name, domain_id, is_domain) values"},{"line_number":685,"context_line":"        other_project \u003d {"},{"line_number":686,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":119,"id":"da85f559_0713c65d","line":683,"in_reply_to":"da85f559_7c85edcc","updated":"2015-11-13 12:57:06.000000000","message":"yes, but we insert it twice, at lines 693 and 695, changing only the id","commit_id":"625b6152de0956e6f37ff59ba75aeee8d56415ad"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4a063cfb09933d4f807cd292fc27099ac9ab7c38","unresolved":false,"context_lines":[{"line_number":850,"context_line":"        session \u003d self.Session()"},{"line_number":851,"context_line":"        project \u003d {"},{"line_number":852,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":853,"context_line":"            \u0027domain_id\u0027: None,"},{"line_number":854,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":855,"context_line":"            \u0027domain_id\u0027: uuid.uuid4().hex,"},{"line_number":856,"context_line":"            \u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":129,"id":"fa69d971_763f4087","line":853,"range":{"start_line":853,"start_character":12,"end_line":853,"end_character":30},"updated":"2016-01-11 21:39:40.000000000","message":"this is duplicated in this dict","commit_id":"6647f2184dd57bfec0755ca85e2fdd43e4bb53fc"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a48af62cf2ff2249f99f91b30475ddfa6ce554ec","unresolved":false,"context_lines":[{"line_number":850,"context_line":"        session \u003d self.Session()"},{"line_number":851,"context_line":"        project \u003d {"},{"line_number":852,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":853,"context_line":"            \u0027domain_id\u0027: None,"},{"line_number":854,"context_line":"            \u0027is_domain\u0027: True,"},{"line_number":855,"context_line":"            \u0027domain_id\u0027: uuid.uuid4().hex,"},{"line_number":856,"context_line":"            \u0027name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":129,"id":"da6ed579_d1bc2f08","line":853,"range":{"start_line":853,"start_character":12,"end_line":853,"end_character":30},"in_reply_to":"fa69d971_763f4087","updated":"2016-01-14 03:02:08.000000000","message":"Done","commit_id":"6647f2184dd57bfec0755ca85e2fdd43e4bb53fc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"4a063cfb09933d4f807cd292fc27099ac9ab7c38","unresolved":false,"context_lines":[{"line_number":858,"context_line":"        }"},{"line_number":859,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        # It is now possible to insert 2 projects with the same name, inside"},{"line_number":862,"context_line":"        # the same domain, if their is_domain attribute differ."},{"line_number":863,"context_line":"        other_project \u003d {"},{"line_number":864,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":865,"context_line":"            \u0027domain_id\u0027: project[\u0027domain_id\u0027],"}],"source_content_type":"text/x-python","patch_set":129,"id":"fa69d971_969af460","line":862,"range":{"start_line":861,"start_character":10,"end_line":862,"end_character":63},"updated":"2016-01-11 21:39:40.000000000","message":"If we haven\u0027t updated the constraints for sqlite, I\u0027m actually confused as to why this works....","commit_id":"6647f2184dd57bfec0755ca85e2fdd43e4bb53fc"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"a48af62cf2ff2249f99f91b30475ddfa6ce554ec","unresolved":false,"context_lines":[{"line_number":858,"context_line":"        }"},{"line_number":859,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        # It is now possible to insert 2 projects with the same name, inside"},{"line_number":862,"context_line":"        # the same domain, if their is_domain attribute differ."},{"line_number":863,"context_line":"        other_project \u003d {"},{"line_number":864,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":865,"context_line":"            \u0027domain_id\u0027: project[\u0027domain_id\u0027],"}],"source_content_type":"text/x-python","patch_set":129,"id":"da6ed579_b13e5b8a","line":862,"range":{"start_line":861,"start_character":10,"end_line":862,"end_character":63},"in_reply_to":"fa69d971_969af460","updated":"2016-01-14 03:02:08.000000000","message":"We did update it the unique constraint in sqlite, we only didn\u0027t touch the FKs. But now, looks like the FKs are working too","commit_id":"6647f2184dd57bfec0755ca85e2fdd43e4bb53fc"}],"keystone/tests/unit/test_v2_controller.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"1e9589855e654afd214481a1d4b436f82e00133b","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        refs \u003d self.tenant_controller.get_all_projects(_ADMIN_CONTEXT)"},{"line_number":155,"context_line":"        projects \u003d refs.get(\u0027tenants\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        for project in projects:"},{"line_number":158,"context_line":"            self.assertFalse(project.get(\u0027is_domain\u0027))"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_85fb81c0","line":157,"updated":"2015-07-29 15:21:26.000000000","message":"I think it\u0027s not a good way to test that there are no is_domain projects. I suggest to compare projects with an empty list. It would show more clearly that no is_domain projects make their way here.","commit_id":"b13e88fe86f743b0de085c2878092318738d2288"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6a5610cca61a5dba3699c903db8dc5e6d076fc88","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        refs \u003d self.tenant_controller.get_all_projects(_ADMIN_CONTEXT)"},{"line_number":155,"context_line":"        projects \u003d refs.get(\u0027tenants\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        for project in projects:"},{"line_number":158,"context_line":"            self.assertFalse(project.get(\u0027is_domain\u0027))"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_16922c4c","line":157,"in_reply_to":"3a50d1a3_85fb81c0","updated":"2015-07-30 03:35:02.000000000","message":"Actually, I don\u0027t think so. We only need to iterate once in the list and we don\u0027t have a proper method to extract only the is_domain projects","commit_id":"b13e88fe86f743b0de085c2878092318738d2288"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"01a4a9562c9eb40cf5b87f6e1c088d28ad4bb18b","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        projects \u003d refs.get(\u0027tenants\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        for project in projects:"},{"line_number":158,"context_line":"            self.assertFalse(project.get(\u0027is_domain\u0027))"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_37663f2a","line":158,"updated":"2015-07-30 07:24:58.000000000","message":"projects (tenants) in v2 won\u0027t have a is_domain field, it will be filtered.\n\nAlso, I believe these tests should be in the previous patch","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2ec925580d978a229a21ca2d9fe43fadf713b035","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        projects \u003d refs.get(\u0027tenants\u0027)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        for project in projects:"},{"line_number":158,"context_line":"            self.assertFalse(project.get(\u0027is_domain\u0027))"}],"source_content_type":"text/x-python","patch_set":80,"id":"3a50d1a3_745b4cf7","line":158,"in_reply_to":"3a50d1a3_37663f2a","updated":"2015-07-30 14:52:19.000000000","message":"fixed in previous patch","commit_id":"9c3937e9996e23e368154df0eecb9e3b895fd8a2"}],"keystone/tests/unit/test_v3.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98e6540df7a278336147d3a73f8d419ec22b307d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            else:"},{"line_number":54,"context_line":"                scope_data[\u0027project\u0027][\u0027name\u0027] \u003d project_name"},{"line_number":55,"context_line":"                if is_domain is not None:"},{"line_number":56,"context_line":"                    scope_data[\u0027project\u0027][\u0027is_domain\u0027] \u003d is_domain"},{"line_number":57,"context_line":"                if project_domain_id or project_domain_name:"},{"line_number":58,"context_line":"                    project_domain_json \u003d {}"},{"line_number":59,"context_line":"                    if project_domain_id:"}],"source_content_type":"text/x-python","patch_set":57,"id":"ba3cc151_fb120809","line":56,"updated":"2015-07-04 17:25:57.000000000","message":"I don\u0027t think we support this is now, do we?","commit_id":"1ed3d8ba9a8bb69d2e912062f90c99594e8b0769"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"58d281f3cf6caef86faddb2e2ebde2df049cae66","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            else:"},{"line_number":54,"context_line":"                scope_data[\u0027project\u0027][\u0027name\u0027] \u003d project_name"},{"line_number":55,"context_line":"                if is_domain is not None:"},{"line_number":56,"context_line":"                    scope_data[\u0027project\u0027][\u0027is_domain\u0027] \u003d is_domain"},{"line_number":57,"context_line":"                if project_domain_id or project_domain_name:"},{"line_number":58,"context_line":"                    project_domain_json \u003d {}"},{"line_number":59,"context_line":"                    if project_domain_id:"}],"source_content_type":"text/x-python","patch_set":57,"id":"ba3cc151_2bf8f47b","line":56,"in_reply_to":"ba3cc151_fb120809","updated":"2015-07-06 20:18:09.000000000","message":"no, we don\u0027t. I\u0027ll remove this","commit_id":"1ed3d8ba9a8bb69d2e912062f90c99594e8b0769"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1bf7aa35812f9c02f0ceb8a887486bffd2db3ca1","unresolved":false,"context_lines":[{"line_number":829,"context_line":""},{"line_number":830,"context_line":"    @test_utils.wip(\u0027domain operations still look at domain table\u0027)"},{"line_number":831,"context_line":"    def test_list_project_is_domain(self):"},{"line_number":832,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?is_domain\u003dTrue/False``. \"\"\""},{"line_number":833,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2,"},{"line_number":834,"context_line":"                                                   is_domain\u003dTrue)"},{"line_number":835,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_90ea07ab","line":832,"updated":"2015-06-09 15:31:08.000000000","message":"not sure that is the List url....","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ec601befb07531fd7b6a512da390db148e6dc72b","unresolved":false,"context_lines":[{"line_number":829,"context_line":""},{"line_number":830,"context_line":"    @test_utils.wip(\u0027domain operations still look at domain table\u0027)"},{"line_number":831,"context_line":"    def test_list_project_is_domain(self):"},{"line_number":832,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?is_domain\u003dTrue/False``. \"\"\""},{"line_number":833,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2,"},{"line_number":834,"context_line":"                                                   is_domain\u003dTrue)"},{"line_number":835,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_32a3539f","line":832,"in_reply_to":"3afb71cf_90ea07ab","updated":"2015-06-09 17:22:20.000000000","message":"you\u0027re right.","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1bf7aa35812f9c02f0ceb8a887486bffd2db3ca1","unresolved":false,"context_lines":[{"line_number":860,"context_line":"        # The number of projects where is_domain\u003dFalse is the amount created"},{"line_number":861,"context_line":"        # in this test plus 2 pre-existing ones."},{"line_number":862,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), 6)"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"    def test_get_project_with_subtree_as_ids(self):"},{"line_number":865,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?subtree_as_ids``."},{"line_number":866,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_d08f5f28","line":863,"updated":"2015-06-09 15:31:08.000000000","message":"Should we also be checking that if you don\u0027t specify is_domain in the list call, that it defaults to False (just like the auth scope)...since otherwise when domains become projects, you\u0027ll get an extra project in the list (I\u0027m kind of assuming that we don\u0027t want that to happen - but maybe I\u0027m wrong)?","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ec601befb07531fd7b6a512da390db148e6dc72b","unresolved":false,"context_lines":[{"line_number":860,"context_line":"        # The number of projects where is_domain\u003dFalse is the amount created"},{"line_number":861,"context_line":"        # in this test plus 2 pre-existing ones."},{"line_number":862,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), 6)"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"    def test_get_project_with_subtree_as_ids(self):"},{"line_number":865,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?subtree_as_ids``."},{"line_number":866,"context_line":""}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_f2d6dbef","line":863,"in_reply_to":"3afb71cf_d08f5f28","updated":"2015-06-09 17:22:20.000000000","message":"I agree, I\u0027ll add this behavior in the test.","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98e6540df7a278336147d3a73f8d419ec22b307d","unresolved":false,"context_lines":[{"line_number":858,"context_line":"                     expected_status\u003d200)"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"        # The number of projects where is_domain\u003dFalse is the amount created"},{"line_number":861,"context_line":"        # in this test plus 2 pre-existing ones."},{"line_number":862,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), 6)"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        # If is_domain information is not provided, only the is_domain\u003dFalse"}],"source_content_type":"text/x-python","patch_set":57,"id":"ba3cc151_bbf560cc","line":861,"updated":"2015-07-04 17:25:57.000000000","message":"rather than assume there are 2 existing ones, it would be better to list projects initially to find out how many there are then add that number to 4 in the test below.  This make the test more robust.","commit_id":"1ed3d8ba9a8bb69d2e912062f90c99594e8b0769"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"58d281f3cf6caef86faddb2e2ebde2df049cae66","unresolved":false,"context_lines":[{"line_number":858,"context_line":"                     expected_status\u003d200)"},{"line_number":859,"context_line":""},{"line_number":860,"context_line":"        # The number of projects where is_domain\u003dFalse is the amount created"},{"line_number":861,"context_line":"        # in this test plus 2 pre-existing ones."},{"line_number":862,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), 6)"},{"line_number":863,"context_line":""},{"line_number":864,"context_line":"        # If is_domain information is not provided, only the is_domain\u003dFalse"}],"source_content_type":"text/x-python","patch_set":57,"id":"ba3cc151_5a1f3c5b","line":861,"in_reply_to":"ba3cc151_bbf560cc","updated":"2015-07-06 20:18:09.000000000","message":"Done","commit_id":"1ed3d8ba9a8bb69d2e912062f90c99594e8b0769"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"98e6540df7a278336147d3a73f8d419ec22b307d","unresolved":false,"context_lines":[{"line_number":865,"context_line":"        # projects are returned"},{"line_number":866,"context_line":"        r \u003d self.get(\u0027/projects\u0027, expected_status\u003d200)"},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), 6)"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"    def test_get_project_with_subtree_as_ids(self):"},{"line_number":871,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?subtree_as_ids``."}],"source_content_type":"text/x-python","patch_set":57,"id":"ba3cc151_5b0214b6","line":868,"updated":"2015-07-04 17:25:57.000000000","message":"likewise","commit_id":"1ed3d8ba9a8bb69d2e912062f90c99594e8b0769"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"58d281f3cf6caef86faddb2e2ebde2df049cae66","unresolved":false,"context_lines":[{"line_number":865,"context_line":"        # projects are returned"},{"line_number":866,"context_line":"        r \u003d self.get(\u0027/projects\u0027, expected_status\u003d200)"},{"line_number":867,"context_line":""},{"line_number":868,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), 6)"},{"line_number":869,"context_line":""},{"line_number":870,"context_line":"    def test_get_project_with_subtree_as_ids(self):"},{"line_number":871,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?subtree_as_ids``."}],"source_content_type":"text/x-python","patch_set":57,"id":"ba3cc151_1a3a14ce","line":868,"in_reply_to":"ba3cc151_5b0214b6","updated":"2015-07-06 20:18:09.000000000","message":"Done","commit_id":"1ed3d8ba9a8bb69d2e912062f90c99594e8b0769"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"92efc964333cdeabc285009c2781fe4efb8f6dd8","unresolved":false,"context_lines":[{"line_number":893,"context_line":""},{"line_number":894,"context_line":"        \"\"\""},{"line_number":895,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2,"},{"line_number":896,"context_line":"                                                   is_domain\u003dFalse)"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        # Add another child to projects[0] - it will be projects[3]"},{"line_number":899,"context_line":"        new_ref \u003d self.new_project_ref("}],"source_content_type":"text/x-python","patch_set":59,"id":"ba3cc151_573c59e0","line":896,"updated":"2015-07-09 11:23:43.000000000","message":"isn\u0027t False the default already?","commit_id":"601803cf4ed1b5d17c38da26212dc4f46ff1e1d7"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"1dba2adcc89b05f50c629aed35f646062ced2203","unresolved":false,"context_lines":[{"line_number":893,"context_line":""},{"line_number":894,"context_line":"        \"\"\""},{"line_number":895,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2,"},{"line_number":896,"context_line":"                                                   is_domain\u003dFalse)"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        # Add another child to projects[0] - it will be projects[3]"},{"line_number":899,"context_line":"        new_ref \u003d self.new_project_ref("}],"source_content_type":"text/x-python","patch_set":59,"id":"ba3cc151_42e9d5e4","line":896,"in_reply_to":"ba3cc151_573c59e0","updated":"2015-07-09 22:47:04.000000000","message":"Done","commit_id":"601803cf4ed1b5d17c38da26212dc4f46ff1e1d7"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"1e9589855e654afd214481a1d4b436f82e00133b","unresolved":false,"context_lines":[{"line_number":618,"context_line":"                \u0027project_id\u0027: self.project_id})"},{"line_number":619,"context_line":"        self.assertValidProjectResponse(r, self.project)"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def test_get_project_with_parents_as_list_with_invalid_id(self):"},{"line_number":622,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?parents_as_list``.\"\"\""},{"line_number":623,"context_line":"        self.get(\u0027/projects/%(project_id)s?parents_as_list\u0027 % {"},{"line_number":624,"context_line":"                 \u0027project_id\u0027: None}, expected_status\u003d404)"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_85a5c1a2","side":"PARENT","line":621,"updated":"2015-07-29 15:21:26.000000000","message":"wow. Where did these calls go?","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"6a5610cca61a5dba3699c903db8dc5e6d076fc88","unresolved":false,"context_lines":[{"line_number":618,"context_line":"                \u0027project_id\u0027: self.project_id})"},{"line_number":619,"context_line":"        self.assertValidProjectResponse(r, self.project)"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"    def test_get_project_with_parents_as_list_with_invalid_id(self):"},{"line_number":622,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?parents_as_list``.\"\"\""},{"line_number":623,"context_line":"        self.get(\u0027/projects/%(project_id)s?parents_as_list\u0027 % {"},{"line_number":624,"context_line":"                 \u0027project_id\u0027: None}, expected_status\u003d404)"}],"source_content_type":"text/x-python","patch_set":79,"id":"3a50d1a3_035c2def","side":"PARENT","line":621,"in_reply_to":"3a50d1a3_85a5c1a2","updated":"2015-07-30 03:35:02.000000000","message":"that\u0027s a good question. it should\u0027ve been some wrong rebase. Done","commit_id":"b3c1933bcf0b439e063151d4eee9bdbac3dc2cb9"}],"keystone/tests/unit/test_v3_auth.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1bf7aa35812f9c02f0ceb8a887486bffd2db3ca1","unresolved":false,"context_lines":[{"line_number":2181,"context_line":"        self.assertValidDomainScopedTokenResponse(r)"},{"line_number":2182,"context_line":""},{"line_number":2183,"context_line":"    # TODO(raildo): Include the test for is_domain true when the"},{"line_number":2184,"context_line":"    # domain operations be replicated to Project Table."},{"line_number":2185,"context_line":"    def test_project_name_scoped_token_with_is_domain_false(self):"},{"line_number":2186,"context_line":"        path \u003d \u0027/projects/%s/users/%s/roles/%s\u0027 % ("},{"line_number":2187,"context_line":"            self.project[\u0027id\u0027], self.user[\u0027id\u0027], self.role[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_70fb0b7a","line":2184,"updated":"2015-06-09 15:31:08.000000000","message":"nit: s/be replicated/are replicated/","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ec601befb07531fd7b6a512da390db148e6dc72b","unresolved":false,"context_lines":[{"line_number":2181,"context_line":"        self.assertValidDomainScopedTokenResponse(r)"},{"line_number":2182,"context_line":""},{"line_number":2183,"context_line":"    # TODO(raildo): Include the test for is_domain true when the"},{"line_number":2184,"context_line":"    # domain operations be replicated to Project Table."},{"line_number":2185,"context_line":"    def test_project_name_scoped_token_with_is_domain_false(self):"},{"line_number":2186,"context_line":"        path \u003d \u0027/projects/%s/users/%s/roles/%s\u0027 % ("},{"line_number":2187,"context_line":"            self.project[\u0027id\u0027], self.user[\u0027id\u0027], self.role[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":54,"id":"3afb71cf_32f8f37a","line":2184,"in_reply_to":"3afb71cf_70fb0b7a","updated":"2015-06-09 17:22:20.000000000","message":"Done","commit_id":"fb4a42985aefd00952a43d655287dc1e65896fda"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"05bbe4b0ea2d91be384b0a48a77a0e4784f7645b","unresolved":false,"context_lines":[{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"        # TODO(rodrigods): use project1[\u0027id\u0027] as domain_id"},{"line_number":2212,"context_line":"        project2 \u003d self.new_project_ref(self.domain[\u0027id\u0027],"},{"line_number":2213,"context_line":"                                        parent_id\u003dproject1[\u0027id\u0027],"},{"line_number":2214,"context_line":"                                        is_domain\u003dFalse)"},{"line_number":2215,"context_line":"        project2[\u0027name\u0027] \u003d name"},{"line_number":2216,"context_line":"        self.resource_api.create_project(project2[\u0027id\u0027], project2)"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_7da4deb8","line":2213,"updated":"2015-07-23 08:42:21.000000000","message":"not sure this is the right test....isn\u0027t the clash between two projects at the same \"level\" one acting as a domain and one not (since the parent is NOT in the same domain as the children)?","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"8671ba05d61f0f0fb0907af52d70fc0d63e04a90","unresolved":false,"context_lines":[{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"        # TODO(rodrigods): use project1[\u0027id\u0027] as domain_id"},{"line_number":2212,"context_line":"        project2 \u003d self.new_project_ref(self.domain[\u0027id\u0027],"},{"line_number":2213,"context_line":"                                        parent_id\u003dproject1[\u0027id\u0027],"},{"line_number":2214,"context_line":"                                        is_domain\u003dFalse)"},{"line_number":2215,"context_line":"        project2[\u0027name\u0027] \u003d name"},{"line_number":2216,"context_line":"        self.resource_api.create_project(project2[\u0027id\u0027], project2)"}],"source_content_type":"text/x-python","patch_set":74,"id":"3a50d1a3_121b3582","line":2213,"in_reply_to":"3a50d1a3_7da4deb8","updated":"2015-07-23 14:05:01.000000000","message":"Yes, you\u0027re right. Done","commit_id":"64789860bff594f34ad23d9c9c9de7e845be5874"}]}
