)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"3c203a0c738a5003817f0ee7432609a15e117eba","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Pradeep Kumar \u003cpk5294@att.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2017-04-10 23:58:19 +0530"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"wqKeystone v3 tests for endpoint filters for projects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Tests for Keystone v3 for rbac for endpoint filters for projects"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"bff0334d_7bf6bf65","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":2},"updated":"2017-04-10 18:59:29.000000000","message":"Typo.","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"b4040d5a0d861697bd86d0aed21f623a3b32eacc","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Co-Authored-By: Pradeep Kumar \u003cpk5294@att.com\u003e"},{"line_number":13,"context_line":"Co-Authored-By: Kaustav Royburman \u003ckr336r@att.com\u003e"},{"line_number":14,"context_line":"Co-Authored-By: Nicolas Helgeson \u003cnh202b@att.com\u003e"},{"line_number":15,"context_line":"Related-Change: https://review.openstack.org/#/c/447188/"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"bff0334d_96334e14","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":56},"updated":"2017-04-12 14:48:25.000000000","message":"Please change this to \"Depends-On: (change ID)\"","commit_id":"0c3940d07799c116c92ca7177a1cb7f7acba7e5d"}],"patrole_tempest_plugin/tests/api/identity/v3/test_endpoint_filter_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"758038938e38318bf8ebecb3f42fccf90aa976ab","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    @classmethod"},{"line_number":33,"context_line":"    def resource_setup(cls):"},{"line_number":34,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).resource_setup()"},{"line_number":35,"context_line":"        cls.project_ids \u003d list()"},{"line_number":36,"context_line":"        project_name \u003d data_utils.rand_name(\u0027project\u0027)"},{"line_number":37,"context_line":"        project_data \u003d ("},{"line_number":38,"context_line":"            cls.projects_client.create_project(name\u003dproject_name,"},{"line_number":39,"context_line":"                                               enabled\u003dTrue)[\u0027project\u0027])"},{"line_number":40,"context_line":"        cls.project_id \u003d project_data[\u0027id\u0027]"},{"line_number":41,"context_line":"        cls.project_ids.append(cls.project_id)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # Creating service, as a service id is needed to create"},{"line_number":44,"context_line":"        # an endpoint"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfeb2761_844ba4ae","line":41,"range":{"start_line":35,"start_character":0,"end_line":41,"end_character":46},"updated":"2017-04-03 17:59:54.000000000","message":"Use cls.setup_test_project()","commit_id":"e6bf7f19402b1f9cdfa7d44df4a46ff2ce08483a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"758038938e38318bf8ebecb3f42fccf90aa976ab","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        # Creating service, as a service id is needed to create"},{"line_number":44,"context_line":"        # an endpoint"},{"line_number":45,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).resource_setup()"},{"line_number":46,"context_line":"        cls.service_ids \u003d list()"},{"line_number":47,"context_line":"        s_name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":48,"context_line":"        s_type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":49,"context_line":"        s_description \u003d data_utils.rand_name(\u0027description\u0027)"},{"line_number":50,"context_line":"        service_data \u003d ("},{"line_number":51,"context_line":"            cls.services_client.create_service(name\u003ds_name, type\u003ds_type,"},{"line_number":52,"context_line":"                                               description\u003ds_description))"},{"line_number":53,"context_line":"        cls.service_id \u003d service_data[\u0027service\u0027][\u0027id\u0027]"},{"line_number":54,"context_line":"        cls.service_ids.append(cls.service_id)"},{"line_number":55,"context_line":"        # Create endpoints"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfeb2761_e4db90ea","line":52,"range":{"start_line":46,"start_character":0,"end_line":52,"end_character":74},"updated":"2017-04-03 17:59:54.000000000","message":"Use cls.setup_test_service()","commit_id":"e6bf7f19402b1f9cdfa7d44df4a46ff2ce08483a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"758038938e38318bf8ebecb3f42fccf90aa976ab","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        cls.service_id \u003d service_data[\u0027service\u0027][\u0027id\u0027]"},{"line_number":54,"context_line":"        cls.service_ids.append(cls.service_id)"},{"line_number":55,"context_line":"        # Create endpoints"},{"line_number":56,"context_line":"        cls.setup_endpoints \u003d list()"},{"line_number":57,"context_line":"        region \u003d data_utils.rand_name(\u0027region\u0027)"},{"line_number":58,"context_line":"        url \u003d data_utils.rand_url()"},{"line_number":59,"context_line":"        interface \u003d \u0027public\u0027"},{"line_number":60,"context_line":"        endpoint \u003d cls.client.create_endpoint(service_id\u003dcls.service_id,"},{"line_number":61,"context_line":"                                              interface\u003dinterface,"},{"line_number":62,"context_line":"                                              url\u003durl, region\u003dregion,"},{"line_number":63,"context_line":"                                              enabled\u003dTrue)[\u0027endpoint\u0027]"},{"line_number":64,"context_line":"        cls.endpoint_id \u003d endpoint[\u0027id\u0027]"},{"line_number":65,"context_line":"        cls.setup_endpoints.append(cls.endpoint_id)"},{"line_number":66,"context_line":"        # Adding endpoints to projects"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfeb2761_04ee7487","line":63,"range":{"start_line":56,"start_character":0,"end_line":63,"end_character":71},"updated":"2017-04-03 17:59:54.000000000","message":"Use cls.setup_test_endpoint(service\u003dcls.service)","commit_id":"e6bf7f19402b1f9cdfa7d44df4a46ff2ce08483a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"758038938e38318bf8ebecb3f42fccf90aa976ab","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        cls.client_filter.add_endpoint_to_project("},{"line_number":68,"context_line":"            cls.endpoint_id, cls.project_id)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    @classmethod"},{"line_number":71,"context_line":"    def resource_cleanup(cls):"},{"line_number":72,"context_line":"        for e in cls.setup_endpoints:"},{"line_number":73,"context_line":"            cls.client.delete_endpoint(e)"},{"line_number":74,"context_line":"        for s in cls.service_ids:"},{"line_number":75,"context_line":"            cls.services_client.delete_service(s)"},{"line_number":76,"context_line":"        for p in cls.project_ids:"},{"line_number":77,"context_line":"            cls.projects_client.delete_project(p)"},{"line_number":78,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).resource_cleanup()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _add_endpoint_to_project(self):"},{"line_number":81,"context_line":"        endpoint_id \u003d self.client.list_endpoints()"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfeb2761_a4fea834","line":78,"range":{"start_line":70,"start_character":0,"end_line":78,"end_character":77},"updated":"2017-04-03 17:59:54.000000000","message":"None of this is needed. Use setup_test_* methods do this automatically.","commit_id":"e6bf7f19402b1f9cdfa7d44df4a46ff2ce08483a"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"4b3ce7849b3cb0894fad6ec47e4f3c746a5fe6e9","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    @classmethod"},{"line_number":33,"context_line":"    def resource_setup(cls):"},{"line_number":34,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).resource_setup()"},{"line_number":35,"context_line":"        cls.project_ids \u003d list()"},{"line_number":36,"context_line":"        project_name \u003d data_utils.rand_name(\u0027project\u0027)"},{"line_number":37,"context_line":"        project_data \u003d ("},{"line_number":38,"context_line":"            cls.projects_client.create_project(name\u003dproject_name,"},{"line_number":39,"context_line":"                                               enabled\u003dTrue)[\u0027project\u0027])"},{"line_number":40,"context_line":"        cls.project_id \u003d project_data[\u0027id\u0027]"},{"line_number":41,"context_line":"        cls.project_ids.append(cls.project_id)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        # Creating service, as a service id is needed to create"},{"line_number":44,"context_line":"        # an endpoint"},{"line_number":45,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).resource_setup()"},{"line_number":46,"context_line":"        cls.service_ids \u003d list()"},{"line_number":47,"context_line":"        s_name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":48,"context_line":"        s_type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":49,"context_line":"        s_description \u003d data_utils.rand_name(\u0027description\u0027)"},{"line_number":50,"context_line":"        service_data \u003d ("},{"line_number":51,"context_line":"            cls.services_client.create_service(name\u003ds_name, type\u003ds_type,"},{"line_number":52,"context_line":"                                               description\u003ds_description))"},{"line_number":53,"context_line":"        cls.service_id \u003d service_data[\u0027service\u0027][\u0027id\u0027]"},{"line_number":54,"context_line":"        cls.service_ids.append(cls.service_id)"},{"line_number":55,"context_line":"        # Create endpoints"},{"line_number":56,"context_line":"        cls.setup_endpoints \u003d list()"},{"line_number":57,"context_line":"        region \u003d data_utils.rand_name(\u0027region\u0027)"},{"line_number":58,"context_line":"        url \u003d data_utils.rand_url()"},{"line_number":59,"context_line":"        interface \u003d \u0027public\u0027"},{"line_number":60,"context_line":"        endpoint \u003d cls.client.create_endpoint(service_id\u003dcls.service_id,"},{"line_number":61,"context_line":"                                              interface\u003dinterface,"},{"line_number":62,"context_line":"                                              url\u003durl, region\u003dregion,"},{"line_number":63,"context_line":"                                              enabled\u003dTrue)[\u0027endpoint\u0027]"},{"line_number":64,"context_line":"        cls.endpoint_id \u003d endpoint[\u0027id\u0027]"},{"line_number":65,"context_line":"        cls.setup_endpoints.append(cls.endpoint_id)"},{"line_number":66,"context_line":"        # Adding endpoints to projects"},{"line_number":67,"context_line":"        cls.client_filter.add_endpoint_to_project("},{"line_number":68,"context_line":"            cls.endpoint_id, cls.project_id)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    @classmethod"},{"line_number":71,"context_line":"    def resource_cleanup(cls):"},{"line_number":72,"context_line":"        for e in cls.setup_endpoints:"},{"line_number":73,"context_line":"            cls.client.delete_endpoint(e)"},{"line_number":74,"context_line":"        for s in cls.service_ids:"},{"line_number":75,"context_line":"            cls.services_client.delete_service(s)"},{"line_number":76,"context_line":"        for p in cls.project_ids:"},{"line_number":77,"context_line":"            cls.projects_client.delete_project(p)"},{"line_number":78,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).resource_cleanup()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _add_endpoint_to_project(self):"},{"line_number":81,"context_line":"        endpoint_id \u003d self.client.list_endpoints()"}],"source_content_type":"text/x-python","patch_set":1,"id":"dfeb2761_bf4fdc32","line":78,"range":{"start_line":35,"start_character":0,"end_line":78,"end_character":77},"updated":"2017-04-03 14:48:20.000000000","message":"There are methods in Tempest and Patrole base classes to make set up and cleanup much simpler. Please use those instead.","commit_id":"e6bf7f19402b1f9cdfa7d44df4a46ff2ce08483a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"758038938e38318bf8ebecb3f42fccf90aa976ab","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).resource_cleanup()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _add_endpoint_to_project(self):"},{"line_number":81,"context_line":"        endpoint_id \u003d self.client.list_endpoints()"},{"line_number":82,"context_line":"        project_id \u003d self.client.list_projects()"},{"line_number":83,"context_line":"        cls.client_filter.add_endpoint_to_project("},{"line_number":84,"context_line":"            endpoint_id, project_id)"},{"line_number":85,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfeb2761_246e1801","line":82,"range":{"start_line":81,"start_character":8,"end_line":82,"end_character":48},"updated":"2017-04-03 17:59:54.000000000","message":"List methods only return an ID? That doesn\u0027t seem right. In any case, you self.endpoint_id and self.project_id -- they should have already been created in resource_setup.","commit_id":"e6bf7f19402b1f9cdfa7d44df4a46ff2ce08483a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"758038938e38318bf8ebecb3f42fccf90aa976ab","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            endpoint_id, project_id)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _test_list_projects_for_endpoint(self):"},{"line_number":87,"context_line":"        endpoint_id \u003d self.client.list_endpoints()"},{"line_number":88,"context_line":"        cls.client_filter.list_projects_for_endpoint("},{"line_number":89,"context_line":"            endpoint_id)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dfeb2761_4450fc32","line":87,"range":{"start_line":87,"start_character":8,"end_line":87,"end_character":50},"updated":"2017-04-03 17:59:54.000000000","message":"Ditto.","commit_id":"e6bf7f19402b1f9cdfa7d44df4a46ff2ce08483a"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"4b3ce7849b3cb0894fad6ec47e4f3c746a5fe6e9","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            cls.projects_client.delete_project(p)"},{"line_number":78,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).resource_cleanup()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def _add_endpoint_to_project(self):"},{"line_number":81,"context_line":"        endpoint_id \u003d self.client.list_endpoints()"},{"line_number":82,"context_line":"        project_id \u003d self.client.list_projects()"},{"line_number":83,"context_line":"        cls.client_filter.add_endpoint_to_project("},{"line_number":84,"context_line":"            endpoint_id, project_id)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _test_list_projects_for_endpoint(self):"},{"line_number":87,"context_line":"        endpoint_id \u003d self.client.list_endpoints()"},{"line_number":88,"context_line":"        cls.client_filter.list_projects_for_endpoint("},{"line_number":89,"context_line":"            endpoint_id)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @rbac_rule_validation.action("},{"line_number":92,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":1,"id":"dfeb2761_3f5d0ce9","line":89,"range":{"start_line":80,"start_character":0,"end_line":89,"end_character":23},"updated":"2017-04-03 14:48:20.000000000","message":"nit: I don\u0027t see the value in creating these helper functions if they\u0027re only going to be used once.","commit_id":"e6bf7f19402b1f9cdfa7d44df4a46ff2ce08483a"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"a41d96a9abda886dc45c7fd850e38ecafdf7eabc","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        cls.client_filter \u003d cls.endpoint_filter_client"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _add_endpoint_to_project(self):"},{"line_number":33,"context_line":"        self. project \u003d self.setup_test_project()"},{"line_number":34,"context_line":"        project_id \u003d self.project[\u0027id\u0027]"},{"line_number":35,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":36,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfeb2761_eb31fd5b","line":33,"range":{"start_line":33,"start_character":8,"end_line":33,"end_character":21},"updated":"2017-04-04 14:23:41.000000000","message":"There shouldn\u0027t be a space here.","commit_id":"3568be01308c730e9b308b18182768ebe48e7c30"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"3fd3b2c8994c9666a05d48508039df8d96cdc02a","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        cls.client_filter \u003d cls.endpoint_filter_client"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _add_endpoint_to_project(self):"},{"line_number":33,"context_line":"        self. project \u003d self.setup_test_project()"},{"line_number":34,"context_line":"        project_id \u003d self.project[\u0027id\u0027]"},{"line_number":35,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":36,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfeb2761_892394bd","line":33,"range":{"start_line":33,"start_character":8,"end_line":33,"end_character":21},"in_reply_to":"dfeb2761_eb31fd5b","updated":"2017-04-04 17:09:44.000000000","message":"Oops ! Thanks for catching this Samantha. Will fix this.","commit_id":"3568be01308c730e9b308b18182768ebe48e7c30"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"a41d96a9abda886dc45c7fd850e38ecafdf7eabc","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":37,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":38,"context_line":"        # Adding endpoints to projects"},{"line_number":39,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":40,"context_line":"            endpoint_id, project_id)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @rbac_rule_validation.action("},{"line_number":43,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":2,"id":"dfeb2761_00a3e0b3","line":40,"range":{"start_line":39,"start_character":8,"end_line":40,"end_character":36},"updated":"2017-04-04 14:23:41.000000000","message":"Is this something that needs a cleanup associated with it?","commit_id":"3568be01308c730e9b308b18182768ebe48e7c30"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"3fd3b2c8994c9666a05d48508039df8d96cdc02a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":37,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":38,"context_line":"        # Adding endpoints to projects"},{"line_number":39,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":40,"context_line":"            endpoint_id, project_id)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @rbac_rule_validation.action("},{"line_number":43,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":2,"id":"dfeb2761_44e1f329","line":40,"range":{"start_line":39,"start_character":8,"end_line":40,"end_character":36},"in_reply_to":"dfeb2761_00a3e0b3","updated":"2017-04-04 17:09:44.000000000","message":"Thanks for the review Samantha. \nCorrect me if I am wrong, but my understanding is that: \n1. Logically since this is only an association between an endpoint and a project, with setup_test_* if the cleanup of the project and endpoint would happen, the association would also be cleaned up.\n2. Need to add another test to remove the endpoint from project, amongst others. So I suppose this would get taken care anyway.","commit_id":"3568be01308c730e9b308b18182768ebe48e7c30"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ed8403fca1c2d05ca1b4f5bb92f1d9aae9a5a309","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        rule\u003d\"identity:add_endpoint_to_project\")"},{"line_number":35,"context_line":"    @decorators.idempotent_id(\u00279199ec13-816d-4efe-b8b1-e1cd026b9747\u0027)"},{"line_number":36,"context_line":"    def test_add_endpoint_to_project(self):"},{"line_number":37,"context_line":"        self.project \u003d self.setup_test_project()"},{"line_number":38,"context_line":"        project_id \u003d self.project[\u0027id\u0027]"},{"line_number":39,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":40,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":41,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":42,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":43,"context_line":"        # Adding endpoints to projects"},{"line_number":44,"context_line":"        self.client_filter.add_endpoint_to_project("}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_42c0c2e1","line":41,"range":{"start_line":37,"start_character":8,"end_line":41,"end_character":41},"updated":"2017-04-04 18:56:25.000000000","message":"All of this can be placed in resource_setup once. There\u0027s no need to recreate these resources for every test, because they\u0027re not being deleted in any of these tests.\n\nI recently refactored all of identity.v3.rbac_base to allow this approach: https://review.openstack.org/#/c/452269/2/patrole_tempest_plugin/tests/api/identity/v3/rbac_base.py","commit_id":"f9b7e92ea3b14075a50a985210f1790cd81f1489"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ed8403fca1c2d05ca1b4f5bb92f1d9aae9a5a309","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":42,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":43,"context_line":"        # Adding endpoints to projects"},{"line_number":44,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":45,"context_line":"           endpoint_id, project_id)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @rbac_rule_validation.action("},{"line_number":48,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_c27852c5","line":45,"range":{"start_line":44,"start_character":8,"end_line":45,"end_character":35},"updated":"2017-04-04 18:56:25.000000000","message":"Add self.addCleanup(self.client_filter.remove_endpoint_from_project, endpoint_id, project_id)","commit_id":"f9b7e92ea3b14075a50a985210f1790cd81f1489"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ed8403fca1c2d05ca1b4f5bb92f1d9aae9a5a309","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        rule\u003d\"identity:list_projects_for_endpoint\")"},{"line_number":50,"context_line":"    @decorators.idempotent_id(\u0027f53dca42-ec8a-48e9-924b-0bbe6c99727f\u0027)"},{"line_number":51,"context_line":"    def test_list_projects_for_endpoint(self):"},{"line_number":52,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":53,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":54,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":55,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":56,"context_line":"        self.client_filter.list_projects_for_endpoint("},{"line_number":57,"context_line":"            endpoint_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_827ecaac","line":54,"range":{"start_line":52,"start_character":0,"end_line":54,"end_character":41},"updated":"2017-04-04 18:56:25.000000000","message":"Put in resource_setup.","commit_id":"f9b7e92ea3b14075a50a985210f1790cd81f1489"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ed8403fca1c2d05ca1b4f5bb92f1d9aae9a5a309","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        rule\u003d\"identity:check_endpoint_in_project\")"},{"line_number":62,"context_line":"    @decorators.idempotent_id(\u00270c1425eb-833c-4aa1-a21d-52ffa41fdc6a\u0027)"},{"line_number":63,"context_line":"    def test_check_endpoint_in_project(self):"},{"line_number":64,"context_line":"        self.project \u003d self.setup_test_project()"},{"line_number":65,"context_line":"        project_id \u003d self.project[\u0027id\u0027]"},{"line_number":66,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":67,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":68,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":69,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":70,"context_line":"           endpoint_id, project_id)"},{"line_number":71,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_0244fa72","line":68,"range":{"start_line":64,"start_character":8,"end_line":68,"end_character":41},"updated":"2017-04-04 18:56:25.000000000","message":"Put in resource_setup.","commit_id":"f9b7e92ea3b14075a50a985210f1790cd81f1489"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ed8403fca1c2d05ca1b4f5bb92f1d9aae9a5a309","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":67,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":68,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":69,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":70,"context_line":"           endpoint_id, project_id)"},{"line_number":71,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":72,"context_line":"        self.client_filter.check_endpoint_in_project("},{"line_number":73,"context_line":"            endpoint_id, project_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_a2754ecd","line":70,"range":{"start_line":69,"start_character":8,"end_line":70,"end_character":35},"updated":"2017-04-04 18:56:25.000000000","message":"Add cleanup afterward.","commit_id":"f9b7e92ea3b14075a50a985210f1790cd81f1489"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ed8403fca1c2d05ca1b4f5bb92f1d9aae9a5a309","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        rule\u003d\"identity:list_projects_for_endpoints\")"},{"line_number":78,"context_line":"    @decorators.idempotent_id(\u00275d86c659-c6ad-41e0-854e-3823e95c7cc2\u0027)"},{"line_number":79,"context_line":"    def test_list_projects_for_endpoint(self):"},{"line_number":80,"context_line":"        self.project \u003d self.setup_test_project()"},{"line_number":81,"context_line":"        project_id \u003d self.project[\u0027id\u0027]"},{"line_number":82,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":83,"context_line":"        self.client_filter.list_endpoints_in_project("},{"line_number":84,"context_line":"            project_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_a25e6e41","line":81,"range":{"start_line":80,"start_character":8,"end_line":81,"end_character":39},"updated":"2017-04-04 18:56:25.000000000","message":"Put in resource_setup.","commit_id":"f9b7e92ea3b14075a50a985210f1790cd81f1489"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ed8403fca1c2d05ca1b4f5bb92f1d9aae9a5a309","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":89,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":90,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":91,"context_line":"        self.project \u003d self.setup_test_project()"},{"line_number":92,"context_line":"        project_id \u003d self.project[\u0027id\u0027]"},{"line_number":93,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":94,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":95,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":96,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":97,"context_line":"           endpoint_id, project_id)"},{"line_number":98,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_42332215","line":95,"range":{"start_line":91,"start_character":8,"end_line":95,"end_character":41},"updated":"2017-04-04 18:56:25.000000000","message":"Put in resource_setup.","commit_id":"f9b7e92ea3b14075a50a985210f1790cd81f1489"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ed8403fca1c2d05ca1b4f5bb92f1d9aae9a5a309","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":94,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":95,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":96,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":97,"context_line":"           endpoint_id, project_id)"},{"line_number":98,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":99,"context_line":"        # Adding endpoints to projects"},{"line_number":100,"context_line":"        self.client_filter.remove_endpoint_from_project("}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_6254e621","line":97,"range":{"start_line":96,"start_character":8,"end_line":97,"end_character":35},"updated":"2017-04-04 18:56:25.000000000","message":"Add cleanup afterward. Be sure to use test_utils.call_and_ignore_not_found_exc in this case.","commit_id":"f9b7e92ea3b14075a50a985210f1790cd81f1489"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2446a5a5f3194d73299900654eac98185172cb0b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        cls.client \u003d cls.endpoints_client"},{"line_number":30,"context_line":"        cls.client_filter \u003d cls.endpoint_filter_client"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def _create_endpoint_project(self):"},{"line_number":33,"context_line":"        self.project \u003d self.setup_test_project()"},{"line_number":34,"context_line":"        project_id \u003d self.project[\u0027id\u0027]"},{"line_number":35,"context_line":"        self.service \u003d self.setup_test_service()"},{"line_number":36,"context_line":"        self.endpoint \u003d self.setup_test_endpoint(service\u003dself.service)"},{"line_number":37,"context_line":"        endpoint_id \u003d self.endpoint[\u0027id\u0027]"},{"line_number":38,"context_line":"        return (endpoint_id, project_id)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @rbac_rule_validation.action("},{"line_number":41,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":7,"id":"bff0334d_fb2dc8a8","line":38,"range":{"start_line":32,"start_character":0,"end_line":38,"end_character":40},"updated":"2017-04-05 16:58:45.000000000","message":"Again, I prefer if all these resources are created inside\n\n@classmethod\ndef resource_setup(cls):\n    cls.project \u003d cls.setup_test_project()\n    ...\n\nThen in, say, test_add_endpoint_to_project, you can do:\n\nself.client_filter.add_endpoint_to_project(\n    self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])\n# Note that addCleanup must be used in this case.\nself.addCleanup(\n    self.client_filter.remove_endpoint_from_project,\n    self.endpoint[\u0027id\u0027], self.project[\u0027id])\n\nNo need to continuously re-recreate these resources.","commit_id":"5b0d84eca2b415ca37cf0092cdf5b754fe86cd21"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2446a5a5f3194d73299900654eac98185172cb0b","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @rbac_rule_validation.action("},{"line_number":74,"context_line":"        service\u003d\"keystone\","},{"line_number":75,"context_line":"        rule\u003d\"identity:list_projects_for_endpoints\")"},{"line_number":76,"context_line":"    @decorators.idempotent_id(\u00275d86c659-c6ad-41e0-854e-3823e95c7cc2\u0027)"},{"line_number":77,"context_line":"    def test_list_projects_for_endpoint(self):"},{"line_number":78,"context_line":"        _, project_id \u003d self._create_endpoint_project()"}],"source_content_type":"text/x-python","patch_set":7,"id":"bff0334d_1bd74cc2","line":75,"range":{"start_line":75,"start_character":23,"end_line":75,"end_character":50},"updated":"2017-04-05 16:58:45.000000000","message":"list_endpoints_for_project\n\nSee https://github.com/openstack/keystone/blob/master/keystone/common/policies/project_endpoint.py","commit_id":"5b0d84eca2b415ca37cf0092cdf5b754fe86cd21"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2446a5a5f3194d73299900654eac98185172cb0b","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def test_list_projects_for_endpoint(self):"},{"line_number":78,"context_line":"        _, project_id \u003d self._create_endpoint_project()"},{"line_number":79,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":80,"context_line":"        self.client_filter.list_endpoints_in_project("},{"line_number":81,"context_line":"            project_id)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @rbac_rule_validation.action("}],"source_content_type":"text/x-python","patch_set":7,"id":"bff0334d_9b991c21","line":80,"range":{"start_line":80,"start_character":27,"end_line":80,"end_character":52},"updated":"2017-04-05 16:58:45.000000000","message":"This is a small nit, but this method name is inconsistent. list_endpoints_in_project !\u003d policy action list_endpoints_for_project, even though all other policy actions sync up with the client method names.","commit_id":"5b0d84eca2b415ca37cf0092cdf5b754fe86cd21"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"5e61733ccc90cd5d3c6e1e5f13f65d7fbc4b1a0c","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def test_list_projects_for_endpoint(self):"},{"line_number":78,"context_line":"        _, project_id \u003d self._create_endpoint_project()"},{"line_number":79,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":80,"context_line":"        self.client_filter.list_endpoints_in_project("},{"line_number":81,"context_line":"            project_id)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    @rbac_rule_validation.action("}],"source_content_type":"text/x-python","patch_set":7,"id":"bff0334d_b57364b1","line":80,"range":{"start_line":80,"start_character":27,"end_line":80,"end_character":52},"in_reply_to":"bff0334d_9b991c21","updated":"2017-04-07 20:25:07.000000000","message":"I\u0027m OK with this actually. If it\u0027s fine by Tempest, fine by me.","commit_id":"5b0d84eca2b415ca37cf0092cdf5b754fe86cd21"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"2446a5a5f3194d73299900654eac98185172cb0b","unresolved":false,"context_lines":[{"line_number":89,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":90,"context_line":"           endpoint_id, project_id)"},{"line_number":91,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":92,"context_line":"        # Adding endpoints to projects"},{"line_number":93,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":94,"context_line":"           endpoint_id, project_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"bff0334d_5b603433","line":92,"range":{"start_line":92,"start_character":8,"end_line":92,"end_character":38},"updated":"2017-04-05 16:58:45.000000000","message":"Remove this.","commit_id":"5b0d84eca2b415ca37cf0092cdf5b754fe86cd21"},{"author":{"_account_id":23625,"name":"Nicolas Helgeson","email":"nh202b@att.com","username":"nhelgeson"},"change_message_id":"bc67603e0f6207e4c49e37aae06f79064d8c5515","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def setup_clients(cls):"},{"line_number":28,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).setup_clients()"},{"line_number":29,"context_line":"        cls.client \u003d cls.endpoints_client"},{"line_number":30,"context_line":"        cls.client_filter \u003d cls.endpoint_filter_client"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_c1671cb7","line":29,"range":{"start_line":29,"start_character":12,"end_line":29,"end_character":18},"updated":"2017-04-10 19:49:57.000000000","message":"un-used client","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"cb632580c5e275cc79a68ea6eb1c7ae46a31db5a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def setup_clients(cls):"},{"line_number":28,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).setup_clients()"},{"line_number":29,"context_line":"        cls.client \u003d cls.endpoints_client"},{"line_number":30,"context_line":"        cls.client_filter \u003d cls.endpoint_filter_client"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_a8106358","line":29,"range":{"start_line":29,"start_character":12,"end_line":29,"end_character":18},"in_reply_to":"bff0334d_c1671cb7","updated":"2017-04-11 12:46:01.000000000","message":"Thanks have removed this!","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23625,"name":"Nicolas Helgeson","email":"nh202b@att.com","username":"nhelgeson"},"change_message_id":"bc67603e0f6207e4c49e37aae06f79064d8c5515","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def setup_clients(cls):"},{"line_number":28,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).setup_clients()"},{"line_number":29,"context_line":"        cls.client \u003d cls.endpoints_client"},{"line_number":30,"context_line":"        cls.client_filter \u003d cls.endpoint_filter_client"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @classmethod"},{"line_number":33,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_a12f783d","line":30,"range":{"start_line":30,"start_character":12,"end_line":30,"end_character":25},"updated":"2017-04-10 19:49:57.000000000","message":"if you follow other V3 test conventions, this would be declared in the base","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"cb632580c5e275cc79a68ea6eb1c7ae46a31db5a","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def setup_clients(cls):"},{"line_number":28,"context_line":"        super(IdentityEndpointsFilterV3AdminRbacTest, cls).setup_clients()"},{"line_number":29,"context_line":"        cls.client \u003d cls.endpoints_client"},{"line_number":30,"context_line":"        cls.client_filter \u003d cls.endpoint_filter_client"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @classmethod"},{"line_number":33,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_0b050911","line":30,"range":{"start_line":30,"start_character":12,"end_line":30,"end_character":25},"in_reply_to":"bff0334d_a12f783d","updated":"2017-04-11 12:46:01.000000000","message":"Thanks will explore this.","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"3c203a0c738a5003817f0ee7432609a15e117eba","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        rule\u003d\"identity:add_endpoint_to_project\")"},{"line_number":42,"context_line":"    @decorators.idempotent_id(\u00279199ec13-816d-4efe-b8b1-e1cd026b9747\u0027)"},{"line_number":43,"context_line":"    def test_add_endpoint_to_project(self):"},{"line_number":44,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":45,"context_line":"        # Adding endpoints to projects"},{"line_number":46,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":47,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_1b6e932e","line":44,"range":{"start_line":44,"start_character":42,"end_line":44,"end_character":58},"updated":"2017-04-10 18:59:29.000000000","message":"This was recently changed to toggle_rbac_role [0], in keeping with pep8 standards.\n\n[0] https://review.openstack.org/#/c/454751/","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"cb632580c5e275cc79a68ea6eb1c7ae46a31db5a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        rule\u003d\"identity:add_endpoint_to_project\")"},{"line_number":42,"context_line":"    @decorators.idempotent_id(\u00279199ec13-816d-4efe-b8b1-e1cd026b9747\u0027)"},{"line_number":43,"context_line":"    def test_add_endpoint_to_project(self):"},{"line_number":44,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":45,"context_line":"        # Adding endpoints to projects"},{"line_number":46,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":47,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_c83cc7e2","line":44,"range":{"start_line":44,"start_character":42,"end_line":44,"end_character":58},"in_reply_to":"bff0334d_1b6e932e","updated":"2017-04-11 12:46:01.000000000","message":"Thanks, we have made the changes now.","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"3c203a0c738a5003817f0ee7432609a15e117eba","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":68,"context_line":"        self.client_filter.check_endpoint_in_project("},{"line_number":69,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":70,"context_line":"        self.addCleanup(self.client_filter.remove_endpoint_from_project,"},{"line_number":71,"context_line":"                        self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @rbac_rule_validation.action("},{"line_number":74,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_db1eebb9","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":64},"updated":"2017-04-10 18:59:29.000000000","message":"This should be called immediately after self.client_filter.add_endpoint_to_project, in case the API call above throws an error, in which the clean up will never be executed.","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"cb632580c5e275cc79a68ea6eb1c7ae46a31db5a","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":68,"context_line":"        self.client_filter.check_endpoint_in_project("},{"line_number":69,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":70,"context_line":"        self.addCleanup(self.client_filter.remove_endpoint_from_project,"},{"line_number":71,"context_line":"                        self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    @rbac_rule_validation.action("},{"line_number":74,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_682dbba6","line":71,"range":{"start_line":70,"start_character":0,"end_line":71,"end_character":64},"in_reply_to":"bff0334d_db1eebb9","updated":"2017-04-11 12:46:01.000000000","message":"Thanks, have made the changes in the latest patch set","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"3c203a0c738a5003817f0ee7432609a15e117eba","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":85,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":86,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":87,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":88,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":89,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":91,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_5bce5b2d","line":88,"range":{"start_line":87,"start_character":8,"end_line":88,"end_character":52},"updated":"2017-04-10 18:59:29.000000000","message":"Add\n\nself.addCleanup(test_utils.call_and_ignore_not_found_exc,\n                self.client_filter.remove_endpoint_from_project,\n                self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])\n\nbelow this.\n\nIf client_filter.remove_endpoint_from_project throws a 403, then the resource won\u0027t be deleted. However, if it is deleted, the call_and_ignore_not_found_exc will ignore the 404 that is thrown when deletion is attempted in the clean up.","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23625,"name":"Nicolas Helgeson","email":"nh202b@att.com","username":"nhelgeson"},"change_message_id":"bc67603e0f6207e4c49e37aae06f79064d8c5515","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":85,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":86,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":87,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":88,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":89,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":91,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_8190f44b","line":88,"range":{"start_line":87,"start_character":8,"end_line":88,"end_character":52},"in_reply_to":"bff0334d_5bce5b2d","updated":"2017-04-10 19:49:57.000000000","message":"Additionally, this process of adding endpoints to project and cleaning up is called 3 times, I would recommend pulling it out into its own method.","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"cb632580c5e275cc79a68ea6eb1c7ae46a31db5a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":85,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":86,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":87,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":88,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":89,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":91,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_c815e74a","line":88,"range":{"start_line":87,"start_character":8,"end_line":88,"end_character":52},"in_reply_to":"bff0334d_5bce5b2d","updated":"2017-04-11 12:46:01.000000000","message":"Thanks. However when I added this the test did not work so I have reverted back for now.","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"becc04e66922c24d0b2421d2b3dd87b01a52c8a8","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":85,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":86,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":87,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":88,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":89,"context_line":"        self.rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":90,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":91,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"bff0334d_4e49dfb4","line":88,"range":{"start_line":87,"start_character":8,"end_line":88,"end_character":52},"in_reply_to":"bff0334d_c815e74a","updated":"2017-04-11 13:40:37.000000000","message":"The cleanup is still required. If you are having issues getting it to work, we are happy to help.","commit_id":"f8eb609975e364090258017c08b13fa20e367a17"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"77d4a900a0ea73a577a6da07e13253e376d08fec","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @rbac_rule_validation.action("},{"line_number":50,"context_line":"        service\u003d\"keystone\","},{"line_number":51,"context_line":"        rule\u003d\"identity:list_projects_for_endpoint\")"},{"line_number":52,"context_line":"    @decorators.idempotent_id(\u0027f53dca42-ec8a-48e9-924b-0bbe6c99727f\u0027)"},{"line_number":53,"context_line":"    def test_list_projects_for_endpoint(self):"},{"line_number":54,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_4e28bf95","line":51,"updated":"2017-04-11 13:45:34.000000000","message":"One of these (either L51 or L73) seems to be incorrect. One should be \"list_projects_for_endpoint\" and one should be \"list_endpoints_for_project.\"","commit_id":"69a6c0e787de132c9feb0074cca20639d87a1c1b"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"fbcc35ba899b529943bd47e26173b1757e4f1f2a","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @rbac_rule_validation.action("},{"line_number":50,"context_line":"        service\u003d\"keystone\","},{"line_number":51,"context_line":"        rule\u003d\"identity:list_projects_for_endpoint\")"},{"line_number":52,"context_line":"    @decorators.idempotent_id(\u0027f53dca42-ec8a-48e9-924b-0bbe6c99727f\u0027)"},{"line_number":53,"context_line":"    def test_list_projects_for_endpoint(self):"},{"line_number":54,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_7958c72f","line":51,"in_reply_to":"bff0334d_4e28bf95","updated":"2017-04-12 10:56:37.000000000","message":"Thanks Samantha! We have made the changes.","commit_id":"69a6c0e787de132c9feb0074cca20639d87a1c1b"},{"author":{"_account_id":23625,"name":"Nicolas Helgeson","email":"nh202b@att.com","username":"nhelgeson"},"change_message_id":"6a5a55fb2d9fa92dae06740266400bb0ff072408","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        rule\u003d\"identity:check_endpoint_in_project\")"},{"line_number":61,"context_line":"    @decorators.idempotent_id(\u00270c1425eb-833c-4aa1-a21d-52ffa41fdc6a\u0027)"},{"line_number":62,"context_line":"    def test_check_endpoint_in_project(self):"},{"line_number":63,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":64,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":65,"context_line":"        self.addCleanup(self.client_filter.remove_endpoint_from_project,"},{"line_number":66,"context_line":"                        self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":67,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":68,"context_line":"        self.client_filter.check_endpoint_in_project("},{"line_number":69,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_c3101d51","line":66,"range":{"start_line":63,"start_character":8,"end_line":66,"end_character":64},"updated":"2017-04-11 17:59:20.000000000","message":"turn this into a class method ex:\ndef _add_endpoint_to_project(self):\n  self.client_filter.add....\n  self.addCleanup(call_and_ignore_....)\n\nthen it can be called multiple times, once each for L41, L62, and L84","commit_id":"69a6c0e787de132c9feb0074cca20639d87a1c1b"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"fbcc35ba899b529943bd47e26173b1757e4f1f2a","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        rule\u003d\"identity:check_endpoint_in_project\")"},{"line_number":61,"context_line":"    @decorators.idempotent_id(\u00270c1425eb-833c-4aa1-a21d-52ffa41fdc6a\u0027)"},{"line_number":62,"context_line":"    def test_check_endpoint_in_project(self):"},{"line_number":63,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":64,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":65,"context_line":"        self.addCleanup(self.client_filter.remove_endpoint_from_project,"},{"line_number":66,"context_line":"                        self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":67,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":68,"context_line":"        self.client_filter.check_endpoint_in_project("},{"line_number":69,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_b9d76f4b","line":66,"range":{"start_line":63,"start_character":8,"end_line":66,"end_character":64},"in_reply_to":"bff0334d_c3101d51","updated":"2017-04-12 10:56:37.000000000","message":"Thanks Nicolas ! Will explore this now that the cleanup bit is working.","commit_id":"69a6c0e787de132c9feb0074cca20639d87a1c1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"c067f7a50b14326f8826c374143a14087b879986","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":83,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":84,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":85,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":86,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":87,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":88,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":89,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_bc6c21ce","line":86,"range":{"start_line":85,"start_character":8,"end_line":86,"end_character":52},"updated":"2017-04-11 14:17:52.000000000","message":"Still missing clean up with test_utils.call_and_ignore_not_found_exc.","commit_id":"69a6c0e787de132c9feb0074cca20639d87a1c1b"},{"author":{"_account_id":23625,"name":"Nicolas Helgeson","email":"nh202b@att.com","username":"nhelgeson"},"change_message_id":"6a5a55fb2d9fa92dae06740266400bb0ff072408","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":83,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":84,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":85,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":86,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":87,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":88,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":89,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_68a5b046","line":86,"range":{"start_line":85,"start_character":8,"end_line":86,"end_character":51},"updated":"2017-04-11 17:59:20.000000000","message":"This cleanup seems out of place. What is being cleaned up?","commit_id":"69a6c0e787de132c9feb0074cca20639d87a1c1b"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a6279bd56935c2ee72da3c26cd5eb94ebd49b4d8","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":83,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":84,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":85,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":86,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":87,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":88,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":89,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_349b7d18","line":86,"range":{"start_line":85,"start_character":8,"end_line":86,"end_character":51},"in_reply_to":"bff0334d_68a5b046","updated":"2017-04-11 20:20:20.000000000","message":"Check my comment in PS13.\n\nAs already mentioned,  self.client_filter.remove_endpoint_from_project on L88 will not **always** execute successfully. For example, if that API call throws a 403 or any other error (but more than likely a 403), then cleanup will **never** be performed. By adding a self.addCleanup(test_utils.call_and_ignore_notfound_exc), cleanup is **always** guaranteed.","commit_id":"69a6c0e787de132c9feb0074cca20639d87a1c1b"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"fbcc35ba899b529943bd47e26173b1757e4f1f2a","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        rule\u003d\"identity:remove_endpoint_from_project\")"},{"line_number":83,"context_line":"    @decorators.idempotent_id(\u0027b4e21c10-4f47-427b-9b8a-f5b5601adfda\u0027)"},{"line_number":84,"context_line":"    def test_remove_endpoint_from_project(self):"},{"line_number":85,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":86,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":87,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":88,"context_line":"        self.client_filter.remove_endpoint_from_project("},{"line_number":89,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"bff0334d_1962dbd8","line":86,"range":{"start_line":85,"start_character":8,"end_line":86,"end_character":52},"in_reply_to":"bff0334d_bc6c21ce","updated":"2017-04-12 10:56:37.000000000","message":"Thanks Felipe! Got it to work finally and have uploaded the patch.","commit_id":"69a6c0e787de132c9feb0074cca20639d87a1c1b"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"b4040d5a0d861697bd86d0aed21f623a3b32eacc","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":87,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":88,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":89,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":90,"context_line":"                        self.client_filter.remove_endpoint_from_project,"},{"line_number":91,"context_line":"                        self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":92,"context_line":"        self.client_filter.remove_endpoint_from_project("}],"source_content_type":"text/x-python","patch_set":14,"id":"bff0334d_b679b2c5","line":89,"updated":"2017-04-12 14:48:25.000000000","message":"This cleanup should be before the switch_role (see Felipe\u0027s comments on patch set 9).","commit_id":"0c3940d07799c116c92ca7177a1cb7f7acba7e5d"},{"author":{"_account_id":23625,"name":"Nicolas Helgeson","email":"nh202b@att.com","username":"nhelgeson"},"change_message_id":"256c745e1e3cb282db3d57fe8fc0a246c4f2fad9","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # Adding endpoints to projects"},{"line_number":45,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":46,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":47,"context_line":"        self.addCleanup(self.client_filter.remove_endpoint_from_project,"},{"line_number":48,"context_line":"                        self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @rbac_rule_validation.action("},{"line_number":51,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_d6e30b04","line":48,"range":{"start_line":47,"start_character":8,"end_line":48,"end_character":63},"updated":"2017-04-12 20:05:46.000000000","message":"I feel like this cleanup needs the call_and_ignore since the permissions would deny adding the endpoint to the project, but if you code is running without error, maybe not...","commit_id":"d06a094861763eddcb06686c2b1d0828b7d1cfd8"},{"author":{"_account_id":23625,"name":"Nicolas Helgeson","email":"nh202b@att.com","username":"nhelgeson"},"change_message_id":"256c745e1e3cb282db3d57fe8fc0a246c4f2fad9","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    def test_add_endpoint_to_project(self):"},{"line_number":43,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":44,"context_line":"        # Adding endpoints to projects"},{"line_number":45,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":46,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":47,"context_line":"        self.addCleanup(self.client_filter.remove_endpoint_from_project,"},{"line_number":48,"context_line":"                        self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @rbac_rule_validation.action("},{"line_number":51,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":15,"id":"bff0334d_36b477f1","line":48,"range":{"start_line":45,"start_character":8,"end_line":48,"end_character":64},"updated":"2017-04-12 20:05:46.000000000","message":"I still think that in the interest of dry code you should break this off into a separate function, but it is not vital to the process","commit_id":"d06a094861763eddcb06686c2b1d0828b7d1cfd8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"74e97f17a68455b4e79abfc60e5e5cb6fa7cbf2c","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # Adding endpoints to projects"},{"line_number":45,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":46,"context_line":"            self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":47,"context_line":"        self.addCleanup(self.client_filter.remove_endpoint_from_project,"},{"line_number":48,"context_line":"                        self.endpoint[\u0027id\u0027], self.project[\u0027id\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @rbac_rule_validation.action("},{"line_number":51,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":15,"id":"9ff52f3f_825f7ce4","line":48,"range":{"start_line":47,"start_character":8,"end_line":48,"end_character":63},"in_reply_to":"bff0334d_d6e30b04","updated":"2017-04-12 22:12:00.000000000","message":"A helper function is preferable, you\u0027re right.\n\nBut no test_utils.call_and_ignore_notfound_exc is needed. If self.client_filter.add_endpoint_to_project throws an error (especially a Forbidden), then the resource is never created, and so doesn\u0027t need to be cleaned up, as it doesn\u0027t exist. If the resource, however, is created (that is self.client_filter.add_endpoint_to_project returns a successful HTTP code), then the resource exists and hence the client won\u0027t throw a 404 during deletion.","commit_id":"d06a094861763eddcb06686c2b1d0828b7d1cfd8"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"dc4c7f6f3c22fe6b9f7b3f992787e775dd79d266","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    def test_add_endpoint_to_project(self):"},{"line_number":43,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":44,"context_line":"        # Adding endpoints to projects"},{"line_number":45,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":46,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":47,"context_line":"        self.addCleanup(self.client_filter.delete_endpoint_from_project,"},{"line_number":48,"context_line":"                        self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @rbac_rule_validation.action("},{"line_number":51,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_cf230905","line":48,"range":{"start_line":45,"start_character":8,"end_line":48,"end_character":64},"updated":"2017-04-18 21:25:58.000000000","message":"See Nicolas\u0027 and Felipe\u0027s comments from patch set 15.","commit_id":"73c592a6993b594b3c428d74b341e97fd0ea4e43"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"bacc18dcf11cb9e40f17cc8c2dcfc925f0688aa8","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    def test_add_endpoint_to_project(self):"},{"line_number":43,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":44,"context_line":"        # Adding endpoints to projects"},{"line_number":45,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":46,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":47,"context_line":"        self.addCleanup(self.client_filter.delete_endpoint_from_project,"},{"line_number":48,"context_line":"                        self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @rbac_rule_validation.action("},{"line_number":51,"context_line":"        service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_affe7d34","line":48,"range":{"start_line":45,"start_character":8,"end_line":48,"end_character":64},"in_reply_to":"7ffa3b31_cf230905","updated":"2017-04-18 21:32:29.000000000","message":"As mentioned in their comments this is not vital, but will take it up with the next commit","commit_id":"73c592a6993b594b3c428d74b341e97fd0ea4e43"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"dc4c7f6f3c22fe6b9f7b3f992787e775dd79d266","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        service\u003d\"keystone\","},{"line_number":61,"context_line":"        rule\u003d\"identity:check_endpoint_in_project\")"},{"line_number":62,"context_line":"    @decorators.idempotent_id(\u00270c1425eb-833c-4aa1-a21d-52ffa41fdc6a\u0027)"},{"line_number":63,"context_line":"    def test_check_endpoint_in_project(self):"},{"line_number":64,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":65,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":66,"context_line":"        self.addCleanup(self.client_filter.delete_endpoint_from_project,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_8f44e1b8","line":63,"range":{"start_line":63,"start_character":13,"end_line":63,"end_character":18},"updated":"2017-04-18 21:25:58.000000000","message":"Should be \"show\"","commit_id":"73c592a6993b594b3c428d74b341e97fd0ea4e43"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"cfe54dc3d2e01fbaf90374c62f9a17b8d9d975c5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        service\u003d\"keystone\","},{"line_number":61,"context_line":"        rule\u003d\"identity:check_endpoint_in_project\")"},{"line_number":62,"context_line":"    @decorators.idempotent_id(\u00270c1425eb-833c-4aa1-a21d-52ffa41fdc6a\u0027)"},{"line_number":63,"context_line":"    def test_check_endpoint_in_project(self):"},{"line_number":64,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":65,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":66,"context_line":"        self.addCleanup(self.client_filter.delete_endpoint_from_project,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_61188974","line":63,"range":{"start_line":63,"start_character":13,"end_line":63,"end_character":18},"in_reply_to":"7ffa3b31_4100ed01","updated":"2017-04-18 21:44:54.000000000","message":"Ah, my mistake.","commit_id":"73c592a6993b594b3c428d74b341e97fd0ea4e43"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"bacc18dcf11cb9e40f17cc8c2dcfc925f0688aa8","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        service\u003d\"keystone\","},{"line_number":61,"context_line":"        rule\u003d\"identity:check_endpoint_in_project\")"},{"line_number":62,"context_line":"    @decorators.idempotent_id(\u00270c1425eb-833c-4aa1-a21d-52ffa41fdc6a\u0027)"},{"line_number":63,"context_line":"    def test_check_endpoint_in_project(self):"},{"line_number":64,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":65,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":66,"context_line":"        self.addCleanup(self.client_filter.delete_endpoint_from_project,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_efdb65ea","line":63,"range":{"start_line":63,"start_character":13,"end_line":63,"end_character":18},"in_reply_to":"7ffa3b31_8f44e1b8","updated":"2017-04-18 21:32:29.000000000","message":"\u0027Check\u0027 is kept in line with the client code. Wouldn\u0027t it better to keep the conventions the same for both ?","commit_id":"73c592a6993b594b3c428d74b341e97fd0ea4e43"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"86bc22b255612ad69bcc490f026e4f10824da95c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        service\u003d\"keystone\","},{"line_number":61,"context_line":"        rule\u003d\"identity:check_endpoint_in_project\")"},{"line_number":62,"context_line":"    @decorators.idempotent_id(\u00270c1425eb-833c-4aa1-a21d-52ffa41fdc6a\u0027)"},{"line_number":63,"context_line":"    def test_check_endpoint_in_project(self):"},{"line_number":64,"context_line":"        self.client_filter.add_endpoint_to_project("},{"line_number":65,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":66,"context_line":"        self.addCleanup(self.client_filter.delete_endpoint_from_project,"}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_4100ed01","line":63,"range":{"start_line":63,"start_character":13,"end_line":63,"end_character":18},"in_reply_to":"7ffa3b31_8f44e1b8","updated":"2017-04-18 21:43:23.000000000","message":"@Samantha\n\nCode is correct.\n\n\"check\" does an HTTP HEAD request, while \"show\" does an HTTP GET. Should be check.","commit_id":"73c592a6993b594b3c428d74b341e97fd0ea4e43"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"dc4c7f6f3c22fe6b9f7b3f992787e775dd79d266","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.addCleanup(self.client_filter.delete_endpoint_from_project,"},{"line_number":67,"context_line":"                        self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":68,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":69,"context_line":"        self.client_filter.check_endpoint_in_project("},{"line_number":70,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @rbac_rule_validation.action("}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_af22fdfe","line":69,"range":{"start_line":69,"start_character":27,"end_line":69,"end_character":32},"updated":"2017-04-18 21:25:58.000000000","message":"See L63","commit_id":"73c592a6993b594b3c428d74b341e97fd0ea4e43"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"bacc18dcf11cb9e40f17cc8c2dcfc925f0688aa8","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        self.addCleanup(self.client_filter.delete_endpoint_from_project,"},{"line_number":67,"context_line":"                        self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":68,"context_line":"        self.rbac_utils.switch_role(self, toggle_rbac_role\u003dTrue)"},{"line_number":69,"context_line":"        self.client_filter.check_endpoint_in_project("},{"line_number":70,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    @rbac_rule_validation.action("}],"source_content_type":"text/x-python","patch_set":16,"id":"7ffa3b31_cfd669c4","line":69,"range":{"start_line":69,"start_character":27,"end_line":69,"end_character":32},"in_reply_to":"7ffa3b31_af22fdfe","updated":"2017-04-18 21:32:29.000000000","message":"\u0027Check\u0027 is kept in line with the client code. Wouldn\u0027t it better to keep the conventions the same for both ?","commit_id":"73c592a6993b594b3c428d74b341e97fd0ea4e43"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"76f90c7bd95f2386067e223d7913b675472ffdc2","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def setup_clients(cls):"},{"line_number":28,"context_line":"        super(IdentityEndpointsFilterV3RbacTest, cls).setup_clients()"},{"line_number":29,"context_line":"        cls.client_filter \u003d cls.os.endpoint_filter_client"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @classmethod"},{"line_number":32,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffa3b31_79282ee1","line":29,"range":{"start_line":29,"start_character":12,"end_line":29,"end_character":25},"updated":"2017-04-19 13:22:19.000000000","message":"nit: I would prefer \"filter_client\" or something to that effect, as all other client names follow this convention","commit_id":"b6408186fa10ae6742e76c5089f43e1ee6590b27"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"15a486a73286bbf4e204b25399c9f96908bfd641","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def setup_clients(cls):"},{"line_number":28,"context_line":"        super(IdentityEndpointsFilterV3RbacTest, cls).setup_clients()"},{"line_number":29,"context_line":"        cls.client_filter \u003d cls.os.endpoint_filter_client"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @classmethod"},{"line_number":32,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffa3b31_ee06afce","line":29,"range":{"start_line":29,"start_character":12,"end_line":29,"end_character":25},"in_reply_to":"7ffa3b31_79282ee1","updated":"2017-04-19 14:03:03.000000000","message":"Done","commit_id":"b6408186fa10ae6742e76c5089f43e1ee6590b27"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"5b2e66d2d1061ca5d8f46ac3d917a7ced8e6a956","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.service \u003d cls.setup_test_service()"},{"line_number":36,"context_line":"        cls.endpoint \u003d cls.setup_test_endpoint(service\u003dcls.service)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _test_setup_and_teardown(self):"},{"line_number":39,"context_line":"        # Adding and cleaning up endpoints to projects"},{"line_number":40,"context_line":"        self.ep_api_client.add_endpoint_to_project("},{"line_number":41,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"7ffa3b31_b46a38ea","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":32},"updated":"2017-04-19 15:16:46.000000000","message":"May we call this _add_endpoint_to_project instead?","commit_id":"9d02f867f71072c24a396bc9b972d1a7742c5d5e"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"06236f3f605610b084c9aef2f191fec5829b95d0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.service \u003d cls.setup_test_service()"},{"line_number":36,"context_line":"        cls.endpoint \u003d cls.setup_test_endpoint(service\u003dcls.service)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _test_setup_and_teardown(self):"},{"line_number":39,"context_line":"        # Adding and cleaning up endpoints to projects"},{"line_number":40,"context_line":"        self.ep_api_client.add_endpoint_to_project("},{"line_number":41,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"5ff73747_5da8fc1d","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":32},"in_reply_to":"7ffa3b31_51c0902a","updated":"2017-04-25 10:59:52.000000000","message":"Done","commit_id":"9d02f867f71072c24a396bc9b972d1a7742c5d5e"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"81a723973bcaf09f98e27b96142659d583fc4a6a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.service \u003d cls.setup_test_service()"},{"line_number":36,"context_line":"        cls.endpoint \u003d cls.setup_test_endpoint(service\u003dcls.service)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _test_setup_and_teardown(self):"},{"line_number":39,"context_line":"        # Adding and cleaning up endpoints to projects"},{"line_number":40,"context_line":"        self.ep_api_client.add_endpoint_to_project("},{"line_number":41,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"7ffa3b31_979133f4","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":32},"in_reply_to":"7ffa3b31_51c0902a","updated":"2017-04-21 15:57:16.000000000","message":"I agree with Felipe.  I\u0027d recommend either Felipe\u0027s suggestion, or your previous one.","commit_id":"9d02f867f71072c24a396bc9b972d1a7742c5d5e"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"06236f3f605610b084c9aef2f191fec5829b95d0","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.service \u003d cls.setup_test_service()"},{"line_number":36,"context_line":"        cls.endpoint \u003d cls.setup_test_endpoint(service\u003dcls.service)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _test_setup_and_teardown(self):"},{"line_number":39,"context_line":"        # Adding and cleaning up endpoints to projects"},{"line_number":40,"context_line":"        self.ep_api_client.add_endpoint_to_project("},{"line_number":41,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"5ff73747_3d63f01c","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":32},"in_reply_to":"7ffa3b31_979133f4","updated":"2017-04-25 10:59:52.000000000","message":"Done","commit_id":"9d02f867f71072c24a396bc9b972d1a7742c5d5e"},{"author":{"_account_id":23900,"name":"Uday T Kumar","email":"uday053@gmail.com","username":"uday.t.kumar"},"change_message_id":"257cd8f9b406ce565dd7ca4dba821c406401e7cc","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        cls.service \u003d cls.setup_test_service()"},{"line_number":36,"context_line":"        cls.endpoint \u003d cls.setup_test_endpoint(service\u003dcls.service)"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def _test_setup_and_teardown(self):"},{"line_number":39,"context_line":"        # Adding and cleaning up endpoints to projects"},{"line_number":40,"context_line":"        self.ep_api_client.add_endpoint_to_project("},{"line_number":41,"context_line":"            self.project[\u0027id\u0027], self.endpoint[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"7ffa3b31_51c0902a","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":32},"in_reply_to":"7ffa3b31_b46a38ea","updated":"2017-04-20 07:19:41.000000000","message":"Thanks Felipe! I had originally called this \"_add_cleanup_endpoint_to_project\" (patch set 17) but changed it since this is used for the various tests to setup and cleanup. If you feel the earlier one is better, I can revert back to it.","commit_id":"9d02f867f71072c24a396bc9b972d1a7742c5d5e"}]}
