)]}'
{"keystone/catalog/backends/filesystem.py":[{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"20965d4ad55ae2b47cba801d99e68ec84726ac2f","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            yaml_file \u003d CONF.find_file(yaml_file)"},{"line_number":87,"context_line":"        try:"},{"line_number":88,"context_line":"            with open(yaml_file) as f:"},{"line_number":89,"context_line":"                self.__catalog_data \u003d yaml.load(f)"},{"line_number":90,"context_line":"        except IOError:"},{"line_number":91,"context_line":"            LOG.critical(\u0027Unable to open yaml file %s\u0027, yaml_file)"},{"line_number":92,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f1a1f67_fd1692f1","line":89,"updated":"2017-07-13 22:55:17.000000000","message":"Maybe we should use yaml.safe_load here?","commit_id":"772e7a01f1ba7d3f103509e970fdbbacbea97544"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"59657c57e87ce42a31a61d45278e6cabf1831377","unresolved":false,"context_lines":[{"line_number":54,"context_line":"              -"},{"line_number":55,"context_line":"                type: other"},{"line_number":56,"context_line":"                url: \"https://something-else-identity.example.com\""},{"line_number":57,"context_line":"                # NOTE: The above endpoint will not render in the v2 catalog."},{"line_number":58,"context_line":"            region: RegionOne"},{"line_number":59,"context_line":"            service: ServiceOne"},{"line_number":60,"context_line":"            id: EndpointOne"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_1d1549e5","line":57,"range":{"start_line":57,"start_character":34,"end_line":57,"end_character":42},"updated":"2017-07-19 18:24:18.000000000","message":"Interface*","commit_id":"8d012e31fd6ad4c4425aed17b797ad46a848a90c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"5e35d9dfb183b2d9d2a48818cd51c28bda43e7a5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            service: ServiceThree"},{"line_number":77,"context_line":"            id: EndpointThree"},{"line_number":78,"context_line":"        regions:"},{"line_number":79,"context_line":"          RegionOne:"},{"line_number":80,"context_line":"            description: \"First Region\""},{"line_number":81,"context_line":"          RegionTwo:"},{"line_number":82,"context_line":"            description: \"Second Region\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_3dc80572","line":79,"range":{"start_line":79,"start_character":10,"end_line":79,"end_character":19},"updated":"2017-07-18 22:31:45.000000000","message":"so this is the ID?\nif so, why arent the endpoints represented in the same way?\ne.g L70 would be\n\n    EndpointThree:","commit_id":"8d012e31fd6ad4c4425aed17b797ad46a848a90c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"59657c57e87ce42a31a61d45278e6cabf1831377","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            service: ServiceThree"},{"line_number":77,"context_line":"            id: EndpointThree"},{"line_number":78,"context_line":"        regions:"},{"line_number":79,"context_line":"          RegionOne:"},{"line_number":80,"context_line":"            description: \"First Region\""},{"line_number":81,"context_line":"          RegionTwo:"},{"line_number":82,"context_line":"            description: \"Second Region\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_ca524535","line":79,"range":{"start_line":79,"start_character":10,"end_line":79,"end_character":19},"in_reply_to":"1f1a1f67_3dc80572","updated":"2017-07-19 18:24:18.000000000","message":"This change should be doable, it will require some different handling of keys vs values when constructing the catalog(s)","commit_id":"8d012e31fd6ad4c4425aed17b797ad46a848a90c"},{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"76b0d51840806548310ea11463e849a20907ef07","unresolved":false,"context_lines":[{"line_number":368,"context_line":"                               \u0027url\u0027: formatted_url}"},{"line_number":369,"context_line":"                if region:"},{"line_number":370,"context_line":"                    ep_rendered[\u0027region\u0027] \u003d region"},{"line_number":371,"context_line":"                s_rendered.setdefault(\u0027endpoints\u0027, []).append(ep_rendered)"},{"line_number":372,"context_line":"        return catalog"},{"line_number":373,"context_line":""},{"line_number":374,"context_line":"    # NOTE(notmorgan): this driver is read-only, all methods below this point"}],"source_content_type":"text/x-python","patch_set":3,"id":"ff346bd7_26c07250","line":371,"updated":"2017-07-25 17:39:21.000000000","message":"This could potentially be None? Which would throw a \n\u003e AttributeError: \u0027NoneType\u0027 object has no attribute \u0027setdefault\u0027","commit_id":"8d012e31fd6ad4c4425aed17b797ad46a848a90c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dded9a4c1b0e59e9fa8cd0ee3524046c41019b58","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __init__(self):"},{"line_number":90,"context_line":"        super(Catalog, self).__init__()"},{"line_number":91,"context_line":"        self.__catalog_data \u003d {}"},{"line_number":92,"context_line":"        yaml_file \u003d CONF.catalog.filesystem_yaml_file"},{"line_number":93,"context_line":"        if not os.path.exists(yaml_file):"},{"line_number":94,"context_line":"            yaml_file \u003d CONF.find_file(yaml_file)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_ad0d8ce9","line":91,"range":{"start_line":91,"start_character":8,"end_line":91,"end_character":32},"updated":"2018-03-19 21:10:35.000000000","message":"If I\u0027m understanding this correctly, this means that the catalog data lives in this variable for the lifetime of the Catalog object. Do we know if that lifetime spans requests? If not, then updates to the .yaml service catalog are not going to get picked up until a keystone restart.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"30af3da7e3f35b0ce6ae5c643151d419169386e0","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __init__(self):"},{"line_number":90,"context_line":"        super(Catalog, self).__init__()"},{"line_number":91,"context_line":"        self.__catalog_data \u003d {}"},{"line_number":92,"context_line":"        yaml_file \u003d CONF.catalog.filesystem_yaml_file"},{"line_number":93,"context_line":"        if not os.path.exists(yaml_file):"},{"line_number":94,"context_line":"            yaml_file \u003d CONF.find_file(yaml_file)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_4605ae79","line":91,"range":{"start_line":91,"start_character":8,"end_line":91,"end_character":32},"in_reply_to":"df7087c5_0367a927","updated":"2018-03-20 01:48:59.000000000","message":"yeah, this could be done via a decorator","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"20f0ea30c4b7e883ade29804791a93cf451a950f","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __init__(self):"},{"line_number":90,"context_line":"        super(Catalog, self).__init__()"},{"line_number":91,"context_line":"        self.__catalog_data \u003d {}"},{"line_number":92,"context_line":"        yaml_file \u003d CONF.catalog.filesystem_yaml_file"},{"line_number":93,"context_line":"        if not os.path.exists(yaml_file):"},{"line_number":94,"context_line":"            yaml_file \u003d CONF.find_file(yaml_file)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_0367a927","line":91,"range":{"start_line":91,"start_character":8,"end_line":91,"end_character":32},"in_reply_to":"df7087c5_ad0d8ce9","updated":"2018-03-19 23:45:16.000000000","message":"Correct, we could have a file watcher looking for an update, but this was a simple version. I would 100% support using this as a cache and loading from disk only if the file has changed.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"b77ea55b0641825e9d64147d1643a28c87eef35c","unresolved":false,"context_lines":[{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    def __init__(self):"},{"line_number":90,"context_line":"        super(Catalog, self).__init__()"},{"line_number":91,"context_line":"        self.__catalog_data \u003d {}"},{"line_number":92,"context_line":"        yaml_file \u003d CONF.catalog.filesystem_yaml_file"},{"line_number":93,"context_line":"        if not os.path.exists(yaml_file):"},{"line_number":94,"context_line":"            yaml_file \u003d CONF.find_file(yaml_file)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9f6a8fd7_8cc29233","line":91,"range":{"start_line":91,"start_character":8,"end_line":91,"end_character":32},"in_reply_to":"df7087c5_ad0d8ce9","updated":"2018-04-23 03:22:05.000000000","message":"There is currently no functionality in the templated format to reload the catalog on-change. Could we hold back on implementing that after this commit merges?\n\nFeels like it\u0027s a neat feature, but maybe not required to get the new filesystem format implemented.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def __init__(self):"},{"line_number":90,"context_line":"        super(Catalog, self).__init__()"},{"line_number":91,"context_line":"        self.__catalog_data \u003d {}"},{"line_number":92,"context_line":"        yaml_file \u003d CONF.catalog.filesystem_yaml_file"},{"line_number":93,"context_line":"        if not os.path.exists(yaml_file):"},{"line_number":94,"context_line":"            yaml_file \u003d CONF.find_file(yaml_file)"},{"line_number":95,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_f2612513","line":92,"range":{"start_line":92,"start_character":8,"end_line":92,"end_character":17},"updated":"2018-03-19 20:57:56.000000000","message":"This could be a relative path or an absolute path. If it\u0027s an absolute path and it doesn\u0027t exist on the system, will calling .find_file(yaml_file) help?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"20f0ea30c4b7e883ade29804791a93cf451a950f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    def __init__(self):"},{"line_number":90,"context_line":"        super(Catalog, self).__init__()"},{"line_number":91,"context_line":"        self.__catalog_data \u003d {}"},{"line_number":92,"context_line":"        yaml_file \u003d CONF.catalog.filesystem_yaml_file"},{"line_number":93,"context_line":"        if not os.path.exists(yaml_file):"},{"line_number":94,"context_line":"            yaml_file \u003d CONF.find_file(yaml_file)"},{"line_number":95,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_03c249ea","line":92,"range":{"start_line":92,"start_character":8,"end_line":92,"end_character":17},"in_reply_to":"df7087c5_f2612513","updated":"2018-03-19 23:45:16.000000000","message":"See 2 lines below, we call find_file :)","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            with open(yaml_file) as f:"},{"line_number":97,"context_line":"                self._build_and_validate_catalog_data(yaml.safe_load(f))"},{"line_number":98,"context_line":"        except IOError:"},{"line_number":99,"context_line":"            LOG.critical(\u0027Unable to open yaml file %s\u0027, yaml_file)"},{"line_number":100,"context_line":"            raise"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _build_and_validate_catalog_data(self, data):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_b2440d76","line":99,"range":{"start_line":99,"start_character":26,"end_line":99,"end_character":65},"updated":"2018-03-19 20:57:56.000000000","message":"We could provide more information here that is indicative of why this failed.\n\n  msg \u003d (\u0027Failed to load catalog data from %(file)s. \u0027\n         \u0027Please make sure the file exists and keystone \u0027\n         \u0027has access to read it.\u0027 , yaml_file)","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"30af3da7e3f35b0ce6ae5c643151d419169386e0","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            with open(yaml_file) as f:"},{"line_number":97,"context_line":"                self._build_and_validate_catalog_data(yaml.safe_load(f))"},{"line_number":98,"context_line":"        except IOError:"},{"line_number":99,"context_line":"            LOG.critical(\u0027Unable to open yaml file %s\u0027, yaml_file)"},{"line_number":100,"context_line":"            raise"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _build_and_validate_catalog_data(self, data):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_26043a7b","line":99,"range":{"start_line":99,"start_character":26,"end_line":99,"end_character":65},"in_reply_to":"df7087c5_b2440d76","updated":"2018-03-20 01:48:59.000000000","message":"sure","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        except KeyError:"},{"line_number":206,"context_line":"            raise exception.ServiceNotFound(service_id\u003dservice_id)"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def get_v3_catalog(self, user_id, project_id):"},{"line_number":209,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        The default implementation builds the V3 catalog from the V2 catalog."}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_12cb791e","line":208,"range":{"start_line":208,"start_character":8,"end_line":208,"end_character":22},"updated":"2018-03-19 20:57:56.000000000","message":"We could actually simplify this interface now and have the controller layer do the building of the response instead of the driver (which leads to API contracts being built in the driver instead of the actual API layer).","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"9c62a1eb03fbc71495857041a1d7bf7608752daf","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def get_v3_catalog(self, user_id, project_id):"},{"line_number":209,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        The default implementation builds the V3 catalog from the V2 catalog."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        Example::"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_b9d7564b","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":77},"updated":"2018-03-16 02:48:53.000000000","message":"this can be removed.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def get_v3_catalog(self, user_id, project_id):"},{"line_number":209,"context_line":"        \"\"\"Retrieve and format the current V3 service catalog."},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        The default implementation builds the V3 catalog from the V2 catalog."},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        Example::"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_d238a13e","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":77},"in_reply_to":"df7087c5_b9d7564b","updated":"2018-03-19 20:57:56.000000000","message":"++, we should remove any v2.0 -\u003e v3 cruft laying around","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":322,"context_line":"    def check_endpoint_in_project(self, endpoint_id, project_id):"},{"line_number":323,"context_line":"        raise exception.NotImplemented()"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def list_endpoints_for_project(self, project_id):"},{"line_number":326,"context_line":"        raise exception.NotImplemented()"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def list_projects_for_endpoint(self, endpoint_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_ad202c9d","line":325,"updated":"2018-03-19 20:57:56.000000000","message":"This contains writes?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"20f0ea30c4b7e883ade29804791a93cf451a950f","unresolved":false,"context_lines":[{"line_number":322,"context_line":"    def check_endpoint_in_project(self, endpoint_id, project_id):"},{"line_number":323,"context_line":"        raise exception.NotImplemented()"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def list_endpoints_for_project(self, project_id):"},{"line_number":326,"context_line":"        raise exception.NotImplemented()"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def list_projects_for_endpoint(self, endpoint_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_a344bd75","line":325,"in_reply_to":"df7087c5_ad202c9d","updated":"2018-03-19 23:45:16.000000000","message":"The endpoint for project is part of the filtering bits in catalog. We do not support that at all with the file-based catalogs, therefore this is not implemented. I guess it could return an empty list instead?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":325,"context_line":"    def list_endpoints_for_project(self, project_id):"},{"line_number":326,"context_line":"        raise exception.NotImplemented()"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def list_projects_for_endpoint(self, endpoint_id):"},{"line_number":329,"context_line":"        raise exception.NotImplemented()"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def delete_association_by_endpoint(self, endpoint_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_8d3768e4","line":328,"updated":"2018-03-19 20:57:56.000000000","message":"This contains writes?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"20f0ea30c4b7e883ade29804791a93cf451a950f","unresolved":false,"context_lines":[{"line_number":325,"context_line":"    def list_endpoints_for_project(self, project_id):"},{"line_number":326,"context_line":"        raise exception.NotImplemented()"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    def list_projects_for_endpoint(self, endpoint_id):"},{"line_number":329,"context_line":"        raise exception.NotImplemented()"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def delete_association_by_endpoint(self, endpoint_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_2358ad54","line":328,"in_reply_to":"df7087c5_8d3768e4","updated":"2018-03-19 23:45:16.000000000","message":"Same as above.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":337,"context_line":"    def create_endpoint_group(self, endpoint_group):"},{"line_number":338,"context_line":"        raise exception.NotImplemented()"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def get_endpoint_group(self, endpoint_group_id):"},{"line_number":341,"context_line":"        raise exception.NotImplemented()"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def update_endpoint_group(self, endpoint_group_id, endpoint_group):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_ed4b845c","line":340,"updated":"2018-03-19 20:57:56.000000000","message":"This contains writes?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"20f0ea30c4b7e883ade29804791a93cf451a950f","unresolved":false,"context_lines":[{"line_number":337,"context_line":"    def create_endpoint_group(self, endpoint_group):"},{"line_number":338,"context_line":"        raise exception.NotImplemented()"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def get_endpoint_group(self, endpoint_group_id):"},{"line_number":341,"context_line":"        raise exception.NotImplemented()"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def update_endpoint_group(self, endpoint_group_id, endpoint_group):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_a3391df3","line":340,"in_reply_to":"df7087c5_ed4b845c","updated":"2018-03-19 23:45:16.000000000","message":"See above (applies to all the project-filtering in catalog)","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":349,"context_line":"    def add_endpoint_group_to_project(self, endpoint_group_id, project_id):"},{"line_number":350,"context_line":"        raise exception.NotImplemented()"},{"line_number":351,"context_line":""},{"line_number":352,"context_line":"    def get_endpoint_group_in_project(self, endpoint_group_id, project_id):"},{"line_number":353,"context_line":"        raise exception.NotImplemented()"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def list_endpoint_groups(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_cd5a4029","line":352,"updated":"2018-03-19 20:57:56.000000000","message":"This is writable?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":352,"context_line":"    def get_endpoint_group_in_project(self, endpoint_group_id, project_id):"},{"line_number":353,"context_line":"        raise exception.NotImplemented()"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":"    def list_endpoint_groups(self):"},{"line_number":356,"context_line":"        raise exception.NotImplemented()"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def list_endpoint_groups_for_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_8d3c48c0","line":355,"updated":"2018-03-19 20:57:56.000000000","message":"This is writable?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":355,"context_line":"    def list_endpoint_groups(self):"},{"line_number":356,"context_line":"        raise exception.NotImplemented()"},{"line_number":357,"context_line":""},{"line_number":358,"context_line":"    def list_endpoint_groups_for_project(self, project_id):"},{"line_number":359,"context_line":"        raise exception.NotImplemented()"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def list_projects_associated_with_endpoint_group(self, endpoint_group_id):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_2d497c5f","line":358,"updated":"2018-03-19 20:57:56.000000000","message":"This is writable?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    def list_endpoint_groups_for_project(self, project_id):"},{"line_number":359,"context_line":"        raise exception.NotImplemented()"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    def list_projects_associated_with_endpoint_group(self, endpoint_group_id):"},{"line_number":362,"context_line":"        raise exception.NotImplemented()"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    def remove_endpoint_group_from_project(self, endpoint_group_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_4d463052","line":361,"updated":"2018-03-19 20:57:56.000000000","message":"This is writable?","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f5295ce5704b2266940ad212cebe98cbd7367ef9","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        raise exception.NotImplemented()"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"    def update_service(self, service_id, service_ref):"},{"line_number":320,"context_line":"        raise exception.NotImplemented()"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def delete_service(self, service_id):"},{"line_number":323,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_d766a029","line":320,"updated":"2018-06-13 14:30:14.000000000","message":"We should probably convert these to raise 403s for proper API handling, a NotImplemented here is probably wrong.\n\nThe server may not implement functionality, but this is less HTTP server not implementing and more \"we don\u0027t support it, you are forbidden from performing that action\" in our case.\n\nhttps://tools.ietf.org/html/rfc7231#section-6.6.2\n\n\nI am ok with it as is though.","commit_id":"0928badb3f851065f2abd7b58e8593b5f38600bf"}],"keystone/conf/catalog.py":[{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"dc7d9c5d786e4e145cd67de92b1811b3f73b9b5d","unresolved":false,"context_lines":[{"line_number":26,"context_line":"is only used if the `[catalog] driver` is set to `templated`."},{"line_number":27,"context_line":"\"\"\"))"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"yaml_catalog_file \u003d cfg.StrOpt("},{"line_number":30,"context_line":"    \u0027yaml_catalog_file\u0027,"},{"line_number":31,"context_line":"    default\u003d\u0027catalog.yaml\u0027,"},{"line_number":32,"context_line":"    help\u003dutils.fmt(\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_aedd0fe1","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":17},"updated":"2017-07-18 15:16:50.000000000","message":"why do we need the option?","commit_id":"8d012e31fd6ad4c4425aed17b797ad46a848a90c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d681249713c38b2cd68a221489f5fe7d999faab0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"is only used if the `[catalog] driver` is set to `templated`."},{"line_number":27,"context_line":"\"\"\"))"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"yaml_catalog_file \u003d cfg.StrOpt("},{"line_number":30,"context_line":"    \u0027yaml_catalog_file\u0027,"},{"line_number":31,"context_line":"    default\u003d\u0027catalog.yaml\u0027,"},{"line_number":32,"context_line":"    help\u003dutils.fmt(\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_65e03227","line":29,"in_reply_to":"1f1a1f67_913954d8","updated":"2017-07-18 16:51:09.000000000","message":"Yeah, the option is needed. I wouldn\u0027t want to overload/change format on the \"template_file\". If we are loading from disk we need to allow folks to specify where.\n\nBasically what lance said (it is an intended case).","commit_id":"8d012e31fd6ad4c4425aed17b797ad46a848a90c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b085ad16c2eb9ae968f8d2dda33a48302d725f23","unresolved":false,"context_lines":[{"line_number":26,"context_line":"is only used if the `[catalog] driver` is set to `templated`."},{"line_number":27,"context_line":"\"\"\"))"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"yaml_catalog_file \u003d cfg.StrOpt("},{"line_number":30,"context_line":"    \u0027yaml_catalog_file\u0027,"},{"line_number":31,"context_line":"    default\u003d\u0027catalog.yaml\u0027,"},{"line_number":32,"context_line":"    help\u003dutils.fmt(\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"1f1a1f67_913954d8","line":29,"in_reply_to":"1f1a1f67_aedd0fe1","updated":"2017-07-18 15:21:54.000000000","message":"I could see this being useful for operators who want to build out a new catalog and then switch to it. Or make changes to a separate file then flip the deployment to actually using it. Not sure if that\u0027s the intended case though?","commit_id":"8d012e31fd6ad4c4425aed17b797ad46a848a90c"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.conf import utils"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"template_file \u003d cfg.StrOpt("},{"line_number":19,"context_line":"    \u0027template_file\u0027,"},{"line_number":20,"context_line":"    default\u003d\u0027default_catalog.templates\u0027,"},{"line_number":21,"context_line":"    help\u003dutils.fmt(\"\"\""}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_f717d7a2","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":13},"updated":"2018-03-19 20:57:56.000000000","message":"nit: if we consolidate the approach below - we can deprecate this option in favor of simpler configuration.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":24,"context_line":"\"\"\"))"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"yaml_catalog_file \u003d cfg.StrOpt("},{"line_number":27,"context_line":"    \u0027filesystem_yaml_file\u0027,"},{"line_number":28,"context_line":"    default\u003d\u0027catalog.yaml\u0027,"},{"line_number":29,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":30,"context_line":"Absolute path to the yaml file with catalog data. This option is only used"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_f4ca7518","line":27,"range":{"start_line":27,"start_character":5,"end_line":27,"end_character":25},"updated":"2018-03-19 20:57:56.000000000","message":"This seems generic because we\u0027re using \"filesystem\" in the name, but it\u0027s also specific to the yaml implementation of the catalog backend. It feels like we should make this more generic, so that it can be used when configured with the yaml backend or the templated backend.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    default\u003d\u0027catalog.yaml\u0027,"},{"line_number":29,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":30,"context_line":"Absolute path to the yaml file with catalog data. This option is only used"},{"line_number":31,"context_line":"if the `[catalog] driver` is set to `filesystem`."},{"line_number":32,"context_line":"\"\"\"))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"driver \u003d cfg.StrOpt("}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_f4659546","line":31,"range":{"start_line":31,"start_character":37,"end_line":31,"end_character":47},"updated":"2018-03-19 20:57:56.000000000","message":"Do we want to be generic here? `filesystem` could mean ``templated`` or ``yaml``, right?\n\nFor example - we could achieve the following with only two configuration options that would allow us to deprecate `template_file\u0027.\n\n  [catalog]\n  driver \u003d sql\n  catalog_file \u003d None  # because it\u0027s not used with sql\n\nor \n\n  [catalog]\n  driver \u003d templated\n  catalog_file \u003d default_catalog.templates\n\nand finally:\n\n  [catalog]\n  driver \u003d yaml\n  catalog_file \u003d catalog.yaml","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"b77ea55b0641825e9d64147d1643a28c87eef35c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    default\u003d\u0027catalog.yaml\u0027,"},{"line_number":29,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":30,"context_line":"Absolute path to the yaml file with catalog data. This option is only used"},{"line_number":31,"context_line":"if the `[catalog] driver` is set to `filesystem`."},{"line_number":32,"context_line":"\"\"\"))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"driver \u003d cfg.StrOpt("}],"source_content_type":"text/x-python","patch_set":11,"id":"9f6a8fd7_acbf56a8","line":31,"range":{"start_line":31,"start_character":37,"end_line":31,"end_character":47},"in_reply_to":"df7087c5_f4659546","updated":"2018-04-23 03:22:05.000000000","message":"Yea - I think this is the preferred approach.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    help\u003dutils.fmt(\"\"\""},{"line_number":38,"context_line":"Entry point for the catalog driver in the `keystone.catalog` namespace."},{"line_number":39,"context_line":"Keystone provides a `sql` option (which supports basic CRUD operations through"},{"line_number":40,"context_line":"SQL), a `templated` option (which loads the catalog from a templated catalog"},{"line_number":41,"context_line":"file on disk), and a `endpoint_filter.sql` option (which supports arbitrary"},{"line_number":42,"context_line":"service catalogs per project)."},{"line_number":43,"context_line":"\"\"\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_5726c318","line":40,"updated":"2018-03-19 20:57:56.000000000","message":"We\u0027ll need to update this help text to advertise the yaml catalog.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"}],"keystone/tests/unit/default_filesystem_catalog.yaml":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":20,"context_line":"      -"},{"line_number":21,"context_line":"        type: public"},{"line_number":22,"context_line":"        url: \"https://compute.example.com/v2.1/\""},{"line_number":23,"context_line":"    region: RegionOne"},{"line_number":24,"context_line":"    service: ServiceTwo"},{"line_number":25,"context_line":"  EndpointThree:"},{"line_number":26,"context_line":"    interfaces:"},{"line_number":27,"context_line":"      -"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"df7087c5_72ce7584","line":24,"range":{"start_line":23,"start_character":0,"end_line":24,"end_character":23},"updated":"2018-03-19 20:57:56.000000000","message":"With YAML, we have the ability to reduce some of the duplication here with nesting... what about something like this?\n\nhttp://paste.openstack.org/show/705082/","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"}],"keystone/tests/unit/test_backend_filesystem.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"PROVIDERS \u003d provider_api.ProviderAPIs"},{"line_number":29,"context_line":"BROKEN_WRITE_FUNCTIONALITY_MSG \u003d (\"Filesystem backend doesn\u0027t correctly \""},{"line_number":30,"context_line":"                                  \"implement write operations\")"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_f29fe562","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":6},"updated":"2018-03-19 20:57:56.000000000","message":"Completely agree with this, but I\u0027m not sure we should advertise this as \"broken\", since we never really wanted to develop this feature with write support from the beginning. Broken implies that something needs to be fixed, but there isn\u0027t really anything to fix about the current behavior. Instead, we might just say something like \"The %(driver)s doesn\u0027t support write operations.\"","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        self.assertEqual(expect_services.sort(key\u003dlambda svc: svc[\u0027id\u0027]),"},{"line_number":145,"context_line":"                         services.sort(key\u003dlambda svc: svc[\u0027id\u0027]))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def test_show_service(self):"},{"line_number":148,"context_line":"        expect_service \u003d {\u0027enabled\u0027: True,"},{"line_number":149,"context_line":"                          \u0027id\u0027: \u0027ServiceOne\u0027,"},{"line_number":150,"context_line":"                          \u0027name\u0027: \u0027ServiceOne\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"df7087c5_72caf54f","line":147,"range":{"start_line":147,"start_character":13,"end_line":147,"end_character":17},"updated":"2018-03-19 20:57:56.000000000","message":"nit: get* since we seem to use that consistently over \"show\".","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":22623,"name":"Erik Olof Gunnar Andersson","email":"eandersson@blizzard.com","username":"eoandersson"},"change_message_id":"11f171efa4f6b2ec693c4d5db804491c530f427d","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"PROVIDERS \u003d provider_api.ProviderAPIs"},{"line_number":31,"context_line":"WRITE_FUNCTIONALITY_MSG \u003d (\"Filesystem backend doesn\u0027t correctly implement \""},{"line_number":32,"context_line":"                           \"write operations\")"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_579f224f","line":31,"updated":"2018-06-11 20:58:44.000000000","message":"This could probably be something simpler like,\n\u003e Filesystem backend does not implement write operations","commit_id":"0928badb3f851065f2abd7b58e8593b5f38600bf"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f5295ce5704b2266940ad212cebe98cbd7367ef9","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"PROVIDERS \u003d provider_api.ProviderAPIs"},{"line_number":31,"context_line":"WRITE_FUNCTIONALITY_MSG \u003d (\"Filesystem backend doesn\u0027t correctly implement \""},{"line_number":32,"context_line":"                           \"write operations\")"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_171978cf","line":31,"in_reply_to":"5f7c97a3_579f224f","updated":"2018-06-13 14:30:14.000000000","message":"\u003e Filesystem backend does not support write operations","commit_id":"0928badb3f851065f2abd7b58e8593b5f38600bf"}],"releasenotes/notes/filesystem-catalog-backend-a25bfc25262313b1.yaml":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"   [`blueprint filesystem-catalog-backend \u003chttps://blueprints.launchpad.net/keystone/+spec/filesystem-catalog-backend\u003e`_]"},{"line_number":5,"context_line":"   Added a new filesystem backend for catalog. Now Keystone support yaml file"},{"line_number":6,"context_line":"   as the catalog\u0027s backend. Please note that it\u0027s a readonly backend."},{"line_number":7,"context_line":"   Operators should define the catalog structure firstly in the yaml file"},{"line_number":8,"context_line":"   before starting Keystone service. And this new backend is only used for"},{"line_number":9,"context_line":"   Keystone V3."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"df7087c5_72f8b57b","line":6,"range":{"start_line":5,"start_character":46,"end_line":6,"end_character":70},"updated":"2018-03-19 20:57:56.000000000","message":"nit: Keystone now supports a read-only YAML catalog backend.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"   [`blueprint filesystem-catalog-backend \u003chttps://blueprints.launchpad.net/keystone/+spec/filesystem-catalog-backend\u003e`_]"},{"line_number":5,"context_line":"   Added a new filesystem backend for catalog. Now Keystone support yaml file"},{"line_number":6,"context_line":"   as the catalog\u0027s backend. Please note that it\u0027s a readonly backend."},{"line_number":7,"context_line":"   Operators should define the catalog structure firstly in the yaml file"},{"line_number":8,"context_line":"   before starting Keystone service. And this new backend is only used for"},{"line_number":9,"context_line":"   Keystone V3."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"df7087c5_122ff9f6","line":7,"updated":"2018-03-19 20:57:56.000000000","message":"We could link to some documentation that actually describes maintenance and operator workflows (e.g. how to define a catalog in YAML).","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"7e3b78f32c4155b33a0dcb463b863b5d9c4003f3","unresolved":false,"context_lines":[{"line_number":5,"context_line":"   Added a new filesystem backend for catalog. Now Keystone support yaml file"},{"line_number":6,"context_line":"   as the catalog\u0027s backend. Please note that it\u0027s a readonly backend."},{"line_number":7,"context_line":"   Operators should define the catalog structure firstly in the yaml file"},{"line_number":8,"context_line":"   before starting Keystone service. And this new backend is only used for"},{"line_number":9,"context_line":"   Keystone V3."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"df7087c5_52d6d1f3","line":9,"range":{"start_line":8,"start_character":37,"end_line":9,"end_character":15},"updated":"2018-03-19 20:57:56.000000000","message":"This might not make much sense to explicitly say since we already removed v2.0 support in Queens.","commit_id":"24609a716e73b349722394079a5889c8ccbf5d90"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d952028c961891bc98e6e232f385a787537bebee","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"   [`blueprint filesystem-catalog-backend \u003chttps://blueprints.launchpad.net/keystone/+spec/filesystem-catalog-backend\u003e`_]"},{"line_number":5,"context_line":"   Added a new filesystem backend for catalog. Now Keystone support yaml file"},{"line_number":6,"context_line":"   as the catalog\u0027s backend. Please note that it\u0027s a readonly backend."},{"line_number":7,"context_line":"   Operators should define the catalog structure firstly in the yaml file"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"ffb9cba7_9ea8c2db","line":4,"range":{"start_line":4,"start_character":3,"end_line":4,"end_character":121},"updated":"2019-04-24 15:55:14.000000000","message":"This needs to be a RFE Bug.","commit_id":"d378eadc2701d17febecade5c93bcafa99d1aff5"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"ce75b762a6c92d978465810a10842795aa7610d8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"   [`blueprint filesystem-catalog-backend \u003chttps://blueprints.launchpad.net/keystone/+spec/filesystem-catalog-backend\u003e`_]"},{"line_number":5,"context_line":"   Added a new filesystem backend for catalog. Now Keystone support yaml file"},{"line_number":6,"context_line":"   as the catalog\u0027s backend. Please note that it\u0027s a readonly backend."},{"line_number":7,"context_line":"   Operators should define the catalog structure firstly in the yaml file"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"dfbec78f_459fb9b3","line":4,"range":{"start_line":4,"start_character":5,"end_line":4,"end_character":120},"updated":"2019-05-09 17:42:14.000000000","message":"bug.","commit_id":"e23473958f2643b594ac0987d9e1609f2172a8f9"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"054f68d00875fa933f3e253632e51994e85aa3dd","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - \u003e"},{"line_number":4,"context_line":"   [` filesystem-catalog-backend \u003chttps://bugs.launchpad.net/keystone/+bug/1815966\u003e`_]"},{"line_number":5,"context_line":"   Added a new filesystem backend for catalog. Now Keystone support yaml file"},{"line_number":6,"context_line":"   as the catalog\u0027s backend. Please note that it\u0027s a readonly backend."},{"line_number":7,"context_line":"   Operators should define the catalog structure firstly in the yaml file"},{"line_number":8,"context_line":"   before starting Keystone service."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"9fb8cfa7_c8ca10a0","line":5,"range":{"start_line":5,"start_character":60,"end_line":5,"end_character":67},"updated":"2019-06-19 19:02:07.000000000","message":"supports","commit_id":"9e00dce6e705bbe830fc26262571503075e582b2"}]}
