)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a8080a86b0f3f61226a28e6faea5ab1a96dff246","unresolved":false,"context_lines":[{"line_number":11,"context_line":"assigned roles.  A config option controls whether implied roles"},{"line_number":12,"context_line":"are expanded in the auth data associated with tokens."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"The list_assignment tests helper is also modifed to"},{"line_number":15,"context_line":"allow data driven tests for implied roles, and those new tests"},{"line_number":16,"context_line":"are also included here."},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"da6ed579_c46662ba","line":14,"range":{"start_line":14,"start_character":41,"end_line":14,"end_character":48},"updated":"2016-01-15 11:05:45.000000000","message":"nit: modifed/modified.","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ace1d189aecc42ea270118898f69b118c4c86f0c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"are also included here."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Implied roles are not supported by the LDAP drivers; if you"},{"line_number":19,"context_line":"try and CRUD implied roles with an LDAP assignment driver a"},{"line_number":20,"context_line":"NotImplemented is returned, although to keep the code in the"},{"line_number":21,"context_line":"manager simple, listing implied roles will just return an"},{"line_number":22,"context_line":"empty list."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"da6ed579_b8453cb4","line":19,"range":{"start_line":19,"start_character":8,"end_line":19,"end_character":12},"updated":"2016-01-18 04:35:12.000000000","message":"CRD","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"20c50a62b61458df788a0c660e6b7cd198fa49e3","unresolved":false,"context_lines":[{"line_number":16,"context_line":"are also included here."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Implied roles are not supported by the LDAP drivers; if you"},{"line_number":19,"context_line":"try and CRUD implied roles with an LDAP assignment driver a"},{"line_number":20,"context_line":"NotImplemented is returned, although to keep the code in the"},{"line_number":21,"context_line":"manager simple, listing implied roles will just return an"},{"line_number":22,"context_line":"empty list."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"da6ed579_fc4883ce","line":19,"range":{"start_line":19,"start_character":8,"end_line":19,"end_character":12},"in_reply_to":"da6ed579_9c806748","updated":"2016-01-18 07:39:54.000000000","message":"\u0027cause you can\u0027t update a role inference...","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b3ea821eecc12a19b1d2047a740d2e19f1cb6398","unresolved":false,"context_lines":[{"line_number":16,"context_line":"are also included here."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Implied roles are not supported by the LDAP drivers; if you"},{"line_number":19,"context_line":"try and CRUD implied roles with an LDAP assignment driver a"},{"line_number":20,"context_line":"NotImplemented is returned, although to keep the code in the"},{"line_number":21,"context_line":"manager simple, listing implied roles will just return an"},{"line_number":22,"context_line":"empty list."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"da6ed579_9c806748","line":19,"range":{"start_line":19,"start_character":8,"end_line":19,"end_character":12},"in_reply_to":"da6ed579_b8453cb4","updated":"2016-01-18 07:24:14.000000000","message":"why remove the U?","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7eedbb717838ccd4ab93210f226abed49091fc2e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"are also included here."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Implied roles are not supported by the LDAP drivers; if you"},{"line_number":19,"context_line":"try and CRUD implied roles with an LDAP assignment driver a"},{"line_number":20,"context_line":"NotImplemented is returned, although to keep the code in the"},{"line_number":21,"context_line":"manager simple, listing implied roles will just return an"},{"line_number":22,"context_line":"empty list."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"da6ed579_502f1d3e","line":19,"range":{"start_line":19,"start_character":8,"end_line":19,"end_character":12},"in_reply_to":"da6ed579_fc4883ce","updated":"2016-01-18 15:47:30.000000000","message":"Done.  Also removed from \"althought\" to the end of the line as that is no longer true: more consistent to just throw for all calls to the LDAP driver.","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"}],"keystone/assignment/core.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"110b5e2dcc437470515f6decef573a02859e0648","unresolved":false,"context_lines":[{"line_number":594,"context_line":"            return expand_group_assignment(ref, user_id)"},{"line_number":595,"context_line":"        return [ref]"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def _add_implied_roles_and_post_filter_by_role(self, role_id, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles and post filter by role if required."},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        The refs passed in have had all inheritance and group assignments"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_722c0c99","line":597,"range":{"start_line":597,"start_character":27,"end_line":597,"end_character":31},"updated":"2016-01-06 20:20:55.000000000","message":"whenever I see \"_and_\" in the method name, I smell opportunity for code refactoring","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a8cb911eb217c75e26890beffbd6f4827f1b0767","unresolved":false,"context_lines":[{"line_number":594,"context_line":"            return expand_group_assignment(ref, user_id)"},{"line_number":595,"context_line":"        return [ref]"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def _add_implied_roles_and_post_filter_by_role(self, role_id, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles and post filter by role if required."},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        The refs passed in have had all inheritance and group assignments"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_5e4a0757","line":597,"range":{"start_line":597,"start_character":27,"end_line":597,"end_character":31},"in_reply_to":"fa69d971_722c0c99","updated":"2016-01-07 16:34:23.000000000","message":"The refactoring is internal to the method.  This method is a facade for the various pieces.  In the future, they can be exposed separately if required.","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"97f1ebf1816bb6a455d95f9ad112a28bbff982fc","unresolved":false,"context_lines":[{"line_number":1613,"context_line":""},{"line_number":1614,"context_line":"    def list_prior_roles(self, implied_id):"},{"line_number":1615,"context_line":"        return []"},{"line_number":1616,"context_line":""},{"line_number":1617,"context_line":""},{"line_number":1618,"context_line":"RoleDriver \u003d manager.create_legacy_driver(RoleDriverV8)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da6ed579_e3256eae","line":1616,"updated":"2016-01-12 01:01:39.000000000","message":"Need to add list_role_inference_rules() method here?","commit_id":"0f8f8e0f3ac56a0a2946a77924f6eb10a175307b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ad8eb4b0bc340d6ec7827f7b17a3e622e2c5e7cd","unresolved":false,"context_lines":[{"line_number":597,"context_line":"    def _add_implied_roles(self, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        post filter by role if required."},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"        The refs passed in have had all inheritance and group assignments"},{"line_number":603,"context_line":"        expanded out. We now need to look at the role_id in each ref and see"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_c1ab181c","line":600,"updated":"2016-01-13 16:59:49.000000000","message":"this comment is not longer relevant.  THe call is outside this function to filter now","commit_id":"37be9f2debb93ecbfe11ebb43905186284112ff6"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ad8eb4b0bc340d6ec7827f7b17a3e622e2c5e7cd","unresolved":false,"context_lines":[{"line_number":606,"context_line":"        in the indirect dict that is part of such a duplicated ref, so that a"},{"line_number":607,"context_line":"        caller can determine where the assignment came from."},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"        Finally, if the call to list_role_assignments specified a role_id"},{"line_number":610,"context_line":"        filter, then if that role_id had any implied roles, we will have"},{"line_number":611,"context_line":"        deferred the role filtering until now (since otherwise we would remove"},{"line_number":612,"context_line":"        roles before they had a chance to have the implied roles expanded). If"}],"source_content_type":"text/x-python","patch_set":15,"id":"da6ed579_e17dfcb1","line":609,"updated":"2016-01-13 16:59:49.000000000","message":"move this comment to the calling function","commit_id":"37be9f2debb93ecbfe11ebb43905186284112ff6"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"968dc9e5ee88cf8f7843ba081e1400b1d6ac5a35","unresolved":false,"context_lines":[{"line_number":616,"context_line":"            return implied_ref"},{"line_number":617,"context_line":""},{"line_number":618,"context_line":"        if not CONF.token.infer_roles:"},{"line_number":619,"context_line":"            # If we could not have had inferred roles then there won\u0027t be any"},{"line_number":620,"context_line":"            # filtering required."},{"line_number":621,"context_line":"            return refs"},{"line_number":622,"context_line":"        try:"},{"line_number":623,"context_line":"            implied_roles_cache \u003d {}"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_ceded86c","line":620,"range":{"start_line":619,"start_character":14,"end_line":620,"end_character":33},"updated":"2016-01-13 20:31:31.000000000","message":"if we have moved the filtering, need to change this comment too...","commit_id":"6ea9ccf6d6c8bec0ffde385bd2bc58bc2c6fbd98"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"968dc9e5ee88cf8f7843ba081e1400b1d6ac5a35","unresolved":false,"context_lines":[{"line_number":778,"context_line":"        # If filtering by domain, then only non-inherited assignments are"},{"line_number":779,"context_line":"        # relevant, since domains don\u0027t inherit assignments"},{"line_number":780,"context_line":"        inherited \u003d False if domain_id else inherited"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"        # List user assignments"},{"line_number":783,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":784,"context_line":"            role_id\u003dfilter_role_id, user_id\u003duser_id, project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_33392142","line":781,"updated":"2016-01-13 20:31:31.000000000","message":"So you removed some logic here form my version. While this will still give the correct answer, it means you are retrieving more rows that you need....even when you are not using implied roles....I might agree that calling list_prior_roles might be more costly that simply not using a role filter..but if infer roles are off, then we should pass in the filter.\n\nAs an aside, if you REALLY do want to just wait till the end to do role filtering, no need to set fillter_role_Id....just don\u0027t pass a role_id into the call to list_role_assignments_for_actor()","commit_id":"6ea9ccf6d6c8bec0ffde385bd2bc58bc2c6fbd98"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"968dc9e5ee88cf8f7843ba081e1400b1d6ac5a35","unresolved":false,"context_lines":[{"line_number":1529,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1530,"context_line":""},{"line_number":1531,"context_line":"    @abc.abstractmethod"},{"line_number":1532,"context_line":"    def list_prior_roles(self, implied_id):"},{"line_number":1533,"context_line":"        \"\"\"Lists prior roles for an implied id"},{"line_number":1534,"context_line":""},{"line_number":1535,"context_line":"        :raises: keystone.exception.RoleNotFound"}],"source_content_type":"text/x-python","patch_set":16,"id":"da6ed579_2e869413","line":1532,"range":{"start_line":1532,"start_character":8,"end_line":1532,"end_character":43},"updated":"2016-01-13 20:31:31.000000000","message":"I think that IF we drop the intermediate filtering step, then we don\u0027t need this method....","commit_id":"6ea9ccf6d6c8bec0ffde385bd2bc58bc2c6fbd98"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6d49b32c0a120a5a120365ba0785c797cc89a840","unresolved":false,"context_lines":[{"line_number":766,"context_line":"        # Due to the need to expand implied roles, this parameter will skip"},{"line_number":767,"context_line":"        # filtering on the individual calls and return the superset."},{"line_number":768,"context_line":"        # Matching on the specified role is performed at the end."},{"line_number":769,"context_line":"        filter_role_id \u003d None"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        # If filtering by group or inherited domain assignment the list is"},{"line_number":772,"context_line":"        # guaranteed to be empty"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_2258e489","line":769,"range":{"start_line":769,"start_character":8,"end_line":769,"end_character":29},"updated":"2016-01-13 22:20:03.000000000","message":"nit: no need to even define this parameter...just don\u0027t need to pass anything in to list_role_assignments_for_actor()","commit_id":"411f9da4f0305a30b6a89635c443ab80d5956373"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b49f27605351301c0dcb0455c59f1ddad65a267a","unresolved":false,"context_lines":[{"line_number":766,"context_line":"        # Due to the need to expand implied roles, this parameter will skip"},{"line_number":767,"context_line":"        # filtering on the individual calls and return the superset."},{"line_number":768,"context_line":"        # Matching on the specified role is performed at the end."},{"line_number":769,"context_line":"        filter_role_id \u003d None"},{"line_number":770,"context_line":""},{"line_number":771,"context_line":"        # If filtering by group or inherited domain assignment the list is"},{"line_number":772,"context_line":"        # guaranteed to be empty"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_ad492562","line":769,"range":{"start_line":769,"start_character":8,"end_line":769,"end_character":29},"in_reply_to":"da6ed579_2258e489","updated":"2016-01-13 22:26:12.000000000","message":"sorry, that\u0027s incorrect.  I think if we are only going to filter by role at the end, then list_role_assignments_for_actor() never needs to filter by role_id, so that can stripped out of it (i.e. it never passes role_id into the de\u003driver.list_role_assignments()","commit_id":"411f9da4f0305a30b6a89635c443ab80d5956373"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6d49b32c0a120a5a120365ba0785c797cc89a840","unresolved":false,"context_lines":[{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        # List user assignments"},{"line_number":781,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":782,"context_line":"            role_id\u003dfilter_role_id, user_id\u003duser_id, project_id\u003dproject_id,"},{"line_number":783,"context_line":"            subtree_ids\u003dsubtree_ids, domain_id\u003ddomain_id,"},{"line_number":784,"context_line":"            inherited\u003dinherited)"},{"line_number":785,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_220a247a","line":782,"range":{"start_line":782,"start_character":12,"end_line":782,"end_character":34},"updated":"2016-01-13 22:20:03.000000000","message":"nit: you can just not pass anything in here, it defaults to None","commit_id":"411f9da4f0305a30b6a89635c443ab80d5956373"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9d1851f2a7bd5bfd72704680350fc5d6628ca54c","unresolved":false,"context_lines":[{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        # List user assignments"},{"line_number":781,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":782,"context_line":"            role_id\u003dfilter_role_id, user_id\u003duser_id, project_id\u003dproject_id,"},{"line_number":783,"context_line":"            subtree_ids\u003dsubtree_ids, domain_id\u003ddomain_id,"},{"line_number":784,"context_line":"            inherited\u003dinherited)"},{"line_number":785,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_e2796cc9","line":782,"range":{"start_line":782,"start_character":12,"end_line":782,"end_character":34},"in_reply_to":"da6ed579_220a247a","updated":"2016-01-13 22:22:57.000000000","message":"oops, sorry, it doesn\u0027t default to None....","commit_id":"411f9da4f0305a30b6a89635c443ab80d5956373"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6d49b32c0a120a5a120365ba0785c797cc89a840","unresolved":false,"context_lines":[{"line_number":789,"context_line":"            group_ids \u003d self._get_group_ids_for_user_id(user_id)"},{"line_number":790,"context_line":"            if group_ids:"},{"line_number":791,"context_line":"                group_refs \u003d list_role_assignments_for_actor("},{"line_number":792,"context_line":"                    role_id\u003dfilter_role_id, project_id\u003dproject_id,"},{"line_number":793,"context_line":"                    subtree_ids\u003dsubtree_ids, group_ids\u003dgroup_ids,"},{"line_number":794,"context_line":"                    domain_id\u003ddomain_id, inherited\u003dinherited)"},{"line_number":795,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_02260015","line":792,"range":{"start_line":792,"start_character":20,"end_line":792,"end_character":42},"updated":"2016-01-13 22:20:03.000000000","message":"nit: you can just not pass anything in here, it defaults to None","commit_id":"411f9da4f0305a30b6a89635c443ab80d5956373"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6d49b32c0a120a5a120365ba0785c797cc89a840","unresolved":false,"context_lines":[{"line_number":1587,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1588,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1589,"context_line":""},{"line_number":1590,"context_line":"    def list_prior_roles(self, implied_id):"},{"line_number":1591,"context_line":"        return []"},{"line_number":1592,"context_line":""},{"line_number":1593,"context_line":"    def list_role_inference_rules(self):"},{"line_number":1594,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":17,"id":"da6ed579_82ce702c","line":1591,"range":{"start_line":1590,"start_character":8,"end_line":1591,"end_character":17},"updated":"2016-01-13 22:20:03.000000000","message":"should remove this","commit_id":"411f9da4f0305a30b6a89635c443ab80d5956373"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a8080a86b0f3f61226a28e6faea5ab1a96dff246","unresolved":false,"context_lines":[{"line_number":1507,"context_line":"    def delete_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1508,"context_line":"        \"\"\"Deletes a role inference rule"},{"line_number":1509,"context_line":""},{"line_number":1510,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1511,"context_line":""},{"line_number":1512,"context_line":"        \"\"\""},{"line_number":1513,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_43d6de28","line":1510,"range":{"start_line":1510,"start_character":8,"end_line":1510,"end_character":48},"updated":"2016-01-15 11:05:45.000000000","message":"remove this docstring, no exception is raised from this API.\nhttps://review.openstack.org/#/c/264260/19/keystone/assignment/role_backends/sql.py@92","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a8080a86b0f3f61226a28e6faea5ab1a96dff246","unresolved":false,"context_lines":[{"line_number":1521,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1522,"context_line":"        \"\"\"Lists roles implied from the prior id"},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"        \"\"\""},{"line_number":1527,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_e3003236","line":1524,"range":{"start_line":1524,"start_character":8,"end_line":1524,"end_character":48},"updated":"2016-01-15 11:05:45.000000000","message":"same here, no exception is raised from the backend driver.\n\nhttps://review.openstack.org/#/c/264260/19/keystone/assignment/role_backends/sql.py@99","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"528f9a451fadfbec49375a1d1b8e199401dd8641","unresolved":false,"context_lines":[{"line_number":1521,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1522,"context_line":"        \"\"\"Lists roles implied from the prior id"},{"line_number":1523,"context_line":""},{"line_number":1524,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"        \"\"\""},{"line_number":1527,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_d94ce49f","line":1524,"range":{"start_line":1524,"start_character":8,"end_line":1524,"end_character":48},"in_reply_to":"da6ed579_e3003236","updated":"2016-01-15 19:32:31.000000000","message":"Done","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"36342becdb1af97900420075e261b7a16b03223b","unresolved":false,"context_lines":[{"line_number":782,"context_line":"            subtree_ids\u003dsubtree_ids, domain_id\u003ddomain_id,"},{"line_number":783,"context_line":"            inherited\u003dinherited)"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"        # And those from the user\u0027s groups.  Again, role_id is not"},{"line_number":786,"context_line":"        # used to filter here"},{"line_number":787,"context_line":"        group_refs \u003d []"},{"line_number":788,"context_line":"        if user_id:"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_c124dd61","line":785,"range":{"start_line":785,"start_character":44,"end_line":785,"end_character":45},"updated":"2016-01-16 02:49:07.000000000","message":"single space I think.","commit_id":"0d6d21b4a65dade6e1e7b0dc80817308061eb11f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"0635aa880ba1ba9b0c5a0e5f2bf5505f26a3b596","unresolved":false,"context_lines":[{"line_number":782,"context_line":"            subtree_ids\u003dsubtree_ids, domain_id\u003ddomain_id,"},{"line_number":783,"context_line":"            inherited\u003dinherited)"},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"        # And those from the user\u0027s groups.  Again, role_id is not"},{"line_number":786,"context_line":"        # used to filter here"},{"line_number":787,"context_line":"        group_refs \u003d []"},{"line_number":788,"context_line":"        if user_id:"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_41ac6d8c","line":785,"range":{"start_line":785,"start_character":44,"end_line":785,"end_character":45},"in_reply_to":"da6ed579_c124dd61","updated":"2016-01-16 02:54:35.000000000","message":"Done","commit_id":"0d6d21b4a65dade6e1e7b0dc80817308061eb11f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"36342becdb1af97900420075e261b7a16b03223b","unresolved":false,"context_lines":[{"line_number":1489,"context_line":"    def get_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1490,"context_line":"        \"\"\"Fetches a role inference rule"},{"line_number":1491,"context_line":""},{"line_number":1492,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"        \"\"\""},{"line_number":1495,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_c1a37dff","line":1492,"range":{"start_line":1492,"start_character":8,"end_line":1492,"end_character":48},"updated":"2016-01-16 02:49:07.000000000","message":"change this to \n  :raises keystone.exception.ImpliedRoleNotFound: conditions\n\nIt\u0027s ImpliedRoleNotFound instead of RoleNotFound, and need to change the format or else the doc will not be rendered correctly in some cases.\n\n\nsee:\nhttps://review.openstack.org/#/c/226225/\nhttp://sphinx-doc.org/domains.html#info-field-lists","commit_id":"0d6d21b4a65dade6e1e7b0dc80817308061eb11f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"0635aa880ba1ba9b0c5a0e5f2bf5505f26a3b596","unresolved":false,"context_lines":[{"line_number":1489,"context_line":"    def get_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1490,"context_line":"        \"\"\"Fetches a role inference rule"},{"line_number":1491,"context_line":""},{"line_number":1492,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"        \"\"\""},{"line_number":1495,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_e1ea41ac","line":1492,"range":{"start_line":1492,"start_character":8,"end_line":1492,"end_character":48},"in_reply_to":"da6ed579_c1a37dff","updated":"2016-01-16 02:54:35.000000000","message":"Done","commit_id":"0d6d21b4a65dade6e1e7b0dc80817308061eb11f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"36342becdb1af97900420075e261b7a16b03223b","unresolved":false,"context_lines":[{"line_number":1498,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1499,"context_line":"        \"\"\"Creates a role inference rule"},{"line_number":1500,"context_line":""},{"line_number":1501,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1502,"context_line":""},{"line_number":1503,"context_line":"        \"\"\""},{"line_number":1504,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_010435c4","line":1501,"range":{"start_line":1501,"start_character":8,"end_line":1501,"end_character":48},"updated":"2016-01-16 02:49:07.000000000","message":"change this to:\n  :raises keystone.exception.RoleNotFound: If the role doesn\u0027t exist.","commit_id":"0d6d21b4a65dade6e1e7b0dc80817308061eb11f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"0635aa880ba1ba9b0c5a0e5f2bf5505f26a3b596","unresolved":false,"context_lines":[{"line_number":1498,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1499,"context_line":"        \"\"\"Creates a role inference rule"},{"line_number":1500,"context_line":""},{"line_number":1501,"context_line":"        :raises: keystone.exception.RoleNotFound"},{"line_number":1502,"context_line":""},{"line_number":1503,"context_line":"        \"\"\""},{"line_number":1504,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_a1cd295f","line":1501,"range":{"start_line":1501,"start_character":8,"end_line":1501,"end_character":48},"in_reply_to":"da6ed579_010435c4","updated":"2016-01-16 02:54:35.000000000","message":"Done","commit_id":"0d6d21b4a65dade6e1e7b0dc80817308061eb11f"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ace1d189aecc42ea270118898f69b118c4c86f0c","unresolved":false,"context_lines":[{"line_number":1505,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"    @abc.abstractmethod"},{"line_number":1508,"context_line":"    def delete_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1509,"context_line":"        \"\"\"Deletes a role inference rule\"\"\""},{"line_number":1510,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1511,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_f8d734bd","line":1508,"range":{"start_line":1508,"start_character":34,"end_line":1508,"end_character":47},"updated":"2016-01-18 04:35:12.000000000","message":"prior_role_id","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7eedbb717838ccd4ab93210f226abed49091fc2e","unresolved":false,"context_lines":[{"line_number":1505,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"    @abc.abstractmethod"},{"line_number":1508,"context_line":"    def delete_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1509,"context_line":"        \"\"\"Deletes a role inference rule\"\"\""},{"line_number":1510,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1511,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_7076e13f","line":1508,"range":{"start_line":1508,"start_character":34,"end_line":1508,"end_character":47},"in_reply_to":"da6ed579_f8d734bd","updated":"2016-01-18 15:47:30.000000000","message":"Done","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ace1d189aecc42ea270118898f69b118c4c86f0c","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"    @abc.abstractmethod"},{"line_number":1518,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1519,"context_line":"        \"\"\"Lists roles implied from the prior id\"\"\""},{"line_number":1520,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1521,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_78cb441f","line":1518,"range":{"start_line":1518,"start_character":33,"end_line":1518,"end_character":41},"updated":"2016-01-18 04:35:12.000000000","message":"use prior_role_id for consistency","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7eedbb717838ccd4ab93210f226abed49091fc2e","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"    @abc.abstractmethod"},{"line_number":1518,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1519,"context_line":"        \"\"\"Lists roles implied from the prior id\"\"\""},{"line_number":1520,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1521,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_308f0925","line":1518,"range":{"start_line":1518,"start_character":33,"end_line":1518,"end_character":41},"in_reply_to":"da6ed579_78cb441f","updated":"2016-01-18 15:47:30.000000000","message":"Done","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ace1d189aecc42ea270118898f69b118c4c86f0c","unresolved":false,"context_lines":[{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"    @abc.abstractmethod"},{"line_number":1518,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1519,"context_line":"        \"\"\"Lists roles implied from the prior id\"\"\""},{"line_number":1520,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_d8da70e9","line":1519,"range":{"start_line":1519,"start_character":40,"end_line":1519,"end_character":45},"updated":"2016-01-18 04:35:12.000000000","message":"ditto","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7eedbb717838ccd4ab93210f226abed49091fc2e","unresolved":false,"context_lines":[{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"    @abc.abstractmethod"},{"line_number":1518,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1519,"context_line":"        \"\"\"Lists roles implied from the prior id\"\"\""},{"line_number":1520,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_5092bd4c","line":1519,"range":{"start_line":1519,"start_character":40,"end_line":1519,"end_character":45},"in_reply_to":"da6ed579_d8da70e9","updated":"2016-01-18 15:47:30.000000000","message":"Done","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ace1d189aecc42ea270118898f69b118c4c86f0c","unresolved":false,"context_lines":[{"line_number":1574,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1575,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"    def delete_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1578,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    def list_implied_roles(self, prior_id):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_189ec807","line":1577,"range":{"start_line":1577,"start_character":34,"end_line":1577,"end_character":47},"updated":"2016-01-18 04:35:12.000000000","message":"prior_role_id","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ace1d189aecc42ea270118898f69b118c4c86f0c","unresolved":false,"context_lines":[{"line_number":1577,"context_line":"    def delete_implied_role(self, proir_role_id, implied_role_id):"},{"line_number":1578,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1579,"context_line":""},{"line_number":1580,"context_line":"    def list_implied_roles(self, prior_id):"},{"line_number":1581,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1582,"context_line":""},{"line_number":1583,"context_line":"    def list_role_inference_rules(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_589440e7","line":1580,"range":{"start_line":1580,"start_character":33,"end_line":1580,"end_character":41},"updated":"2016-01-18 04:35:12.000000000","message":"use prior_role_id for consistency","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"072cb505e56c1f314bbdb55f8c7e6f84da64d1aa","unresolved":false,"context_lines":[{"line_number":594,"context_line":"            return expand_group_assignment(ref, user_id)"},{"line_number":595,"context_line":"        return [ref]"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def _add_implied_roles(self, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        The refs passed in have had all inheritance and group assignments"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_343415dd","line":597,"range":{"start_line":597,"start_character":33,"end_line":597,"end_character":37},"updated":"2016-01-18 22:14:24.000000000","message":"nit: these must be role references?","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ad31f4b00956316d002d23fd72b8031dc53cce9f","unresolved":false,"context_lines":[{"line_number":594,"context_line":"            return expand_group_assignment(ref, user_id)"},{"line_number":595,"context_line":"        return [ref]"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def _add_implied_roles(self, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        The refs passed in have had all inheritance and group assignments"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_14c78a13","line":597,"range":{"start_line":597,"start_character":33,"end_line":597,"end_character":37},"in_reply_to":"ba63e191_343415dd","updated":"2016-01-19 01:40:18.000000000","message":"Done","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"072cb505e56c1f314bbdb55f8c7e6f84da64d1aa","unresolved":false,"context_lines":[{"line_number":595,"context_line":"        return [ref]"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def _add_implied_roles(self, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        The refs passed in have had all inheritance and group assignments"},{"line_number":601,"context_line":"        expanded out. We now need to look at the role_id in each ref and see"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_f4251dae","line":598,"range":{"start_line":598,"start_character":30,"end_line":598,"end_character":35},"updated":"2016-01-18 22:14:24.000000000","message":"nit: missing a period at the end of the doc string.","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ad31f4b00956316d002d23fd72b8031dc53cce9f","unresolved":false,"context_lines":[{"line_number":595,"context_line":"        return [ref]"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def _add_implied_roles(self, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        The refs passed in have had all inheritance and group assignments"},{"line_number":601,"context_line":"        expanded out. We now need to look at the role_id in each ref and see"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_34cc0e35","line":598,"range":{"start_line":598,"start_character":30,"end_line":598,"end_character":35},"in_reply_to":"ba63e191_f4251dae","updated":"2016-01-19 01:40:18.000000000","message":"Done","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"072cb505e56c1f314bbdb55f8c7e6f84da64d1aa","unresolved":false,"context_lines":[{"line_number":597,"context_line":"    def _add_implied_roles(self, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        The refs passed in have had all inheritance and group assignments"},{"line_number":601,"context_line":"        expanded out. We now need to look at the role_id in each ref and see"},{"line_number":602,"context_line":"        if it is a prior role for some implied roles. If it is, then we need to"},{"line_number":603,"context_line":"        duplicate that ref, one for each implied role. We store the prior role"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_74684dbb","line":600,"range":{"start_line":600,"start_character":12,"end_line":600,"end_character":16},"updated":"2016-01-18 22:14:24.000000000","message":"Is refs a list of references?","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ad31f4b00956316d002d23fd72b8031dc53cce9f","unresolved":false,"context_lines":[{"line_number":597,"context_line":"    def _add_implied_roles(self, refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"        The refs passed in have had all inheritance and group assignments"},{"line_number":601,"context_line":"        expanded out. We now need to look at the role_id in each ref and see"},{"line_number":602,"context_line":"        if it is a prior role for some implied roles. If it is, then we need to"},{"line_number":603,"context_line":"        duplicate that ref, one for each implied role. We store the prior role"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_d4d012cc","line":600,"range":{"start_line":600,"start_character":12,"end_line":600,"end_character":16},"in_reply_to":"ba63e191_74684dbb","updated":"2016-01-19 01:40:18.000000000","message":"yes","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a55f24765aa7ec54692df8fb8b090f37fda02213","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def _filter_by_role_id(self, role_id, ref_results):"},{"line_number":645,"context_line":"        # if we need to filer by role_id, only return those that match"},{"line_number":646,"context_line":"        filter_results \u003d []"},{"line_number":647,"context_line":"        for ref in ref_results:"},{"line_number":648,"context_line":"            if ref[\u0027role_id\u0027] \u003d\u003d role_id:"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_a3da1177","line":645,"range":{"start_line":645,"start_character":8,"end_line":645,"end_character":70},"updated":"2016-01-18 20:55:51.000000000","message":"nit: if we arrive here, we know we have to filter by role_id","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"ad31f4b00956316d002d23fd72b8031dc53cce9f","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def _filter_by_role_id(self, role_id, ref_results):"},{"line_number":645,"context_line":"        # if we need to filer by role_id, only return those that match"},{"line_number":646,"context_line":"        filter_results \u003d []"},{"line_number":647,"context_line":"        for ref in ref_results:"},{"line_number":648,"context_line":"            if ref[\u0027role_id\u0027] \u003d\u003d role_id:"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_54e502a6","line":645,"range":{"start_line":645,"start_character":8,"end_line":645,"end_character":70},"in_reply_to":"ba63e191_a3da1177","updated":"2016-01-19 01:40:18.000000000","message":"Done","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":593,"context_line":"        elif \u0027group_id\u0027 in ref:"},{"line_number":594,"context_line":"            return expand_group_assignment(ref, user_id)"},{"line_number":595,"context_line":"        return [ref]"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"    def _add_implied_roles(self, role_refs):"},{"line_number":598,"context_line":"        \"\"\"Expand out implied roles."},{"line_number":599,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_8abb3972","line":596,"updated":"2016-01-19 13:32:23.000000000","message":"Don\u0027t we need a check call for implied roles ?","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":600,"context_line":"        The role_refs passed in have had all inheritance and group assignments"},{"line_number":601,"context_line":"        expanded out. We now need to look at the role_id in each ref and see"},{"line_number":602,"context_line":"        if it is a prior role for some implied roles. If it is, then we need to"},{"line_number":603,"context_line":"        duplicate that ref, one for each implied role. We store the prior role"},{"line_number":604,"context_line":"        in the indirect dict that is part of such a duplicated ref, so that a"},{"line_number":605,"context_line":"        caller can determine where the assignment came from."},{"line_number":606,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_9c25c7ac","line":603,"range":{"start_line":603,"start_character":36,"end_line":603,"end_character":40},"updated":"2016-01-19 13:32:23.000000000","message":"for each leaf implied role right ?","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"046aa790434b4e6f2131f973c532833dec5a5080","unresolved":false,"context_lines":[{"line_number":600,"context_line":"        The role_refs passed in have had all inheritance and group assignments"},{"line_number":601,"context_line":"        expanded out. We now need to look at the role_id in each ref and see"},{"line_number":602,"context_line":"        if it is a prior role for some implied roles. If it is, then we need to"},{"line_number":603,"context_line":"        duplicate that ref, one for each implied role. We store the prior role"},{"line_number":604,"context_line":"        in the indirect dict that is part of such a duplicated ref, so that a"},{"line_number":605,"context_line":"        caller can determine where the assignment came from."},{"line_number":606,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_42e8bd7c","line":603,"range":{"start_line":603,"start_character":36,"end_line":603,"end_character":40},"in_reply_to":"ba63e191_9c25c7ac","updated":"2016-01-19 16:09:03.000000000","message":"not leaf, since if you had 3 levels of implied role, even the middle level would need to be duplicated.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":611,"context_line":"            # role_id to be the prior role"},{"line_number":612,"context_line":"            implied_ref \u003d copy.deepcopy(prior_ref)"},{"line_number":613,"context_line":"            implied_ref[\u0027role_id\u0027] \u003d implied_role_id"},{"line_number":614,"context_line":"            indirect \u003d implied_ref.setdefault(\u0027indirect\u0027, {})"},{"line_number":615,"context_line":"            indirect[\u0027role_id\u0027] \u003d prior_ref[\u0027role_id\u0027]"},{"line_number":616,"context_line":"            return implied_ref"},{"line_number":617,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_bc820b51","line":614,"range":{"start_line":614,"start_character":47,"end_line":614,"end_character":55},"updated":"2016-01-19 13:32:23.000000000","message":"henrynash: indirect helping again :) we made a great decision adding this","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"de2672ffa3d3adfd02292063dfbff6bca59eb1dd","unresolved":false,"context_lines":[{"line_number":633,"context_line":"                for implied_role in implied_roles:"},{"line_number":634,"context_line":"                    implied_ref \u003d ("},{"line_number":635,"context_line":"                        _make_implied_ref_copy("},{"line_number":636,"context_line":"                            next_ref, implied_role[\u0027implied_role_id\u0027]))"},{"line_number":637,"context_line":"                    ref_results.append(implied_ref)"},{"line_number":638,"context_line":"                    role_refs_to_check.append(implied_ref)"},{"line_number":639,"context_line":"        except exception.NotImplemented:"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_c587e25f","line":636,"updated":"2016-01-19 13:41:21.000000000","message":"This sounds weird. Wouldn\u0027t it be better to call implied_ref as inference_rule ?\n\nimplied_role[\u0027implied_role_id\u0027] seemed odd to me because roles don\u0027t have this attribute","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":635,"context_line":"                        _make_implied_ref_copy("},{"line_number":636,"context_line":"                            next_ref, implied_role[\u0027implied_role_id\u0027]))"},{"line_number":637,"context_line":"                    ref_results.append(implied_ref)"},{"line_number":638,"context_line":"                    role_refs_to_check.append(implied_ref)"},{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_9c87070f","line":638,"updated":"2016-01-19 13:32:23.000000000","message":"I like this algorithm using cache, this way we avoid to check for implied roles of a given role multiple times","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"dd4355e10310d8aceb9063c5964e3a4d2cb0a550","unresolved":false,"context_lines":[{"line_number":635,"context_line":"                        _make_implied_ref_copy("},{"line_number":636,"context_line":"                            next_ref, implied_role[\u0027implied_role_id\u0027]))"},{"line_number":637,"context_line":"                    ref_results.append(implied_ref)"},{"line_number":638,"context_line":"                    role_refs_to_check.append(implied_ref)"},{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_1f90d742","line":638,"range":{"start_line":638,"start_character":20,"end_line":638,"end_character":58},"updated":"2016-01-19 17:42:30.000000000","message":"Shouldn\u0027t we only be appending the missing ones to improve efficiency?","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"30ddec5f1028e3610a7de73e88f0782547ac6710","unresolved":false,"context_lines":[{"line_number":635,"context_line":"                        _make_implied_ref_copy("},{"line_number":636,"context_line":"                            next_ref, implied_role[\u0027implied_role_id\u0027]))"},{"line_number":637,"context_line":"                    ref_results.append(implied_ref)"},{"line_number":638,"context_line":"                    role_refs_to_check.append(implied_ref)"},{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_6a4a73c7","line":638,"range":{"start_line":638,"start_character":20,"end_line":638,"end_character":58},"in_reply_to":"ba63e191_1f90d742","updated":"2016-01-19 17:54:37.000000000","message":"++ yeah making this a set would help","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"dd4355e10310d8aceb9063c5964e3a4d2cb0a550","unresolved":false,"context_lines":[{"line_number":637,"context_line":"                    ref_results.append(implied_ref)"},{"line_number":638,"context_line":"                    role_refs_to_check.append(implied_ref)"},{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_5f4c0f70","line":640,"range":{"start_line":640,"start_character":16,"end_line":640,"end_character":21},"updated":"2016-01-19 17:42:30.000000000","message":"debug? I would think this is much more serious than that? Also, shouldn\u0027t we be returning role_refs here?","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"f4bb55aeab6f377a8a99c170094107d85112a0b4","unresolved":false,"context_lines":[{"line_number":637,"context_line":"                    ref_results.append(implied_ref)"},{"line_number":638,"context_line":"                    role_refs_to_check.append(implied_ref)"},{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"9a68dd71_d8f602d7","line":640,"range":{"start_line":640,"start_character":16,"end_line":640,"end_character":21},"in_reply_to":"ba63e191_5f4c0f70","updated":"2016-01-20 18:45:30.000000000","message":"Done","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"dd4355e10310d8aceb9063c5964e3a4d2cb0a550","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def _filter_by_role_id(self, role_id, ref_results):"},{"line_number":645,"context_line":"        # if we arrive here, we  need to filer by role_id."}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_9f8a87be","line":642,"range":{"start_line":642,"start_character":15,"end_line":642,"end_character":26},"updated":"2016-01-19 17:42:30.000000000","message":"ref_results could contain duplicates right? Say we have two prior roles A and B and they both imply the same role: A -\u003e C and B -\u003e C.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"30ddec5f1028e3610a7de73e88f0782547ac6710","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def _filter_by_role_id(self, role_id, ref_results):"},{"line_number":645,"context_line":"        # if we arrive here, we  need to filer by role_id."}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_cafeff37","line":642,"range":{"start_line":642,"start_character":15,"end_line":642,"end_character":26},"in_reply_to":"ba63e191_9f8a87be","updated":"2016-01-19 17:54:37.000000000","message":"Yes, it may return duplicates. The caller must be careful about it. For example, see get_roles_for_user_and_project which remove any duplicates.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"018945dbc26ea4be8bf526d4ee68d103b0f73310","unresolved":false,"context_lines":[{"line_number":639,"context_line":"        except exception.NotImplemented:"},{"line_number":640,"context_line":"            LOG.debug(\u0027Role driver does not support implied roles.\u0027)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def _filter_by_role_id(self, role_id, ref_results):"},{"line_number":645,"context_line":"        # if we arrive here, we  need to filer by role_id."}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_452a0080","line":642,"range":{"start_line":642,"start_character":15,"end_line":642,"end_character":26},"in_reply_to":"ba63e191_cafeff37","updated":"2016-01-19 17:58:38.000000000","message":"..and we have an explicit test for this, see:test_role_assignments_directed_graph_of_implied_roles() in test_backend.py","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def _filter_by_role_id(self, role_id, ref_results):"},{"line_number":645,"context_line":"        # if we arrive here, we  need to filer by role_id."},{"line_number":646,"context_line":"        filter_results \u003d []"},{"line_number":647,"context_line":"        for ref in ref_results:"},{"line_number":648,"context_line":"            if ref[\u0027role_id\u0027] \u003d\u003d role_id:"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_3ca4dba4","line":645,"range":{"start_line":645,"start_character":31,"end_line":645,"end_character":33},"updated":"2016-01-19 13:32:23.000000000","message":"(nit) double space","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":642,"context_line":"        return ref_results"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"    def _filter_by_role_id(self, role_id, ref_results):"},{"line_number":645,"context_line":"        # if we arrive here, we  need to filer by role_id."},{"line_number":646,"context_line":"        filter_results \u003d []"},{"line_number":647,"context_line":"        for ref in ref_results:"},{"line_number":648,"context_line":"            if ref[\u0027role_id\u0027] \u003d\u003d role_id:"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_2c3c7fc7","line":645,"range":{"start_line":645,"start_character":31,"end_line":645,"end_character":33},"in_reply_to":"ba63e191_3ca4dba4","updated":"2016-01-20 03:50:46.000000000","message":"Done","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        # List user assignments."},{"line_number":776,"context_line":"        # Due to the need to expand implied roles, this call will skip"},{"line_number":777,"context_line":"        # filtering by role_id and instead return the whole set of roles."},{"line_number":778,"context_line":"        # Matching on the specified role is performed at the end."},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":781,"context_line":"            role_id\u003dNone, user_id\u003duser_id, project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_fc2f239f","line":778,"updated":"2016-01-19 13:32:23.000000000","message":"Not if CONF.token.infer_roles is set to False. What about:\n\n    role_id_filtered \u003d role_id if not CONF.token.infer_roles else None\n\nAnd then the last filtering at line 803 would check:\n\n    if not role_id_filtered:\n        ...\n\nOtherwise we need to remove the logic of role filtering from other methods above ....","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"046aa790434b4e6f2131f973c532833dec5a5080","unresolved":false,"context_lines":[{"line_number":775,"context_line":"        # List user assignments."},{"line_number":776,"context_line":"        # Due to the need to expand implied roles, this call will skip"},{"line_number":777,"context_line":"        # filtering by role_id and instead return the whole set of roles."},{"line_number":778,"context_line":"        # Matching on the specified role is performed at the end."},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        direct_refs \u003d list_role_assignments_for_actor("},{"line_number":781,"context_line":"            role_id\u003dNone, user_id\u003duser_id, project_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_a21739a2","line":778,"in_reply_to":"ba63e191_fc2f239f","updated":"2016-01-19 16:09:03.000000000","message":"So the original code I wrote did indeed say that (see: https://review.openstack.org/#/c/264260/8/keystone/assignment/core.py)...in fact it went further....however, after discussion we agreed that given filtering by role_id was probably a low-frequency occurrence, then moving all the role filtering to the end probably made sense and would lead to more reliable code (i.e. less number of different paths).\n\nHowever, I agree 0 if we stick to this, we should remove the filtering by role from list_role_assignments_for_actor() since it is not needed - probably a suitable thing to come back in and refactor once this has merged if required.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"90ea793934bdcfbde7ad4a85eb8a0f1b597ecc91","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        \"\"\""},{"line_number":1505,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"    @abc.abstractmethod"},{"line_number":1508,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1509,"context_line":"        \"\"\"Deletes a role inference rule\"\"\""},{"line_number":1510,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1511,"context_line":""},{"line_number":1512,"context_line":"    @abc.abstractmethod"},{"line_number":1513,"context_line":"    def list_role_inference_rules(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_15aa21d5","line":1510,"range":{"start_line":1507,"start_character":4,"end_line":1510,"end_character":60},"updated":"2016-01-19 04:55:53.000000000","message":"does this not raise a RoleNotFound exception when it doesn\u0027t exist? \n\n  :raises: keystone.exception.RoleNotFound: If the role doesn\u0027t exist.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        \"\"\""},{"line_number":1505,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"    @abc.abstractmethod"},{"line_number":1508,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1509,"context_line":"        \"\"\"Deletes a role inference rule\"\"\""},{"line_number":1510,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1511,"context_line":""},{"line_number":1512,"context_line":"    @abc.abstractmethod"},{"line_number":1513,"context_line":"    def list_role_inference_rules(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_3f3b6dd3","line":1510,"range":{"start_line":1507,"start_character":4,"end_line":1510,"end_character":60},"in_reply_to":"ba63e191_15aa21d5","updated":"2016-01-19 13:32:23.000000000","message":"I agree with Steve here","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"48a1a4f6472a906ab4650ce188fece5bf65da0a3","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        \"\"\""},{"line_number":1505,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"    @abc.abstractmethod"},{"line_number":1508,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1509,"context_line":"        \"\"\"Deletes a role inference rule\"\"\""},{"line_number":1510,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1511,"context_line":""},{"line_number":1512,"context_line":"    @abc.abstractmethod"},{"line_number":1513,"context_line":"    def list_role_inference_rules(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_f5d0adcb","line":1510,"range":{"start_line":1507,"start_character":4,"end_line":1510,"end_character":60},"in_reply_to":"ba63e191_15aa21d5","updated":"2016-01-19 05:15:38.000000000","message":"I was thinking backend should hold the check logic, but currently there is no such check logic.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        \"\"\""},{"line_number":1505,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"    @abc.abstractmethod"},{"line_number":1508,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1509,"context_line":"        \"\"\"Deletes a role inference rule\"\"\""},{"line_number":1510,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1511,"context_line":""},{"line_number":1512,"context_line":"    @abc.abstractmethod"},{"line_number":1513,"context_line":"    def list_role_inference_rules(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_9dacba36","line":1510,"range":{"start_line":1507,"start_character":4,"end_line":1510,"end_character":60},"in_reply_to":"ba63e191_24903243","updated":"2016-01-20 03:50:46.000000000","message":"It could raise ImpliedRoleNotFound if the combination does not exist. \n\nFixed the backend and added test","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"dd4355e10310d8aceb9063c5964e3a4d2cb0a550","unresolved":false,"context_lines":[{"line_number":1504,"context_line":"        \"\"\""},{"line_number":1505,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"    @abc.abstractmethod"},{"line_number":1508,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1509,"context_line":"        \"\"\"Deletes a role inference rule\"\"\""},{"line_number":1510,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1511,"context_line":""},{"line_number":1512,"context_line":"    @abc.abstractmethod"},{"line_number":1513,"context_line":"    def list_role_inference_rules(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_24903243","line":1510,"range":{"start_line":1507,"start_character":4,"end_line":1510,"end_character":60},"in_reply_to":"ba63e191_3f3b6dd3","updated":"2016-01-19 17:42:30.000000000","message":"Should be NotImplemented. Returning a 404 on something that is not implemented is rather misleading. Should be a 501.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"    @abc.abstractmethod"},{"line_number":1518,"context_line":"    def list_implied_roles(self, prior_role_id):"},{"line_number":1519,"context_line":"        \"\"\"Lists roles implied from the prior role id\"\"\""},{"line_number":1520,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_df79f194","line":1519,"range":{"start_line":1519,"start_character":51,"end_line":1519,"end_character":53},"updated":"2016-01-19 13:32:23.000000000","message":"(nit) ID","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"    @abc.abstractmethod"},{"line_number":1518,"context_line":"    def list_implied_roles(self, prior_role_id):"},{"line_number":1519,"context_line":"        \"\"\"Lists roles implied from the prior role id\"\"\""},{"line_number":1520,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1521,"context_line":""},{"line_number":1522,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_1d644a47","line":1519,"range":{"start_line":1519,"start_character":51,"end_line":1519,"end_character":53},"in_reply_to":"ba63e191_df79f194","updated":"2016-01-20 03:50:46.000000000","message":"Done","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":1569,"context_line":"        self.driver.delete_role(role_id)"},{"line_number":1570,"context_line":""},{"line_number":1571,"context_line":"    def get_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1572,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1573,"context_line":""},{"line_number":1574,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":1575,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_bf375daf","line":1572,"updated":"2016-01-19 13:32:23.000000000","message":"It would be nice to add a more meaningful message, such as:\n\n    Instances of the v8 assignment drivers do not support implied roles mechanism. Please provide a driver which implements the v9 version of the assignment driver signature.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"}],"keystone/assignment/role_backends/ldap.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"110b5e2dcc437470515f6decef573a02859e0648","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self.get_role(role_id)"},{"line_number":97,"context_line":"        return self.role.update(role_id, role)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":100,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_72888c71","line":99,"range":{"start_line":99,"start_character":64,"end_line":99,"end_character":66},"updated":"2016-01-06 20:20:55.000000000","message":"thought we are deprecating writable LDAP work, no?","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a8cb911eb217c75e26890beffbd6f4827f1b0767","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self.get_role(role_id)"},{"line_number":97,"context_line":"        return self.role.update(role_id, role)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":100,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_3bc085e0","line":99,"range":{"start_line":99,"start_character":64,"end_line":99,"end_character":66},"in_reply_to":"fa69d971_72888c71","updated":"2016-01-07 16:34:23.000000000","message":"We are.  These are skipping the tests for LDAP, otherwise they get run and LDAP will fail.","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a8080a86b0f3f61226a28e6faea5ab1a96dff246","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def list_role_inference_rules(self):"},{"line_number":109,"context_line":"        return []"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def get_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":112,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_bb66ec4e","line":109,"range":{"start_line":109,"start_character":8,"end_line":109,"end_character":17},"updated":"2016-01-15 11:05:45.000000000","message":"might need to add a comment to say why it returns `[]` instead of raise NotImplemented() here.","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"528f9a451fadfbec49375a1d1b8e199401dd8641","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def list_role_inference_rules(self):"},{"line_number":109,"context_line":"        return []"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def get_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":112,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_29304de8","line":109,"range":{"start_line":109,"start_character":8,"end_line":109,"end_character":17},"in_reply_to":"da6ed579_bb66ec4e","updated":"2016-01-15 19:32:31.000000000","message":"Done.  Making it raise to be consistent with the others.","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        return self.role.update(role_id, role)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":100,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":103,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_9f5db9eb","line":100,"updated":"2016-01-19 13:32:23.000000000","message":"Same here, what about a more meaningful message ?\n\n    LDAP does not support implied roles.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        return self.role.update(role_id, role)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def create_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":100,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":103,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_a2fe3d36","line":100,"in_reply_to":"ba63e191_9f5db9eb","updated":"2016-01-20 03:50:46.000000000","message":"I\u0027ll skip this comment, this file is going to be dropped anyway in this release.\n\nhttps://review.openstack.org/#/c/269385/","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"}],"keystone/assignment/role_backends/sql.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"110b5e2dcc437470515f6decef573a02859e0648","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                ImpliedRoleTable.implied_role_id \u003d\u003d implied_role_id))."},{"line_number":98,"context_line":"             delete(synchronize_session\u003d\u0027fetch\u0027))"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027implied_role\u0027)"},{"line_number":101,"context_line":"    def list_implied_roles(self, prior_role_id):"},{"line_number":102,"context_line":"        with sql.transaction() as session:"},{"line_number":103,"context_line":"            query \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_52d30860","line":100,"range":{"start_line":100,"start_character":9,"end_line":100,"end_character":25},"updated":"2016-01-06 20:20:55.000000000","message":"why would there be conflicts in listing?","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a8cb911eb217c75e26890beffbd6f4827f1b0767","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                ImpliedRoleTable.implied_role_id \u003d\u003d implied_role_id))."},{"line_number":98,"context_line":"             delete(synchronize_session\u003d\u0027fetch\u0027))"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027implied_role\u0027)"},{"line_number":101,"context_line":"    def list_implied_roles(self, prior_role_id):"},{"line_number":102,"context_line":"        with sql.transaction() as session:"},{"line_number":103,"context_line":"            query \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_bbac7536","line":100,"range":{"start_line":100,"start_character":9,"end_line":100,"end_character":25},"in_reply_to":"fa69d971_52d30860","updated":"2016-01-07 16:34:23.000000000","message":"Good point.  THere should not be.  Will remove","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"110b5e2dcc437470515f6decef573a02859e0648","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            refs \u003d query.all()"},{"line_number":107,"context_line":"            return [ref.to_dict() for ref in refs]"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027implied_role\u0027)"},{"line_number":110,"context_line":"    def list_prior_roles(self, implied_role_id):"},{"line_number":111,"context_line":"        with sql.transaction() as session:"},{"line_number":112,"context_line":"            query \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_32cc54ba","line":109,"range":{"start_line":109,"start_character":9,"end_line":109,"end_character":25},"updated":"2016-01-06 20:20:55.000000000","message":"same as above","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"110b5e2dcc437470515f6decef573a02859e0648","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            refs \u003d query.all()"},{"line_number":116,"context_line":"            return [ref.to_dict() for ref in refs]"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027implied_role\u0027)"},{"line_number":119,"context_line":"    def get_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":120,"context_line":"        with sql.transaction() as session:"},{"line_number":121,"context_line":"            query \u003d session.query("}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_b2b84412","line":118,"range":{"start_line":118,"start_character":9,"end_line":118,"end_character":25},"updated":"2016-01-06 20:20:55.000000000","message":"same as above","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a8080a86b0f3f61226a28e6faea5ab1a96dff246","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                # We don\u0027t know which role threw this."},{"line_number":87,"context_line":"                # Query each to trigger the exception."},{"line_number":88,"context_line":"                self._get_role(prior_role_id)"},{"line_number":89,"context_line":"                self._get_role(implied_role_id)"},{"line_number":90,"context_line":"            return ref.to_dict()"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_e7704342","line":89,"range":{"start_line":89,"start_character":21,"end_line":89,"end_character":30},"updated":"2016-01-15 11:05:45.000000000","message":"nice handling!","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a8080a86b0f3f61226a28e6faea5ab1a96dff246","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                               primary_key\u003dTrue)"},{"line_number":144,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":145,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":146,"context_line":"    __table_args__ \u003d ("},{"line_number":147,"context_line":"        sql.UniqueConstraint(\u0027prior_role_id\u0027, \u0027implied_role_id\u0027), {})"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_47c90fab","line":147,"range":{"start_line":146,"start_character":3,"end_line":147,"end_character":69},"updated":"2016-01-15 11:05:45.000000000","message":"pls remove this, this is not needed since you have defined both of them are part of the PK.\n\naccording to the ISO standard, the PK itself should be uniqueness.","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"528f9a451fadfbec49375a1d1b8e199401dd8641","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                               primary_key\u003dTrue)"},{"line_number":144,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":145,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":146,"context_line":"    __table_args__ \u003d ("},{"line_number":147,"context_line":"        sql.UniqueConstraint(\u0027prior_role_id\u0027, \u0027implied_role_id\u0027), {})"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":19,"id":"da6ed579_8997f939","line":147,"range":{"start_line":146,"start_character":3,"end_line":147,"end_character":69},"in_reply_to":"da6ed579_47c90fab","updated":"2016-01-15 19:32:31.000000000","message":"Done","commit_id":"a4d07ccd293f38a40e1224eee120e7e68357283b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"36342becdb1af97900420075e261b7a16b03223b","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                               primary_key\u003dTrue)"},{"line_number":144,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":145,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":146,"context_line":"    __table_args__ \u003d ()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_81402537","line":146,"range":{"start_line":146,"start_character":4,"end_line":146,"end_character":23},"updated":"2016-01-16 02:49:07.000000000","message":"I feel this can be removed as well.","commit_id":"0d6d21b4a65dade6e1e7b0dc80817308061eb11f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"0635aa880ba1ba9b0c5a0e5f2bf5505f26a3b596","unresolved":false,"context_lines":[{"line_number":143,"context_line":"                               primary_key\u003dTrue)"},{"line_number":144,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":145,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":146,"context_line":"    __table_args__ \u003d ()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":21,"id":"da6ed579_e101e16b","line":146,"range":{"start_line":146,"start_character":4,"end_line":146,"end_character":23},"in_reply_to":"da6ed579_81402537","updated":"2016-01-16 02:54:35.000000000","message":"Done","commit_id":"0d6d21b4a65dade6e1e7b0dc80817308061eb11f"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ace1d189aecc42ea270118898f69b118c4c86f0c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        with sql.transaction() as session:"},{"line_number":79,"context_line":"            inference \u003d {\u0027prior_role_id\u0027: prior_role_id,"},{"line_number":80,"context_line":"                         \u0027implied_role_id\u0027: implied_role_id"},{"line_number":81,"context_line":"                         }"},{"line_number":82,"context_line":"            ref \u003d ImpliedRoleTable.from_dict(inference)"},{"line_number":83,"context_line":"            try:"},{"line_number":84,"context_line":"                session.add(ref)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_c4884fc9","line":81,"updated":"2016-01-18 04:35:12.000000000","message":"nit: } not aligned with opening bracket, remove extra space","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7eedbb717838ccd4ab93210f226abed49091fc2e","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        with sql.transaction() as session:"},{"line_number":79,"context_line":"            inference \u003d {\u0027prior_role_id\u0027: prior_role_id,"},{"line_number":80,"context_line":"                         \u0027implied_role_id\u0027: implied_role_id"},{"line_number":81,"context_line":"                         }"},{"line_number":82,"context_line":"            ref \u003d ImpliedRoleTable.from_dict(inference)"},{"line_number":83,"context_line":"            try:"},{"line_number":84,"context_line":"                session.add(ref)"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_13476f78","line":81,"in_reply_to":"da6ed579_c4884fc9","updated":"2016-01-18 15:47:30.000000000","message":"Done","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ace1d189aecc42ea270118898f69b118c4c86f0c","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":93,"context_line":"        with sql.transaction() as session:"},{"line_number":94,"context_line":"            (session.query(ImpliedRoleTable).filter(and_("},{"line_number":95,"context_line":"                ImpliedRoleTable.prior_role_id \u003d\u003d prior_role_id,"},{"line_number":96,"context_line":"                ImpliedRoleTable.implied_role_id \u003d\u003d implied_role_id))."},{"line_number":97,"context_line":"             delete(synchronize_session\u003d\u0027fetch\u0027))"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_a4543b21","line":94,"updated":"2016-01-18 04:35:12.000000000","message":"nit: why not assign a query variable to split the code into multiple lines? Seems more readable that way.","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7eedbb717838ccd4ab93210f226abed49091fc2e","unresolved":false,"context_lines":[{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    def delete_implied_role(self, prior_role_id, implied_role_id):"},{"line_number":93,"context_line":"        with sql.transaction() as session:"},{"line_number":94,"context_line":"            (session.query(ImpliedRoleTable).filter(and_("},{"line_number":95,"context_line":"                ImpliedRoleTable.prior_role_id \u003d\u003d prior_role_id,"},{"line_number":96,"context_line":"                ImpliedRoleTable.implied_role_id \u003d\u003d implied_role_id))."},{"line_number":97,"context_line":"             delete(synchronize_session\u003d\u0027fetch\u0027))"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_ce412a3b","line":94,"in_reply_to":"da6ed579_a4543b21","updated":"2016-01-18 15:47:30.000000000","message":"Done","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"51cbec976597b3c91350445f17898eca0c7231d5","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":131,"context_line":"        return cls(**new_dictionary)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def to_dict(self):"},{"line_number":134,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes.\"\"\""},{"line_number":135,"context_line":"        d \u003d dict()"},{"line_number":136,"context_line":"        for attr in self.__class__.attributes:"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_c83055a1","line":133,"updated":"2016-01-18 09:18:15.000000000","message":"how is that different from default to_dict() method? include_extra_dict is False by default. If there is a reason for reimplementing this class please add some comment explaining it.","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7eedbb717838ccd4ab93210f226abed49091fc2e","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":131,"context_line":"        return cls(**new_dictionary)"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def to_dict(self):"},{"line_number":134,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes.\"\"\""},{"line_number":135,"context_line":"        d \u003d dict()"},{"line_number":136,"context_line":"        for attr in self.__class__.attributes:"}],"source_content_type":"text/x-python","patch_set":22,"id":"da6ed579_a944f0b6","line":133,"in_reply_to":"da6ed579_c83055a1","updated":"2016-01-18 15:47:30.000000000","message":"Done","commit_id":"837803d2ae066fceb21ef675d3c17b2acaecbf5b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"072cb505e56c1f314bbdb55f8c7e6f84da64d1aa","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":141,"context_line":"        return d"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    __tablename__ \u003d \u0027implied_role\u0027"},{"line_number":144,"context_line":"    attributes \u003d [\u0027prior_role_id\u0027, \u0027implied_role_id\u0027]"},{"line_number":145,"context_line":"    prior_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":146,"context_line":"                               primary_key\u003dTrue)"},{"line_number":147,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":148,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_5400a9aa","line":148,"range":{"start_line":143,"start_character":4,"end_line":148,"end_character":50},"updated":"2016-01-18 22:14:24.000000000","message":"nit: this section could be moved up under the class definition for better readability.","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"a45b0c51c515ea682d0d6db6cb9f546fcb416bc5","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":141,"context_line":"        return d"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    __tablename__ \u003d \u0027implied_role\u0027"},{"line_number":144,"context_line":"    attributes \u003d [\u0027prior_role_id\u0027, \u0027implied_role_id\u0027]"},{"line_number":145,"context_line":"    prior_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":146,"context_line":"                               primary_key\u003dTrue)"},{"line_number":147,"context_line":"    implied_role_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027role.id\u0027),"},{"line_number":148,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba63e191_77c4c53f","line":148,"range":{"start_line":143,"start_character":3,"end_line":148,"end_character":50},"updated":"2016-01-19 03:45:21.000000000","message":"same comment as in the previous patch set","commit_id":"900de70d061f28d3d8f386e4882fbff77293e6d0"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                session.add(ref)"},{"line_number":84,"context_line":"            except db_exception.DBReferenceError:"},{"line_number":85,"context_line":"                # We don\u0027t know which role threw this."},{"line_number":86,"context_line":"                # Query each to trigger the exception."},{"line_number":87,"context_line":"                self._get_role(prior_role_id)"},{"line_number":88,"context_line":"                self._get_role(implied_role_id)"},{"line_number":89,"context_line":"            return ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_ffadd588","line":86,"updated":"2016-01-19 13:32:23.000000000","message":"Do we really need to ? Also, isn\u0027t the bad role specified in the foreignkey constraint violation ?","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                session.add(ref)"},{"line_number":84,"context_line":"            except db_exception.DBReferenceError:"},{"line_number":85,"context_line":"                # We don\u0027t know which role threw this."},{"line_number":86,"context_line":"                # Query each to trigger the exception."},{"line_number":87,"context_line":"                self._get_role(prior_role_id)"},{"line_number":88,"context_line":"                self._get_role(implied_role_id)"},{"line_number":89,"context_line":"            return ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_6c0a7723","line":86,"in_reply_to":"ba63e191_ffadd588","updated":"2016-01-20 03:50:46.000000000","message":"not quite, it is not clear which FK failed.\n\nI noticed a bug, the session is not passed, it should be _get_role(session, prior_role_id)","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            if len(ref) \u003c 1:"},{"line_number":120,"context_line":"                raise exception.ImpliedRoleNotFound("},{"line_number":121,"context_line":"                    prior_role_id\u003dprior_role_id,"},{"line_number":122,"context_line":"                    implied_role_id\u003dimplied_role_id)"},{"line_number":123,"context_line":"            return ref[0].to_dict()"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_7f0c8594","line":122,"updated":"2016-01-19 13:32:23.000000000","message":"We may also use query.one() and treat the case of an exception, reraising ImpliedRoleNotFound","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            if len(ref) \u003c 1:"},{"line_number":120,"context_line":"                raise exception.ImpliedRoleNotFound("},{"line_number":121,"context_line":"                    prior_role_id\u003dprior_role_id,"},{"line_number":122,"context_line":"                    implied_role_id\u003dimplied_role_id)"},{"line_number":123,"context_line":"            return ref[0].to_dict()"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_ee797efd","line":122,"in_reply_to":"ba63e191_7f0c8594","updated":"2016-01-20 03:50:46.000000000","message":"good suggestion, cleaner code. Done","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"90ea793934bdcfbde7ad4a85eb8a0f1b597ecc91","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @classmethod"},{"line_number":135,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":136,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":137,"context_line":"        return cls(**new_dictionary)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def to_dict(self):"},{"line_number":140,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        overrides the `to_dict` function from the base class"},{"line_number":143,"context_line":"        to avoid having an `extra` field."},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        d \u003d dict()"},{"line_number":146,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":147,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":148,"context_line":"        return d"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_95e4d13b","line":148,"range":{"start_line":135,"start_character":0,"end_line":148,"end_character":16},"updated":"2016-01-19 04:55:53.000000000","message":"is this needed? i thought it\u0027s mixed in with sql.DictBase now?","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @classmethod"},{"line_number":135,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":136,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":137,"context_line":"        return cls(**new_dictionary)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def to_dict(self):"},{"line_number":140,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        overrides the `to_dict` function from the base class"},{"line_number":143,"context_line":"        to avoid having an `extra` field."},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        d \u003d dict()"},{"line_number":146,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":147,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":148,"context_line":"        return d"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_4e544a20","line":148,"range":{"start_line":135,"start_character":0,"end_line":148,"end_character":16},"in_reply_to":"ba63e191_5ff741d3","updated":"2016-01-20 03:50:46.000000000","message":"I think this line would fail if we don\u0027t override this method:\n\nhttps://github.com/openstack/keystone/blob/master/keystone/common/sql/core.py#L141","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                                 primary_key\u003dTrue)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    @classmethod"},{"line_number":135,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":136,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":137,"context_line":"        return cls(**new_dictionary)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def to_dict(self):"},{"line_number":140,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        overrides the `to_dict` function from the base class"},{"line_number":143,"context_line":"        to avoid having an `extra` field."},{"line_number":144,"context_line":"        \"\"\""},{"line_number":145,"context_line":"        d \u003d dict()"},{"line_number":146,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":147,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":148,"context_line":"        return d"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"class RoleTable(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_5ff741d3","line":148,"range":{"start_line":135,"start_character":0,"end_line":148,"end_character":16},"in_reply_to":"ba63e191_95e4d13b","updated":"2016-01-19 13:32:23.000000000","message":"++","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"}],"keystone/common/config.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"110b5e2dcc437470515f6decef573a02859e0648","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                        \u0027middleware must be configured with the \u0027"},{"line_number":302,"context_line":"                        \u0027hash_algorithms, otherwise token revocation will \u0027"},{"line_number":303,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":304,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":305,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":306,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":307,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_1257d0ca","line":304,"range":{"start_line":304,"start_character":21,"end_line":304,"end_character":32},"updated":"2016-01-06 20:20:55.000000000","message":"why is this configurable?","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a8cb911eb217c75e26890beffbd6f4827f1b0767","unresolved":false,"context_lines":[{"line_number":301,"context_line":"                        \u0027middleware must be configured with the \u0027"},{"line_number":302,"context_line":"                        \u0027hash_algorithms, otherwise token revocation will \u0027"},{"line_number":303,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":304,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":305,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":306,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":307,"context_line":"    ],"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_5b2e99a6","line":304,"range":{"start_line":304,"start_character":21,"end_line":304,"end_character":32},"in_reply_to":"fa69d971_1257d0ca","updated":"2016-01-07 16:34:23.000000000","message":"This is how the feature would be enabled/disabled as a kill switch.  Also, in the future, we may decide to expand the role inference rules in the policy file instead or as well.","commit_id":"6e4366c08097569e263a2cb65467281d17293275"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"90ea793934bdcfbde7ad4a85eb8a0f1b597ecc91","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":304,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":305,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":306,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":307,"context_line":"    ],"},{"line_number":308,"context_line":"    \u0027revoke\u0027: ["},{"line_number":309,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_55873961","line":306,"range":{"start_line":306,"start_character":20,"end_line":306,"end_character":70},"updated":"2016-01-19 04:55:53.000000000","message":"bump this over by 4 spaces","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"dd4355e10310d8aceb9063c5964e3a4d2cb0a550","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":304,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":305,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":306,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":307,"context_line":"    ],"},{"line_number":308,"context_line":"    \u0027revoke\u0027: ["},{"line_number":309,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_bf5aeb4e","line":306,"range":{"start_line":306,"start_character":20,"end_line":306,"end_character":70},"in_reply_to":"ba63e191_55873961","updated":"2016-01-19 17:42:30.000000000","message":"Bonus: make it fail pep8! :-)","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":304,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":305,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":306,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":307,"context_line":"    ],"},{"line_number":308,"context_line":"    \u0027revoke\u0027: ["},{"line_number":309,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_429421e1","line":306,"range":{"start_line":306,"start_character":20,"end_line":306,"end_character":70},"in_reply_to":"ba63e191_55873961","updated":"2016-01-20 03:50:46.000000000","message":"Done","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":303,"context_line":"                        \u0027not be processed correctly.\u0027),"},{"line_number":304,"context_line":"        cfg.BoolOpt(\u0027infer_roles\u0027, default\u003dTrue,"},{"line_number":305,"context_line":"                    help\u003d\u0027Add roles to token that are not explicitly added, \u0027"},{"line_number":306,"context_line":"                    \u0027but that are linked implicitly to other roles.\u0027),"},{"line_number":307,"context_line":"    ],"},{"line_number":308,"context_line":"    \u0027revoke\u0027: ["},{"line_number":309,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_ce011a6c","line":306,"range":{"start_line":306,"start_character":20,"end_line":306,"end_character":70},"in_reply_to":"ba63e191_bf5aeb4e","updated":"2016-01-20 03:50:46.000000000","message":"I am afraid to do that, there might be to many indention to fix :)","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"}],"keystone/tests/unit/test_backend.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"27757a0426d9cad4561504ddb8227321b57e4d97","unresolved":false,"context_lines":[{"line_number":6422,"context_line":"                # show the one top level role assignment"},{"line_number":6423,"context_line":"                {\u0027params\u0027: {\u0027user\u0027: 0},"},{"line_number":6424,"context_line":"                 \u0027results\u0027: [{\u0027user\u0027: 0, \u0027role\u0027: 0, \u0027project\u0027: 0}]},"},{"line_number":6425,"context_line":"                # Listing in effective mode should how the implied roles"},{"line_number":6426,"context_line":"                # expanded out"},{"line_number":6427,"context_line":"                {\u0027params\u0027: {\u0027user\u0027: 0, \u0027effective\u0027: True},"},{"line_number":6428,"context_line":"                 \u0027results\u0027: [{\u0027user\u0027: 0, \u0027role\u0027: 0, \u0027project\u0027: 0},"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_a3aaa317","line":6425,"updated":"2016-01-08 20:57:12.000000000","message":"how-\u003eshow","commit_id":"cff71fad5bc84a52d6a0b68efde33655e0e5bd28"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"072cb505e56c1f314bbdb55f8c7e6f84da64d1aa","unresolved":false,"context_lines":[{"line_number":6462,"context_line":"            \u0027implied_roles\u0027: [{\u0027role\u0027: 0, \u0027implied_roles\u0027: [1, 2]},"},{"line_number":6463,"context_line":"                              {\u0027role\u0027: 1, \u0027implied_roles\u0027: [3, 4]},"},{"line_number":6464,"context_line":"                              {\u0027role\u0027: 5, \u0027implied_roles\u0027: [4]}],"},{"line_number":6465,"context_line":"            # The use gets both top level roles"},{"line_number":6466,"context_line":"            \u0027assignments\u0027: [{\u0027user\u0027: 0, \u0027role\u0027: 0, \u0027project\u0027: 0},"},{"line_number":6467,"context_line":"                            {\u0027user\u0027: 0, \u0027role\u0027: 5, \u0027project\u0027: 0}],"},{"line_number":6468,"context_line":"            \u0027tests\u0027: ["}],"source_content_type":"text/x-python","patch_set":24,"id":"ba63e191_f4b51dd0","line":6465,"range":{"start_line":6465,"start_character":18,"end_line":6465,"end_character":21},"updated":"2016-01-18 22:14:24.000000000","message":"user*","commit_id":"07cc21981e1dc9c7ea121fd506da2bd24ceb1e0f"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":6430,"context_line":"            \u0027entities\u0027: {\u0027domains\u0027: {\u0027users\u0027: 1, \u0027projects\u0027: 1},"},{"line_number":6431,"context_line":"                         \u0027roles\u0027: 4},"},{"line_number":6432,"context_line":"            # Three level tree of implied roles"},{"line_number":6433,"context_line":"            \u0027implied_roles\u0027: [{\u0027role\u0027: 0, \u0027implied_roles\u0027: [1]},"},{"line_number":6434,"context_line":"                              {\u0027role\u0027: 1, \u0027implied_roles\u0027: [2, 3]}],"},{"line_number":6435,"context_line":"            \u0027assignments\u0027: [{\u0027user\u0027: 0, \u0027role\u0027: 0, \u0027project\u0027: 0}],"},{"line_number":6436,"context_line":"            \u0027tests\u0027: ["}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_aa607d36","line":6433,"range":{"start_line":6433,"start_character":59,"end_line":6433,"end_character":62},"updated":"2016-01-19 13:32:23.000000000","message":"This, and others in this file, doesnt\u0027 need to be a list when containing a single element. See L308","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":6430,"context_line":"            \u0027entities\u0027: {\u0027domains\u0027: {\u0027users\u0027: 1, \u0027projects\u0027: 1},"},{"line_number":6431,"context_line":"                         \u0027roles\u0027: 4},"},{"line_number":6432,"context_line":"            # Three level tree of implied roles"},{"line_number":6433,"context_line":"            \u0027implied_roles\u0027: [{\u0027role\u0027: 0, \u0027implied_roles\u0027: [1]},"},{"line_number":6434,"context_line":"                              {\u0027role\u0027: 1, \u0027implied_roles\u0027: [2, 3]}],"},{"line_number":6435,"context_line":"            \u0027assignments\u0027: [{\u0027user\u0027: 0, \u0027role\u0027: 0, \u0027project\u0027: 0}],"},{"line_number":6436,"context_line":"            \u0027tests\u0027: ["}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_5db5e22e","line":6433,"range":{"start_line":6433,"start_character":59,"end_line":6433,"end_character":62},"in_reply_to":"ba63e191_aa607d36","updated":"2016-01-20 03:50:46.000000000","message":"I guess it makes sense to not use a list here so that the code path for L308 will be exercised.\n\nFixed in the follow-up patch, and applied to other sample data as well.","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"560f23504bf8911bd672ba01c714fe23d39539d4","unresolved":false,"context_lines":[{"line_number":6576,"context_line":"        }"},{"line_number":6577,"context_line":"        self.config_fixture.config(group\u003d\u0027os_inherit\u0027, enabled\u003dTrue)"},{"line_number":6578,"context_line":"        self.execute_assignment_plan(test_plan)"},{"line_number":6579,"context_line":""},{"line_number":6580,"context_line":""},{"line_number":6581,"context_line":"class FilterTests(filtering.FilterTests):"},{"line_number":6582,"context_line":"    def test_list_entities_filtered(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_aabcfd6c","line":6579,"updated":"2016-01-19 13:32:23.000000000","message":"Please add a test for cyclic reference when creating implied roles","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"ed3d499ec32606ab999f115c3eeb3cc2c0212d52","unresolved":false,"context_lines":[{"line_number":6576,"context_line":"        }"},{"line_number":6577,"context_line":"        self.config_fixture.config(group\u003d\u0027os_inherit\u0027, enabled\u003dTrue)"},{"line_number":6578,"context_line":"        self.execute_assignment_plan(test_plan)"},{"line_number":6579,"context_line":""},{"line_number":6580,"context_line":""},{"line_number":6581,"context_line":"class FilterTests(filtering.FilterTests):"},{"line_number":6582,"context_line":"    def test_list_entities_filtered(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_ceb35ae8","line":6579,"in_reply_to":"ba63e191_1689a426","updated":"2016-01-20 03:50:46.000000000","message":"ayoung is working on circular deps in a separate patch","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"267732ba79a702e103f18e6cf2689c6c14654795","unresolved":false,"context_lines":[{"line_number":6576,"context_line":"        }"},{"line_number":6577,"context_line":"        self.config_fixture.config(group\u003d\u0027os_inherit\u0027, enabled\u003dTrue)"},{"line_number":6578,"context_line":"        self.execute_assignment_plan(test_plan)"},{"line_number":6579,"context_line":""},{"line_number":6580,"context_line":""},{"line_number":6581,"context_line":"class FilterTests(filtering.FilterTests):"},{"line_number":6582,"context_line":"    def test_list_entities_filtered(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"ba63e191_1689a426","line":6579,"in_reply_to":"ba63e191_aabcfd6c","updated":"2016-01-19 16:44:36.000000000","message":"++","commit_id":"e27991e61a55ab8a0f237b6ab34342170632d22d"}]}
