)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"9e8d19e21781123b945f3426772815995a6f5cb3","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implied roles API tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implied roles is a feature added recently to keystone. It enables the"},{"line_number":10,"context_line":"possibility to have roles implying another roles, this avoids the need"},{"line_number":11,"context_line":"to add specific role assignments to each action a user can take. For"},{"line_number":12,"context_line":"example: if we had the \"admin\" role implying the \"member\" role, we"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"1a430d35_7638bdd3","line":9,"range":{"start_line":9,"start_character":33,"end_line":9,"end_character":41},"updated":"2017-02-09 03:47:35.000000000","message":"Can we know which version this feature has been implemented since? Defcore is using Tempest for older version clouds than our gating. So the version could be helpful for them.","commit_id":"ca3b39d6d9b036f1eb03d9d5bda0832ec4faffd3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5b3ac3e3b2e648672839669b8cb73fff0a4cac2c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implied roles API tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implied roles is a feature added recently to keystone. It enables the"},{"line_number":10,"context_line":"possibility to have roles implying another roles, this avoids the need"},{"line_number":11,"context_line":"to add specific role assignments to each action a user can take. For"},{"line_number":12,"context_line":"example: if we had the \"admin\" role implying the \"member\" role, we"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"fa31d9ce_1ee76fe5","line":9,"range":{"start_line":9,"start_character":33,"end_line":9,"end_character":41},"in_reply_to":"1a430d35_7638bdd3","updated":"2017-02-10 06:53:48.000000000","message":"seems like from Mitaka.","commit_id":"ca3b39d6d9b036f1eb03d9d5bda0832ec4faffd3"}],"tempest/api/identity/admin/v3/test_roles.py":[{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"84e7c771b9a040c2cc02d16d6f98dbf7105d205e","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def resource_setup(cls):"},{"line_number":26,"context_line":"        super(RolesV3TestJSON, cls).resource_setup()"},{"line_number":27,"context_line":"        cls.roles \u003d list()"},{"line_number":28,"context_line":"        for _ in range(4):"},{"line_number":29,"context_line":"            role_name \u003d data_utils.rand_name(name\u003d\u0027role\u0027)"},{"line_number":30,"context_line":"            role \u003d cls.roles_client.create_role(name\u003drole_name)[\u0027role\u0027]"},{"line_number":31,"context_line":"            cls.roles.append(role)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a430d35_005f1473","line":28,"range":{"start_line":28,"start_character":23,"end_line":28,"end_character":24},"updated":"2017-02-03 03:41:06.000000000","message":"why 4?","commit_id":"9dcf8844a316c643f89db4e2726f48a4211e40ad"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"37c86a390c0d3f6ba3753f20036addc113eb6664","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def resource_setup(cls):"},{"line_number":26,"context_line":"        super(RolesV3TestJSON, cls).resource_setup()"},{"line_number":27,"context_line":"        cls.roles \u003d list()"},{"line_number":28,"context_line":"        for _ in range(4):"},{"line_number":29,"context_line":"            role_name \u003d data_utils.rand_name(name\u003d\u0027role\u0027)"},{"line_number":30,"context_line":"            role \u003d cls.roles_client.create_role(name\u003drole_name)[\u0027role\u0027]"},{"line_number":31,"context_line":"            cls.roles.append(role)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a430d35_a63e49b6","line":28,"range":{"start_line":28,"start_character":23,"end_line":28,"end_character":24},"in_reply_to":"1a430d35_005f1473","updated":"2017-02-03 13:19:45.000000000","message":"I was intending to use 4 roles in \"test_roles_hierarchy\", it doesn\u0027t look necessary anymore.","commit_id":"9dcf8844a316c643f89db4e2726f48a4211e40ad"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"2ae5d0e7fc3b7e439887625df91b81f99e79e36d","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            self.roles_client.delete_role_from_user_on_project,"},{"line_number":269,"context_line":"            self.project[\u0027id\u0027], self.user_body[\u0027id\u0027], self.roles[0][\u0027id\u0027])"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        # Create an inference rule from \"roles[0]\" to \"roles[1]\""},{"line_number":272,"context_line":"        self.roles_client.create_role_inference_rule("},{"line_number":273,"context_line":"            self.roles[0][\u0027id\u0027], self.roles[1][\u0027id\u0027])"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        # In the effective list of role assignments, both prior role and"},{"line_number":276,"context_line":"        # implied role should be present. This means that a user can"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_abaa8a17","line":273,"range":{"start_line":271,"start_character":7,"end_line":273,"end_character":53},"updated":"2017-02-03 16:45:20.000000000","message":"Does this get cleaned up?  Also, in general I\u0027d prefer a private method for creating these that creates and adds cleanup.  It helps avoid cases where someone accidentally forgets to put an addCleanup, and it makes the code much easier to read without the multi-line addCleanups constantly breaking adding extra pointless space.","commit_id":"cc31153f30c55449f74edabd5b624ff51fb9e36f"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"feaa9c6c012cece0cc5ae1c840e9f3772ae3bfd5","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            self.roles_client.delete_role_from_user_on_project,"},{"line_number":269,"context_line":"            self.project[\u0027id\u0027], self.user_body[\u0027id\u0027], self.roles[0][\u0027id\u0027])"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        # Create an inference rule from \"roles[0]\" to \"roles[1]\""},{"line_number":272,"context_line":"        self.roles_client.create_role_inference_rule("},{"line_number":273,"context_line":"            self.roles[0][\u0027id\u0027], self.roles[1][\u0027id\u0027])"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        # In the effective list of role assignments, both prior role and"},{"line_number":276,"context_line":"        # implied role should be present. This means that a user can"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_e24907d2","line":273,"range":{"start_line":271,"start_character":7,"end_line":273,"end_character":53},"in_reply_to":"1a430d35_42a65bc2","updated":"2017-02-03 23:06:39.000000000","message":"Right, my worry is if the test fails.  If for example an assert fails, the test exists and line 292 is never called.  This is why we put the addCleanup with test_utils.call_and_ignore_notfound_exc in test cases where the resource is expected to be deleted.  This will add the resource deletion to a stack of things to be done after a test ends.  In the ideal case, the resource is already gone and we get a 404.  In the negative case, the test ends before line 292 and during cleanUp the resource is deleted.","commit_id":"cc31153f30c55449f74edabd5b624ff51fb9e36f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"3c76c671b415eb38c5f7171611a3a918dc658394","unresolved":false,"context_lines":[{"line_number":268,"context_line":"            self.roles_client.delete_role_from_user_on_project,"},{"line_number":269,"context_line":"            self.project[\u0027id\u0027], self.user_body[\u0027id\u0027], self.roles[0][\u0027id\u0027])"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        # Create an inference rule from \"roles[0]\" to \"roles[1]\""},{"line_number":272,"context_line":"        self.roles_client.create_role_inference_rule("},{"line_number":273,"context_line":"            self.roles[0][\u0027id\u0027], self.roles[1][\u0027id\u0027])"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"        # In the effective list of role assignments, both prior role and"},{"line_number":276,"context_line":"        # implied role should be present. This means that a user can"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a430d35_42a65bc2","line":273,"range":{"start_line":271,"start_character":7,"end_line":273,"end_character":53},"in_reply_to":"1a430d35_abaa8a17","updated":"2017-02-03 22:58:57.000000000","message":"yes, see line 292. The whole point of this test is check the role assignments before and after creating/deleting an inference rule.","commit_id":"cc31153f30c55449f74edabd5b624ff51fb9e36f"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"fcc52b7b3da9d3e6725d00f4de6b06258a25169a","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                             ignore_not_found\u003dFalse):"},{"line_number":203,"context_line":"        self.roles_client.create_role_inference_rule("},{"line_number":204,"context_line":"            prior_role_id, implies_role_id)"},{"line_number":205,"context_line":"        if ignore_not_found:"},{"line_number":206,"context_line":"            self.addCleanup("},{"line_number":207,"context_line":"                test_utils.call_and_ignore_notfound_exc,"},{"line_number":208,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":209,"context_line":"                prior_role_id,"},{"line_number":210,"context_line":"                implies_role_id)"},{"line_number":211,"context_line":"        else:"},{"line_number":212,"context_line":"            self.addCleanup("},{"line_number":213,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":214,"context_line":"                prior_role_id,"},{"line_number":215,"context_line":"                implies_role_id)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027c90c316c-d706-4728-bcba-eb1912081b69\u0027)"},{"line_number":218,"context_line":"    def test_implied_roles_create_delete(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a430d35_3a4694bf","line":215,"range":{"start_line":205,"start_character":8,"end_line":215,"end_character":32},"updated":"2017-02-06 18:26:53.000000000","message":"This is interesting.  Is there ever a case where raising an error on a 404 NotFound during cleanup is a good thing?","commit_id":"97b2fec53942b006b26217a8e6c0811fa94984c2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"d8755e0f3c63a5e869cbbed73d448c5098ec27e6","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                             ignore_not_found\u003dFalse):"},{"line_number":203,"context_line":"        self.roles_client.create_role_inference_rule("},{"line_number":204,"context_line":"            prior_role_id, implies_role_id)"},{"line_number":205,"context_line":"        if ignore_not_found:"},{"line_number":206,"context_line":"            self.addCleanup("},{"line_number":207,"context_line":"                test_utils.call_and_ignore_notfound_exc,"},{"line_number":208,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":209,"context_line":"                prior_role_id,"},{"line_number":210,"context_line":"                implies_role_id)"},{"line_number":211,"context_line":"        else:"},{"line_number":212,"context_line":"            self.addCleanup("},{"line_number":213,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":214,"context_line":"                prior_role_id,"},{"line_number":215,"context_line":"                implies_role_id)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027c90c316c-d706-4728-bcba-eb1912081b69\u0027)"},{"line_number":218,"context_line":"    def test_implied_roles_create_delete(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a430d35_b997f18e","line":215,"range":{"start_line":205,"start_character":8,"end_line":215,"end_character":32},"in_reply_to":"1a430d35_3a4694bf","updated":"2017-02-06 19:03:36.000000000","message":"only in tests where we are supposed to delete the entry prior the cleanUp. Check the test below, for example: it creates the implied role at line 228 and deletes it at line 236, in this case, the cleanUp will fail with a 404, so we want to ignore it.","commit_id":"97b2fec53942b006b26217a8e6c0811fa94984c2"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"996594bf3f8789665ac1d394de5e1d38158babc0","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                             ignore_not_found\u003dFalse):"},{"line_number":203,"context_line":"        self.roles_client.create_role_inference_rule("},{"line_number":204,"context_line":"            prior_role_id, implies_role_id)"},{"line_number":205,"context_line":"        if ignore_not_found:"},{"line_number":206,"context_line":"            self.addCleanup("},{"line_number":207,"context_line":"                test_utils.call_and_ignore_notfound_exc,"},{"line_number":208,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":209,"context_line":"                prior_role_id,"},{"line_number":210,"context_line":"                implies_role_id)"},{"line_number":211,"context_line":"        else:"},{"line_number":212,"context_line":"            self.addCleanup("},{"line_number":213,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":214,"context_line":"                prior_role_id,"},{"line_number":215,"context_line":"                implies_role_id)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027c90c316c-d706-4728-bcba-eb1912081b69\u0027)"},{"line_number":218,"context_line":"    def test_implied_roles_create_delete(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a430d35_f9aed983","line":215,"range":{"start_line":205,"start_character":8,"end_line":215,"end_character":32},"in_reply_to":"1a430d35_b997f18e","updated":"2017-02-06 19:15:21.000000000","message":"Good point.","commit_id":"97b2fec53942b006b26217a8e6c0811fa94984c2"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"996594bf3f8789665ac1d394de5e1d38158babc0","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027c90c316c-d706-4728-bcba-eb1912081b69\u0027)"},{"line_number":218,"context_line":"    def test_implied_roles_create_delete(self):"},{"line_number":219,"context_line":"        prior_role_id \u003d self.roles_client.create_role("},{"line_number":220,"context_line":"            name\u003ddata_utils.rand_name(\u0027prior_role\u0027))[\u0027role\u0027][\u0027id\u0027]"},{"line_number":221,"context_line":"        self.addCleanup(self.roles_client.delete_role, prior_role_id)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        implies_role_id \u003d self.roles_client.create_role("},{"line_number":224,"context_line":"            name\u003ddata_utils.rand_name(\u0027implies_role\u0027))[\u0027role\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a430d35_b996114a","line":221,"range":{"start_line":219,"start_character":8,"end_line":221,"end_character":69},"updated":"2017-02-06 19:15:21.000000000","message":"The BaseIdentityTest already has a setup_test_role method that does this same thing.  Might be a good idea to use that instead of directly calling the client.","commit_id":"97b2fec53942b006b26217a8e6c0811fa94984c2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c6be8a6ec1be2a2d4f2793c1d58171c452f768c5","unresolved":false,"context_lines":[{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027c90c316c-d706-4728-bcba-eb1912081b69\u0027)"},{"line_number":218,"context_line":"    def test_implied_roles_create_delete(self):"},{"line_number":219,"context_line":"        prior_role_id \u003d self.roles_client.create_role("},{"line_number":220,"context_line":"            name\u003ddata_utils.rand_name(\u0027prior_role\u0027))[\u0027role\u0027][\u0027id\u0027]"},{"line_number":221,"context_line":"        self.addCleanup(self.roles_client.delete_role, prior_role_id)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        implies_role_id \u003d self.roles_client.create_role("},{"line_number":224,"context_line":"            name\u003ddata_utils.rand_name(\u0027implies_role\u0027))[\u0027role\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a430d35_96e4a0e1","line":221,"range":{"start_line":219,"start_character":8,"end_line":221,"end_character":69},"in_reply_to":"1a430d35_b996114a","updated":"2017-02-07 13:49:00.000000000","message":"thanks, figured out that we don\u0027t need to create new roles, just use the fixtures from the class","commit_id":"97b2fec53942b006b26217a8e6c0811fa94984c2"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"996594bf3f8789665ac1d394de5e1d38158babc0","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            name\u003ddata_utils.rand_name(\u0027prior_role\u0027))[\u0027role\u0027][\u0027id\u0027]"},{"line_number":221,"context_line":"        self.addCleanup(self.roles_client.delete_role, prior_role_id)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        implies_role_id \u003d self.roles_client.create_role("},{"line_number":224,"context_line":"            name\u003ddata_utils.rand_name(\u0027implies_role\u0027))[\u0027role\u0027][\u0027id\u0027]"},{"line_number":225,"context_line":"        self.addCleanup(self.roles_client.delete_role, implies_role_id)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"        # Create an inference rule from prior_role to implies_role"},{"line_number":228,"context_line":"        self._create_implied_role(prior_role_id, implies_role_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a430d35_199c8568","line":225,"range":{"start_line":223,"start_character":8,"end_line":225,"end_character":71},"updated":"2017-02-06 19:15:21.000000000","message":"see above","commit_id":"97b2fec53942b006b26217a8e6c0811fa94984c2"},{"author":{"_account_id":6167,"name":"Ken\u0027ichi Ohmichi","email":"ken1ohmichi@gmail.com","username":"oomichi"},"change_message_id":"9e8d19e21781123b945f3426772815995a6f5cb3","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":209,"context_line":"                prior_role_id,"},{"line_number":210,"context_line":"                implies_role_id)"},{"line_number":211,"context_line":"        else:"},{"line_number":212,"context_line":"            self.addCleanup("},{"line_number":213,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":214,"context_line":"                prior_role_id,"},{"line_number":215,"context_line":"                implies_role_id)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027c90c316c-d706-4728-bcba-eb1912081b69\u0027)"},{"line_number":218,"context_line":"    def test_implied_roles_create_delete(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a430d35_f60aedd0","line":215,"range":{"start_line":211,"start_character":0,"end_line":215,"end_character":32},"updated":"2017-02-09 03:47:35.000000000","message":"I guess it is enough to implement call_and_ignore_notfound_exc case only without this code for simple code like the other tests for long-maintenance.","commit_id":"ca3b39d6d9b036f1eb03d9d5bda0832ec4faffd3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5b3ac3e3b2e648672839669b8cb73fff0a4cac2c","unresolved":false,"context_lines":[{"line_number":208,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":209,"context_line":"                prior_role_id,"},{"line_number":210,"context_line":"                implies_role_id)"},{"line_number":211,"context_line":"        else:"},{"line_number":212,"context_line":"            self.addCleanup("},{"line_number":213,"context_line":"                self.roles_client.delete_role_inference_rule,"},{"line_number":214,"context_line":"                prior_role_id,"},{"line_number":215,"context_line":"                implies_role_id)"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    @decorators.idempotent_id(\u0027c90c316c-d706-4728-bcba-eb1912081b69\u0027)"},{"line_number":218,"context_line":"    def test_implied_roles_create_delete(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"fa31d9ce_bec5835c","line":215,"range":{"start_line":211,"start_character":0,"end_line":215,"end_character":32},"in_reply_to":"1a430d35_f60aedd0","updated":"2017-02-10 06:53:48.000000000","message":"yes, agree. but let\u0027s do it in follow up as cleanup","commit_id":"ca3b39d6d9b036f1eb03d9d5bda0832ec4faffd3"}]}
