)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc207e921cac721adad77e9951f08080dddaba83","unresolved":false,"context_lines":[{"line_number":7,"context_line":"LDAP Assignment does not support grant v3 API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The LDAP assignment backend is missing support for several of the v3"},{"line_number":10,"context_line":"APIs, for example, role grant CRUD. This patch imeplements Role Grant"},{"line_number":11,"context_line":"CRUD for V3 Assignment API. Also, several test cases, related to"},{"line_number":12,"context_line":"1221805 and 1101287 bugs, have been developed."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F%2Bwr8%3D","line":10,"updated":"2013-11-20 15:33:11.000000000","message":"implements*","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"32048a971d4a42c0b279b6225758c058d2463cd0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"LDAP Assignment does not support grant v3 API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The LDAP assignment backend is missing support for several of the v3"},{"line_number":10,"context_line":"APIs, for example, role grant CRUD. This patch imeplements Role Grant"},{"line_number":11,"context_line":"CRUD for V3 Assignment API. Also, several test cases, related to"},{"line_number":12,"context_line":"1221805 and 1101287 bugs, have been developed."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F%2BtXk%3D","line":10,"in_reply_to":"AAAATn%2F%2Bwr8%3D","updated":"2014-08-14 12:06:35.000000000","message":"Done","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc207e921cac721adad77e9951f08080dddaba83","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The LDAP assignment backend is missing support for several of the v3"},{"line_number":10,"context_line":"APIs, for example, role grant CRUD. This patch imeplements Role Grant"},{"line_number":11,"context_line":"CRUD for V3 Assignment API. Also, several test cases, related to"},{"line_number":12,"context_line":"1221805 and 1101287 bugs, have been developed."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partial-Bug: #1221805"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F%2BwrY%3D","line":12,"updated":"2013-11-20 15:33:11.000000000","message":"\u0027related to bug 1221805 and bug 1101287\u0027 this should link the bugs appropriately and allow for easier review.","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"32048a971d4a42c0b279b6225758c058d2463cd0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The LDAP assignment backend is missing support for several of the v3"},{"line_number":10,"context_line":"APIs, for example, role grant CRUD. This patch imeplements Role Grant"},{"line_number":11,"context_line":"CRUD for V3 Assignment API. Also, several test cases, related to"},{"line_number":12,"context_line":"1221805 and 1101287 bugs, have been developed."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partial-Bug: #1221805"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAATn%2F%2BtXg%3D","line":12,"in_reply_to":"AAAATn%2F%2BwrY%3D","updated":"2014-08-14 12:06:35.000000000","message":"Done","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":91,"name":"Alvaro","email":"aloga@ifca.unican.es","username":"aloga"},"change_message_id":"fb0d29ecefd6d551445ab2269b5637e3a7bf9ad0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"LDAP Assignment does not support grant v3 API"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The LDAP assignment backend is missing support for several of the v3"},{"line_number":10,"context_line":"APIs, for example, role grant CRUD. This patch implements Role Grant"},{"line_number":11,"context_line":"CRUD for V3 Assignment API."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Closes-Bug: #1248952"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"AAAATn%2F%2Brq4%3D","line":10,"updated":"2013-11-21 15:55:00.000000000","message":"Could you put explicitly what was missing and what was added, not just the example?","commit_id":"5cc8e32ad7d9b9eef7845e317d8c413b4f3e44b3"}],"keystone/assignment/backends/ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc207e921cac721adad77e9951f08080dddaba83","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            # functions such as \"self.role.get_role_assignments, it returns"},{"line_number":100,"context_line":"            # the key \"CN\" or \"OU\" in uppercase."},{"line_number":101,"context_line":"            # The group_dn var has \"CN\" and \"OU\" in lowercase."},{"line_number":102,"context_line":"            # For this reason it has been necessary to use the function"},{"line_number":103,"context_line":"            # \"upper()\" on IF sentence."},{"line_number":104,"context_line":"            return [self.role._dn_to_id(a.role_dn)"},{"line_number":105,"context_line":"                    for a in self.role.get_role_assignments"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BwqA%3D","line":102,"updated":"2013-11-20 15:33:11.000000000","message":"\u0027For this reason, it is necessary to use the \"upper()\" function so both are consistent\u0027 or something to that effect.","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"32048a971d4a42c0b279b6225758c058d2463cd0","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            # functions such as \"self.role.get_role_assignments, it returns"},{"line_number":100,"context_line":"            # the key \"CN\" or \"OU\" in uppercase."},{"line_number":101,"context_line":"            # The group_dn var has \"CN\" and \"OU\" in lowercase."},{"line_number":102,"context_line":"            # For this reason it has been necessary to use the function"},{"line_number":103,"context_line":"            # \"upper()\" on IF sentence."},{"line_number":104,"context_line":"            return [self.role._dn_to_id(a.role_dn)"},{"line_number":105,"context_line":"                    for a in self.role.get_role_assignments"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BtXc%3D","line":102,"in_reply_to":"AAAATn%2F%2BwqA%3D","updated":"2014-08-14 12:06:35.000000000","message":"Done","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc207e921cac721adad77e9951f08080dddaba83","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        tenant_dn \u003d self.project._id_to_dn(tenant_id)"},{"line_number":183,"context_line":"        return GroupRoleAssociation(group_dn\u003dgroup_dn,"},{"line_number":184,"context_line":"                                    role_dn\u003drole_dn,"},{"line_number":185,"context_line":"                                    tenant_dn\u003dtenant_dn)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _create_metadata(self, user_id, tenant_id, metadata):"},{"line_number":188,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BwpU%3D","line":185,"updated":"2013-11-20 15:33:11.000000000","message":"(NIT): can role_dn and tenant_dn be on the same indentation level as group_dn? Just for readability?\n\n    group_dn\u003dgroup_dn,\n    role_dn\u003drole_dn,\n    tenant_dn\u003dtenant_dn)","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"32048a971d4a42c0b279b6225758c058d2463cd0","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        tenant_dn \u003d self.project._id_to_dn(tenant_id)"},{"line_number":183,"context_line":"        return GroupRoleAssociation(group_dn\u003dgroup_dn,"},{"line_number":184,"context_line":"                                    role_dn\u003drole_dn,"},{"line_number":185,"context_line":"                                    tenant_dn\u003dtenant_dn)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _create_metadata(self, user_id, tenant_id, metadata):"},{"line_number":188,"context_line":"        return {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BtXY%3D","line":185,"in_reply_to":"AAAATn%2F%2BwpU%3D","updated":"2014-08-14 12:06:35.000000000","message":"Done","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":91,"name":"Alvaro","email":"aloga@ifca.unican.es","username":"aloga"},"change_message_id":"fb0d29ecefd6d551445ab2269b5637e3a7bf9ad0","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            self.identity_api.get_group(group_id)"},{"line_number":96,"context_line":"            self.get_project(tenant_id)"},{"line_number":97,"context_line":"            group_dn \u003d self.group._id_to_dn(group_id)"},{"line_number":98,"context_line":"            # NOTE(marcos-fermin-lobo): In tests performed on the memory, for"},{"line_number":99,"context_line":"            # functions such as \"self.role.get_role_assignments, it returns"},{"line_number":100,"context_line":"            # the key \"CN\" or \"OU\" in uppercase."},{"line_number":101,"context_line":"            # The group_dn var has \"CN\" and \"OU\" in lowercase."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Brt4%3D","line":98,"updated":"2013-11-21 15:55:00.000000000","message":"Is this always happening or, does it just happen for the in-memory tests? If it is the later, why not putting this in the tests?","commit_id":"5cc8e32ad7d9b9eef7845e317d8c413b4f3e44b3"},{"author":{"_account_id":91,"name":"Alvaro","email":"aloga@ifca.unican.es","username":"aloga"},"change_message_id":"fb0d29ecefd6d551445ab2269b5637e3a7bf9ad0","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        role_dn \u003d self._subrole_id_to_dn(role_id, tenant_id)"},{"line_number":168,"context_line":"        self.role.add_user(role_id, role_dn, user_dn, user_id, tenant_id)"},{"line_number":169,"context_line":"        tenant_dn \u003d self.project._id_to_dn(tenant_id)"},{"line_number":170,"context_line":"        return UserRoleAssociation(role_dn\u003drole_dn,"},{"line_number":171,"context_line":"                                   user_dn\u003duser_dn,"},{"line_number":172,"context_line":"                                   tenant_dn\u003dtenant_dn)"},{"line_number":173,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Brt0%3D","line":170,"updated":"2013-11-21 15:55:00.000000000","message":"This is not related with your patch, therefore I\u0027ll revert it.","commit_id":"5cc8e32ad7d9b9eef7845e317d8c413b4f3e44b3"},{"author":{"_account_id":91,"name":"Alvaro","email":"aloga@ifca.unican.es","username":"aloga"},"change_message_id":"fb0d29ecefd6d551445ab2269b5637e3a7bf9ad0","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def delete_project(self, tenant_id):"},{"line_number":212,"context_line":"        if self.project.subtree_delete_enabled:"},{"line_number":213,"context_line":"            self.project.deleteTree(id)"},{"line_number":214,"context_line":"        else:"},{"line_number":215,"context_line":"            tenant_dn \u003d self.project._id_to_dn(tenant_id)"},{"line_number":216,"context_line":"            self.role.roles_delete_subtree_by_project(tenant_dn)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2BrsI%3D","line":213,"updated":"2013-11-21 15:55:00.000000000","message":"You are reverting some changes that were applied in a previous changese, I tink that you need to rebase against master","commit_id":"5cc8e32ad7d9b9eef7845e317d8c413b4f3e44b3"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be5cb728dc185a4b7e7f5b5c4d133bfb8b697733","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                    (self.project._id_to_dn(tenant_id))"},{"line_number":92,"context_line":"                    if self.user._dn_to_id(a.user_dn) \u003d\u003d user_id]"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        def _get_roles_for_just_group_and_project(group_id, tenant_id):"},{"line_number":95,"context_line":"            self.identity_api.get_group(group_id)"},{"line_number":96,"context_line":"            self.get_project(tenant_id)"},{"line_number":97,"context_line":"            group_dn \u003d self.group._id_to_dn(group_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9%2F5A%3D","line":94,"updated":"2013-12-03 16:47:34.000000000","message":"remove \"just\" from the name.\n\nchange \"tenant_id\" parameter to \"project_id\"","commit_id":"ce9d54066b045606cc48906de1618626a0dda651"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"c373a4be3656f403c3e47d46d84f38fda4851daf","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                    (self.project._id_to_dn(tenant_id))"},{"line_number":92,"context_line":"                    if self.user._dn_to_id(a.user_dn) \u003d\u003d user_id]"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        def _get_roles_for_just_group_and_project(group_id, tenant_id):"},{"line_number":95,"context_line":"            self.identity_api.get_group(group_id)"},{"line_number":96,"context_line":"            self.get_project(tenant_id)"},{"line_number":97,"context_line":"            group_dn \u003d self.group._id_to_dn(group_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F97uQ%3D","line":94,"in_reply_to":"AAAATn%2F9%2F5A%3D","updated":"2013-12-04 10:00:25.000000000","message":"Done","commit_id":"ce9d54066b045606cc48906de1618626a0dda651"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be5cb728dc185a4b7e7f5b5c4d133bfb8b697733","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        def _get_roles_for_just_group_and_project(group_id, tenant_id):"},{"line_number":95,"context_line":"            self.identity_api.get_group(group_id)"},{"line_number":96,"context_line":"            self.get_project(tenant_id)"},{"line_number":97,"context_line":"            group_dn \u003d self.group._id_to_dn(group_id)"},{"line_number":98,"context_line":"            # NOTE(marcos-fermin-lobo): In tests performed on the memory, for"},{"line_number":99,"context_line":"            # functions such as \"self.role.get_role_assignments, it returns"},{"line_number":100,"context_line":"            # the key \"CN\" or \"OU\" in uppercase."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9%2F4Y%3D","line":97,"updated":"2013-12-03 16:47:34.000000000","message":"we shouldn\u0027t be calling a private method of a class. Create a public method to call.\n\nDoes it make sense to generate a DN for a group that\u0027s in the SQL backend rather than an LDAP backend? The entry isn\u0027t going to exist.","commit_id":"ce9d54066b045606cc48906de1618626a0dda651"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"84caf2b653067d554a2945f6955c9d92b7d1d108","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        def _get_roles_for_just_group_and_project(group_id, tenant_id):"},{"line_number":95,"context_line":"            self.identity_api.get_group(group_id)"},{"line_number":96,"context_line":"            self.get_project(tenant_id)"},{"line_number":97,"context_line":"            group_dn \u003d self.group._id_to_dn(group_id)"},{"line_number":98,"context_line":"            # NOTE(marcos-fermin-lobo): In tests performed on the memory, for"},{"line_number":99,"context_line":"            # functions such as \"self.role.get_role_assignments, it returns"},{"line_number":100,"context_line":"            # the key \"CN\" or \"OU\" in uppercase."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F976w%3D","line":97,"in_reply_to":"AAAATn%2F9%2F4Y%3D","updated":"2013-12-04 09:48:12.000000000","message":"About call to private methods. On line 91 and 92 on this file there are calls to private methods. This is the reason because I did not implement a public method to call to group._id_to_dn.","commit_id":"ce9d54066b045606cc48906de1618626a0dda651"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"c373a4be3656f403c3e47d46d84f38fda4851daf","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        def _get_roles_for_just_group_and_project(group_id, tenant_id):"},{"line_number":95,"context_line":"            self.identity_api.get_group(group_id)"},{"line_number":96,"context_line":"            self.get_project(tenant_id)"},{"line_number":97,"context_line":"            group_dn \u003d self.group._id_to_dn(group_id)"},{"line_number":98,"context_line":"            # NOTE(marcos-fermin-lobo): In tests performed on the memory, for"},{"line_number":99,"context_line":"            # functions such as \"self.role.get_role_assignments, it returns"},{"line_number":100,"context_line":"            # the key \"CN\" or \"OU\" in uppercase."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F97uM%3D","line":97,"in_reply_to":"AAAATn%2F9%2F4Y%3D","updated":"2013-12-04 10:00:25.000000000","message":"Done","commit_id":"ce9d54066b045606cc48906de1618626a0dda651"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"be5cb728dc185a4b7e7f5b5c4d133bfb8b697733","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            self.identity_api.get_group(group_id)"},{"line_number":96,"context_line":"            self.get_project(tenant_id)"},{"line_number":97,"context_line":"            group_dn \u003d self.group._id_to_dn(group_id)"},{"line_number":98,"context_line":"            # NOTE(marcos-fermin-lobo): In tests performed on the memory, for"},{"line_number":99,"context_line":"            # functions such as \"self.role.get_role_assignments, it returns"},{"line_number":100,"context_line":"            # the key \"CN\" or \"OU\" in uppercase."},{"line_number":101,"context_line":"            # The group_dn var has \"CN\" and \"OU\" in lowercase."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F9%2F3U%3D","line":98,"updated":"2013-12-03 16:47:34.000000000","message":"This is because Active Directory changes the member value in the same way. So suggest change \"In tests performed on the memory\" to \"For Active Directory,\"","commit_id":"ce9d54066b045606cc48906de1618626a0dda651"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"c373a4be3656f403c3e47d46d84f38fda4851daf","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            self.identity_api.get_group(group_id)"},{"line_number":96,"context_line":"            self.get_project(tenant_id)"},{"line_number":97,"context_line":"            group_dn \u003d self.group._id_to_dn(group_id)"},{"line_number":98,"context_line":"            # NOTE(marcos-fermin-lobo): In tests performed on the memory, for"},{"line_number":99,"context_line":"            # functions such as \"self.role.get_role_assignments, it returns"},{"line_number":100,"context_line":"            # the key \"CN\" or \"OU\" in uppercase."},{"line_number":101,"context_line":"            # The group_dn var has \"CN\" and \"OU\" in lowercase."}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F97uI%3D","line":98,"in_reply_to":"AAAATn%2F9%2F3U%3D","updated":"2013-12-04 10:00:25.000000000","message":"Done","commit_id":"ce9d54066b045606cc48906de1618626a0dda651"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6467ec2a47ed5ef2204597313e59f1ac5b99c782","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        if domain_id is not None:"},{"line_number":110,"context_line":"            msg \u003d \u0027Domain metadata not supported by LDAP\u0027"},{"line_number":111,"context_line":"            raise exception.NotImplemented(message\u003dmsg)"},{"line_number":112,"context_line":"        if group_id is None and user_id is None:"},{"line_number":113,"context_line":"            return {}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        if tenant_id is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2FlYQ%3D","line":112,"updated":"2014-01-10 19:31:08.000000000","message":"this should never be true, so i don\u0027t understand this change?","commit_id":"cfc38c887aa7d46e9e3ac7b12b424934f094b498"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"4db9c41706a3e56c3e56756eb783cd8e9c7375ba","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        if domain_id is not None:"},{"line_number":110,"context_line":"            msg \u003d \u0027Domain metadata not supported by LDAP\u0027"},{"line_number":111,"context_line":"            raise exception.NotImplemented(message\u003dmsg)"},{"line_number":112,"context_line":"        if group_id is None and user_id is None:"},{"line_number":113,"context_line":"            return {}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        if tenant_id is None:"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2FgCk%3D","line":112,"in_reply_to":"AAAAUH%2F%2FlYQ%3D","updated":"2014-01-13 10:43:36.000000000","message":"I\u0027m protecting function misuses.","commit_id":"cfc38c887aa7d46e9e3ac7b12b424934f094b498"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"9293ad1e3918c834d56ac9da1882f3b609053e28","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        if group_id is None and user_id is None:"},{"line_number":113,"context_line":"            return {}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        if tenant_id is None:"},{"line_number":116,"context_line":"            return {}"},{"line_number":117,"context_line":"        if user_id is None:"},{"line_number":118,"context_line":"            metadata_ref \u003d _get_roles_for_group_and_project(group_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAT3%2F%2Fu%2FM%3D","line":115,"updated":"2014-01-02 17:52:56.000000000","message":"What about Domain roles?  I guess they are less important with LDAP front and backend, so maybe not necessary to implement this time around.","commit_id":"cfc38c887aa7d46e9e3ac7b12b424934f094b498"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6467ec2a47ed5ef2204597313e59f1ac5b99c782","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        if group_id is None and user_id is None:"},{"line_number":113,"context_line":"            return {}"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        if tenant_id is None:"},{"line_number":116,"context_line":"            return {}"},{"line_number":117,"context_line":"        if user_id is None:"},{"line_number":118,"context_line":"            metadata_ref \u003d _get_roles_for_group_and_project(group_id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2Flnw%3D","line":115,"in_reply_to":"AAAAT3%2F%2Fu%2FM%3D","updated":"2014-01-10 19:31:08.000000000","message":"++ i\u0027m fine with doing that later, but it\u0027d be nice if there was explicitly room to handle the request here with a TODO","commit_id":"cfc38c887aa7d46e9e3ac7b12b424934f094b498"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6467ec2a47ed5ef2204597313e59f1ac5b99c782","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                group_id, project_id, role_id)"},{"line_number":318,"context_line":"        else:"},{"line_number":319,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d self.add_role_to_user_and_project("},{"line_number":320,"context_line":"                user_id, project_id, role_id)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def get_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":323,"context_line":"                  domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2FlWk%3D","line":320,"updated":"2014-01-10 19:31:08.000000000","message":"several pieces here in the next few methods seem like they belong at the manager layer, not in the ldap driver... maybe this patch should be based on a refactor first?","commit_id":"cfc38c887aa7d46e9e3ac7b12b424934f094b498"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"4db9c41706a3e56c3e56756eb783cd8e9c7375ba","unresolved":false,"context_lines":[{"line_number":317,"context_line":"                group_id, project_id, role_id)"},{"line_number":318,"context_line":"        else:"},{"line_number":319,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d self.add_role_to_user_and_project("},{"line_number":320,"context_line":"                user_id, project_id, role_id)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def get_grant(self, role_id, user_id\u003dNone, group_id\u003dNone,"},{"line_number":323,"context_line":"                  domain_id\u003dNone, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2Ff%2F0%3D","line":320,"in_reply_to":"AAAAUH%2F%2FlWk%3D","updated":"2014-01-13 10:43:36.000000000","message":"Do you propose to up this methods to the Drives class?","commit_id":"cfc38c887aa7d46e9e3ac7b12b424934f094b498"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"6467ec2a47ed5ef2204597313e59f1ac5b99c782","unresolved":false,"context_lines":[{"line_number":687,"context_line":"        res \u003d []"},{"line_number":688,"context_line":"        for role_dn, role in roles:"},{"line_number":689,"context_line":"            tenant \u003d ldap.dn.str2dn(role_dn)"},{"line_number":690,"context_line":"            tenant.pop(0)"},{"line_number":691,"context_line":"            tenant_dn \u003d ldap.dn.dn2str(tenant)"},{"line_number":692,"context_line":"            for user_dn in role[self.member_attribute]:"},{"line_number":693,"context_line":"                res.append(UserRoleAssociation("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2FlWE%3D","line":690,"updated":"2014-01-10 19:31:08.000000000","message":"an inline comment would be nice to explain this","commit_id":"cfc38c887aa7d46e9e3ac7b12b424934f094b498"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"4db9c41706a3e56c3e56756eb783cd8e9c7375ba","unresolved":false,"context_lines":[{"line_number":687,"context_line":"        res \u003d []"},{"line_number":688,"context_line":"        for role_dn, role in roles:"},{"line_number":689,"context_line":"            tenant \u003d ldap.dn.str2dn(role_dn)"},{"line_number":690,"context_line":"            tenant.pop(0)"},{"line_number":691,"context_line":"            tenant_dn \u003d ldap.dn.dn2str(tenant)"},{"line_number":692,"context_line":"            for user_dn in role[self.member_attribute]:"},{"line_number":693,"context_line":"                res.append(UserRoleAssociation("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2Ffoo%3D","line":690,"in_reply_to":"AAAAUH%2F%2FlWE%3D","updated":"2014-01-13 10:43:36.000000000","message":"Done","commit_id":"cfc38c887aa7d46e9e3ac7b12b424934f094b498"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3f1d776f74be78b30d879a070a1982a6cf9b54fb","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            # function so both are consistent."},{"line_number":104,"context_line":"            return [self.role._dn_to_id(a.role_dn)"},{"line_number":105,"context_line":"                    for a in self.role.get_role_assignments"},{"line_number":106,"context_line":"                    (self.project._id_to_dn(project_id))"},{"line_number":107,"context_line":"                    if a.user_dn.upper() \u003d\u003d group_dn.upper()]"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        if domain_id is not None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FFrw%3D","line":106,"updated":"2014-01-17 18:02:19.000000000","message":"opening the paren for a function call on another line makes this really difficult/misleading to read","commit_id":"f421920ee03b1fd8e5df1c960a69617859b4bc07"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3f1d776f74be78b30d879a070a1982a6cf9b54fb","unresolved":false,"context_lines":[{"line_number":171,"context_line":"                                   user_dn\u003duser_dn,"},{"line_number":172,"context_line":"                                   tenant_dn\u003dtenant_dn)"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def add_role_to_group_and_project(self, group_id, tenant_id, role_id):"},{"line_number":175,"context_line":"        self.identity_api.get_group(group_id)"},{"line_number":176,"context_line":"        self.get_project(tenant_id)"},{"line_number":177,"context_line":"        self.get_role(role_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FFkI%3D","line":174,"updated":"2014-01-17 18:02:19.000000000","message":"this shouldn\u0027t be a public method","commit_id":"f421920ee03b1fd8e5df1c960a69617859b4bc07"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3f1d776f74be78b30d879a070a1982a6cf9b54fb","unresolved":false,"context_lines":[{"line_number":223,"context_line":"                                     self.project._id_to_dn(tenant_id),"},{"line_number":224,"context_line":"                                     user_id, role_id)"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    def del_role_from_group_and_project(self, group_id, tenant_id, role_id):"},{"line_number":227,"context_line":"        role_dn \u003d self._subrole_id_to_dn(role_id, tenant_id)"},{"line_number":228,"context_line":"        return self.role.delete_user(role_dn,"},{"line_number":229,"context_line":"                                     self.group._id_to_dn(group_id),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FFj4%3D","line":226,"updated":"2014-01-17 18:02:19.000000000","message":"this shouldn\u0027t be public, and should follow the naming convention of similar methods: _remove_role_from_group_and_project()","commit_id":"f421920ee03b1fd8e5df1c960a69617859b4bc07"}],"keystone/tests/test_backend_ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc207e921cac721adad77e9951f08080dddaba83","unresolved":false,"context_lines":[{"line_number":386,"context_line":"                                         role_id\u003d\u0027admin\u0027)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        # Read back the list of assignments - check it is gone up by 2"},{"line_number":389,"context_line":"        assignment_list \u003d self.assignment_api.list_role_assignments()"},{"line_number":390,"context_line":"        self.assertEquals(len(assignment_list), existing_assignments + 2)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def test_list_role_assignments_bad_role(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bwl4%3D","line":389,"updated":"2013-11-20 15:33:11.000000000","message":"(NIT): why not make this consistent with line 379 and call len() when assigning?\n\n    assignment_list \u003d len(self.assignment_api.list_role_assignments())\n\nCould also name these according to when they were assigned so it\u0027s easier to tell when it happened. Maybe something like \u0027before_assignment\u0027 and \u0027after_assignment\u0027?","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":8533,"name":"Marcos Fermín Lobo","email":"lobo@lukos.org","username":"mlobo"},"change_message_id":"32048a971d4a42c0b279b6225758c058d2463cd0","unresolved":false,"context_lines":[{"line_number":386,"context_line":"                                         role_id\u003d\u0027admin\u0027)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        # Read back the list of assignments - check it is gone up by 2"},{"line_number":389,"context_line":"        assignment_list \u003d self.assignment_api.list_role_assignments()"},{"line_number":390,"context_line":"        self.assertEquals(len(assignment_list), existing_assignments + 2)"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"    def test_list_role_assignments_bad_role(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BtXU%3D","line":389,"in_reply_to":"AAAATn%2F%2Bwl4%3D","updated":"2014-08-14 12:06:35.000000000","message":"Done","commit_id":"1cea5deb4e525710b8560849eacec74225397cfd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3f1d776f74be78b30d879a070a1982a6cf9b54fb","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        self.assertRaises(exception.ProjectNotFound,"},{"line_number":156,"context_line":"                          self.assignment_api.list_grants,"},{"line_number":157,"context_line":"                          uuid.uuid4().hex,"},{"line_number":158,"context_line":"                          None, None, \u0027other\u0027)"},{"line_number":159,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":160,"context_line":"                          self.assignment_api.list_grants,"},{"line_number":161,"context_line":"                          uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FFgk%3D","line":158,"updated":"2014-01-17 18:02:19.000000000","message":"these need to be kwargs","commit_id":"f421920ee03b1fd8e5df1c960a69617859b4bc07"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3f1d776f74be78b30d879a070a1982a6cf9b54fb","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":160,"context_line":"                          self.assignment_api.list_grants,"},{"line_number":161,"context_line":"                          uuid.uuid4().hex,"},{"line_number":162,"context_line":"                          None, None, self.tenant_bar[\u0027id\u0027])"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def test_add_role_grant_to_user_and_project_404(self):"},{"line_number":165,"context_line":"        self.assertRaises(exception.ProjectNotFound,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FFgg%3D","line":162,"updated":"2014-01-17 18:02:19.000000000","message":"kwargs","commit_id":"f421920ee03b1fd8e5df1c960a69617859b4bc07"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3f1d776f74be78b30d879a070a1982a6cf9b54fb","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        self.assertRaises(exception.ProjectNotFound,"},{"line_number":166,"context_line":"                          self.assignment_api.list_grants,"},{"line_number":167,"context_line":"                          uuid.uuid4().hex,"},{"line_number":168,"context_line":"                          None, None, \u0027other\u0027)"},{"line_number":169,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":170,"context_line":"                          self.assignment_api.list_grants,"},{"line_number":171,"context_line":"                          uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FFgQ%3D","line":168,"updated":"2014-01-17 18:02:19.000000000","message":"kwargs","commit_id":"f421920ee03b1fd8e5df1c960a69617859b4bc07"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3f1d776f74be78b30d879a070a1982a6cf9b54fb","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":170,"context_line":"                          self.assignment_api.list_grants,"},{"line_number":171,"context_line":"                          uuid.uuid4().hex,"},{"line_number":172,"context_line":"                          None, None, self.tenant_bar[\u0027id\u0027])"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def test_remove_role_grant_from_user_and_project(self):"},{"line_number":175,"context_line":"        self.assignment_api.create_grant(user_id\u003dself.user_foo[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FFgc%3D","line":172,"updated":"2014-01-17 18:02:19.000000000","message":"kwargs","commit_id":"f421920ee03b1fd8e5df1c960a69617859b4bc07"}]}
