)]}'
{"keystone/exception.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a85d7bfc921ed02b468ede3e0b2caa5422d44a79","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class ValidationShowHierarchyError(Error):"},{"line_number":145,"context_line":"    message_format \u003d _(\"The request project does not in a hierarchical tree \""},{"line_number":146,"context_line":"                       \"or the enforcement model in current deployment does \""},{"line_number":147,"context_line":"                       \"not support hierarchy.\")"},{"line_number":148,"context_line":"    code \u003d int(http_client.BAD_REQUEST)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_9a3e0d88","line":145,"range":{"start_line":145,"start_character":28,"end_line":145,"end_character":35},"updated":"2018-07-09 20:54:57.000000000","message":"nit: requested project is not a member of a project hierarchy","commit_id":"93d4d740ab7af0ad55bcf41c575a1850e1a8ac36"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a85d7bfc921ed02b468ede3e0b2caa5422d44a79","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class ValidationShowHierarchyError(Error):"},{"line_number":145,"context_line":"    message_format \u003d _(\"The request project does not in a hierarchical tree \""},{"line_number":146,"context_line":"                       \"or the enforcement model in current deployment does \""},{"line_number":147,"context_line":"                       \"not support hierarchy.\")"},{"line_number":148,"context_line":"    code \u003d int(http_client.BAD_REQUEST)"},{"line_number":149,"context_line":"    title \u003d http_client.responses[http_client.BAD_REQUEST]"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_1a4afd22","line":146,"range":{"start_line":146,"start_character":31,"end_line":146,"end_character":42},"updated":"2018-07-09 20:54:57.000000000","message":"nit: current enforcement model does not support hierarchical projects.","commit_id":"93d4d740ab7af0ad55bcf41c575a1850e1a8ac36"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"a6480b5364c10b23be5219de82f32fbb43b3a147","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    title \u003d http_client.responses[http_client.BAD_REQUEST]"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class ValidationShowHierarchyError(Error):"},{"line_number":145,"context_line":"    message_format \u003d _(\"The project does not in a hierarchical tree or the \""},{"line_number":146,"context_line":"                       \"enforcement model in current deployment does not \""},{"line_number":147,"context_line":"                       \"support hierarchy.\")"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_577f8cbb","line":144,"range":{"start_line":144,"start_character":6,"end_line":144,"end_character":34},"updated":"2018-07-13 08:15:50.000000000","message":"This error isn\u0027t being used anywhere?","commit_id":"940735bbb80386b4c7fba148a6ceb9b7b1286f07"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"f2311c90f6a977d0973263ac06027ccaf7fcf09d","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    title \u003d http_client.responses[http_client.BAD_REQUEST]"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"class ValidationShowHierarchyError(Error):"},{"line_number":145,"context_line":"    message_format \u003d _(\"The project does not in a hierarchical tree or the \""},{"line_number":146,"context_line":"                       \"enforcement model in current deployment does not \""},{"line_number":147,"context_line":"                       \"support hierarchy.\")"}],"source_content_type":"text/x-python","patch_set":14,"id":"5f7c97a3_72309656","line":144,"range":{"start_line":144,"start_character":6,"end_line":144,"end_character":34},"in_reply_to":"5f7c97a3_577f8cbb","updated":"2018-07-13 08:58:44.000000000","message":"oh, it was used in previous patch set. I forget to remove it.","commit_id":"940735bbb80386b4c7fba148a6ceb9b7b1286f07"}],"keystone/limit/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a85d7bfc921ed02b468ede3e0b2caa5422d44a79","unresolved":false,"context_lines":[{"line_number":112,"context_line":"            show_hierarchy \u003d hints.get_exact_filter_by_name(\u0027show_hierarchy\u0027)"},{"line_number":113,"context_line":"            project_id_filter \u003d hints.get_exact_filter_by_name(\u0027project_id\u0027)"},{"line_number":114,"context_line":"            # TODO(wxy): Use oslo.policy to check the filter once it supports."},{"line_number":115,"context_line":"            if show_hierarchy:"},{"line_number":116,"context_line":"                if (\u0027service\u0027 not in context.roles and"},{"line_number":117,"context_line":"                        not context.service_token):"},{"line_number":118,"context_line":"                    action \u003d _(\"The request should be admin or service when\""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_ba03c9bd","line":115,"updated":"2018-07-09 20:54:57.000000000","message":"This requires a project to be supplied, right? Are we pulling the project for the hierarchy from the token?","commit_id":"93d4d740ab7af0ad55bcf41c575a1850e1a8ac36"}],"keystone/limit/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a85d7bfc921ed02b468ede3e0b2caa5422d44a79","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            # TODO(wxy): Fetch all projects\u0027 limits in hierarchy is heavy-load."},{"line_number":132,"context_line":"            # And the use case is not very clear as well. Forbid it now. This"},{"line_number":133,"context_line":"            # can be allow once we have a clear case for it."},{"line_number":134,"context_line":"            if not project_id_filter:"},{"line_number":135,"context_line":"                action \u003d _(\"The project_id filter must be specified when\""},{"line_number":136,"context_line":"                           \"using show_hierarchy filter.\")"},{"line_number":137,"context_line":"                raise exception.Forbidden(action\u003daction)"},{"line_number":138,"context_line":"            project_ids_tree \u003d self.enforcement_model.get_project_ids_tree("},{"line_number":139,"context_line":"                project_id_filter[\u0027value\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_9a0ccdeb","line":136,"range":{"start_line":134,"start_character":13,"end_line":136,"end_character":58},"updated":"2018-07-09 20:54:57.000000000","message":"This feels like validation that should be done in the controller layer. If we detect we\u0027re looking for a project hierarchy in the controller layer, we can introduce a specific list_limits_for_project_hierarchy() method to address that case (which should keep this method simpler).","commit_id":"93d4d740ab7af0ad55bcf41c575a1850e1a8ac36"}],"keystone/limit/models/base.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a85d7bfc921ed02b468ede3e0b2caa5422d44a79","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                        |   |"},{"line_number":82,"context_line":"                        D   E"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        The return dict is like::"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"            {"},{"line_number":87,"context_line":"                \"project_id\": A[\u0027id\u0027],"},{"line_number":88,"context_line":"                \"limits\": ["},{"line_number":89,"context_line":"                    {"},{"line_number":90,"context_line":"                        \"project_id\": B[\u0027id\u0027],"},{"line_number":91,"context_line":"                        \"limits\": []"},{"line_number":92,"context_line":"                    },"},{"line_number":93,"context_line":"                    {"},{"line_number":94,"context_line":"                        \"project_id\": C[\u0027id\u0027],"},{"line_number":95,"context_line":"                        \"limits\": ["},{"line_number":96,"context_line":"                            {"},{"line_number":97,"context_line":"                                \"project_id\": D[\u0027id\u0027],"},{"line_number":98,"context_line":"                                \"limits\": []"},{"line_number":99,"context_line":"                            },"},{"line_number":100,"context_line":"                            {"},{"line_number":101,"context_line":"                                \"project_id\": E[\u0027id\u0027],"},{"line_number":102,"context_line":"                                \"limits\": []"},{"line_number":103,"context_line":"                            }"},{"line_number":104,"context_line":"                        ]"},{"line_number":105,"context_line":"                    }"},{"line_number":106,"context_line":"                ]"},{"line_number":107,"context_line":"            }"},{"line_number":108,"context_line":"        \"\"\""},{"line_number":109,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_dabd65d7","line":107,"range":{"start_line":84,"start_character":6,"end_line":107,"end_character":13},"updated":"2018-07-09 20:54:57.000000000","message":"If we add more enforcement models in the future, this might become duplicated across models. We could just return a list of project IDs and use a single method/implementation in core.py/controller.py to build the response.\n\nJust thinking about this from a maintainability perspective if/when we start adding more enforcement models. I wouldn\u0027t want something to slip through the crack where we have something that unintentionally breaks the API depending on which enforcement model is being used.","commit_id":"93d4d740ab7af0ad55bcf41c575a1850e1a8ac36"}],"keystone/resource/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d4f333f15382dbaf403a71a95ea4fad0fa39d893","unresolved":false,"context_lines":[{"line_number":203,"context_line":"    def _expand_project_ref(self, request, ref):"},{"line_number":204,"context_line":"        params \u003d request.params"},{"line_number":205,"context_line":"        context \u003d request.context_dict"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        parents_as_list \u003d \u0027parents_as_list\u0027 in params and ("},{"line_number":208,"context_line":"            self.query_filter_is_true(params[\u0027parents_as_list\u0027]))"},{"line_number":209,"context_line":"        parents_as_ids \u003d \u0027parents_as_ids\u0027 in params and ("}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_80eb2e0f","side":"PARENT","line":206,"updated":"2018-07-18 15:05:13.000000000","message":"Unrelated white-space change?","commit_id":"dca9a05c7c86f1b32becd0dfae05c44f00ea6d95"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a6d2e701a23122dddd4e3c0165d05e5cb988db7c","unresolved":false,"context_lines":[{"line_number":203,"context_line":"    def _expand_project_ref(self, request, ref):"},{"line_number":204,"context_line":"        params \u003d request.params"},{"line_number":205,"context_line":"        context \u003d request.context_dict"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        parents_as_list \u003d \u0027parents_as_list\u0027 in params and ("},{"line_number":208,"context_line":"            self.query_filter_is_true(params[\u0027parents_as_list\u0027]))"},{"line_number":209,"context_line":"        parents_as_ids \u003d \u0027parents_as_ids\u0027 in params and ("}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_d069eabf","side":"PARENT","line":206,"in_reply_to":"5f7c97a3_80eb2e0f","updated":"2018-07-19 03:19:59.000000000","message":"Done","commit_id":"dca9a05c7c86f1b32becd0dfae05c44f00ea6d95"}],"keystone/resource/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d4f333f15382dbaf403a71a95ea4fad0fa39d893","unresolved":false,"context_lines":[{"line_number":529,"context_line":"    def list_project_parents(self, project_id, user_id\u003dNone,"},{"line_number":530,"context_line":"                             include_limits\u003dFalse):"},{"line_number":531,"context_line":"        self._assert_valid_project_id(project_id)"},{"line_number":532,"context_line":"        parents \u003d self.driver.list_project_parents(project_id)"},{"line_number":533,"context_line":"        # If a user_id was provided, the returned list should be filtered"},{"line_number":534,"context_line":"        # against the projects this user has access to."},{"line_number":535,"context_line":"        if user_id:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_c0c36605","line":532,"range":{"start_line":532,"start_character":8,"end_line":532,"end_character":15},"updated":"2018-07-18 15:05:13.000000000","message":"I guess one thing about the returned result here is that it doesn\u0027t really fall within the specification we wrote for limits [0]. Instead of having the hierarchy treated as an actual tree, this is a list of all parents.\n\n[0] http://specs.openstack.org/openstack/keystone-specs/specs/keystone/rocky/strict-two-level-enforcement-model.html#fetching-project-hierarchy","commit_id":"a90868409aa9942a87627c342b50a67e6c8e1818"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d4f333f15382dbaf403a71a95ea4fad0fa39d893","unresolved":false,"context_lines":[{"line_number":539,"context_line":"                hints \u003d driver_hints.Hints()"},{"line_number":540,"context_line":"                hints.add_filter(\u0027project_id\u0027, parent[\u0027id\u0027])"},{"line_number":541,"context_line":"                limits \u003d PROVIDERS.unified_limit_api.list_limits(hints)"},{"line_number":542,"context_line":"                parent[\u0027limits\u0027] \u003d limits"},{"line_number":543,"context_line":"        return parents"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def _build_parents_as_ids_dict(self, project, parents_by_id):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_c05cc6f1","line":542,"updated":"2018-07-18 15:05:13.000000000","message":"nit: I was able to reduce a bit of duplication between this method and the one that uses the same logic below:\n\nhttp://paste.openstack.org/raw/726202/","commit_id":"a90868409aa9942a87627c342b50a67e6c8e1818"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a6d2e701a23122dddd4e3c0165d05e5cb988db7c","unresolved":false,"context_lines":[{"line_number":539,"context_line":"                hints \u003d driver_hints.Hints()"},{"line_number":540,"context_line":"                hints.add_filter(\u0027project_id\u0027, parent[\u0027id\u0027])"},{"line_number":541,"context_line":"                limits \u003d PROVIDERS.unified_limit_api.list_limits(hints)"},{"line_number":542,"context_line":"                parent[\u0027limits\u0027] \u003d limits"},{"line_number":543,"context_line":"        return parents"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def _build_parents_as_ids_dict(self, project, parents_by_id):"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_d066ca28","line":542,"in_reply_to":"5f7c97a3_c05cc6f1","updated":"2018-07-19 03:19:59.000000000","message":"sure","commit_id":"a90868409aa9942a87627c342b50a67e6c8e1818"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d4f333f15382dbaf403a71a95ea4fad0fa39d893","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def list_projects_in_subtree(self, project_id, user_id\u003dNone,"},{"line_number":589,"context_line":"                                 include_limits\u003dFalse):"},{"line_number":590,"context_line":"        self._assert_valid_project_id(project_id)"},{"line_number":591,"context_line":"        subtree \u003d self.driver.list_projects_in_subtree(project_id)"},{"line_number":592,"context_line":"        # If a user_id was provided, the returned list should be filtered"},{"line_number":593,"context_line":"        # against the projects this user has access to."},{"line_number":594,"context_line":"        if user_id:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_c0ecc693","line":591,"range":{"start_line":591,"start_character":8,"end_line":591,"end_character":15},"updated":"2018-07-18 15:05:13.000000000","message":"Same comment here as above. We\u0027ll need to decide if the data structure currently implemented is enough for what we need. Or if we want to rework it to represent things in an actual hierarchy.\n\nThis might be relatively transparent to the user, but it will determine if we push more logic into oslo.limit to deal with sorting the response and determining parents/children.","commit_id":"a90868409aa9942a87627c342b50a67e6c8e1818"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a6d2e701a23122dddd4e3c0165d05e5cb988db7c","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def list_projects_in_subtree(self, project_id, user_id\u003dNone,"},{"line_number":589,"context_line":"                                 include_limits\u003dFalse):"},{"line_number":590,"context_line":"        self._assert_valid_project_id(project_id)"},{"line_number":591,"context_line":"        subtree \u003d self.driver.list_projects_in_subtree(project_id)"},{"line_number":592,"context_line":"        # If a user_id was provided, the returned list should be filtered"},{"line_number":593,"context_line":"        # against the projects this user has access to."},{"line_number":594,"context_line":"        if user_id:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_f36c30d0","line":591,"range":{"start_line":591,"start_character":8,"end_line":591,"end_character":15},"in_reply_to":"5f7c97a3_c0ecc693","updated":"2018-07-19 03:19:59.000000000","message":"++, yeah, now we\u0027ll return a linear list which is not hierarchical structure by default, so if oslo.limit want the hierarchical info, it should add the logic by itself. \n\nSo here is some questions:\n1. who should deal with the hierarchy, keystone or oslo.limit?\n2. how the oslo.limit using hierarchy?\n\nIMO, oslo.limit only need hierarchical limit info when the related project\u0027s limit is missing, then oslo.limit need to get the project\u0027s parents limit (or registered limit). So we can see that the hierarchical info is used not very often in oslo.limit. So I prefer leave the logic to oslo.limit itself.\n\nOn the other side, if oslo.limit handles the hierarchical logic, then we do not need change Keystone API so much.(we don\u0027t need create a new API or do a big refactor to response body.)\n\nCorrect me if I missed other usages about hierarchy in oslo.limit.","commit_id":"a90868409aa9942a87627c342b50a67e6c8e1818"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"057072db22b7e0d6883282885119c0f6a375a42f","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def list_projects_in_subtree(self, project_id, user_id\u003dNone,"},{"line_number":589,"context_line":"                                 include_limits\u003dFalse):"},{"line_number":590,"context_line":"        self._assert_valid_project_id(project_id)"},{"line_number":591,"context_line":"        subtree \u003d self.driver.list_projects_in_subtree(project_id)"},{"line_number":592,"context_line":"        # If a user_id was provided, the returned list should be filtered"},{"line_number":593,"context_line":"        # against the projects this user has access to."},{"line_number":594,"context_line":"        if user_id:"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_9b6481b5","line":591,"range":{"start_line":591,"start_character":8,"end_line":591,"end_character":15},"in_reply_to":"5f7c97a3_f36c30d0","updated":"2018-07-24 14:15:49.000000000","message":"That makes sense. I this for the existing use cases - this might be fine (but we\u0027ll need an update to correct the specification).\n\nThe only other negative side-effect of tacking this type of query parameter onto an existing API is that we can\u0027t mark it as experimental, since it\u0027s already stable. But that\u0027s the trade off of having to develop a new API I suppose.","commit_id":"a90868409aa9942a87627c342b50a67e6c8e1818"}],"keystone/tests/unit/test_limits.py":[{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"bab685711b0dfba97fadc2cfc670ddc2f76449bf","unresolved":false,"context_lines":[{"line_number":1492,"context_line":"            self.assertEqual(parent_limit[key], ref_parent_limit[key])"},{"line_number":1493,"context_line":"        # the parent contains two children."},{"line_number":1494,"context_line":"        ref_child_limits \u003d ref_parent_limit[\u0027limits\u0027]"},{"line_number":1495,"context_line":"        self.assertEqual(2, len(ref_child_limits))"},{"line_number":1496,"context_line":"        if ref_child_limits[0][\u0027project_id\u0027] \u003d\u003d child_project_A[\u0027id\u0027]:"},{"line_number":1497,"context_line":"            self.assertEqual(child_project_B[\u0027id\u0027],"},{"line_number":1498,"context_line":"                             ref_child_limits[1][\u0027project_id\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_abf7428c","line":1495,"updated":"2018-07-05 07:01:52.000000000","message":"Minor correction of syntex error\n\nmultiple spaces after \u0027,\u0027","commit_id":"22a9cc38ff4daa21640fc52a8723c7b50a06eefc"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"29ef9d8d438317341b5d2537da01e8a2917eeed4","unresolved":false,"context_lines":[{"line_number":1492,"context_line":"            self.assertEqual(parent_limit[key], ref_parent_limit[key])"},{"line_number":1493,"context_line":"        # the parent contains two children."},{"line_number":1494,"context_line":"        ref_child_limits \u003d ref_parent_limit[\u0027limits\u0027]"},{"line_number":1495,"context_line":"        self.assertEqual(2, len(ref_child_limits))"},{"line_number":1496,"context_line":"        if ref_child_limits[0][\u0027project_id\u0027] \u003d\u003d child_project_A[\u0027id\u0027]:"},{"line_number":1497,"context_line":"            self.assertEqual(child_project_B[\u0027id\u0027],"},{"line_number":1498,"context_line":"                             ref_child_limits[1][\u0027project_id\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_ab7422d1","line":1495,"in_reply_to":"5f7c97a3_abf7428c","updated":"2018-07-05 07:15:11.000000000","message":"It was an error in ps6, I fixed it in this ps. There is only one space now.","commit_id":"22a9cc38ff4daa21640fc52a8723c7b50a06eefc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a85d7bfc921ed02b468ede3e0b2caa5422d44a79","unresolved":false,"context_lines":[{"line_number":824,"context_line":"        self.assertEqual(1, len(limits))"},{"line_number":825,"context_line":"        self.assertEqual(self.project_id, limits[0][\u0027project_id\u0027])"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"    def test_list_limit_with_show_hierarchy_filter_in_different_case(self):"},{"line_number":828,"context_line":"        # If the request is admin, the show_hierarchy filter must be specified"},{"line_number":829,"context_line":"        # together with project_id filter."},{"line_number":830,"context_line":"        self.get("}],"source_content_type":"text/x-python","patch_set":8,"id":"5f7c97a3_9aa84d8b","line":827,"range":{"start_line":827,"start_character":8,"end_line":827,"end_character":68},"updated":"2018-07-09 20:54:57.000000000","message":"nit: I\u0027d wouldn\u0027t be opposed to testing these in two separate tests since they\u0027re two distinct cases.","commit_id":"93d4d740ab7af0ad55bcf41c575a1850e1a8ac36"}],"keystone/tests/unit/test_v3_resource.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"13233956f65772f9f4ddc0f46decae1b27662d69","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"        self.assertIsNone(r.result[\u0027project\u0027].get(\u0027limits\u0027))"},{"line_number":1132,"context_line":""},{"line_number":1133,"context_line":"        # using \"include_limits\" with \"parents_as_list\""},{"line_number":1134,"context_line":"        r \u003d self.get(\u0027/projects/%(project_id)s?include_limits\u0026parents_as_list\u0027"},{"line_number":1135,"context_line":"                     % {\u0027project_id\u0027: subproject[\u0027project\u0027][\u0027id\u0027]})"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        self.assertEqual(2, len(r.result[\u0027project\u0027][\u0027parents\u0027]))"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_e032220f","line":1134,"updated":"2018-07-18 15:10:13.000000000","message":"I did notice that the response here includes a tree structure 3 levels deep [0]. The follow on patch the includes the constraint for two-level hierarchies doesn\u0027t fail either though.\n\nIn my example c2f7a38524744dcbb62688d47760dbd1 is the grandchild, e2e8a793333047169b271bc5f8293da4 is the parent, and 1c0d856ecd7441cf9ee04a9a4957a9df is the grandparent.\n\nIs that intended?\n\n[0] http://paste.openstack.org/show/726203/","commit_id":"a90868409aa9942a87627c342b50a67e6c8e1818"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f5dec90c8c59ef4f9fe49b39b622ea6476196f41","unresolved":false,"context_lines":[{"line_number":1131,"context_line":"        self.assertIsNone(r.result[\u0027project\u0027].get(\u0027limits\u0027))"},{"line_number":1132,"context_line":""},{"line_number":1133,"context_line":"        # using \"include_limits\" with \"parents_as_list\""},{"line_number":1134,"context_line":"        r \u003d self.get(\u0027/projects/%(project_id)s?include_limits\u0026parents_as_list\u0027"},{"line_number":1135,"context_line":"                     % {\u0027project_id\u0027: subproject[\u0027project\u0027][\u0027id\u0027]})"},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        self.assertEqual(2, len(r.result[\u0027project\u0027][\u0027parents\u0027]))"}],"source_content_type":"text/x-python","patch_set":17,"id":"5f7c97a3_4b445719","line":1134,"in_reply_to":"5f7c97a3_e032220f","updated":"2018-07-18 15:23:00.000000000","message":"Nevermind - I had to dig into the subsequent patch to figure out how this all works while maintaining the constraint [0].\n\n[0] https://review.openstack.org/#/c/580258/10/keystone/tests/unit/test_v3_resource.py","commit_id":"a90868409aa9942a87627c342b50a67e6c8e1818"}]}
