)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"01529092c2210f4afc79438a6e2a8276a4c6103c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement endpoint filtering functionality on the client side."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"bp/endpoint-filtering"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I48cb8dbd2720bb0c5777712b68a8a5b8f3bf7f60"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAW3%2F%2FP2I%3D","line":9,"updated":"2014-04-15 19:44:53.000000000","message":"implements: bp/endpoint-filtering\n\nalso, no bp by that name exists in https://blueprints.launchpad.net/python-keystoneclient","commit_id":"a5f7113d6c61c91c4364d9fa34eb70e385f421e3"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c98a520f050b1ba878cf8a3f446bd3f3bca244d6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Implement endpoint filtering functionality on the client side."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"bp/endpoint-filtering"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: I48cb8dbd2720bb0c5777712b68a8a5b8f3bf7f60"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAXH%2F%2F%2FsI%3D","line":9,"in_reply_to":"AAAAW3%2F%2FP2I%3D","updated":"2014-04-16 01:00:29.000000000","message":"just created one\n\nhttps://blueprints.launchpad.net/python-keystoneclient/+spec/endpoint-filter\n\nI was hoping to recycle the old one\n\nhttps://blueprints.launchpad.net/keystone/+spec/endpoint-filtering","commit_id":"a5f7113d6c61c91c4364d9fa34eb70e385f421e3"}],"keystoneclient/tests/v3/test_endpoint_filter.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystoneclient.tests.v3 import utils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class EndpointFilterTests(utils.TestCase):"},{"line_number":23,"context_line":"    def setUp(self):"},{"line_number":24,"context_line":"        super(EndpointFilterTests, self).setUp()"},{"line_number":25,"context_line":"        self.manager \u003d self.client.endpoint_filter"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkFI%3D","line":22,"updated":"2014-04-12 16:02:58.000000000","message":"add a comment what endpoint filtering is. It\u0027s not obvious to me why we need to \"add_endpoint_to_project_via_obj\" to filter endpoints, so filtering endpoints here means something different than what I would expect.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    def new_ref(self, **kwargs):"},{"line_number":28,"context_line":"        kwargs.setdefault(\u0027id\u0027, uuid.uuid4().hex)"},{"line_number":29,"context_line":"        kwargs.setdefault(uuid.uuid4().hex, uuid.uuid4().hex)"},{"line_number":30,"context_line":"        kwargs.setdefault(\u0027enabled\u0027, True)"},{"line_number":31,"context_line":"        return kwargs"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkFM%3D","line":29,"updated":"2014-04-12 16:02:58.000000000","message":"what is this for? add a comment.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":119,"context_line":""},{"line_number":120,"context_line":"        expected_endpoint_ids \u003d sorted("},{"line_number":121,"context_line":"            [endpoint[\u0027id\u0027] for endpoint in endpoints[\u0027endpoints\u0027]])"},{"line_number":122,"context_line":"        actual_endpoint_ids \u003d sorted("},{"line_number":123,"context_line":"            [endpoint.id for endpoint in endpoints_resp])"},{"line_number":124,"context_line":"        self.assertEqual(expected_endpoint_ids, actual_endpoint_ids)"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkEA%3D","line":122,"updated":"2014-04-12 16:02:58.000000000","message":"is it sorted in case the order changes? I don\u0027t see how that could happen.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            [project[\u0027id\u0027] for project in projects[\u0027projects\u0027]])"},{"line_number":142,"context_line":"        actual_project_ids \u003d sorted("},{"line_number":143,"context_line":"            [project.id for project in projects_resp])"},{"line_number":144,"context_line":"        self.assertEqual(expected_project_ids, actual_project_ids)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkC0%3D","line":144,"updated":"2014-04-12 16:02:58.000000000","message":"There should be tests for invalid arguments, for example if you try to list projects for endpoint but no arguments are given.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"01529092c2210f4afc79438a6e2a8276a4c6103c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # copied from CrudTests as we need to create endpoint and project"},{"line_number":37,"context_line":"        # refs for our tests. EndpointFilter is not exactly CRUD API."},{"line_number":38,"context_line":"        kwargs.setdefault(\u0027id\u0027, uuid.uuid4().hex)"},{"line_number":39,"context_line":"        kwargs.setdefault(uuid.uuid4().hex, uuid.uuid4().hex)"},{"line_number":40,"context_line":"        kwargs.setdefault(\u0027enabled\u0027, True)"},{"line_number":41,"context_line":"        return kwargs"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FP1I%3D","line":39,"updated":"2014-04-15 19:44:53.000000000","message":"specifically, do we need the 2nd line here?","commit_id":"a5f7113d6c61c91c4364d9fa34eb70e385f421e3"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"c98a520f050b1ba878cf8a3f446bd3f3bca244d6","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        # copied from CrudTests as we need to create endpoint and project"},{"line_number":37,"context_line":"        # refs for our tests. EndpointFilter is not exactly CRUD API."},{"line_number":38,"context_line":"        kwargs.setdefault(\u0027id\u0027, uuid.uuid4().hex)"},{"line_number":39,"context_line":"        kwargs.setdefault(uuid.uuid4().hex, uuid.uuid4().hex)"},{"line_number":40,"context_line":"        kwargs.setdefault(\u0027enabled\u0027, True)"},{"line_number":41,"context_line":"        return kwargs"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAXH%2F%2F%2FsE%3D","line":39,"in_reply_to":"AAAAW3%2F%2FP1I%3D","updated":"2014-04-16 01:00:29.000000000","message":"Not really. I can remove it.","commit_id":"a5f7113d6c61c91c4364d9fa34eb70e385f421e3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"45eefdde79f7d30ff361f92612077e16a76165d4","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    \"\"\"Test project-endpoint associations (a.k.a. EndpointFilter Extension)."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Endpoint filter provides associations between service endpoints and"},{"line_number":26,"context_line":"    projects. These assciations are then used to create ad-hoc catalogs for"},{"line_number":27,"context_line":"    each project-scoped token request."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAXH%2F%2F%2FpQ%3D","line":26,"updated":"2014-04-16 01:15:30.000000000","message":"change \"assciations\" to \"associations\"","commit_id":"eff1960daf341a0e23876c31300ee89378250e00"}],"keystoneclient/v3/contrib/endpoint_filter.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        project_id \u003d base.getid(project)"},{"line_number":25,"context_line":"        endpoint_id \u003d base.getid(endpoint)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"        api_path \u003d None"},{"line_number":28,"context_line":"        if project_id and endpoint_id:"},{"line_number":29,"context_line":"            api_path \u003d \u0027/projects/%s/endpoints/%s\u0027 % (project_id, endpoint_id)"},{"line_number":30,"context_line":"        elif project_id:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkD4%3D","line":27,"updated":"2014-04-12 16:02:58.000000000","message":"remove this line, having a None api_path isn\u0027t going to be valid.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        return self.OS_EP_FILTER_EXT + api_path"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def add_endpoint_to_project(self, project\u003dNone, endpoint\u003dNone):"},{"line_number":41,"context_line":"        \"\"\"Create a project-endpoint association.\"\"\""},{"line_number":42,"context_line":"        base_url \u003d self._build_base_url(project\u003dproject,"},{"line_number":43,"context_line":"                                        endpoint\u003dendpoint)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkDg%3D","line":40,"updated":"2014-04-12 16:02:58.000000000","message":"endpoint and project should be required.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def add_endpoint_to_project(self, project\u003dNone, endpoint\u003dNone):"},{"line_number":41,"context_line":"        \"\"\"Create a project-endpoint association.\"\"\""},{"line_number":42,"context_line":"        base_url \u003d self._build_base_url(project\u003dproject,"},{"line_number":43,"context_line":"                                        endpoint\u003dendpoint)"},{"line_number":44,"context_line":"        return super(EndpointFilterManager, self)._put(url\u003dbase_url)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def remove_endpoint_from_project(self, project\u003dNone, endpoint\u003dNone):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkDY%3D","line":43,"updated":"2014-04-12 16:02:58.000000000","message":"if no endpoint is passed, then the path will be like \"/endpoints/123/projects\", but PUT doesn\u0027t work on this resource.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                                        endpoint\u003dendpoint)"},{"line_number":44,"context_line":"        return super(EndpointFilterManager, self)._put(url\u003dbase_url)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def remove_endpoint_from_project(self, project\u003dNone, endpoint\u003dNone):"},{"line_number":47,"context_line":"        \"\"\"Remove a project-endpoint association.\"\"\""},{"line_number":48,"context_line":"        base_url \u003d self._build_base_url(project\u003dproject,"},{"line_number":49,"context_line":"                                        endpoint\u003dendpoint)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkDQ%3D","line":46,"updated":"2014-04-12 16:02:58.000000000","message":"endpoint and project should be required.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"403eeffb9936ae0e0f59c0a9ef1956bbd8702dae","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                                        endpoint\u003dendpoint)"},{"line_number":44,"context_line":"        return super(EndpointFilterManager, self)._put(url\u003dbase_url)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def remove_endpoint_from_project(self, project\u003dNone, endpoint\u003dNone):"},{"line_number":47,"context_line":"        \"\"\"Remove a project-endpoint association.\"\"\""},{"line_number":48,"context_line":"        base_url \u003d self._build_base_url(project\u003dproject,"},{"line_number":49,"context_line":"                                        endpoint\u003dendpoint)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FX04%3D","line":46,"updated":"2014-04-15 03:42:51.000000000","message":"remove or delete, OS-EP-FILTER spec says delete.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                                        endpoint\u003dendpoint)"},{"line_number":50,"context_line":"        return super(EndpointFilterManager, self)._delete(url\u003dbase_url)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def check_endpoint_in_project(self, project\u003dNone, endpoint\u003dNone):"},{"line_number":53,"context_line":"        \"\"\"Checks if project-endpoint association exist.\"\"\""},{"line_number":54,"context_line":"        base_url \u003d self._build_base_url(project\u003dproject,"},{"line_number":55,"context_line":"                                        endpoint\u003dendpoint)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkDE%3D","line":52,"updated":"2014-04-12 16:02:58.000000000","message":"endpoint and project should be required.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                                        endpoint\u003dendpoint)"},{"line_number":56,"context_line":"        return super(EndpointFilterManager, self)._head(url\u003dbase_url)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def list_endpoints_for_project(self, project\u003dNone):"},{"line_number":59,"context_line":"        \"\"\"List all endpoints for a given project.\"\"\""},{"line_number":60,"context_line":"        base_url \u003d self._build_base_url(project\u003dproject)"},{"line_number":61,"context_line":"        return super(EndpointFilterManager, self)._list("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkCo%3D","line":58,"updated":"2014-04-12 16:02:58.000000000","message":"project should be required.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a2531d35df411d1a949116fe471113a39adad11","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            self.client.endpoints.collection_key,"},{"line_number":64,"context_line":"            obj_class\u003dself.client.endpoints.resource_class)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def list_projects_for_endpoint(self, endpoint\u003dNone):"},{"line_number":67,"context_line":"        \"\"\"List all projects for a given endpoint.\"\"\""},{"line_number":68,"context_line":"        base_url \u003d self._build_base_url(endpoint\u003dendpoint)"},{"line_number":69,"context_line":"        return super(EndpointFilterManager, self)._list("}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FkCk%3D","line":66,"updated":"2014-04-12 16:02:58.000000000","message":"endpoint should be required.","commit_id":"8574fd7031ca5155f65cb4511ec89d256b38b608"}]}
