)]}'
{"keystone/catalog/backends/kvs.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"26541a3afd97e396822d2d82609f88655d7a7208","unresolved":false,"context_lines":[{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        \"\"\""},{"line_number":361,"context_line":"        pass"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def delete_endpoint_group_association_by_project(self, project_id):"},{"line_number":364,"context_line":"        \"\"\"Remove endpoint group to project associations."},{"line_number":365,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_63889ec7","line":362,"updated":"2016-01-15 22:25:13.000000000","message":"If we get https://review.openstack.org/#/c/158442/ merged we won\u0027t have to fix this file.","commit_id":"ba49160f292aa39191da6595e54f8cf25e9f6957"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"af19c07f6ef97cdca0251e06069437c917dd0372","unresolved":false,"context_lines":[{"line_number":359,"context_line":""},{"line_number":360,"context_line":"        \"\"\""},{"line_number":361,"context_line":"        pass"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def delete_endpoint_group_association_by_project(self, project_id):"},{"line_number":364,"context_line":"        \"\"\"Remove endpoint group to project associations."},{"line_number":365,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_c2783692","line":362,"in_reply_to":"da6ed579_63889ec7","updated":"2016-01-18 08:39:36.000000000","message":"yes, this is gating, all the change from this file can be removed now.","commit_id":"ba49160f292aa39191da6595e54f8cf25e9f6957"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"af19c07f6ef97cdca0251e06069437c917dd0372","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        \"\"\""},{"line_number":371,"context_line":"        pass"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"        # Service Provider filtering"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"    def associate_project_with_sp(self, project_id, sp_id):"},{"line_number":376,"context_line":"        \"\"\"Associate a service provider with a project."}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_67571ccb","line":373,"range":{"start_line":373,"start_character":4,"end_line":373,"end_character":8},"updated":"2016-01-18 08:39:36.000000000","message":"remove the extra space to align with APIs defined below.","commit_id":"ba49160f292aa39191da6595e54f8cf25e9f6957"}],"keystone/catalog/backends/sql.py":[{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"94323ff2d8ef19763220d4be35bff3569b178d86","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        association_ref \u003d session.query(ProjectServiceProvider).get("},{"line_number":575,"context_line":"            (project_id, sp_id))"},{"line_number":576,"context_line":"        if association_ref is None:"},{"line_number":577,"context_line":"            raise exception.NotFound(\"Service PRovider association was \""},{"line_number":578,"context_line":"                                     \"not found\")"},{"line_number":579,"context_line":"        return association_ref.to_dict()"},{"line_number":580,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_007fb3e0","line":577,"range":{"start_line":577,"start_character":46,"end_line":577,"end_character":54},"updated":"2016-01-11 13:37:08.000000000","message":"nit: Provider","commit_id":"cfe2e60540ac45df0074c7f3f7bef99cb49b7e46"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":574,"context_line":"        association_ref \u003d session.query(ProjectServiceProvider).get("},{"line_number":575,"context_line":"            (project_id, sp_id))"},{"line_number":576,"context_line":"        if association_ref is None:"},{"line_number":577,"context_line":"            raise exception.NotFound(\"Service PRovider association was \""},{"line_number":578,"context_line":"                                     \"not found\")"},{"line_number":579,"context_line":"        return association_ref.to_dict()"},{"line_number":580,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_fc4ff1ba","line":577,"range":{"start_line":577,"start_character":46,"end_line":577,"end_character":54},"updated":"2016-01-13 13:46:12.000000000","message":"nit: PRvoider/Prvoider","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"}],"keystone/catalog/controllers.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":652,"context_line":"        self.federation_api.get_sp(sp_id)"},{"line_number":653,"context_line":"        self.catalog_api.get_project_service_provider_association("},{"line_number":654,"context_line":"            project_id, sp_id)"},{"line_number":655,"context_line":"        wsgi.render_response(status\u003d(204, \u0027No Content\u0027))"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"    @controller.protected()"},{"line_number":658,"context_line":"    def delete_service_provider_association(self, context, project_id, sp_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_13aaf870","line":655,"range":{"start_line":655,"start_character":29,"end_line":655,"end_character":55},"updated":"2016-01-13 13:46:12.000000000","message":"(204, \u0027No Content\u0027) is the default status, no need to override here.\n\n\nAnd according to the code here, you can just remove this line of code.\n\nsee: https://github.com/openstack/keystone/blob/master/keystone/common/wsgi.py#L270-L271","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":662,"context_line":"            project_id, sp_id)"},{"line_number":663,"context_line":""},{"line_number":664,"context_line":"    @controller.protected()"},{"line_number":665,"context_line":"    def list_project_service_providers(self, context, project_id):"},{"line_number":666,"context_line":"        self.resource_api.get_project(project_id)"},{"line_number":667,"context_line":"        refs \u003d ("},{"line_number":668,"context_line":"            self.catalog_api.list_project_service_providers("}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_4143b642","line":665,"range":{"start_line":665,"start_character":8,"end_line":665,"end_character":38},"updated":"2016-01-13 13:46:12.000000000","message":"this API is list service provider by the project id, so it might be better to rename it as \"list_service_providers_project\"?","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":672,"context_line":""},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"@dependency.requires(\u0027catalog_api\u0027, \u0027federation_api\u0027, \u0027resource_api\u0027)"},{"line_number":675,"context_line":"class ServiceProviderProjectV3Controller(ProjectServiceProviderV3Controller):"},{"line_number":676,"context_line":"    member_name \u003d \"project\""},{"line_number":677,"context_line":"    collection_name \u003d \"projects\""},{"line_number":678,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_c1d48621","line":675,"range":{"start_line":675,"start_character":41,"end_line":675,"end_character":75},"updated":"2016-01-13 13:46:12.000000000","message":"class ProjectServiceProviderV3Controller has ready define the dependency, does it really need to define the @dependency again? at least \u0027federation_api\u0027, \u0027resource_api\u0027 can be removed here.","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":677,"context_line":"    collection_name \u003d \"projects\""},{"line_number":678,"context_line":""},{"line_number":679,"context_line":"    @controller.protected()"},{"line_number":680,"context_line":"    def list_service_provider_projects(self, context, sp_id):"},{"line_number":681,"context_line":"        self.federation_api.get_sp(sp_id)"},{"line_number":682,"context_line":"        projects \u003d self.catalog_api.list_service_provider_projects(sp_id)"},{"line_number":683,"context_line":"        return ServiceProviderProjectV3Controller.wrap_collection("}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_61927a59","line":680,"range":{"start_line":680,"start_character":8,"end_line":680,"end_character":29},"updated":"2016-01-13 13:46:12.000000000","message":"list projects actually.","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"}],"keystone/catalog/core.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        return filtered_endpoints"},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"    # Service Providers filtering"},{"line_number":386,"context_line":"    def list_project_service_providers(self, project_id):"},{"line_number":387,"context_line":"        \"\"\"List all service providers associated with a project\"\"\""},{"line_number":388,"context_line":"        refs \u003d self.driver.list_project_service_providers(project_id)"},{"line_number":389,"context_line":"        filtered_sps \u003d []"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_a17152e2","line":386,"range":{"start_line":386,"start_character":4,"end_line":386,"end_character":38},"updated":"2016-01-13 13:46:12.000000000","message":"all these APIs should define an abstractmethod, and provide V9 version driver interface for these change to support the legacy backend driver.","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":392,"context_line":"                sp \u003d self.federation_api.get_sp("},{"line_number":393,"context_line":"                    ref[\u0027service_provider_id\u0027])"},{"line_number":394,"context_line":"                filtered_sps.append(sp)"},{"line_number":395,"context_line":"            except exception.ServiceProviderNotFound:"},{"line_number":396,"context_line":"                self.delete_association_by_service_provider("},{"line_number":397,"context_line":"                    ref[\u0027service_provider_id\u0027])"},{"line_number":398,"context_line":"        return filtered_sps"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def list_service_provider_projects(self, sp_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_dc622dad","line":397,"range":{"start_line":395,"start_character":0,"end_line":397,"end_character":47},"updated":"2016-01-13 13:46:12.000000000","message":"these check is redundant since sp_id or project_id have been checked in controller layer.\n\nyou cannot create a project / service provide association where project or service provide not exists. And delete project or service provide will remove the association as well.","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":406,"context_line":"            try:"},{"line_number":407,"context_line":"                project \u003d self.resource_api.get_project(ref[\u0027project_id\u0027])"},{"line_number":408,"context_line":"                filtered_projects.append(project)"},{"line_number":409,"context_line":"            except exception.ProjectNotFound:"},{"line_number":410,"context_line":"                self.delete_project_service_provider_association("},{"line_number":411,"context_line":"                    ref[\u0027project_id\u0027])"},{"line_number":412,"context_line":"        return filtered_projects"},{"line_number":413,"context_line":""},{"line_number":414,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_7cb541ec","line":411,"range":{"start_line":409,"start_character":0,"end_line":411,"end_character":38},"updated":"2016-01-13 13:46:12.000000000","message":"same here, this is needn\u0027t.","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"af19c07f6ef97cdca0251e06069437c917dd0372","unresolved":false,"context_lines":[{"line_number":392,"context_line":"                sp \u003d self.federation_api.get_sp("},{"line_number":393,"context_line":"                    ref[\u0027service_provider_id\u0027])"},{"line_number":394,"context_line":"                filtered_sps.append(sp)"},{"line_number":395,"context_line":"            except exception.ServiceProviderNotFound:"},{"line_number":396,"context_line":"                self.delete_association_by_service_provider("},{"line_number":397,"context_line":"                    ref[\u0027service_provider_id\u0027])"},{"line_number":398,"context_line":"        return filtered_sps"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"    def list_service_provider_projects(self, sp_id):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_0703c010","line":397,"range":{"start_line":395,"start_character":0,"end_line":397,"end_character":47},"updated":"2016-01-18 08:39:36.000000000","message":"I still think this is not necessary, good as it is if you think these handling has it\u0027s value.\n\nsomething I did like this,\nhttps://review.openstack.org/#/c/250032/2/keystone/catalog/core.py@367\n\nand I even try to add the testcase to test this,\nhttps://review.openstack.org/#/c/259627/\n\nBut eventually, I think user will not able to enter the situation.","commit_id":"ba49160f292aa39191da6595e54f8cf25e9f6957"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"af19c07f6ef97cdca0251e06069437c917dd0372","unresolved":false,"context_lines":[{"line_number":919,"context_line":"        \"\"\""},{"line_number":920,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"    # Abstract methods for Service Prviders filtering"},{"line_number":923,"context_line":""},{"line_number":924,"context_line":"    @abc.abstractmethod"},{"line_number":925,"context_line":"    def associate_project_with_sp(self, project_id, sp_id):"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_42e4460c","line":922,"range":{"start_line":922,"start_character":0,"end_line":922,"end_character":53},"updated":"2016-01-18 08:39:36.000000000","message":"these backends change should based on the V9 version of catalog driver interface.\n\nexample: https://review.openstack.org/#/c/262082/","commit_id":"ba49160f292aa39191da6595e54f8cf25e9f6957"}],"keystone/catalog/routers.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"af19c07f6ef97cdca0251e06069437c917dd0372","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        # TODO(marek-denis): Replace path strings with variables"},{"line_number":194,"context_line":"        self._add_resource("},{"line_number":195,"context_line":"            mapper, project_service_provider_controller,"},{"line_number":196,"context_line":"            path\u003d(\u0027/OS-EP-FILTER/projects/{project_id}\u0027"},{"line_number":197,"context_line":"                  \u0027/service_providers/{sp_id}\u0027),"},{"line_number":198,"context_line":"            put_action\u003d\u0027create_service_provider_association\u0027,"},{"line_number":199,"context_line":"            head_action\u003d\u0027check_service_provider_association\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_02b64e3d","line":196,"range":{"start_line":196,"start_character":19,"end_line":196,"end_character":32},"updated":"2016-01-18 08:39:36.000000000","message":"the path should be changed, what\u0027s doing here is irrelevant with endpoint filter and should not be I think.","commit_id":"ba49160f292aa39191da6595e54f8cf25e9f6957"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"16dced30e1b51ff0758bdd3841113858567fd114","unresolved":false,"context_lines":[{"line_number":31,"context_line":"ENDPOINT_GROUP_PARAMETER_RELATION \u003d build_parameter_relation("},{"line_number":32,"context_line":"    parameter_name\u003d\u0027endpoint_group_id\u0027)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"SP_ID_PARAMETER_RELATION \u003d build_parameter_relation(parameter_name\u003d\u0027sp_id\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class Routers(wsgi.RoutersBase):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7a5de9d1_bb55341e","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":75},"updated":"2016-01-28 02:47:28.000000000","message":"json home issue is caused by this wrong relation, it should be linked to federation SP ID rather than here.\n\nwill fix it later.","commit_id":"f8677e2c27e01113b16ce4da0f84405e9c32909f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"cd7ba8d16e8655a940b72403629e0b69c1fe36d1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"ENDPOINT_GROUP_PARAMETER_RELATION \u003d build_parameter_relation("},{"line_number":34,"context_line":"    parameter_name\u003d\u0027endpoint_group_id\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"SP_ID_PARAMETER_RELATION \u003d federation_routers.SP_ID_PARAMETER_RELATION"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class Routers(wsgi.RoutersBase):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_cc4f1191","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":24},"updated":"2016-01-28 07:51:43.000000000","message":"Is it better to move SP ID relation into `common/json_home.py` so that we can just use it without importing something from federation.","commit_id":"2badcb7deb9730c34044bcb25eedfa4c28469a7b"}],"keystone/common/sql/migrate_repo/versions/087_add_service_provider_filtering_tables.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3861395b40fc7d0d8a688f8b77224f5ddab78b29","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa69d971_be4cbf42","line":1,"updated":"2016-01-11 17:17:50.000000000","message":"This should be changed to 088 as 087 has already merged.","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d20d858c9446b9bb5a2f5945e8eb51a44528478f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_2b5a6184","line":1,"in_reply_to":"da6ed579_fd2ae12b","updated":"2016-01-12 13:09:36.000000000","message":"Done","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d5559da2929fb1e3864fd4be5f77a6c71f59e1af","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_fd2ae12b","line":1,"in_reply_to":"fa69d971_be4cbf42","updated":"2016-01-12 08:26:24.000000000","message":"++","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"}],"keystone/common/sql/migrate_repo/versions/088_add_service_provider_filtering_tables.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":21,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    endpoint_filtering_table \u003d sql.Table("},{"line_number":24,"context_line":"        \u0027project_service_provider\u0027,"},{"line_number":25,"context_line":"        meta,"},{"line_number":26,"context_line":"        sql.Column("}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_bcb739d7","line":23,"range":{"start_line":23,"start_character":4,"end_line":23,"end_character":28},"updated":"2016-01-13 13:46:12.000000000","message":"the table name should be changed, it\u0027s not endpoint filter table.","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"}],"keystone/tests/unit/test_service_provider_filtering.py":[{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"94323ff2d8ef19763220d4be35bff3569b178d86","unresolved":false,"context_lines":[{"line_number":291,"context_line":"                         \u0027service_provider_id\u0027: self.SERVICE_PROVIDER_ID}))"},{"line_number":292,"context_line":"#"},{"line_number":293,"context_line":"        r \u003d self.get(association_url)"},{"line_number":294,"context_line":"#       self.assertValidEndpointListResponse(r, expected_length\u003d0)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"#    @unit.skip_if_cache_disabled(\u0027catalog\u0027)"},{"line_number":297,"context_line":"#    def test_create_endpoint_project_association_invalidates_cache(self):"},{"line_number":298,"context_line":"#        # NOTE(davechen): create another endpoint which will be added to"},{"line_number":299,"context_line":"#        # default project, this should be done at first since"},{"line_number":300,"context_line":"#        # `create_endpoint` will also invalidate cache."},{"line_number":301,"context_line":"#        endpoint_id2 \u003d uuid.uuid4().hex"},{"line_number":302,"context_line":"#        endpoint2 \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":303,"context_line":"#                                          region_id\u003dself.region_id,"},{"line_number":304,"context_line":"#                                          interface\u003d\u0027public\u0027,"},{"line_number":305,"context_line":"#                                          id\u003dendpoint_id2)"},{"line_number":306,"context_line":"#        self.catalog_api.create_endpoint(endpoint_id2, endpoint2.copy())"},{"line_number":307,"context_line":"#"},{"line_number":308,"context_line":"#        # create endpoint project association."},{"line_number":309,"context_line":"#        self.put(self.default_request_url)"},{"line_number":310,"context_line":"#"},{"line_number":311,"context_line":"#        # should get back only one endpoint that was just created."},{"line_number":312,"context_line":"#        user_id \u003d uuid.uuid4().hex"},{"line_number":313,"context_line":"#        catalog \u003d self.catalog_api.get_v3_catalog("},{"line_number":314,"context_line":"#            user_id,"},{"line_number":315,"context_line":"#            self.default_domain_project_id)"},{"line_number":316,"context_line":"#"},{"line_number":317,"context_line":"#        # there is only one endpoints associated with the default project."},{"line_number":318,"context_line":"#        self.assertEqual(1, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":319,"context_line":"#        self.assertEqual(self.endpoint_id, catalog[0][\u0027endpoints\u0027][0][\u0027id\u0027])"},{"line_number":320,"context_line":"#"},{"line_number":321,"context_line":"#        # add the second endpoint to default project, bypassing"},{"line_number":322,"context_line":"#        # catalog_api API manager."},{"line_number":323,"context_line":"#        self.catalog_api.driver.add_endpoint_to_project("},{"line_number":324,"context_line":"#            endpoint_id2,"},{"line_number":325,"context_line":"#            self.default_domain_project_id)"},{"line_number":326,"context_line":"#"},{"line_number":327,"context_line":"#        # but, we can just get back one endpoint from the cache, since the"},{"line_number":328,"context_line":"#        # catalog is pulled out from cache and its haven\u0027t been invalidated."},{"line_number":329,"context_line":"#        catalog \u003d self.catalog_api.get_v3_catalog("},{"line_number":330,"context_line":"#            user_id,"},{"line_number":331,"context_line":"#            self.default_domain_project_id)"},{"line_number":332,"context_line":"#"},{"line_number":333,"context_line":"#        self.assertEqual(1, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":334,"context_line":"#"},{"line_number":335,"context_line":"#        # remove the endpoint2 from the default project, and add it again via"},{"line_number":336,"context_line":"#        # catalog_api API manager."},{"line_number":337,"context_line":"#        self.catalog_api.driver.remove_endpoint_from_project("},{"line_number":338,"context_line":"#            endpoint_id2,"},{"line_number":339,"context_line":"#            self.default_domain_project_id)"},{"line_number":340,"context_line":"#"},{"line_number":341,"context_line":"#        # add second endpoint to default project, this can be done by calling"},{"line_number":342,"context_line":"#        # the catalog_api API manager directly but call the REST API"},{"line_number":343,"context_line":"#        # instead for consistency."},{"line_number":344,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":345,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":346,"context_line":"#                     \u0027project_id\u0027: self.default_domain_project_id,"},{"line_number":347,"context_line":"#                     \u0027endpoint_id\u0027: endpoint_id2})"},{"line_number":348,"context_line":"#"},{"line_number":349,"context_line":"#        # should get back two endpoints since the cache has been"},{"line_number":350,"context_line":"#        # invalidated when the second endpoint was added to default project."},{"line_number":351,"context_line":"#        catalog \u003d self.catalog_api.get_v3_catalog("},{"line_number":352,"context_line":"#            user_id,"},{"line_number":353,"context_line":"#            self.default_domain_project_id)"},{"line_number":354,"context_line":"#"},{"line_number":355,"context_line":"#        self.assertEqual(2, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":356,"context_line":"#"},{"line_number":357,"context_line":"#        ep_id_list \u003d [catalog[0][\u0027endpoints\u0027][0][\u0027id\u0027],"},{"line_number":358,"context_line":"#                      catalog[0][\u0027endpoints\u0027][1][\u0027id\u0027]]"},{"line_number":359,"context_line":"#        self.assertItemsEqual([self.endpoint_id, endpoint_id2], ep_id_list)"},{"line_number":360,"context_line":"#"},{"line_number":361,"context_line":"#    @unit.skip_if_cache_disabled(\u0027catalog\u0027)"},{"line_number":362,"context_line":"#    def test_remove_endpoint_from_project_invalidates_cache(self):"},{"line_number":363,"context_line":"#        endpoint_id2 \u003d uuid.uuid4().hex"},{"line_number":364,"context_line":"#        endpoint2 \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":365,"context_line":"#                                          region_id\u003dself.region_id,"},{"line_number":366,"context_line":"#                                          interface\u003d\u0027public\u0027,"},{"line_number":367,"context_line":"#                                          id\u003dendpoint_id2)"},{"line_number":368,"context_line":"#        self.catalog_api.create_endpoint(endpoint_id2, endpoint2.copy())"},{"line_number":369,"context_line":"#        # create endpoint project association."},{"line_number":370,"context_line":"#        self.put(self.default_request_url)"},{"line_number":371,"context_line":"#"},{"line_number":372,"context_line":"#        # add second endpoint to default project."},{"line_number":373,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":374,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":375,"context_line":"#                     \u0027project_id\u0027: self.default_domain_project_id,"},{"line_number":376,"context_line":"#                     \u0027endpoint_id\u0027: endpoint_id2})"},{"line_number":377,"context_line":"#"},{"line_number":378,"context_line":"#        # should get back only one endpoint that was just created."},{"line_number":379,"context_line":"#        user_id \u003d uuid.uuid4().hex"},{"line_number":380,"context_line":"#        catalog \u003d self.catalog_api.get_v3_catalog("},{"line_number":381,"context_line":"#            user_id,"},{"line_number":382,"context_line":"#            self.default_domain_project_id)"},{"line_number":383,"context_line":"#"},{"line_number":384,"context_line":"#        # there are two endpoints associated with the default project."},{"line_number":385,"context_line":"#        ep_id_list \u003d [catalog[0][\u0027endpoints\u0027][0][\u0027id\u0027],"},{"line_number":386,"context_line":"#                      catalog[0][\u0027endpoints\u0027][1][\u0027id\u0027]]"},{"line_number":387,"context_line":"#        self.assertEqual(2, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":388,"context_line":"#        self.assertItemsEqual([self.endpoint_id, endpoint_id2], ep_id_list)"},{"line_number":389,"context_line":"#"},{"line_number":390,"context_line":"#        # remove the endpoint2 from the default project, bypassing"},{"line_number":391,"context_line":"#        # catalog_api API manager."},{"line_number":392,"context_line":"#        self.catalog_api.driver.remove_endpoint_from_project("},{"line_number":393,"context_line":"#            endpoint_id2,"},{"line_number":394,"context_line":"#            self.default_domain_project_id)"},{"line_number":395,"context_line":"#"},{"line_number":396,"context_line":"#        # but, we can just still get back two endpoints from the cache,"},{"line_number":397,"context_line":"#        # since the catalog is pulled out from cache and its haven\u0027t"},{"line_number":398,"context_line":"#        # been invalidated."},{"line_number":399,"context_line":"#        catalog \u003d self.catalog_api.get_v3_catalog("},{"line_number":400,"context_line":"#            user_id,"},{"line_number":401,"context_line":"#            self.default_domain_project_id)"},{"line_number":402,"context_line":"#"},{"line_number":403,"context_line":"#        self.assertEqual(2, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":404,"context_line":"#"},{"line_number":405,"context_line":"#        # add back the endpoint2 to the default project, and remove it by"},{"line_number":406,"context_line":"#        # catalog_api API manage."},{"line_number":407,"context_line":"#        self.catalog_api.driver.add_endpoint_to_project("},{"line_number":408,"context_line":"#            endpoint_id2,"},{"line_number":409,"context_line":"#            self.default_domain_project_id)"},{"line_number":410,"context_line":"#"},{"line_number":411,"context_line":"#        # remove the endpoint2 from the default project, this can be done"},{"line_number":412,"context_line":"#        # by calling the catalog_api API manager directly but call"},{"line_number":413,"context_line":"#        # the REST API instead for consistency."},{"line_number":414,"context_line":"#        self.delete(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":415,"context_line":"#                    \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":416,"context_line":"#                        \u0027project_id\u0027: self.default_domain_project_id,"},{"line_number":417,"context_line":"#                        \u0027endpoint_id\u0027: endpoint_id2})"},{"line_number":418,"context_line":"#"},{"line_number":419,"context_line":"#        # should only get back one endpoint since the cache has been"},{"line_number":420,"context_line":"#        # invalidated after the endpoint project association was removed."},{"line_number":421,"context_line":"#        catalog \u003d self.catalog_api.get_v3_catalog("},{"line_number":422,"context_line":"#            user_id,"},{"line_number":423,"context_line":"#            self.default_domain_project_id)"},{"line_number":424,"context_line":"#"},{"line_number":425,"context_line":"#        self.assertEqual(1, len(catalog[0][\u0027endpoints\u0027]))"},{"line_number":426,"context_line":"#        self.assertEqual(self.endpoint_id, catalog[0][\u0027endpoints\u0027][0][\u0027id\u0027])"},{"line_number":427,"context_line":"#"},{"line_number":428,"context_line":"#"},{"line_number":429,"context_line":"#class EndpointFilterTokenRequestTestCase(EndpointFilterTestCase):"},{"line_number":430,"context_line":"#"},{"line_number":431,"context_line":"#    def test_project_scoped_token_using_endpoint_filter(self):"},{"line_number":432,"context_line":"#        \"\"\"Verify endpoints from project scoped token filtered.\"\"\""},{"line_number":433,"context_line":"#        # create a project to work with"},{"line_number":434,"context_line":"#        ref \u003d unit.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":435,"context_line":"#        r \u003d self.post(\u0027/projects\u0027, body\u003d{\u0027project\u0027: ref})"},{"line_number":436,"context_line":"#        project \u003d self.assertValidProjectResponse(r, ref)"},{"line_number":437,"context_line":"#"},{"line_number":438,"context_line":"#        # grant the user a role on the project"},{"line_number":439,"context_line":"#        self.put("},{"line_number":440,"context_line":"#            \u0027/projects/%(project_id)s/users/%(user_id)s/roles/%(role_id)s\u0027 % {"},{"line_number":441,"context_line":"#                \u0027user_id\u0027: self.user[\u0027id\u0027],"},{"line_number":442,"context_line":"#                \u0027project_id\u0027: project[\u0027id\u0027],"},{"line_number":443,"context_line":"#                \u0027role_id\u0027: self.role[\u0027id\u0027]})"},{"line_number":444,"context_line":"#"},{"line_number":445,"context_line":"#        # set the user\u0027s preferred project"},{"line_number":446,"context_line":"#        body \u003d {\u0027user\u0027: {\u0027default_project_id\u0027: project[\u0027id\u0027]}}"},{"line_number":447,"context_line":"#        r \u003d self.patch(\u0027/users/%(user_id)s\u0027 % {"},{"line_number":448,"context_line":"#            \u0027user_id\u0027: self.user[\u0027id\u0027]},"},{"line_number":449,"context_line":"#            body\u003dbody)"},{"line_number":450,"context_line":"#        self.assertValidUserResponse(r)"},{"line_number":451,"context_line":"#"},{"line_number":452,"context_line":"#        # add one endpoint to the project"},{"line_number":453,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":454,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":455,"context_line":"#                     \u0027project_id\u0027: project[\u0027id\u0027],"},{"line_number":456,"context_line":"#                     \u0027endpoint_id\u0027: self.endpoint_id})"},{"line_number":457,"context_line":"#"},{"line_number":458,"context_line":"#        # attempt to authenticate without requesting a project"},{"line_number":459,"context_line":"#        auth_data \u003d self.build_authentication_request("},{"line_number":460,"context_line":"#            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":461,"context_line":"#            password\u003dself.user[\u0027password\u0027])"},{"line_number":462,"context_line":"#        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":463,"context_line":"#        self.assertValidProjectScopedTokenResponse("},{"line_number":464,"context_line":"#            r,"},{"line_number":465,"context_line":"#            require_catalog\u003dTrue,"},{"line_number":466,"context_line":"#            endpoint_filter\u003dTrue,"},{"line_number":467,"context_line":"#            ep_filter_assoc\u003d1)"},{"line_number":468,"context_line":"#        self.assertEqual(project[\u0027id\u0027], r.result[\u0027token\u0027][\u0027project\u0027][\u0027id\u0027])"},{"line_number":469,"context_line":"#"},{"line_number":470,"context_line":"#    def test_default_scoped_token_using_endpoint_filter(self):"},{"line_number":471,"context_line":"#        \"\"\"Verify endpoints from default scoped token filtered.\"\"\""},{"line_number":472,"context_line":"#        # add one endpoint to default project"},{"line_number":473,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":474,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":475,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":476,"context_line":"#                     \u0027endpoint_id\u0027: self.endpoint_id})"},{"line_number":477,"context_line":"#"},{"line_number":478,"context_line":"#        auth_data \u003d self.build_authentication_request("},{"line_number":479,"context_line":"#            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":480,"context_line":"#            password\u003dself.user[\u0027password\u0027],"},{"line_number":481,"context_line":"#            project_id\u003dself.project[\u0027id\u0027])"},{"line_number":482,"context_line":"#        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":483,"context_line":"#        self.assertValidProjectScopedTokenResponse("},{"line_number":484,"context_line":"#            r,"},{"line_number":485,"context_line":"#            require_catalog\u003dTrue,"},{"line_number":486,"context_line":"#            endpoint_filter\u003dTrue,"},{"line_number":487,"context_line":"#            ep_filter_assoc\u003d1)"},{"line_number":488,"context_line":"#        self.assertEqual(self.project[\u0027id\u0027],"},{"line_number":489,"context_line":"#                         r.result[\u0027token\u0027][\u0027project\u0027][\u0027id\u0027])"},{"line_number":490,"context_line":"#"},{"line_number":491,"context_line":"#    def test_scoped_token_with_no_catalog_using_endpoint_filter(self):"},{"line_number":492,"context_line":"#        \"\"\"Verify endpoint filter does not affect no catalog.\"\"\""},{"line_number":493,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":494,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":495,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":496,"context_line":"#                     \u0027endpoint_id\u0027: self.endpoint_id})"},{"line_number":497,"context_line":"#"},{"line_number":498,"context_line":"#        auth_data \u003d self.build_authentication_request("},{"line_number":499,"context_line":"#            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":500,"context_line":"#            password\u003dself.user[\u0027password\u0027],"},{"line_number":501,"context_line":"#            project_id\u003dself.project[\u0027id\u0027])"},{"line_number":502,"context_line":"#        r \u003d self.post(\u0027/auth/tokens?nocatalog\u0027, body\u003dauth_data)"},{"line_number":503,"context_line":"#        self.assertValidProjectScopedTokenResponse("},{"line_number":504,"context_line":"#            r,"},{"line_number":505,"context_line":"#            require_catalog\u003dFalse)"},{"line_number":506,"context_line":"#        self.assertEqual(self.project[\u0027id\u0027],"},{"line_number":507,"context_line":"#                         r.result[\u0027token\u0027][\u0027project\u0027][\u0027id\u0027])"},{"line_number":508,"context_line":"#"},{"line_number":509,"context_line":"#    def test_invalid_endpoint_project_association(self):"},{"line_number":510,"context_line":"#        \"\"\"Verify an invalid endpoint-project association is handled.\"\"\""},{"line_number":511,"context_line":"#        # add first endpoint to default project"},{"line_number":512,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":513,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":514,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":515,"context_line":"#                     \u0027endpoint_id\u0027: self.endpoint_id})"},{"line_number":516,"context_line":"#"},{"line_number":517,"context_line":"#        # create a second temporary endpoint"},{"line_number":518,"context_line":"#        endpoint_id2 \u003d uuid.uuid4().hex"},{"line_number":519,"context_line":"#        endpoint2 \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":520,"context_line":"#                                          region_id\u003dself.region_id,"},{"line_number":521,"context_line":"#                                          interface\u003d\u0027public\u0027,"},{"line_number":522,"context_line":"#                                          id\u003dendpoint_id2)"},{"line_number":523,"context_line":"#        self.catalog_api.create_endpoint(endpoint_id2, endpoint2.copy())"},{"line_number":524,"context_line":"#"},{"line_number":525,"context_line":"#        # add second endpoint to default project"},{"line_number":526,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":527,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":528,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":529,"context_line":"#                     \u0027endpoint_id\u0027: endpoint_id2})"},{"line_number":530,"context_line":"#"},{"line_number":531,"context_line":"#        # remove the temporary reference"},{"line_number":532,"context_line":"#        # this will create inconsistency in the endpoint filter table"},{"line_number":533,"context_line":"#        # which is fixed during the catalog creation for token request"},{"line_number":534,"context_line":"#        self.catalog_api.delete_endpoint(endpoint_id2)"},{"line_number":535,"context_line":"#"},{"line_number":536,"context_line":"#        auth_data \u003d self.build_authentication_request("},{"line_number":537,"context_line":"#            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":538,"context_line":"#            password\u003dself.user[\u0027password\u0027],"},{"line_number":539,"context_line":"#            project_id\u003dself.project[\u0027id\u0027])"},{"line_number":540,"context_line":"#        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":541,"context_line":"#        self.assertValidProjectScopedTokenResponse("},{"line_number":542,"context_line":"#            r,"},{"line_number":543,"context_line":"#            require_catalog\u003dTrue,"},{"line_number":544,"context_line":"#            endpoint_filter\u003dTrue,"},{"line_number":545,"context_line":"#            ep_filter_assoc\u003d1)"},{"line_number":546,"context_line":"#        self.assertEqual(self.project[\u0027id\u0027],"},{"line_number":547,"context_line":"#                         r.result[\u0027token\u0027][\u0027project\u0027][\u0027id\u0027])"},{"line_number":548,"context_line":"#"},{"line_number":549,"context_line":"#    def test_disabled_endpoint(self):"},{"line_number":550,"context_line":"#        \"\"\"Test that a disabled endpoint is handled.\"\"\""},{"line_number":551,"context_line":"#        # Add an enabled endpoint to the default project"},{"line_number":552,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":553,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":554,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":555,"context_line":"#                     \u0027endpoint_id\u0027: self.endpoint_id})"},{"line_number":556,"context_line":"#"},{"line_number":557,"context_line":"#        # Add a disabled endpoint to the default project."},{"line_number":558,"context_line":"#"},{"line_number":559,"context_line":"#        # Create a disabled endpoint that\u0027s like the enabled one."},{"line_number":560,"context_line":"#        disabled_endpoint_ref \u003d copy.copy(self.endpoint)"},{"line_number":561,"context_line":"#        disabled_endpoint_id \u003d uuid.uuid4().hex"},{"line_number":562,"context_line":"#        disabled_endpoint_ref.update({"},{"line_number":563,"context_line":"#            \u0027id\u0027: disabled_endpoint_id,"},{"line_number":564,"context_line":"#            \u0027enabled\u0027: False,"},{"line_number":565,"context_line":"#            \u0027interface\u0027: \u0027internal\u0027"},{"line_number":566,"context_line":"#        })"},{"line_number":567,"context_line":"#        self.catalog_api.create_endpoint(disabled_endpoint_id,"},{"line_number":568,"context_line":"#                                         disabled_endpoint_ref)"},{"line_number":569,"context_line":"#"},{"line_number":570,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":571,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":572,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":573,"context_line":"#                     \u0027endpoint_id\u0027: disabled_endpoint_id})"},{"line_number":574,"context_line":"#"},{"line_number":575,"context_line":"#        # Authenticate to get token with catalog"},{"line_number":576,"context_line":"#        auth_data \u003d self.build_authentication_request("},{"line_number":577,"context_line":"#            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":578,"context_line":"#            password\u003dself.user[\u0027password\u0027],"},{"line_number":579,"context_line":"#            project_id\u003dself.project[\u0027id\u0027])"},{"line_number":580,"context_line":"#        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":581,"context_line":"#"},{"line_number":582,"context_line":"#        endpoints \u003d r.result[\u0027token\u0027][\u0027catalog\u0027][0][\u0027endpoints\u0027]"},{"line_number":583,"context_line":"#        endpoint_ids \u003d [ep[\u0027id\u0027] for ep in endpoints]"},{"line_number":584,"context_line":"#        self.assertEqual([self.endpoint_id], endpoint_ids)"},{"line_number":585,"context_line":"#"},{"line_number":586,"context_line":"#    def test_multiple_endpoint_project_associations(self):"},{"line_number":587,"context_line":"#"},{"line_number":588,"context_line":"#        def _create_an_endpoint():"},{"line_number":589,"context_line":"#            endpoint_ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":590,"context_line":"#                                                 interface\u003d\u0027public\u0027,"},{"line_number":591,"context_line":"#                                                 region_id\u003dself.region_id)"},{"line_number":592,"context_line":"#            r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: endpoint_ref})"},{"line_number":593,"context_line":"#            return r.result[\u0027endpoint\u0027][\u0027id\u0027]"},{"line_number":594,"context_line":"#"},{"line_number":595,"context_line":"#        # create three endpoints"},{"line_number":596,"context_line":"#        endpoint_id1 \u003d _create_an_endpoint()"},{"line_number":597,"context_line":"#        endpoint_id2 \u003d _create_an_endpoint()"},{"line_number":598,"context_line":"#        _create_an_endpoint()"},{"line_number":599,"context_line":"#"},{"line_number":600,"context_line":"#        # only associate two endpoints with project"},{"line_number":601,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":602,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":603,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":604,"context_line":"#                     \u0027endpoint_id\u0027: endpoint_id1})"},{"line_number":605,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":606,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":607,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":608,"context_line":"#                     \u0027endpoint_id\u0027: endpoint_id2})"},{"line_number":609,"context_line":"#"},{"line_number":610,"context_line":"#        # there should be only two endpoints in token catalog"},{"line_number":611,"context_line":"#        auth_data \u003d self.build_authentication_request("},{"line_number":612,"context_line":"#            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":613,"context_line":"#            password\u003dself.user[\u0027password\u0027],"},{"line_number":614,"context_line":"#            project_id\u003dself.project[\u0027id\u0027])"},{"line_number":615,"context_line":"#        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":616,"context_line":"#        self.assertValidProjectScopedTokenResponse("},{"line_number":617,"context_line":"#            r,"},{"line_number":618,"context_line":"#            require_catalog\u003dTrue,"},{"line_number":619,"context_line":"#            endpoint_filter\u003dTrue,"},{"line_number":620,"context_line":"#            ep_filter_assoc\u003d2)"},{"line_number":621,"context_line":"#"},{"line_number":622,"context_line":"#    def test_get_auth_catalog_using_endpoint_filter(self):"},{"line_number":623,"context_line":"#        # add one endpoint to default project"},{"line_number":624,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":625,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":626,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":627,"context_line":"#                     \u0027endpoint_id\u0027: self.endpoint_id})"},{"line_number":628,"context_line":"#"},{"line_number":629,"context_line":"#        auth_data \u003d self.build_authentication_request("},{"line_number":630,"context_line":"#            user_id\u003dself.user[\u0027id\u0027],"},{"line_number":631,"context_line":"#            password\u003dself.user[\u0027password\u0027],"},{"line_number":632,"context_line":"#            project_id\u003dself.project[\u0027id\u0027])"},{"line_number":633,"context_line":"#        token_data \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data)"},{"line_number":634,"context_line":"#        self.assertValidProjectScopedTokenResponse("},{"line_number":635,"context_line":"#            token_data,"},{"line_number":636,"context_line":"#            require_catalog\u003dTrue,"},{"line_number":637,"context_line":"#            endpoint_filter\u003dTrue,"},{"line_number":638,"context_line":"#            ep_filter_assoc\u003d1)"},{"line_number":639,"context_line":"#"},{"line_number":640,"context_line":"#        auth_catalog \u003d self.get(\u0027/auth/catalog\u0027,"},{"line_number":641,"context_line":"#                                token\u003dtoken_data.headers[\u0027X-Subject-Token\u0027])"},{"line_number":642,"context_line":"#        self.assertEqual(token_data.result[\u0027token\u0027][\u0027catalog\u0027],"},{"line_number":643,"context_line":"#                         auth_catalog.result[\u0027catalog\u0027])"},{"line_number":644,"context_line":"#"},{"line_number":645,"context_line":"#"},{"line_number":646,"context_line":"#class JsonHomeTests(EndpointFilterTestCase, test_v3.JsonHomeTestMixin):"},{"line_number":647,"context_line":"#    JSON_HOME_DATA \u003d {"},{"line_number":648,"context_line":"#        \u0027http://docs.openstack.org/api/openstack-identity/3/ext/OS-EP-FILTER/\u0027"},{"line_number":649,"context_line":"#        \u00271.0/rel/endpoint_projects\u0027: {"},{"line_number":650,"context_line":"#            \u0027href-template\u0027: \u0027/OS-EP-FILTER/endpoints/{endpoint_id}/projects\u0027,"},{"line_number":651,"context_line":"#            \u0027href-vars\u0027: {"},{"line_number":652,"context_line":"#                \u0027endpoint_id\u0027:"},{"line_number":653,"context_line":"#                \u0027http://docs.openstack.org/api/openstack-identity/3/param/\u0027"},{"line_number":654,"context_line":"#                \u0027endpoint_id\u0027,"},{"line_number":655,"context_line":"#            },"},{"line_number":656,"context_line":"#        },"},{"line_number":657,"context_line":"#        \u0027http://docs.openstack.org/api/openstack-identity/3/ext/OS-EP-FILTER/\u0027"},{"line_number":658,"context_line":"#        \u00271.0/rel/endpoint_groups\u0027: {"},{"line_number":659,"context_line":"#            \u0027href\u0027: \u0027/OS-EP-FILTER/endpoint_groups\u0027,"},{"line_number":660,"context_line":"#        },"},{"line_number":661,"context_line":"#        \u0027http://docs.openstack.org/api/openstack-identity/3/ext/OS-EP-FILTER/\u0027"},{"line_number":662,"context_line":"#        \u00271.0/rel/endpoint_group\u0027: {"},{"line_number":663,"context_line":"#            \u0027href-template\u0027: \u0027/OS-EP-FILTER/endpoint_groups/\u0027"},{"line_number":664,"context_line":"#            \u0027{endpoint_group_id}\u0027,"},{"line_number":665,"context_line":"#            \u0027href-vars\u0027: {"},{"line_number":666,"context_line":"#                \u0027endpoint_group_id\u0027:"},{"line_number":667,"context_line":"#                \u0027http://docs.openstack.org/api/openstack-identity/3/\u0027"},{"line_number":668,"context_line":"#                \u0027ext/OS-EP-FILTER/1.0/param/endpoint_group_id\u0027,"},{"line_number":669,"context_line":"#            },"},{"line_number":670,"context_line":"#        },"},{"line_number":671,"context_line":"#        \u0027http://docs.openstack.org/api/openstack-identity/3/ext/OS-EP-FILTER/\u0027"},{"line_number":672,"context_line":"#        \u00271.0/rel/endpoint_group_to_project_association\u0027: {"},{"line_number":673,"context_line":"#            \u0027href-template\u0027: \u0027/OS-EP-FILTER/endpoint_groups/\u0027"},{"line_number":674,"context_line":"#            \u0027{endpoint_group_id}/projects/{project_id}\u0027,"},{"line_number":675,"context_line":"#            \u0027href-vars\u0027: {"},{"line_number":676,"context_line":"#                \u0027project_id\u0027:"},{"line_number":677,"context_line":"#                \u0027http://docs.openstack.org/api/openstack-identity/3/param/\u0027"},{"line_number":678,"context_line":"#                \u0027project_id\u0027,"},{"line_number":679,"context_line":"#                \u0027endpoint_group_id\u0027:"},{"line_number":680,"context_line":"#                \u0027http://docs.openstack.org/api/openstack-identity/3/\u0027"},{"line_number":681,"context_line":"#                \u0027ext/OS-EP-FILTER/1.0/param/endpoint_group_id\u0027,"},{"line_number":682,"context_line":"#            },"},{"line_number":683,"context_line":"#        },"},{"line_number":684,"context_line":"#        \u0027http://docs.openstack.org/api/openstack-identity/3/ext/OS-EP-FILTER/\u0027"},{"line_number":685,"context_line":"#        \u00271.0/rel/projects_associated_with_endpoint_group\u0027: {"},{"line_number":686,"context_line":"#            \u0027href-template\u0027: \u0027/OS-EP-FILTER/endpoint_groups/\u0027"},{"line_number":687,"context_line":"#            \u0027{endpoint_group_id}/projects\u0027,"},{"line_number":688,"context_line":"#            \u0027href-vars\u0027: {"},{"line_number":689,"context_line":"#                \u0027endpoint_group_id\u0027:"},{"line_number":690,"context_line":"#                \u0027http://docs.openstack.org/api/openstack-identity/3/\u0027"},{"line_number":691,"context_line":"#                \u0027ext/OS-EP-FILTER/1.0/param/endpoint_group_id\u0027,"},{"line_number":692,"context_line":"#            },"},{"line_number":693,"context_line":"#        },"},{"line_number":694,"context_line":"#        \u0027http://docs.openstack.org/api/openstack-identity/3/ext/OS-EP-FILTER/\u0027"},{"line_number":695,"context_line":"#        \u00271.0/rel/endpoints_in_endpoint_group\u0027: {"},{"line_number":696,"context_line":"#            \u0027href-template\u0027: \u0027/OS-EP-FILTER/endpoint_groups/\u0027"},{"line_number":697,"context_line":"#            \u0027{endpoint_group_id}/endpoints\u0027,"},{"line_number":698,"context_line":"#            \u0027href-vars\u0027: {"},{"line_number":699,"context_line":"#                \u0027endpoint_group_id\u0027:"},{"line_number":700,"context_line":"#                \u0027http://docs.openstack.org/api/openstack-identity/3/\u0027"},{"line_number":701,"context_line":"#                \u0027ext/OS-EP-FILTER/1.0/param/endpoint_group_id\u0027,"},{"line_number":702,"context_line":"#            },"},{"line_number":703,"context_line":"#        },"},{"line_number":704,"context_line":"#        \u0027http://docs.openstack.org/api/openstack-identity/3/ext/OS-EP-FILTER/\u0027"},{"line_number":705,"context_line":"#        \u00271.0/rel/project_endpoint_groups\u0027: {"},{"line_number":706,"context_line":"#            \u0027href-template\u0027: \u0027/OS-EP-FILTER/projects/{project_id}/\u0027"},{"line_number":707,"context_line":"#            \u0027endpoint_groups\u0027,"},{"line_number":708,"context_line":"#            \u0027href-vars\u0027: {"},{"line_number":709,"context_line":"#                \u0027project_id\u0027:"},{"line_number":710,"context_line":"#                \u0027http://docs.openstack.org/api/openstack-identity/3/param/\u0027"},{"line_number":711,"context_line":"#                \u0027project_id\u0027,"},{"line_number":712,"context_line":"#            },"},{"line_number":713,"context_line":"#        },"},{"line_number":714,"context_line":"#    }"},{"line_number":715,"context_line":"#"},{"line_number":716,"context_line":"#"},{"line_number":717,"context_line":"#class EndpointGroupCRUDTestCase(EndpointFilterTestCase):"},{"line_number":718,"context_line":"#"},{"line_number":719,"context_line":"#    DEFAULT_ENDPOINT_GROUP_BODY \u003d {"},{"line_number":720,"context_line":"#        \u0027endpoint_group\u0027: {"},{"line_number":721,"context_line":"#            \u0027description\u0027: \u0027endpoint group description\u0027,"},{"line_number":722,"context_line":"#            \u0027filters\u0027: {"},{"line_number":723,"context_line":"#                \u0027interface\u0027: \u0027admin\u0027"},{"line_number":724,"context_line":"#            },"},{"line_number":725,"context_line":"#            \u0027name\u0027: \u0027endpoint_group_name\u0027"},{"line_number":726,"context_line":"#        }"},{"line_number":727,"context_line":"#    }"},{"line_number":728,"context_line":"#"},{"line_number":729,"context_line":"#    DEFAULT_ENDPOINT_GROUP_URL \u003d \u0027/OS-EP-FILTER/endpoint_groups\u0027"},{"line_number":730,"context_line":"#"},{"line_number":731,"context_line":"#    def test_create_endpoint_group(self):"},{"line_number":732,"context_line":"#        \"\"\"POST /OS-EP-FILTER/endpoint_groups"},{"line_number":733,"context_line":"#"},{"line_number":734,"context_line":"#        Valid endpoint group test case."},{"line_number":735,"context_line":"#"},{"line_number":736,"context_line":"#        \"\"\""},{"line_number":737,"context_line":"#        r \u003d self.post(self.DEFAULT_ENDPOINT_GROUP_URL,"},{"line_number":738,"context_line":"#                      body\u003dself.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":739,"context_line":"#        expected_filters \u003d (self.DEFAULT_ENDPOINT_GROUP_BODY"},{"line_number":740,"context_line":"#                            [\u0027endpoint_group\u0027][\u0027filters\u0027])"},{"line_number":741,"context_line":"#        expected_name \u003d (self.DEFAULT_ENDPOINT_GROUP_BODY"},{"line_number":742,"context_line":"#                         [\u0027endpoint_group\u0027][\u0027name\u0027])"},{"line_number":743,"context_line":"#        self.assertEqual(expected_filters,"},{"line_number":744,"context_line":"#                         r.result[\u0027endpoint_group\u0027][\u0027filters\u0027])"},{"line_number":745,"context_line":"#        self.assertEqual(expected_name, r.result[\u0027endpoint_group\u0027][\u0027name\u0027])"},{"line_number":746,"context_line":"#        self.assertThat("},{"line_number":747,"context_line":"#            r.result[\u0027endpoint_group\u0027][\u0027links\u0027][\u0027self\u0027],"},{"line_number":748,"context_line":"#            matchers.EndsWith("},{"line_number":749,"context_line":"#                \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":750,"context_line":"#                    \u0027endpoint_group_id\u0027: r.result[\u0027endpoint_group\u0027][\u0027id\u0027]}))"},{"line_number":751,"context_line":"#"},{"line_number":752,"context_line":"#    def test_create_invalid_endpoint_group(self):"},{"line_number":753,"context_line":"#        \"\"\"POST /OS-EP-FILTER/endpoint_groups"},{"line_number":754,"context_line":"#"},{"line_number":755,"context_line":"#        Invalid endpoint group creation test case."},{"line_number":756,"context_line":"#"},{"line_number":757,"context_line":"#        \"\"\""},{"line_number":758,"context_line":"#        invalid_body \u003d copy.deepcopy(self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":759,"context_line":"#        invalid_body[\u0027endpoint_group\u0027][\u0027filters\u0027] \u003d {\u0027foobar\u0027: \u0027admin\u0027}"},{"line_number":760,"context_line":"#        self.post(self.DEFAULT_ENDPOINT_GROUP_URL,"},{"line_number":761,"context_line":"#                  body\u003dinvalid_body,"},{"line_number":762,"context_line":"#                  expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":763,"context_line":"#"},{"line_number":764,"context_line":"#    def test_get_endpoint_group(self):"},{"line_number":765,"context_line":"#        \"\"\"GET /OS-EP-FILTER/endpoint_groups/{endpoint_group}"},{"line_number":766,"context_line":"#"},{"line_number":767,"context_line":"#        Valid endpoint group test case."},{"line_number":768,"context_line":"#"},{"line_number":769,"context_line":"#        \"\"\""},{"line_number":770,"context_line":"#        # create an endpoint group to work with"},{"line_number":771,"context_line":"#        response \u003d self.post(self.DEFAULT_ENDPOINT_GROUP_URL,"},{"line_number":772,"context_line":"#                             body\u003dself.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":773,"context_line":"#        endpoint_group_id \u003d response.result[\u0027endpoint_group\u0027][\u0027id\u0027]"},{"line_number":774,"context_line":"#        endpoint_group_filters \u003d response.result[\u0027endpoint_group\u0027][\u0027filters\u0027]"},{"line_number":775,"context_line":"#        endpoint_group_name \u003d response.result[\u0027endpoint_group\u0027][\u0027name\u0027]"},{"line_number":776,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":777,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":778,"context_line":"#        self.get(url)"},{"line_number":779,"context_line":"#        self.assertEqual(endpoint_group_id,"},{"line_number":780,"context_line":"#                         response.result[\u0027endpoint_group\u0027][\u0027id\u0027])"},{"line_number":781,"context_line":"#        self.assertEqual(endpoint_group_filters,"},{"line_number":782,"context_line":"#                         response.result[\u0027endpoint_group\u0027][\u0027filters\u0027])"},{"line_number":783,"context_line":"#        self.assertEqual(endpoint_group_name,"},{"line_number":784,"context_line":"#                         response.result[\u0027endpoint_group\u0027][\u0027name\u0027])"},{"line_number":785,"context_line":"#        self.assertThat(response.result[\u0027endpoint_group\u0027][\u0027links\u0027][\u0027self\u0027],"},{"line_number":786,"context_line":"#                        matchers.EndsWith(url))"},{"line_number":787,"context_line":"#"},{"line_number":788,"context_line":"#    def test_get_invalid_endpoint_group(self):"},{"line_number":789,"context_line":"#        \"\"\"GET /OS-EP-FILTER/endpoint_groups/{endpoint_group}"},{"line_number":790,"context_line":"#"},{"line_number":791,"context_line":"#        Invalid endpoint group test case."},{"line_number":792,"context_line":"#"},{"line_number":793,"context_line":"#        \"\"\""},{"line_number":794,"context_line":"#        endpoint_group_id \u003d \u0027foobar\u0027"},{"line_number":795,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":796,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":797,"context_line":"#        self.get(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":798,"context_line":"#"},{"line_number":799,"context_line":"#    def test_check_endpoint_group(self):"},{"line_number":800,"context_line":"#        \"\"\"HEAD /OS-EP-FILTER/endpoint_groups/{endpoint_group_id}"},{"line_number":801,"context_line":"#"},{"line_number":802,"context_line":"#        Valid endpoint_group_id test case."},{"line_number":803,"context_line":"#"},{"line_number":804,"context_line":"#        \"\"\""},{"line_number":805,"context_line":"#        # create an endpoint group to work with"},{"line_number":806,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":807,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":808,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":809,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":810,"context_line":"#        self.head(url, expected_status\u003dhttp_client.OK)"},{"line_number":811,"context_line":"#"},{"line_number":812,"context_line":"#    def test_check_invalid_endpoint_group(self):"},{"line_number":813,"context_line":"#        \"\"\"HEAD /OS-EP-FILTER/endpoint_groups/{endpoint_group_id}"},{"line_number":814,"context_line":"#"},{"line_number":815,"context_line":"#        Invalid endpoint_group_id test case."},{"line_number":816,"context_line":"#"},{"line_number":817,"context_line":"#        \"\"\""},{"line_number":818,"context_line":"#        endpoint_group_id \u003d \u0027foobar\u0027"},{"line_number":819,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":820,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":821,"context_line":"#        self.head(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":822,"context_line":"#"},{"line_number":823,"context_line":"#    def test_patch_endpoint_group(self):"},{"line_number":824,"context_line":"#        \"\"\"PATCH /OS-EP-FILTER/endpoint_groups/{endpoint_group}"},{"line_number":825,"context_line":"#"},{"line_number":826,"context_line":"#        Valid endpoint group patch test case."},{"line_number":827,"context_line":"#"},{"line_number":828,"context_line":"#        \"\"\""},{"line_number":829,"context_line":"#        body \u003d copy.deepcopy(self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":830,"context_line":"#        body[\u0027endpoint_group\u0027][\u0027filters\u0027] \u003d {\u0027region_id\u0027: \u0027UK\u0027}"},{"line_number":831,"context_line":"#        body[\u0027endpoint_group\u0027][\u0027name\u0027] \u003d \u0027patch_test\u0027"},{"line_number":832,"context_line":"#        # create an endpoint group to work with"},{"line_number":833,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":834,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":835,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":836,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":837,"context_line":"#        r \u003d self.patch(url, body\u003dbody)"},{"line_number":838,"context_line":"#        self.assertEqual(endpoint_group_id,"},{"line_number":839,"context_line":"#                         r.result[\u0027endpoint_group\u0027][\u0027id\u0027])"},{"line_number":840,"context_line":"#        self.assertEqual(body[\u0027endpoint_group\u0027][\u0027filters\u0027],"},{"line_number":841,"context_line":"#                         r.result[\u0027endpoint_group\u0027][\u0027filters\u0027])"},{"line_number":842,"context_line":"#        self.assertThat(r.result[\u0027endpoint_group\u0027][\u0027links\u0027][\u0027self\u0027],"},{"line_number":843,"context_line":"#                        matchers.EndsWith(url))"},{"line_number":844,"context_line":"#"},{"line_number":845,"context_line":"#    def test_patch_nonexistent_endpoint_group(self):"},{"line_number":846,"context_line":"#        \"\"\"PATCH /OS-EP-FILTER/endpoint_groups/{endpoint_group}"},{"line_number":847,"context_line":"#"},{"line_number":848,"context_line":"#        Invalid endpoint group patch test case."},{"line_number":849,"context_line":"#"},{"line_number":850,"context_line":"#        \"\"\""},{"line_number":851,"context_line":"#        body \u003d {"},{"line_number":852,"context_line":"#            \u0027endpoint_group\u0027: {"},{"line_number":853,"context_line":"#                \u0027name\u0027: \u0027patch_test\u0027"},{"line_number":854,"context_line":"#            }"},{"line_number":855,"context_line":"#        }"},{"line_number":856,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":857,"context_line":"#            \u0027endpoint_group_id\u0027: \u0027ABC\u0027}"},{"line_number":858,"context_line":"#        self.patch(url, body\u003dbody, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":859,"context_line":"#"},{"line_number":860,"context_line":"#    def test_patch_invalid_endpoint_group(self):"},{"line_number":861,"context_line":"#        \"\"\"PATCH /OS-EP-FILTER/endpoint_groups/{endpoint_group}"},{"line_number":862,"context_line":"#"},{"line_number":863,"context_line":"#        Valid endpoint group patch test case."},{"line_number":864,"context_line":"#"},{"line_number":865,"context_line":"#        \"\"\""},{"line_number":866,"context_line":"#        body \u003d {"},{"line_number":867,"context_line":"#            \u0027endpoint_group\u0027: {"},{"line_number":868,"context_line":"#                \u0027description\u0027: \u0027endpoint group description\u0027,"},{"line_number":869,"context_line":"#                \u0027filters\u0027: {"},{"line_number":870,"context_line":"#                    \u0027region\u0027: \u0027UK\u0027"},{"line_number":871,"context_line":"#                },"},{"line_number":872,"context_line":"#                \u0027name\u0027: \u0027patch_test\u0027"},{"line_number":873,"context_line":"#            }"},{"line_number":874,"context_line":"#        }"},{"line_number":875,"context_line":"#        # create an endpoint group to work with"},{"line_number":876,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":877,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":878,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":879,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":880,"context_line":"#        self.patch(url, body\u003dbody, expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":881,"context_line":"#"},{"line_number":882,"context_line":"#        # Perform a GET call to ensure that the content remains"},{"line_number":883,"context_line":"#        # the same (as DEFAULT_ENDPOINT_GROUP_BODY) after attempting to update"},{"line_number":884,"context_line":"#        # with an invalid filter"},{"line_number":885,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":886,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":887,"context_line":"#        r \u003d self.get(url)"},{"line_number":888,"context_line":"#        del r.result[\u0027endpoint_group\u0027][\u0027id\u0027]"},{"line_number":889,"context_line":"#        del r.result[\u0027endpoint_group\u0027][\u0027links\u0027]"},{"line_number":890,"context_line":"#        self.assertDictEqual(self.DEFAULT_ENDPOINT_GROUP_BODY, r.result)"},{"line_number":891,"context_line":"#"},{"line_number":892,"context_line":"#    def test_delete_endpoint_group(self):"},{"line_number":893,"context_line":"#        \"\"\"GET /OS-EP-FILTER/endpoint_groups/{endpoint_group}"},{"line_number":894,"context_line":"#"},{"line_number":895,"context_line":"#        Valid endpoint group test case."},{"line_number":896,"context_line":"#"},{"line_number":897,"context_line":"#        \"\"\""},{"line_number":898,"context_line":"#        # create an endpoint group to work with"},{"line_number":899,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":900,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":901,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":902,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":903,"context_line":"#        self.delete(url)"},{"line_number":904,"context_line":"#        self.get(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":905,"context_line":"#"},{"line_number":906,"context_line":"#    def test_delete_invalid_endpoint_group(self):"},{"line_number":907,"context_line":"#        \"\"\"GET /OS-EP-FILTER/endpoint_groups/{endpoint_group}"},{"line_number":908,"context_line":"#"},{"line_number":909,"context_line":"#        Invalid endpoint group test case."},{"line_number":910,"context_line":"#"},{"line_number":911,"context_line":"#        \"\"\""},{"line_number":912,"context_line":"#        endpoint_group_id \u003d \u0027foobar\u0027"},{"line_number":913,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":914,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":915,"context_line":"#        self.delete(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":916,"context_line":"#"},{"line_number":917,"context_line":"#    def test_add_endpoint_group_to_project(self):"},{"line_number":918,"context_line":"#        \"\"\"Create a valid endpoint group and project association.\"\"\""},{"line_number":919,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":920,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":921,"context_line":"#        self._create_endpoint_group_project_association(endpoint_group_id,"},{"line_number":922,"context_line":"#                                                        self.project_id)"},{"line_number":923,"context_line":"#"},{"line_number":924,"context_line":"#    def test_add_endpoint_group_to_project_with_invalid_project_id(self):"},{"line_number":925,"context_line":"#        \"\"\"Create an invalid endpoint group and project association.\"\"\""},{"line_number":926,"context_line":"#        # create an endpoint group to work with"},{"line_number":927,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":928,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":929,"context_line":"#"},{"line_number":930,"context_line":"#        # associate endpoint group with project"},{"line_number":931,"context_line":"#        project_id \u003d uuid.uuid4().hex"},{"line_number":932,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":933,"context_line":"#            endpoint_group_id, project_id)"},{"line_number":934,"context_line":"#        self.put(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":935,"context_line":"#"},{"line_number":936,"context_line":"#    def test_get_endpoint_group_in_project(self):"},{"line_number":937,"context_line":"#        \"\"\"Test retrieving project endpoint group association.\"\"\""},{"line_number":938,"context_line":"#        # create an endpoint group to work with"},{"line_number":939,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":940,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":941,"context_line":"#"},{"line_number":942,"context_line":"#        # associate endpoint group with project"},{"line_number":943,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":944,"context_line":"#            endpoint_group_id, self.project_id)"},{"line_number":945,"context_line":"#        self.put(url)"},{"line_number":946,"context_line":"#        response \u003d self.get(url)"},{"line_number":947,"context_line":"#        self.assertEqual("},{"line_number":948,"context_line":"#            endpoint_group_id,"},{"line_number":949,"context_line":"#            response.result[\u0027project_endpoint_group\u0027][\u0027endpoint_group_id\u0027])"},{"line_number":950,"context_line":"#        self.assertEqual("},{"line_number":951,"context_line":"#            self.project_id,"},{"line_number":952,"context_line":"#            response.result[\u0027project_endpoint_group\u0027][\u0027project_id\u0027])"},{"line_number":953,"context_line":"#"},{"line_number":954,"context_line":"#    def test_get_invalid_endpoint_group_in_project(self):"},{"line_number":955,"context_line":"#        \"\"\"Test retrieving project endpoint group association.\"\"\""},{"line_number":956,"context_line":"#        endpoint_group_id \u003d uuid.uuid4().hex"},{"line_number":957,"context_line":"#        project_id \u003d uuid.uuid4().hex"},{"line_number":958,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":959,"context_line":"#            endpoint_group_id, project_id)"},{"line_number":960,"context_line":"#        self.get(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":961,"context_line":"#"},{"line_number":962,"context_line":"#    def test_list_endpoint_groups_in_project(self):"},{"line_number":963,"context_line":"#        \"\"\"GET /OS-EP-FILTER/projects/{project_id}/endpoint_groups.\"\"\""},{"line_number":964,"context_line":"#        # create an endpoint group to work with"},{"line_number":965,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":966,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":967,"context_line":"#"},{"line_number":968,"context_line":"#        # associate endpoint group with project"},{"line_number":969,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":970,"context_line":"#            endpoint_group_id, self.project_id)"},{"line_number":971,"context_line":"#        self.put(url)"},{"line_number":972,"context_line":"#"},{"line_number":973,"context_line":"#        url \u003d (\u0027/OS-EP-FILTER/projects/%(project_id)s/endpoint_groups\u0027 %"},{"line_number":974,"context_line":"#               {\u0027project_id\u0027: self.project_id})"},{"line_number":975,"context_line":"#        response \u003d self.get(url)"},{"line_number":976,"context_line":"#"},{"line_number":977,"context_line":"#        self.assertEqual("},{"line_number":978,"context_line":"#            endpoint_group_id,"},{"line_number":979,"context_line":"#            response.result[\u0027endpoint_groups\u0027][0][\u0027id\u0027])"},{"line_number":980,"context_line":"#"},{"line_number":981,"context_line":"#    def test_list_endpoint_groups_in_invalid_project(self):"},{"line_number":982,"context_line":"#        \"\"\"Test retrieving from invalid project.\"\"\""},{"line_number":983,"context_line":"#        project_id \u003d uuid.uuid4().hex"},{"line_number":984,"context_line":"#        url \u003d (\u0027/OS-EP-FILTER/projects/%(project_id)s/endpoint_groups\u0027 %"},{"line_number":985,"context_line":"#               {\u0027project_id\u0027: project_id})"},{"line_number":986,"context_line":"#        self.get(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":987,"context_line":"#"},{"line_number":988,"context_line":"#    def test_empty_endpoint_groups_in_project(self):"},{"line_number":989,"context_line":"#        \"\"\"Test when no endpoint groups associated with the project.\"\"\""},{"line_number":990,"context_line":"#        url \u003d (\u0027/OS-EP-FILTER/projects/%(project_id)s/endpoint_groups\u0027 %"},{"line_number":991,"context_line":"#               {\u0027project_id\u0027: self.project_id})"},{"line_number":992,"context_line":"#        response \u003d self.get(url)"},{"line_number":993,"context_line":"#"},{"line_number":994,"context_line":"#        self.assertEqual(0, len(response.result[\u0027endpoint_groups\u0027]))"},{"line_number":995,"context_line":"#"},{"line_number":996,"context_line":"#    def test_check_endpoint_group_to_project(self):"},{"line_number":997,"context_line":"#        \"\"\"Test HEAD with a valid endpoint group and project association.\"\"\""},{"line_number":998,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":999,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1000,"context_line":"#        self._create_endpoint_group_project_association(endpoint_group_id,"},{"line_number":1001,"context_line":"#                                                        self.project_id)"},{"line_number":1002,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":1003,"context_line":"#            endpoint_group_id, self.project_id)"},{"line_number":1004,"context_line":"#        self.head(url, expected_status\u003dhttp_client.OK)"},{"line_number":1005,"context_line":"#"},{"line_number":1006,"context_line":"#    def test_check_endpoint_group_to_project_with_invalid_project_id(self):"},{"line_number":1007,"context_line":"#        \"\"\"Test HEAD with an invalid endpoint group and project association.\"\"\""},{"line_number":1008,"context_line":"#        # create an endpoint group to work with"},{"line_number":1009,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1010,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1011,"context_line":"#"},{"line_number":1012,"context_line":"#        # create an endpoint group to project association"},{"line_number":1013,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":1014,"context_line":"#            endpoint_group_id, self.project_id)"},{"line_number":1015,"context_line":"#        self.put(url)"},{"line_number":1016,"context_line":"#"},{"line_number":1017,"context_line":"#        # send a head request with an invalid project id"},{"line_number":1018,"context_line":"#        project_id \u003d uuid.uuid4().hex"},{"line_number":1019,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":1020,"context_line":"#            endpoint_group_id, project_id)"},{"line_number":1021,"context_line":"#        self.head(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1022,"context_line":"#"},{"line_number":1023,"context_line":"#    def test_list_endpoint_groups(self):"},{"line_number":1024,"context_line":"#        \"\"\"GET /OS-EP-FILTER/endpoint_groups.\"\"\""},{"line_number":1025,"context_line":"#        # create an endpoint group to work with"},{"line_number":1026,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1027,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1028,"context_line":"#"},{"line_number":1029,"context_line":"#        # recover all endpoint groups"},{"line_number":1030,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups\u0027"},{"line_number":1031,"context_line":"#        r \u003d self.get(url)"},{"line_number":1032,"context_line":"#        self.assertNotEmpty(r.result[\u0027endpoint_groups\u0027])"},{"line_number":1033,"context_line":"#        self.assertEqual(endpoint_group_id,"},{"line_number":1034,"context_line":"#                         r.result[\u0027endpoint_groups\u0027][0].get(\u0027id\u0027))"},{"line_number":1035,"context_line":"#"},{"line_number":1036,"context_line":"#    def test_list_projects_associated_with_endpoint_group(self):"},{"line_number":1037,"context_line":"#        \"\"\"GET /OS-EP-FILTER/endpoint_groups/{endpoint_group}/projects"},{"line_number":1038,"context_line":"#"},{"line_number":1039,"context_line":"#        Valid endpoint group test case."},{"line_number":1040,"context_line":"#"},{"line_number":1041,"context_line":"#        \"\"\""},{"line_number":1042,"context_line":"#        # create an endpoint group to work with"},{"line_number":1043,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1044,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1045,"context_line":"#"},{"line_number":1046,"context_line":"#        # associate endpoint group with project"},{"line_number":1047,"context_line":"#        self._create_endpoint_group_project_association(endpoint_group_id,"},{"line_number":1048,"context_line":"#                                                        self.project_id)"},{"line_number":1049,"context_line":"#"},{"line_number":1050,"context_line":"#        # recover list of projects associated with endpoint group"},{"line_number":1051,"context_line":"#        url \u003d (\u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027"},{"line_number":1052,"context_line":"#               \u0027/projects\u0027 %"},{"line_number":1053,"context_line":"#               {\u0027endpoint_group_id\u0027: endpoint_group_id})"},{"line_number":1054,"context_line":"#        self.get(url)"},{"line_number":1055,"context_line":"#"},{"line_number":1056,"context_line":"#    def test_list_endpoints_associated_with_endpoint_group(self):"},{"line_number":1057,"context_line":"#        \"\"\"GET /OS-EP-FILTER/endpoint_groups/{endpoint_group}/endpoints"},{"line_number":1058,"context_line":"#"},{"line_number":1059,"context_line":"#        Valid endpoint group test case."},{"line_number":1060,"context_line":"#"},{"line_number":1061,"context_line":"#        \"\"\""},{"line_number":1062,"context_line":"#        # create a service"},{"line_number":1063,"context_line":"#        service_ref \u003d unit.new_service_ref()"},{"line_number":1064,"context_line":"#        response \u003d self.post("},{"line_number":1065,"context_line":"#            \u0027/services\u0027,"},{"line_number":1066,"context_line":"#            body\u003d{\u0027service\u0027: service_ref})"},{"line_number":1067,"context_line":"#"},{"line_number":1068,"context_line":"#        service_id \u003d response.result[\u0027service\u0027][\u0027id\u0027]"},{"line_number":1069,"context_line":"#"},{"line_number":1070,"context_line":"#        # create an endpoint"},{"line_number":1071,"context_line":"#        endpoint_ref \u003d unit.new_endpoint_ref(service_id\u003dservice_id,"},{"line_number":1072,"context_line":"#                                             interface\u003d\u0027public\u0027,"},{"line_number":1073,"context_line":"#                                             region_id\u003dself.region_id)"},{"line_number":1074,"context_line":"#        response \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: endpoint_ref})"},{"line_number":1075,"context_line":"#        endpoint_id \u003d response.result[\u0027endpoint\u0027][\u0027id\u0027]"},{"line_number":1076,"context_line":"#"},{"line_number":1077,"context_line":"#        # create an endpoint group"},{"line_number":1078,"context_line":"#        body \u003d copy.deepcopy(self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1079,"context_line":"#        body[\u0027endpoint_group\u0027][\u0027filters\u0027] \u003d {\u0027service_id\u0027: service_id}"},{"line_number":1080,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1081,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, body)"},{"line_number":1082,"context_line":"#"},{"line_number":1083,"context_line":"#        # create association"},{"line_number":1084,"context_line":"#        self._create_endpoint_group_project_association(endpoint_group_id,"},{"line_number":1085,"context_line":"#                                                        self.project_id)"},{"line_number":1086,"context_line":"#"},{"line_number":1087,"context_line":"#        # recover list of endpoints associated with endpoint group"},{"line_number":1088,"context_line":"#        url \u003d (\u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027"},{"line_number":1089,"context_line":"#               \u0027/endpoints\u0027 % {\u0027endpoint_group_id\u0027: endpoint_group_id})"},{"line_number":1090,"context_line":"#        r \u003d self.get(url)"},{"line_number":1091,"context_line":"#        self.assertNotEmpty(r.result[\u0027endpoints\u0027])"},{"line_number":1092,"context_line":"#        self.assertEqual(endpoint_id, r.result[\u0027endpoints\u0027][0].get(\u0027id\u0027))"},{"line_number":1093,"context_line":"#"},{"line_number":1094,"context_line":"#    def test_list_endpoints_associated_with_project_endpoint_group(self):"},{"line_number":1095,"context_line":"#        \"\"\"GET /OS-EP-FILTER/projects/{project_id}/endpoints"},{"line_number":1096,"context_line":"#"},{"line_number":1097,"context_line":"#        Valid project, endpoint id, and endpoint group test case."},{"line_number":1098,"context_line":"#"},{"line_number":1099,"context_line":"#        \"\"\""},{"line_number":1100,"context_line":"#        # create a temporary service"},{"line_number":1101,"context_line":"#        service_ref \u003d unit.new_service_ref()"},{"line_number":1102,"context_line":"#        response \u003d self.post(\u0027/services\u0027, body\u003d{\u0027service\u0027: service_ref})"},{"line_number":1103,"context_line":"#        service_id2 \u003d response.result[\u0027service\u0027][\u0027id\u0027]"},{"line_number":1104,"context_line":"#"},{"line_number":1105,"context_line":"#        # create additional endpoints"},{"line_number":1106,"context_line":"#        self._create_endpoint_and_associations("},{"line_number":1107,"context_line":"#            self.default_domain_project_id, service_id2)"},{"line_number":1108,"context_line":"#        self._create_endpoint_and_associations("},{"line_number":1109,"context_line":"#            self.default_domain_project_id)"},{"line_number":1110,"context_line":"#"},{"line_number":1111,"context_line":"#        # create project and endpoint association with default endpoint:"},{"line_number":1112,"context_line":"#        self.put(self.default_request_url)"},{"line_number":1113,"context_line":"#"},{"line_number":1114,"context_line":"#        # create an endpoint group that contains a different endpoint"},{"line_number":1115,"context_line":"#        body \u003d copy.deepcopy(self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1116,"context_line":"#        body[\u0027endpoint_group\u0027][\u0027filters\u0027] \u003d {\u0027service_id\u0027: service_id2}"},{"line_number":1117,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1118,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, body)"},{"line_number":1119,"context_line":"#"},{"line_number":1120,"context_line":"#        # associate endpoint group with project"},{"line_number":1121,"context_line":"#        self._create_endpoint_group_project_association("},{"line_number":1122,"context_line":"#            endpoint_group_id, self.default_domain_project_id)"},{"line_number":1123,"context_line":"#"},{"line_number":1124,"context_line":"#        # Now get a list of the filtered endpoints"},{"line_number":1125,"context_line":"#        endpoints_url \u003d \u0027/OS-EP-FILTER/projects/%(project_id)s/endpoints\u0027 % {"},{"line_number":1126,"context_line":"#            \u0027project_id\u0027: self.default_domain_project_id}"},{"line_number":1127,"context_line":"#        r \u003d self.get(endpoints_url)"},{"line_number":1128,"context_line":"#        endpoints \u003d self.assertValidEndpointListResponse(r)"},{"line_number":1129,"context_line":"#        self.assertEqual(2, len(endpoints))"},{"line_number":1130,"context_line":"#"},{"line_number":1131,"context_line":"#        # Ensure catalog includes the endpoints from endpoint_group project"},{"line_number":1132,"context_line":"#        # association, this is needed when a project scoped token is issued"},{"line_number":1133,"context_line":"#        # and \"endpoint_filter.sql\" backend driver is in place."},{"line_number":1134,"context_line":"#        user_id \u003d uuid.uuid4().hex"},{"line_number":1135,"context_line":"#        catalog_list \u003d self.catalog_api.get_v3_catalog("},{"line_number":1136,"context_line":"#            user_id,"},{"line_number":1137,"context_line":"#            self.default_domain_project_id)"},{"line_number":1138,"context_line":"#        self.assertEqual(2, len(catalog_list))"},{"line_number":1139,"context_line":"#"},{"line_number":1140,"context_line":"#        # Now remove project endpoint group association"},{"line_number":1141,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":1142,"context_line":"#            endpoint_group_id, self.default_domain_project_id)"},{"line_number":1143,"context_line":"#        self.delete(url)"},{"line_number":1144,"context_line":"#"},{"line_number":1145,"context_line":"#        # Now remove endpoint group"},{"line_number":1146,"context_line":"#        url \u003d \u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027 % {"},{"line_number":1147,"context_line":"#            \u0027endpoint_group_id\u0027: endpoint_group_id}"},{"line_number":1148,"context_line":"#        self.delete(url)"},{"line_number":1149,"context_line":"#"},{"line_number":1150,"context_line":"#        r \u003d self.get(endpoints_url)"},{"line_number":1151,"context_line":"#        endpoints \u003d self.assertValidEndpointListResponse(r)"},{"line_number":1152,"context_line":"#        self.assertEqual(1, len(endpoints))"},{"line_number":1153,"context_line":"#"},{"line_number":1154,"context_line":"#        catalog_list \u003d self.catalog_api.get_v3_catalog("},{"line_number":1155,"context_line":"#            user_id,"},{"line_number":1156,"context_line":"#            self.default_domain_project_id)"},{"line_number":1157,"context_line":"#        self.assertEqual(1, len(catalog_list))"},{"line_number":1158,"context_line":"#"},{"line_number":1159,"context_line":"#    def test_endpoint_group_project_cleanup_with_project(self):"},{"line_number":1160,"context_line":"#        # create endpoint group"},{"line_number":1161,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1162,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1163,"context_line":"#"},{"line_number":1164,"context_line":"#        # create new project and associate with endpoint_group"},{"line_number":1165,"context_line":"#        project_ref \u003d unit.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":1166,"context_line":"#        r \u003d self.post(\u0027/projects\u0027, body\u003d{\u0027project\u0027: project_ref})"},{"line_number":1167,"context_line":"#        project \u003d self.assertValidProjectResponse(r, project_ref)"},{"line_number":1168,"context_line":"#        url \u003d self._get_project_endpoint_group_url(endpoint_group_id,"},{"line_number":1169,"context_line":"#                                                   project[\u0027id\u0027])"},{"line_number":1170,"context_line":"#        self.put(url)"},{"line_number":1171,"context_line":"#"},{"line_number":1172,"context_line":"#        # check that we can recover the project endpoint group association"},{"line_number":1173,"context_line":"#        self.get(url)"},{"line_number":1174,"context_line":"#"},{"line_number":1175,"context_line":"#        # Now delete the project and then try and retrieve the project"},{"line_number":1176,"context_line":"#        # endpoint group association again"},{"line_number":1177,"context_line":"#        self.delete(\u0027/projects/%(project_id)s\u0027 % {"},{"line_number":1178,"context_line":"#            \u0027project_id\u0027: project[\u0027id\u0027]})"},{"line_number":1179,"context_line":"#        self.get(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1180,"context_line":"#"},{"line_number":1181,"context_line":"#    def test_endpoint_group_project_cleanup_with_endpoint_group(self):"},{"line_number":1182,"context_line":"#        # create endpoint group"},{"line_number":1183,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1184,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1185,"context_line":"#"},{"line_number":1186,"context_line":"#        # create new project and associate with endpoint_group"},{"line_number":1187,"context_line":"#        project_ref \u003d unit.new_project_ref(domain_id\u003dself.domain_id)"},{"line_number":1188,"context_line":"#        r \u003d self.post(\u0027/projects\u0027, body\u003d{\u0027project\u0027: project_ref})"},{"line_number":1189,"context_line":"#        project \u003d self.assertValidProjectResponse(r, project_ref)"},{"line_number":1190,"context_line":"#        url \u003d self._get_project_endpoint_group_url(endpoint_group_id,"},{"line_number":1191,"context_line":"#                                                   project[\u0027id\u0027])"},{"line_number":1192,"context_line":"#        self.put(url)"},{"line_number":1193,"context_line":"#"},{"line_number":1194,"context_line":"#        # check that we can recover the project endpoint group association"},{"line_number":1195,"context_line":"#        self.get(url)"},{"line_number":1196,"context_line":"#"},{"line_number":1197,"context_line":"#        # now remove the project endpoint group association"},{"line_number":1198,"context_line":"#        self.delete(url)"},{"line_number":1199,"context_line":"#        self.get(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1200,"context_line":"#"},{"line_number":1201,"context_line":"#    def test_removing_an_endpoint_group_project(self):"},{"line_number":1202,"context_line":"#        # create an endpoint group"},{"line_number":1203,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1204,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1205,"context_line":"#"},{"line_number":1206,"context_line":"#        # create an endpoint_group project"},{"line_number":1207,"context_line":"#        url \u003d self._get_project_endpoint_group_url("},{"line_number":1208,"context_line":"#            endpoint_group_id, self.default_domain_project_id)"},{"line_number":1209,"context_line":"#        self.put(url)"},{"line_number":1210,"context_line":"#"},{"line_number":1211,"context_line":"#        # remove the endpoint group project"},{"line_number":1212,"context_line":"#        self.delete(url)"},{"line_number":1213,"context_line":"#        self.get(url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1214,"context_line":"#"},{"line_number":1215,"context_line":"#    def test_remove_endpoint_group_with_project_association(self):"},{"line_number":1216,"context_line":"#        # create an endpoint group"},{"line_number":1217,"context_line":"#        endpoint_group_id \u003d self._create_valid_endpoint_group("},{"line_number":1218,"context_line":"#            self.DEFAULT_ENDPOINT_GROUP_URL, self.DEFAULT_ENDPOINT_GROUP_BODY)"},{"line_number":1219,"context_line":"#"},{"line_number":1220,"context_line":"#        # create an endpoint_group project"},{"line_number":1221,"context_line":"#        project_endpoint_group_url \u003d self._get_project_endpoint_group_url("},{"line_number":1222,"context_line":"#            endpoint_group_id, self.default_domain_project_id)"},{"line_number":1223,"context_line":"#        self.put(project_endpoint_group_url)"},{"line_number":1224,"context_line":"#"},{"line_number":1225,"context_line":"#        # remove endpoint group, the associated endpoint_group project will"},{"line_number":1226,"context_line":"#        # be removed as well."},{"line_number":1227,"context_line":"#        endpoint_group_url \u003d (\u0027/OS-EP-FILTER/endpoint_groups/\u0027"},{"line_number":1228,"context_line":"#                              \u0027%(endpoint_group_id)s\u0027"},{"line_number":1229,"context_line":"#                              % {\u0027endpoint_group_id\u0027: endpoint_group_id})"},{"line_number":1230,"context_line":"#        self.delete(endpoint_group_url)"},{"line_number":1231,"context_line":"#        self.get(endpoint_group_url, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1232,"context_line":"#        self.get(project_endpoint_group_url,"},{"line_number":1233,"context_line":"#                 expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1234,"context_line":"#"},{"line_number":1235,"context_line":"#    def _create_valid_endpoint_group(self, url, body):"},{"line_number":1236,"context_line":"#        r \u003d self.post(url, body\u003dbody)"},{"line_number":1237,"context_line":"#        return r.result[\u0027endpoint_group\u0027][\u0027id\u0027]"},{"line_number":1238,"context_line":"#"},{"line_number":1239,"context_line":"#    def _create_endpoint_group_project_association(self,"},{"line_number":1240,"context_line":"#                                                   endpoint_group_id,"},{"line_number":1241,"context_line":"#                                                   project_id):"},{"line_number":1242,"context_line":"#        url \u003d self._get_project_endpoint_group_url(endpoint_group_id,"},{"line_number":1243,"context_line":"#                                                   project_id)"},{"line_number":1244,"context_line":"#        self.put(url)"},{"line_number":1245,"context_line":"#"},{"line_number":1246,"context_line":"#    def _get_project_endpoint_group_url(self,"},{"line_number":1247,"context_line":"#                                        endpoint_group_id,"},{"line_number":1248,"context_line":"#                                        project_id):"},{"line_number":1249,"context_line":"#        return (\u0027/OS-EP-FILTER/endpoint_groups/%(endpoint_group_id)s\u0027"},{"line_number":1250,"context_line":"#                \u0027/projects/%(project_id)s\u0027 %"},{"line_number":1251,"context_line":"#                {\u0027endpoint_group_id\u0027: endpoint_group_id,"},{"line_number":1252,"context_line":"#                 \u0027project_id\u0027: project_id})"},{"line_number":1253,"context_line":"#"},{"line_number":1254,"context_line":"#    def _create_endpoint_and_associations(self, project_id, service_id\u003dNone):"},{"line_number":1255,"context_line":"#        \"\"\"Creates an endpoint associated with service and project.\"\"\""},{"line_number":1256,"context_line":"#        if not service_id:"},{"line_number":1257,"context_line":"#            # create a new service"},{"line_number":1258,"context_line":"#            service_ref \u003d unit.new_service_ref()"},{"line_number":1259,"context_line":"#            response \u003d self.post("},{"line_number":1260,"context_line":"#                \u0027/services\u0027, body\u003d{\u0027service\u0027: service_ref})"},{"line_number":1261,"context_line":"#            service_id \u003d response.result[\u0027service\u0027][\u0027id\u0027]"},{"line_number":1262,"context_line":"#"},{"line_number":1263,"context_line":"#        # create endpoint"},{"line_number":1264,"context_line":"#        endpoint_ref \u003d unit.new_endpoint_ref(service_id\u003dservice_id,"},{"line_number":1265,"context_line":"#                                             interface\u003d\u0027public\u0027,"},{"line_number":1266,"context_line":"#                                             region_id\u003dself.region_id)"},{"line_number":1267,"context_line":"#        response \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: endpoint_ref})"},{"line_number":1268,"context_line":"#        endpoint \u003d response.result[\u0027endpoint\u0027]"},{"line_number":1269,"context_line":"#"},{"line_number":1270,"context_line":"#        # now add endpoint to project"},{"line_number":1271,"context_line":"#        self.put(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":1272,"context_line":"#                 \u0027/endpoints/%(endpoint_id)s\u0027 % {"},{"line_number":1273,"context_line":"#                     \u0027project_id\u0027: self.project[\u0027id\u0027],"},{"line_number":1274,"context_line":"#                     \u0027endpoint_id\u0027: endpoint[\u0027id\u0027]})"},{"line_number":1275,"context_line":"#        return endpoint"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa69d971_d3e9771b","line":1275,"range":{"start_line":294,"start_character":1,"end_line":1275,"end_character":24},"updated":"2016-01-11 13:37:08.000000000","message":"Why this is whole tests are commented? This should be removed?","commit_id":"cfe2e60540ac45df0074c7f3f7bef99cb49b7e46"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3861395b40fc7d0d8a688f8b77224f5ddab78b29","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa69d971_9ec21b52","line":1,"updated":"2016-01-11 17:17:50.000000000","message":"Was this code taken from somewhere else that already had a copyright?","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d20d858c9446b9bb5a2f5945e8eb51a44528478f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_ab773101","line":1,"in_reply_to":"fa69d971_9ec21b52","updated":"2016-01-12 13:09:36.000000000","message":"no.","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3861395b40fc7d0d8a688f8b77224f5ddab78b29","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from six.moves import http_client"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.tests.unit import test_v3"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"CONF \u003d cfg.CONF"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"fa69d971_7e9c076a","line":21,"updated":"2016-01-11 17:17:50.000000000","message":"(nit) add newline","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d20d858c9446b9bb5a2f5945e8eb51a44528478f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from six.moves import http_client"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.tests.unit import test_v3"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"CONF \u003d cfg.CONF"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_cb74e5fe","line":21,"in_reply_to":"fa69d971_7e9c076a","updated":"2016-01-12 13:09:36.000000000","message":"Done","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d5559da2929fb1e3864fd4be5f77a6c71f59e1af","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                 expected_status\u003dhttp_client.CREATED)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    # TODO(marek-denis): Implement this :-)"},{"line_number":60,"context_line":"    def assertValidServiceProvidersListResponse(self, response, reference):"},{"line_number":61,"context_line":"        pass"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_create_project_sp_association(self):"},{"line_number":64,"context_line":"        \"\"\"PUT /OS-EP-FILTER/projects/{project_id}"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_fde181ff","line":61,"range":{"start_line":60,"start_character":4,"end_line":61,"end_character":12},"updated":"2016-01-12 08:26:24.000000000","message":"use the function in the patch you rebased this patch on","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9342cca9263349901cdf5f63ebfe2b295b49ce21","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                      \u0027service_provider_id\u0027: self.SERVICE_PROVIDER_ID})"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"    def test_check_nonexisting_service_provider_association(self):"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        self.head(\u0027/OS-EP-FILTER/projects/%(project_id)s\u0027"},{"line_number":119,"context_line":"                  \u0027/service_providers/%(service_provider_id)s\u0027 % {"},{"line_number":120,"context_line":"                      \u0027project_id\u0027: self.default_domain_project_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"da6ed579_bc13b9b7","line":117,"updated":"2016-01-13 13:46:12.000000000","message":"add the docstring here for consistency?","commit_id":"0a5e9400f16d1cc5ddb0c44af7d38280339856b7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"26541a3afd97e396822d2d82609f88655d7a7208","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF \u003d cfg.CONF"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class EndpointFilterTestCase(test_v3.RestfulTestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def config_overrides(self):"},{"line_number":27,"context_line":"        super(EndpointFilterTestCase, self).config_overrides()"}],"source_content_type":"text/x-python","patch_set":12,"id":"da6ed579_8308322f","line":24,"updated":"2016-01-15 22:25:13.000000000","message":"Is there a plan to reuse this class? Right now it doesn\u0027t seem that useful.","commit_id":"ba49160f292aa39191da6595e54f8cf25e9f6957"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d5559da2929fb1e3864fd4be5f77a6c71f59e1af","unresolved":false,"context_lines":[{"line_number":828,"context_line":"                                    [\u0027service_provider_id\u0027, \u0027project_id\u0027])"},{"line_number":829,"context_line":""},{"line_number":830,"context_line":"        self.assertTableDoesNotExist(\u0027project_service_provider\u0027)"},{"line_number":831,"context_line":"        self.upgrade(87)"},{"line_number":832,"context_line":"        assert_tables_columns_exist()"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_7deef1ed","line":831,"range":{"start_line":831,"start_character":21,"end_line":831,"end_character":23},"updated":"2016-01-12 08:26:24.000000000","message":"88","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d20d858c9446b9bb5a2f5945e8eb51a44528478f","unresolved":false,"context_lines":[{"line_number":828,"context_line":"                                    [\u0027service_provider_id\u0027, \u0027project_id\u0027])"},{"line_number":829,"context_line":""},{"line_number":830,"context_line":"        self.assertTableDoesNotExist(\u0027project_service_provider\u0027)"},{"line_number":831,"context_line":"        self.upgrade(87)"},{"line_number":832,"context_line":"        assert_tables_columns_exist()"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_2b0ca193","line":831,"range":{"start_line":831,"start_character":21,"end_line":831,"end_character":23},"in_reply_to":"da6ed579_7deef1ed","updated":"2016-01-12 13:09:36.000000000","message":"Done","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"}],"keystone/tests/unit/test_versions.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"3861395b40fc7d0d8a688f8b77224f5ddab78b29","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                          \u0027/service_providers\u0027),"},{"line_number":518,"context_line":"        \u0027href-vars\u0027: {\u0027sp_id\u0027: SP_ID_PARAMETER_RELATION,"},{"line_number":519,"context_line":"                      \u0027project_id\u0027: json_home.Parameters.PROJECT_ID, }},"},{"line_number":520,"context_line":"    _build_ep_filter_rel(resource_name\u003d\u0027project_service_providers\u0027):"},{"line_number":521,"context_line":"    {"},{"line_number":522,"context_line":"        \u0027href-template\u0027: \u0027/OS-EP-FILTER/service_providers/{sp_id}/projects\u0027,"},{"line_number":523,"context_line":"        \u0027href-vars\u0027: {\u0027sp_id\u0027: SP_ID_PARAMETER_RELATION}},"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa69d971_2b7accf1","line":520,"updated":"2016-01-11 17:17:50.000000000","message":"I haven\u0027t tried it locally yet, but one possible reason for the test failures is that you are building two relations for \u0027project_service_providers\u0027 and I don\u0027t think you can do that.","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d20d858c9446b9bb5a2f5945e8eb51a44528478f","unresolved":false,"context_lines":[{"line_number":517,"context_line":"                          \u0027/service_providers\u0027),"},{"line_number":518,"context_line":"        \u0027href-vars\u0027: {\u0027sp_id\u0027: SP_ID_PARAMETER_RELATION,"},{"line_number":519,"context_line":"                      \u0027project_id\u0027: json_home.Parameters.PROJECT_ID, }},"},{"line_number":520,"context_line":"    _build_ep_filter_rel(resource_name\u003d\u0027project_service_providers\u0027):"},{"line_number":521,"context_line":"    {"},{"line_number":522,"context_line":"        \u0027href-template\u0027: \u0027/OS-EP-FILTER/service_providers/{sp_id}/projects\u0027,"},{"line_number":523,"context_line":"        \u0027href-vars\u0027: {\u0027sp_id\u0027: SP_ID_PARAMETER_RELATION}},"}],"source_content_type":"text/x-python","patch_set":9,"id":"da6ed579_88f35373","line":520,"in_reply_to":"fa69d971_2b7accf1","updated":"2016-01-12 13:09:36.000000000","message":"yeah, my bad, but fixing this didn\u0027t help much with JSON home thing.","commit_id":"25de013bfc1dae111cb617833d09b981f477bdf8"}]}
