)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"b979687580eba7e0c9ab2a178309a5afe852084c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"List projects filtering by is_domain flag"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch adds the ability to filter project by is_domain flag."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Ia53f73e578834c191d04ede2b76a104c29b14678"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba7be1f8_0c63fbb1","line":10,"updated":"2015-02-23 18:48:11.000000000","message":"Partially-Implements: bp reseller","commit_id":"978e2acec3121178873343e6252633b9dffac7f8"}],"keystone/resource/controllers.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"89fd5cdb928cb7c908e6ee651b4f2f0fb482f19d","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"},{"line_number":228,"context_line":"                                \u0027parent_id\u0027, \u0027is_domain\u0027)"},{"line_number":229,"context_line":"    def list_projects(self, context, filters):"},{"line_number":230,"context_line":"        hints \u003d ProjectV3.build_driver_hints(context, filters)"},{"line_number":231,"context_line":"        refs \u003d self.resource_api.list_projects(hints\u003dhints)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da9b358b_510977dc","line":228,"updated":"2015-03-31 09:20:52.000000000","message":"This is not going to work with the current LDAP driver support, which assumes there is only one type of boolean, the \"enabled\" attribute.  We\u0027ll need to fix that (or, if we really are deprecating the LDAP assignment backend, we need to make it clear in the doc somewhere that you can\u0027t use this filter with an LDAP backend)","commit_id":"b041018eebe445ab713ca352cb6a6611add9c9ac"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"1fe37bc5fbcdf243148fffe7f5c5338a069f455d","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"},{"line_number":228,"context_line":"                                \u0027parent_id\u0027, \u0027is_domain\u0027)"},{"line_number":229,"context_line":"    def list_projects(self, context, filters):"},{"line_number":230,"context_line":"        hints \u003d ProjectV3.build_driver_hints(context, filters)"},{"line_number":231,"context_line":"        refs \u003d self.resource_api.list_projects(hints\u003dhints)"}],"source_content_type":"text/x-python","patch_set":17,"id":"9aa53dc9_8cc5ab3d","line":228,"in_reply_to":"baa041b7_03a85a1e","updated":"2015-04-07 20:35:35.000000000","message":"In the previous patch https://review.openstack.org/#/c/157427/42/keystone/resource/backends/ldap.py\n\nlist_projects() - line 98 call:\n _set_default_attributes() - line 88 and then call:\nset_default_is_domain_project() - line 63\n\nWe are treating this case there, so for LDAP this flag will be False in all cases.","commit_id":"b041018eebe445ab713ca352cb6a6611add9c9ac"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ac2125859673d9c1e881d2bf91ad5f8d2eb5d5a0","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"},{"line_number":228,"context_line":"                                \u0027parent_id\u0027, \u0027is_domain\u0027)"},{"line_number":229,"context_line":"    def list_projects(self, context, filters):"},{"line_number":230,"context_line":"        hints \u003d ProjectV3.build_driver_hints(context, filters)"},{"line_number":231,"context_line":"        refs \u003d self.resource_api.list_projects(hints\u003dhints)"}],"source_content_type":"text/x-python","patch_set":17,"id":"da9b358b_756455e4","line":228,"in_reply_to":"da9b358b_510977dc","updated":"2015-03-31 15:56:14.000000000","message":"LDAP doesn\u0027t support is_domain\u003dTrue, and we already have treat this case in this previous patch: https://review.openstack.org/#/c/157427/37/keystone/resource/backends/ldap.py\n\nSo, we need to do some validation here?","commit_id":"b041018eebe445ab713ca352cb6a6611add9c9ac"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0f46c5009cecd857c4e4f1e690203ecad08ae75f","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        return ProjectV3.wrap_member(context, ref)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    @controller.filterprotected(\u0027domain_id\u0027, \u0027enabled\u0027, \u0027name\u0027,"},{"line_number":228,"context_line":"                                \u0027parent_id\u0027, \u0027is_domain\u0027)"},{"line_number":229,"context_line":"    def list_projects(self, context, filters):"},{"line_number":230,"context_line":"        hints \u003d ProjectV3.build_driver_hints(context, filters)"},{"line_number":231,"context_line":"        refs \u003d self.resource_api.list_projects(hints\u003dhints)"}],"source_content_type":"text/x-python","patch_set":17,"id":"baa041b7_03a85a1e","line":228,"in_reply_to":"da9b358b_756455e4","updated":"2015-04-02 17:22:54.000000000","message":"So you may need to fix something in the ldap resource driver that looks in the hints and if the is_domain is specified it handles it specially?","commit_id":"b041018eebe445ab713ca352cb6a6611add9c9ac"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"cd32af5310aeed4cc2429ee0ee7965ffb988ea47","unresolved":false,"context_lines":[{"line_number":252,"context_line":"    def list_projects(self, context, filters):"},{"line_number":253,"context_line":"        hints \u003d ProjectV3.build_driver_hints(context, filters)"},{"line_number":254,"context_line":"        # If \u0027is_domain\u0027 has not been included as a query, we default it to"},{"line_number":255,"context_line":"        # False (which in query terms means \u00270\u0027"},{"line_number":256,"context_line":"        if \u0027is_domain\u0027 not in context[\u0027query_string\u0027]:"},{"line_number":257,"context_line":"            hints.add_filter(\u0027is_domain\u0027, \u00270\u0027)"},{"line_number":258,"context_line":"        refs \u003d self.resource_api.list_projects(hints\u003dhints)"}],"source_content_type":"text/x-python","patch_set":52,"id":"3a57f1b5_f847e01a","line":255,"updated":"2016-02-11 16:00:06.000000000","message":"It\u0027s also possible to simply use False boolean, but may be addressed in a followup patch","commit_id":"469bdb761258226f5de330fe15c4989ba5000ae5"}],"keystone/resource/core.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"110ccddfc50978779c657f855f85d393549461a7","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":106,"context_line":"                                 \u0027branch containing a disabled \u0027"},{"line_number":107,"context_line":"                                 \u0027project: %s\u0027) % ref[\u0027id\u0027])"},{"line_number":108,"context_line":"                if not ref.get(\u0027is_domain\u0027) and tenant.get(\u0027is_domain\u0027):"},{"line_number":109,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":110,"context_line":"                        action\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":111,"context_line":"                                 \u0027feature different from its parents.\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_54d7f84a","line":108,"updated":"2015-02-24 23:21:03.000000000","message":"Can you explain a little about why adding a filter needs to change what we consider a valid project?","commit_id":"abe8d2dc7ddd2fde0cd0e5157427e11dc8bfcb99"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c02205ee7f9b24a574e85efe5d9d450e34e04a38","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":106,"context_line":"                                 \u0027branch containing a disabled \u0027"},{"line_number":107,"context_line":"                                 \u0027project: %s\u0027) % ref[\u0027id\u0027])"},{"line_number":108,"context_line":"                if not ref.get(\u0027is_domain\u0027) and tenant.get(\u0027is_domain\u0027):"},{"line_number":109,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":110,"context_line":"                        action\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":111,"context_line":"                                 \u0027feature different from its parents.\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_c73786fd","line":108,"in_reply_to":"ba7be1f8_30e357a5","updated":"2015-02-26 00:39:38.000000000","message":"I think makes sense to add this constraint to the previous patch, will do it.","commit_id":"abe8d2dc7ddd2fde0cd0e5157427e11dc8bfcb99"},{"author":{"_account_id":8932,"name":"Telles Mota Vidal Nóbrega","email":"tellesnobrega@gmail.com","username":"tellesnobrega"},"change_message_id":"5fddd371737a9cedb8224d7488c867cc7228fb4a","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":106,"context_line":"                                 \u0027branch containing a disabled \u0027"},{"line_number":107,"context_line":"                                 \u0027project: %s\u0027) % ref[\u0027id\u0027])"},{"line_number":108,"context_line":"                if not ref.get(\u0027is_domain\u0027) and tenant.get(\u0027is_domain\u0027):"},{"line_number":109,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":110,"context_line":"                        action\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":111,"context_line":"                                 \u0027feature different from its parents.\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_30e357a5","line":108,"in_reply_to":"ba7be1f8_54d7f84a","updated":"2015-02-25 13:33:05.000000000","message":"We needed to change this to allow the creation of a project where the flag is_domain is False as a children of a project where the flag is true. The previous constraint allowed only projects to have the same setting of the flag is_domain as their parent.","commit_id":"abe8d2dc7ddd2fde0cd0e5157427e11dc8bfcb99"},{"author":{"_account_id":8932,"name":"Telles Mota Vidal Nóbrega","email":"tellesnobrega@gmail.com","username":"tellesnobrega"},"change_message_id":"49eee33d56e6b32c91bd0541ce237e54fbd228d2","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                        action\u003d_(\u0027cannot create a project in a \u0027"},{"line_number":106,"context_line":"                                 \u0027branch containing a disabled \u0027"},{"line_number":107,"context_line":"                                 \u0027project: %s\u0027) % ref[\u0027id\u0027])"},{"line_number":108,"context_line":"                if not ref.get(\u0027is_domain\u0027) and tenant.get(\u0027is_domain\u0027):"},{"line_number":109,"context_line":"                    raise exception.ForbiddenAction("},{"line_number":110,"context_line":"                        action\u003d_(\u0027cannot create a project with the domain \u0027"},{"line_number":111,"context_line":"                                 \u0027feature different from its parents.\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba7be1f8_394f9435","line":108,"in_reply_to":"ba7be1f8_c73786fd","updated":"2015-02-26 11:29:41.000000000","message":"Sure","commit_id":"abe8d2dc7ddd2fde0cd0e5157427e11dc8bfcb99"}],"keystone/tests/unit/test_v3_assignment.py":[{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"65c58dc992753e4dd76c75af9e02c639d07143fa","unresolved":false,"context_lines":[{"line_number":693,"context_line":"        # projects[2] has no child, projects_result must be an empty list"},{"line_number":694,"context_line":"        self.assertEqual(expected_list, projects_result)"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"    def _add_project_to_hierarchy(self, parent_id, domain_id\u003dNone,"},{"line_number":697,"context_line":"                                  is_domain\u003dFalse):"},{"line_number":698,"context_line":"        new_ref \u003d self.new_project_ref("},{"line_number":699,"context_line":"            domain_id\u003ddomain_id if not is_domain else None,"}],"source_content_type":"text/x-python","patch_set":23,"id":"1aca2d91_61fed839","line":696,"updated":"2015-05-07 17:26:24.000000000","message":"seems this method would be more useful if it also return the object created?\n\n\nOtherwise, this method is seems like more of  _assert_add_project_to_hierarchy()","commit_id":"cdd2f7545e21c64b611b1964be117fced211f08f"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"d000df7e36af036e54f1cfc88cba7fcb20b30e42","unresolved":false,"context_lines":[{"line_number":693,"context_line":"        # projects[2] has no child, projects_result must be an empty list"},{"line_number":694,"context_line":"        self.assertEqual(expected_list, projects_result)"},{"line_number":695,"context_line":""},{"line_number":696,"context_line":"    def _add_project_to_hierarchy(self, parent_id, domain_id\u003dNone,"},{"line_number":697,"context_line":"                                  is_domain\u003dFalse):"},{"line_number":698,"context_line":"        new_ref \u003d self.new_project_ref("},{"line_number":699,"context_line":"            domain_id\u003ddomain_id if not is_domain else None,"}],"source_content_type":"text/x-python","patch_set":23,"id":"1aca2d91_3c1b631d","line":696,"in_reply_to":"1aca2d91_61fed839","updated":"2015-05-07 20:05:56.000000000","message":"Done","commit_id":"cdd2f7545e21c64b611b1964be117fced211f08f"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"65c58dc992753e4dd76c75af9e02c639d07143fa","unresolved":false,"context_lines":[{"line_number":696,"context_line":"    def _add_project_to_hierarchy(self, parent_id, domain_id\u003dNone,"},{"line_number":697,"context_line":"                                  is_domain\u003dFalse):"},{"line_number":698,"context_line":"        new_ref \u003d self.new_project_ref("},{"line_number":699,"context_line":"            domain_id\u003ddomain_id if not is_domain else None,"},{"line_number":700,"context_line":"            parent_id\u003dparent_id,"},{"line_number":701,"context_line":"            is_domain\u003dis_domain)"},{"line_number":702,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1aca2d91_611c9813","line":699,"updated":"2015-05-07 17:26:24.000000000","message":"nit: easier to read positive check. Would prefer to swap the condition:\n\n\"None if is_domain else domain_id\"","commit_id":"cdd2f7545e21c64b611b1964be117fced211f08f"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"d000df7e36af036e54f1cfc88cba7fcb20b30e42","unresolved":false,"context_lines":[{"line_number":696,"context_line":"    def _add_project_to_hierarchy(self, parent_id, domain_id\u003dNone,"},{"line_number":697,"context_line":"                                  is_domain\u003dFalse):"},{"line_number":698,"context_line":"        new_ref \u003d self.new_project_ref("},{"line_number":699,"context_line":"            domain_id\u003ddomain_id if not is_domain else None,"},{"line_number":700,"context_line":"            parent_id\u003dparent_id,"},{"line_number":701,"context_line":"            is_domain\u003dis_domain)"},{"line_number":702,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"1aca2d91_1c1667f1","line":699,"in_reply_to":"1aca2d91_611c9813","updated":"2015-05-07 20:05:56.000000000","message":"Done","commit_id":"cdd2f7545e21c64b611b1964be117fced211f08f"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"65c58dc992753e4dd76c75af9e02c639d07143fa","unresolved":false,"context_lines":[{"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":""},{"line_number":834,"context_line":"        \"\"\""},{"line_number":835,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2,"},{"line_number":836,"context_line":"                                                   is_domain\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1aca2d91_61cdb85c","line":833,"updated":"2015-05-07 17:26:24.000000000","message":"nit: This violates: H405  multi line docstring summary not separated with an empty line\n\nNot sure if we want to add more violation.","commit_id":"cdd2f7545e21c64b611b1964be117fced211f08f"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"d000df7e36af036e54f1cfc88cba7fcb20b30e42","unresolved":false,"context_lines":[{"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":""},{"line_number":834,"context_line":"        \"\"\""},{"line_number":835,"context_line":"        projects \u003d self._create_projects_hierarchy(hierarchy_size\u003d2,"},{"line_number":836,"context_line":"                                                   is_domain\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1aca2d91_cfe02efd","line":833,"in_reply_to":"1aca2d91_61cdb85c","updated":"2015-05-07 20:05:56.000000000","message":"Done","commit_id":"cdd2f7545e21c64b611b1964be117fced211f08f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"eeb60d1ffb23382dd15f4aa16df24b682ad09541","unresolved":false,"context_lines":[{"line_number":876,"context_line":""},{"line_number":877,"context_line":"        # The number of projects where is_domain\u003dFalse is the amount created"},{"line_number":878,"context_line":"        # in this test plus 2 pre-existing ones."},{"line_number":879,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), 6)"},{"line_number":880,"context_line":""},{"line_number":881,"context_line":"    def test_get_project_with_subtree_as_ids(self):"},{"line_number":882,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?subtree_as_ids``."}],"source_content_type":"text/x-python","patch_set":29,"id":"9a41bdd9_d211e005","line":879,"updated":"2015-07-17 23:24:00.000000000","message":"better to read the number of existing projects before we do this and add 4 to it....makes the test more robust....","commit_id":"431efac2bcbe1ce451cf3ea9d0b5fa2762ce6858"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"7f9060b0133906323d272661fa28b456643b40b0","unresolved":false,"context_lines":[{"line_number":876,"context_line":""},{"line_number":877,"context_line":"        # The number of projects where is_domain\u003dFalse is the amount created"},{"line_number":878,"context_line":"        # in this test plus 2 pre-existing ones."},{"line_number":879,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), 6)"},{"line_number":880,"context_line":""},{"line_number":881,"context_line":"    def test_get_project_with_subtree_as_ids(self):"},{"line_number":882,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?subtree_as_ids``."}],"source_content_type":"text/x-python","patch_set":29,"id":"3a50d1a3_501afc6f","line":879,"in_reply_to":"9a41bdd9_d211e005","updated":"2015-07-19 02:58:12.000000000","message":"Done","commit_id":"431efac2bcbe1ce451cf3ea9d0b5fa2762ce6858"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dd3df645b85cea19c84baa0c584dc1a86eb31335","unresolved":false,"context_lines":[{"line_number":844,"context_line":"                \u0027project_id\u0027: projects[1][\u0027project\u0027][\u0027id\u0027]},"},{"line_number":845,"context_line":"            expected_status\u003d400)"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"    @test_utils.wip(\u0027domain operations still look at domain table\u0027)"},{"line_number":848,"context_line":"    def test_list_project_is_domain(self):"},{"line_number":849,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?is_domain\u003dTrue/False``. \"\"\""},{"line_number":850,"context_line":"        # Getting the initial amount of is_domain\u003dTrue and is_domain\u003dFalse"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a50d1a3_91c16683","line":847,"updated":"2015-07-19 10:11:52.000000000","message":"doesn\u0027t this mean that if the test fails it is skipped? If so, not sure that\u0027s what we want here.","commit_id":"75ea1402abffbd8d31c9afcfbb7589b8cdeb2462"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"192764ba2f198a6061b2ffd253bd307da867cc81","unresolved":false,"context_lines":[{"line_number":844,"context_line":"                \u0027project_id\u0027: projects[1][\u0027project\u0027][\u0027id\u0027]},"},{"line_number":845,"context_line":"            expected_status\u003d400)"},{"line_number":846,"context_line":""},{"line_number":847,"context_line":"    @test_utils.wip(\u0027domain operations still look at domain table\u0027)"},{"line_number":848,"context_line":"    def test_list_project_is_domain(self):"},{"line_number":849,"context_line":"        \"\"\"Call ``GET /projects/{project_id}?is_domain\u003dTrue/False``. \"\"\""},{"line_number":850,"context_line":"        # Getting the initial amount of is_domain\u003dTrue and is_domain\u003dFalse"}],"source_content_type":"text/x-python","patch_set":30,"id":"3a50d1a3_57c42b3f","line":847,"in_reply_to":"3a50d1a3_91c16683","updated":"2015-07-19 19:29:45.000000000","message":"yes, it does. that\u0027s because the hierarchy using is_domain projects is not totally implemented at this point. It\u0027ll just happen at the \"honor operations\" patch where the migration of domains to the project table will be done. The right thing to do might be moving this patch do be dependent on the \u0027honor\u0027 one","commit_id":"75ea1402abffbd8d31c9afcfbb7589b8cdeb2462"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"95e57f271a8888f9fac0bb90fbbd94a3c96c3aa6","unresolved":false,"context_lines":[{"line_number":842,"context_line":"        # Getting the initial amount or is_domain\u003dTrue and is_domain\u003dFalse"},{"line_number":843,"context_line":"        # projects."},{"line_number":844,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":845,"context_line":"        is_domain_true_len \u003d len(r.result[\u0027projects\u0027])"},{"line_number":846,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dFalse\u0027, expected_status\u003d200)"},{"line_number":847,"context_line":"        is_domain_false_len \u003d len(r.result[\u0027projects\u0027])"},{"line_number":848,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_dd3ff585","line":845,"updated":"2015-07-24 07:15:19.000000000","message":"maybe _len isn\u0027t a good suffix....maybe \"initial_number_is_domain_true\"?","commit_id":"074fb6d5b46e2afad0932e8a554545c989c7bc6a"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"3c0bdf1fc56280eaab2a2c988497032308ab1e4c","unresolved":false,"context_lines":[{"line_number":842,"context_line":"        # Getting the initial amount or is_domain\u003dTrue and is_domain\u003dFalse"},{"line_number":843,"context_line":"        # projects."},{"line_number":844,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":845,"context_line":"        is_domain_true_len \u003d len(r.result[\u0027projects\u0027])"},{"line_number":846,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dFalse\u0027, expected_status\u003d200)"},{"line_number":847,"context_line":"        is_domain_false_len \u003d len(r.result[\u0027projects\u0027])"},{"line_number":848,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_facc09bd","line":845,"in_reply_to":"3a50d1a3_dd3ff585","updated":"2015-07-25 03:43:28.000000000","message":"Done","commit_id":"074fb6d5b46e2afad0932e8a554545c989c7bc6a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"95e57f271a8888f9fac0bb90fbbd94a3c96c3aa6","unresolved":false,"context_lines":[{"line_number":851,"context_line":"            is_domain\u003dTrue)"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        # The method above is supposed to create four is_domain\u003dTrue projects"},{"line_number":854,"context_line":"        # for the beggining, resulting in the hierarchy A-\u003eB-\u003eC:"},{"line_number":855,"context_line":"        # We now have 3 more is_domain projects the is_domain default project."},{"line_number":856,"context_line":"        is_domain_true_len \u003d is_domain_true_len + 3"},{"line_number":857,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_5de68545","line":854,"updated":"2015-07-24 07:15:19.000000000","message":"beginning?","commit_id":"074fb6d5b46e2afad0932e8a554545c989c7bc6a"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"3c0bdf1fc56280eaab2a2c988497032308ab1e4c","unresolved":false,"context_lines":[{"line_number":851,"context_line":"            is_domain\u003dTrue)"},{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        # The method above is supposed to create four is_domain\u003dTrue projects"},{"line_number":854,"context_line":"        # for the beggining, resulting in the hierarchy A-\u003eB-\u003eC:"},{"line_number":855,"context_line":"        # We now have 3 more is_domain projects the is_domain default project."},{"line_number":856,"context_line":"        is_domain_true_len \u003d is_domain_true_len + 3"},{"line_number":857,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_babf61fb","line":854,"in_reply_to":"3a50d1a3_5de68545","updated":"2015-07-25 03:43:28.000000000","message":"Done","commit_id":"074fb6d5b46e2afad0932e8a554545c989c7bc6a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"95e57f271a8888f9fac0bb90fbbd94a3c96c3aa6","unresolved":false,"context_lines":[{"line_number":852,"context_line":""},{"line_number":853,"context_line":"        # The method above is supposed to create four is_domain\u003dTrue projects"},{"line_number":854,"context_line":"        # for the beggining, resulting in the hierarchy A-\u003eB-\u003eC:"},{"line_number":855,"context_line":"        # We now have 3 more is_domain projects the is_domain default project."},{"line_number":856,"context_line":"        is_domain_true_len \u003d is_domain_true_len + 3"},{"line_number":857,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":858,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), is_domain_true_len)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_1dcf9db4","line":855,"updated":"2015-07-24 07:15:19.000000000","message":"not sure I understand this line","commit_id":"074fb6d5b46e2afad0932e8a554545c989c7bc6a"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"3c0bdf1fc56280eaab2a2c988497032308ab1e4c","unresolved":false,"context_lines":[{"line_number":853,"context_line":"        # The method above is supposed to create four is_domain\u003dTrue projects"},{"line_number":854,"context_line":"        # for the beggining, resulting in the hierarchy A-\u003eB-\u003eC:"},{"line_number":855,"context_line":"        # We now have 3 more is_domain projects the is_domain default project."},{"line_number":856,"context_line":"        is_domain_true_len \u003d is_domain_true_len + 3"},{"line_number":857,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":858,"context_line":"        self.assertEqual(len(r.result[\u0027projects\u0027]), is_domain_true_len)"},{"line_number":859,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"3a50d1a3_1a3775b1","line":856,"updated":"2015-07-25 03:43:28.000000000","message":"I forgot a \"plus\" before \"the is_domain default project\" :P will rephrase it","commit_id":"074fb6d5b46e2afad0932e8a554545c989c7bc6a"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"0fb07d7dc8cb4545594222ebd71045d12038c303","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        \"\"\"Call ``GET /projects?is_domain\u003dTrue/False``. \"\"\""},{"line_number":858,"context_line":"        # Getting the initial amount or is_domain\u003dTrue and is_domain\u003dFalse"},{"line_number":859,"context_line":"        # projects."},{"line_number":860,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":861,"context_line":"        initial_number_is_domain_true \u003d len(r.result[\u0027projects\u0027])"},{"line_number":862,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dFalse\u0027, expected_status\u003d200)"},{"line_number":863,"context_line":"        initial_number_is_domain_false \u003d len(r.result[\u0027projects\u0027])"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a4dcd0f_eee1e2ff","line":860,"updated":"2015-08-03 17:48:21.000000000","message":"The test should be much simpler than this, you just need to check that this call returns *only* projects with the is_domain flag set to true\n\nThe same applies to is_domain\u003dFalse call below\n\nYou can than add more projects and check if they return in the correct call, doesn\u0027t need to compare the size of the returned list","commit_id":"0901e1e907aac1dab5c4f378a30740176228a2ca"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"2865ec38dddc7195c1327babc239d225d2910b47","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        \"\"\"Call ``GET /projects?is_domain\u003dTrue/False``. \"\"\""},{"line_number":858,"context_line":"        # Getting the initial amount or is_domain\u003dTrue and is_domain\u003dFalse"},{"line_number":859,"context_line":"        # projects."},{"line_number":860,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":861,"context_line":"        initial_number_is_domain_true \u003d len(r.result[\u0027projects\u0027])"},{"line_number":862,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dFalse\u0027, expected_status\u003d200)"},{"line_number":863,"context_line":"        initial_number_is_domain_false \u003d len(r.result[\u0027projects\u0027])"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a4dcd0f_062f2ea2","line":860,"in_reply_to":"1a4dcd0f_5d9da908","updated":"2015-08-10 10:43:56.000000000","message":"@Brant, the client needs to check if the body of the response matches the query parameters in the URL (if they were valid) - so this means we are following REST.\n\n@Henrique, I mean, if you are testing if the result contains all projects you\u0027ve created, do you really need to validate if it is returning a different number of projects in subsequent calls? Also, why do we need to test GET /projects without the flag (last part of this test)? Don\u0027t we have a test for it?","commit_id":"0901e1e907aac1dab5c4f378a30740176228a2ca"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"565310e4efa8cb61536fe52d152aecc47b047ace","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        \"\"\"Call ``GET /projects?is_domain\u003dTrue/False``. \"\"\""},{"line_number":858,"context_line":"        # Getting the initial amount or is_domain\u003dTrue and is_domain\u003dFalse"},{"line_number":859,"context_line":"        # projects."},{"line_number":860,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":861,"context_line":"        initial_number_is_domain_true \u003d len(r.result[\u0027projects\u0027])"},{"line_number":862,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dFalse\u0027, expected_status\u003d200)"},{"line_number":863,"context_line":"        initial_number_is_domain_false \u003d len(r.result[\u0027projects\u0027])"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a4dcd0f_5d9da908","line":860,"in_reply_to":"1a4dcd0f_8e3ffe24","updated":"2015-08-05 17:51:31.000000000","message":"@Rodrigo, the checking of the initial length of projects was suggested by Henry in patch set 29. It really made the test more robust","commit_id":"0901e1e907aac1dab5c4f378a30740176228a2ca"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"811297112e801d1c077aff08060337710142eb18","unresolved":false,"context_lines":[{"line_number":857,"context_line":"        \"\"\"Call ``GET /projects?is_domain\u003dTrue/False``. \"\"\""},{"line_number":858,"context_line":"        # Getting the initial amount or is_domain\u003dTrue and is_domain\u003dFalse"},{"line_number":859,"context_line":"        # projects."},{"line_number":860,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":861,"context_line":"        initial_number_is_domain_true \u003d len(r.result[\u0027projects\u0027])"},{"line_number":862,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dFalse\u0027, expected_status\u003d200)"},{"line_number":863,"context_line":"        initial_number_is_domain_false \u003d len(r.result[\u0027projects\u0027])"}],"source_content_type":"text/x-python","patch_set":36,"id":"1a4dcd0f_8e3ffe24","line":860,"in_reply_to":"1a4dcd0f_eee1e2ff","updated":"2015-08-03 17:56:26.000000000","message":"Server responses are stubbed out, so client tests can\u0027t verify that the server returns only projects with is_domain set to true. All the client tests can do is verify that the client works correctly, in this case setting ?is_domain\u003dTrue on the request URL and parsing the results. The rest of the testing is only complicating things.","commit_id":"0901e1e907aac1dab5c4f378a30740176228a2ca"}],"keystone/tests/unit/test_v3_resource.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c8b51fc9749e93ed0fff5c987d52d1ee50897bf6","unresolved":false,"context_lines":[{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    def test_list_project_is_domain_filter(self):"},{"line_number":906,"context_line":"        \"\"\"Call ``GET /projects?is_domain\u003dTrue/False``.\"\"\""},{"line_number":907,"context_line":"        # Get the initial number of projects, both acting as a domain as well"},{"line_number":908,"context_line":"        # as regular."},{"line_number":909,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":910,"context_line":"        initial_number_is_domain_true \u003d len(r.result[\u0027projects\u0027])"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_56ec99f2","line":907,"updated":"2016-02-05 20:41:48.000000000","message":"Testing the number is a very weak test in my opinion. Why are you not just getting the response and making sure it contains what is expected? There is a lot of code here and I don\u0027t see the value.","commit_id":"19ad933e301e689484c75f6fe28ef5f8a23324e2"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"3316830a3cd54895a463c3106039e1d14502e570","unresolved":false,"context_lines":[{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    def test_list_project_is_domain_filter(self):"},{"line_number":906,"context_line":"        \"\"\"Call ``GET /projects?is_domain\u003dTrue/False``.\"\"\""},{"line_number":907,"context_line":"        # Get the initial number of projects, both acting as a domain as well"},{"line_number":908,"context_line":"        # as regular."},{"line_number":909,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":910,"context_line":"        initial_number_is_domain_true \u003d len(r.result[\u0027projects\u0027])"}],"source_content_type":"text/x-python","patch_set":51,"id":"5a5ae5dd_57a46906","line":907,"in_reply_to":"5a5ae5dd_56ec99f2","updated":"2016-02-08 10:31:47.000000000","message":"So for the projects this test adds, we do (see lines 924-929 for example). Here, I\u0027m just making this test is resilient to whatever data that may be created by init of the rest case test methods (so if it changes, this test doesn\u0027t break)","commit_id":"19ad933e301e689484c75f6fe28ef5f8a23324e2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"bee3692a62db86d122a0c4482eeaf4aef6a2b58e","unresolved":false,"context_lines":[{"line_number":921,"context_line":"        number_is_domain_true \u003d initial_number_is_domain_true + 2"},{"line_number":922,"context_line":""},{"line_number":923,"context_line":"        r \u003d self.get(\u0027/projects?is_domain\u003dTrue\u0027, expected_status\u003d200)"},{"line_number":924,"context_line":"        self.assertThat(r.result[\u0027projects\u0027],"},{"line_number":925,"context_line":"                        matchers.HasLength(number_is_domain_true))"},{"line_number":926,"context_line":"        self.assertIn(new_is_domain_project[\u0027id\u0027],"},{"line_number":927,"context_line":"                      [p[\u0027id\u0027] for p in r.result[\u0027projects\u0027]])"},{"line_number":928,"context_line":"        self.assertIn(new_is_domain_project2[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":55,"id":"dae33548_a25a454e","line":925,"range":{"start_line":924,"start_character":0,"end_line":925,"end_character":66},"updated":"2016-02-16 22:55:31.000000000","message":"don\u0027t like the length approach, but I can see why is being used in this test since an arbitrary number of is_domain projects is returned in the first calls that comes from the fixtures","commit_id":"e2f1bfa9a475f35c718463b0b83af553f84cbf2a"}]}
