)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87a7c96640a0791d5438d68d9dc60286c159e6a8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Code which gets and deletes elements of tree was moved to one method"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Code which uses \u0027search_s\u0027 and \u0027delete_s\u0027 in ldap backends was moved"},{"line_number":10,"context_line":"to a new method to escape duplication of code."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I8e7402337ab4d75ce8920e8158a6e1dd1ed97abd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAAW3%2F%2FiEM%3D","line":10,"updated":"2014-04-13 16:32:07.000000000","message":"change \"escape\" to \"remove\" or \"eliminate\"","commit_id":"332c4986d2d8270a791bc9af271a3ae321c7ae7d"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"dc463e25fee6740e8cb6221cf7d40f2e1a42c420","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Added handling of exception ldap.NO_SUCH_OBJECT when we couldn\u0027t"},{"line_number":13,"context_line":"find a search base while deleting. Now this exception is"},{"line_number":14,"context_line":"not ignored. Instead of this raised NotFound exception"},{"line_number":15,"context_line":"or more suitable (RoleNotFound, etc)."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Also added handling of situation when we trying to delete"},{"line_number":18,"context_line":"nonexisting entries."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9ad9bd40_e455d0fa","line":15,"updated":"2014-05-05 19:05:40.000000000","message":"aren\u0027t we logging a warning now with the latest patchset?","commit_id":"fa569bbd527a5d3af9d0bc1eece5ff2c3fd4a62a"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"5eb44bb4d51213b7bb882ea448fb9eb70cc03e3a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"Added handling of exception ldap.NO_SUCH_OBJECT when we couldn\u0027t"},{"line_number":13,"context_line":"find a search base while deleting. Now this exception is"},{"line_number":14,"context_line":"not ignored. Instead of this raised NotFound exception"},{"line_number":15,"context_line":"or more suitable (RoleNotFound, etc)."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Also added handling of situation when we trying to delete"},{"line_number":18,"context_line":"nonexisting entries."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9ad9bd40_2a6db5cc","line":15,"in_reply_to":"9ad9bd40_e455d0fa","updated":"2014-05-06 05:44:32.000000000","message":"We are, but if there is no search base we raise a NotFound. \nAs to warning we use it when handling an exception from delete_s not when we couldn\u0027t find a search base.","commit_id":"fa569bbd527a5d3af9d0bc1eece5ff2c3fd4a62a"},{"author":{"_account_id":9569,"name":"Sergey Nikitin","email":"nikitinserv@gmail.com","username":"snikitin"},"change_message_id":"54e59d0fae89b1d1a288d1d8477f5bbad9ff4fc2","unresolved":false,"context_lines":[{"line_number":15,"context_line":"or more suitable (RoleNotFound, etc)."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Also added handling of situation when we trying to delete"},{"line_number":18,"context_line":"nonexisting entries."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Closes bug 1316128"},{"line_number":21,"context_line":"Change-Id: I8e7402337ab4d75ce8920e8158a6e1dd1ed97abd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"9ad9bd40_ca8b6966","line":18,"updated":"2014-05-06 05:45:52.000000000","message":"In this situation we logging warning","commit_id":"fa569bbd527a5d3af9d0bc1eece5ff2c3fd4a62a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0ba6362c3df88179ee34141d2826571ae78b77a8","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Code which uses \u0027search_s\u0027 and \u0027delete_s\u0027 in ldap backends was moved"},{"line_number":10,"context_line":"to a new method to remove duplication of code."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Added handling of exception ldap.NO_SUCH_OBJECT when we couldn\u0027t"},{"line_number":13,"context_line":"find a search base while deleting. Now this exception is"},{"line_number":14,"context_line":"not ignored. Instead of this raised NotFound exception"},{"line_number":15,"context_line":"or more suitable (RoleNotFound, etc)."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7adec928_40b3634c","line":12,"updated":"2014-05-19 23:20:12.000000000","message":"This isn\u0027t related to the refactoring so should be in a separate commit.","commit_id":"eb2b028adbe5f137e8cb0d4f855a95c1fc7ef277"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0ba6362c3df88179ee34141d2826571ae78b77a8","unresolved":false,"context_lines":[{"line_number":17,"context_line":"Also added handling of situation when we trying to delete"},{"line_number":18,"context_line":"nonexisting entries."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Closes bug 1316128"},{"line_number":21,"context_line":"Change-Id: I8e7402337ab4d75ce8920e8158a6e1dd1ed97abd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"7adec928_a0a42708","line":20,"updated":"2014-05-19 23:20:12.000000000","message":"Should be \"Closes-Bug: #1316128\"","commit_id":"eb2b028adbe5f137e8cb0d4f855a95c1fc7ef277"}],"keystone/assignment/backends/ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b265f2aa42d0dcc3b8d4b0e3c7559aa344a454c6","unresolved":false,"context_lines":[{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def delete(self, role_id, tenant_dn):"},{"line_number":661,"context_line":"        self.delete_tree_nodes(tenant_dn, ldap.SCOPE_SUBTREE,"},{"line_number":662,"context_line":"                               {self.id_attr: role_id})"},{"line_number":663,"context_line":"        super(RoleApi, self).delete(role_id)"},{"line_number":664,"context_line":""},{"line_number":665,"context_line":"    def list_role_assignments(self, project_tree_dn):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FxnY%3D","line":662,"updated":"2014-04-10 13:47:49.000000000","message":"Add keyword for optional parameters.","commit_id":"7d32ace242fccc56bb0ca9359dfccd52173547d2"}],"keystone/common/ldap/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b265f2aa42d0dcc3b8d4b0e3c7559aa344a454c6","unresolved":false,"context_lines":[{"line_number":1014,"context_line":"        finally:"},{"line_number":1015,"context_line":"            conn.unbind_s()"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    def delete_tree_nodes(self, obj_dn, scope, query_params\u003dNone):"},{"line_number":1018,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1019,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":1020,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2Fxoc%3D","line":1017,"updated":"2014-04-10 13:47:49.000000000","message":"If this is a public method, we should add doc strings.","commit_id":"7d32ace242fccc56bb0ca9359dfccd52173547d2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b265f2aa42d0dcc3b8d4b0e3c7559aa344a454c6","unresolved":false,"context_lines":[{"line_number":1025,"context_line":"            for node_dn, _ in conn.search_s(obj_dn, scope, query):"},{"line_number":1026,"context_line":"                conn.delete_s(node_dn)"},{"line_number":1027,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":1028,"context_line":"            pass"},{"line_number":1029,"context_line":"        finally:"},{"line_number":1030,"context_line":"            conn.unbind_s()"},{"line_number":1031,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2Fxn8%3D","line":1028,"updated":"2014-04-10 13:47:49.000000000","message":"Should something be logged here?","commit_id":"7d32ace242fccc56bb0ca9359dfccd52173547d2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87a7c96640a0791d5438d68d9dc60286c159e6a8","unresolved":false,"context_lines":[{"line_number":1014,"context_line":"        finally:"},{"line_number":1015,"context_line":"            conn.unbind_s()"},{"line_number":1016,"context_line":""},{"line_number":1017,"context_line":"    def _delete_tree_nodes(self, obj_dn, scope, query_params\u003dNone):"},{"line_number":1018,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1019,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":1020,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FiCc%3D","line":1017,"updated":"2014-04-13 16:32:07.000000000","message":"change obj_dn to search_base","commit_id":"332c4986d2d8270a791bc9af271a3ae321c7ae7d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87a7c96640a0791d5438d68d9dc60286c159e6a8","unresolved":false,"context_lines":[{"line_number":1020,"context_line":"        if query_params:"},{"line_number":1021,"context_line":"            query \u003d (u\u0027(\u0026%s%s)\u0027 %"},{"line_number":1022,"context_line":"                     (query, \u0027\u0027.join([\u0027(%s\u003d%s)\u0027 % (k, v)"},{"line_number":1023,"context_line":"                                      for k, v in query_params.iteritems()])))"},{"line_number":1024,"context_line":"        try:"},{"line_number":1025,"context_line":"            for node_dn, _t in conn.search_s(obj_dn, scope, query):"},{"line_number":1026,"context_line":"                conn.delete_s(node_dn)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FiCU%3D","line":1023,"updated":"2014-04-13 16:32:07.000000000","message":"use six.iteritems -- https://pythonhosted.org/six/#six.iteritems","commit_id":"332c4986d2d8270a791bc9af271a3ae321c7ae7d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87a7c96640a0791d5438d68d9dc60286c159e6a8","unresolved":false,"context_lines":[{"line_number":1022,"context_line":"                     (query, \u0027\u0027.join([\u0027(%s\u003d%s)\u0027 % (k, v)"},{"line_number":1023,"context_line":"                                      for k, v in query_params.iteritems()])))"},{"line_number":1024,"context_line":"        try:"},{"line_number":1025,"context_line":"            for node_dn, _t in conn.search_s(obj_dn, scope, query):"},{"line_number":1026,"context_line":"                conn.delete_s(node_dn)"},{"line_number":1027,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":1028,"context_line":"            LOG.debug(_(\u0027Could not find object with dn\u003d%s\u0027) % obj_dn)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FiCI%3D","line":1025,"updated":"2014-04-13 16:32:07.000000000","message":"this search should be done with attributes\u003d[\u00271.1\u0027] since we only care about the DN.","commit_id":"332c4986d2d8270a791bc9af271a3ae321c7ae7d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87a7c96640a0791d5438d68d9dc60286c159e6a8","unresolved":false,"context_lines":[{"line_number":1024,"context_line":"        try:"},{"line_number":1025,"context_line":"            for node_dn, _t in conn.search_s(obj_dn, scope, query):"},{"line_number":1026,"context_line":"                conn.delete_s(node_dn)"},{"line_number":1027,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":1028,"context_line":"            LOG.debug(_(\u0027Could not find object with dn\u003d%s\u0027) % obj_dn)"},{"line_number":1029,"context_line":"        finally:"},{"line_number":1030,"context_line":"            conn.unbind_s()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FiCQ%3D","line":1027,"updated":"2014-04-13 16:32:07.000000000","message":"should we break out of the loop if delete_s fails? Seems like we should continue on to the next entry.\n\nAlso, since we failed to delete all the entries, an exception should be raised so that the server can report the error rather than indicating success.","commit_id":"332c4986d2d8270a791bc9af271a3ae321c7ae7d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0ff8a6402794b92aa180b2d11597e4d44db0374","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"            # attributes\u003d[\u00271.1\u0027] since we only care about the DN."},{"line_number":1034,"context_line":"            nodes \u003d conn.search_s(search_base, scope, query, [\u00271.1\u0027])"},{"line_number":1035,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":1036,"context_line":"            LOG.debug(_(\u0027Could not find search base with dn\u003d%s\u0027) % search_base)"},{"line_number":1037,"context_line":"            raise self._not_found(self._dn_to_id(search_base))"},{"line_number":1038,"context_line":"        else:"},{"line_number":1039,"context_line":"            for node_dn, _t in nodes:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2F%2Fhc%3D","line":1036,"updated":"2014-04-16 01:35:32.000000000","message":"suggest change \"search base\" to \"entry\"","commit_id":"f3569033e2e92fe8cee700fed8ab2dd5e84424e4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e0ff8a6402794b92aa180b2d11597e4d44db0374","unresolved":false,"context_lines":[{"line_number":1046,"context_line":""},{"line_number":1047,"context_line":"        if not_deleted_nodes:"},{"line_number":1048,"context_line":"            raise exception.NotFound(_(\"Could not delete nonexistent \""},{"line_number":1049,"context_line":"                                       \"objects %s\") % not_deleted_nodes)"},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":""},{"line_number":1052,"context_line":"class EnabledEmuMixIn(BaseLdap):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAXH%2F%2F%2FhE%3D","line":1049,"updated":"2014-04-16 01:35:32.000000000","message":"change \"objects\" to \"entries\"","commit_id":"f3569033e2e92fe8cee700fed8ab2dd5e84424e4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"95fa84733a984307129aab293a2b91592d5ae57f","unresolved":false,"context_lines":[{"line_number":1077,"context_line":"        finally:"},{"line_number":1078,"context_line":"            conn.unbind_s()"},{"line_number":1079,"context_line":""},{"line_number":1080,"context_line":"    def _delete_tree_nodes(self, search_base, scope, query_params\u003dNone):"},{"line_number":1081,"context_line":"        conn \u003d self.get_connection()"},{"line_number":1082,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":1083,"context_line":"        if query_params:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_99daf876","line":1080,"updated":"2014-05-01 21:15:13.000000000","message":"The commit message makes this sound like a refactoring, but I think the behavior is actually different. A NotFound exception is raised if the search failed. Previously this was ignored. Also delete failures are caught and handled differently.\n\nI don\u0027t think these changes are bad, actually the delete handling is great. I do think, however, that the comment message need reflect the new behavior, tests should show the new behavior and ideally a bug could document why.\n\nAs far as the actual implementation of this method, I don\u0027t think that a 404 is the right error for the delete.","commit_id":"b39dbf2f8a1363b7932dc83686889557603fea2f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"95fa84733a984307129aab293a2b91592d5ae57f","unresolved":false,"context_lines":[{"line_number":1093,"context_line":"            nodes \u003d conn.search_s(search_base, scope, query,"},{"line_number":1094,"context_line":"                                  attrlist\u003drequest_no_attributes)"},{"line_number":1095,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":1096,"context_line":"            LOG.debug(_(\u0027Could not find entry with dn\u003d%s\u0027) % search_base)"},{"line_number":1097,"context_line":"            raise self._not_found(self._dn_to_id(search_base))"},{"line_number":1098,"context_line":"        else:"},{"line_number":1099,"context_line":"            for node_dn, _t in nodes:"}],"source_content_type":"text/x-python","patch_set":9,"id":"9ad9bd40_b9625cd6","line":1096,"updated":"2014-05-01 21:15:13.000000000","message":"Remove the % and replace it with a comma. There is no reason to do string manipulation before we know that the string will be written to the log.","commit_id":"b39dbf2f8a1363b7932dc83686889557603fea2f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0ba6362c3df88179ee34141d2826571ae78b77a8","unresolved":false,"context_lines":[{"line_number":1095,"context_line":"        query \u003d u\u0027(objectClass\u003d%s)\u0027 % self.object_class"},{"line_number":1096,"context_line":"        if query_params:"},{"line_number":1097,"context_line":"            query \u003d (u\u0027(\u0026%s%s)\u0027 %"},{"line_number":1098,"context_line":"                     (query, \u0027\u0027.join([\u0027(%s\u003d%s)\u0027 % (k, v) for k, v in"},{"line_number":1099,"context_line":"                                      six.iteritems(query_params)])))"},{"line_number":1100,"context_line":"        not_deleted_nodes \u003d []"},{"line_number":1101,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_603a1f9a","line":1098,"updated":"2014-05-19 23:20:12.000000000","message":"v should be escaped for the filter. -- ldap.filter.escape_filter_chars(v)","commit_id":"eb2b028adbe5f137e8cb0d4f855a95c1fc7ef277"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0ba6362c3df88179ee34141d2826571ae78b77a8","unresolved":false,"context_lines":[{"line_number":1106,"context_line":"            nodes \u003d conn.search_s(search_base, scope, query,"},{"line_number":1107,"context_line":"                                  attrlist\u003drequest_no_attributes)"},{"line_number":1108,"context_line":"        except ldap.NO_SUCH_OBJECT:"},{"line_number":1109,"context_line":"            LOG.debug(_(\u0027Could not find entry with dn\u003d%s\u0027), search_base)"},{"line_number":1110,"context_line":"            raise self._not_found(self._dn_to_id(search_base))"},{"line_number":1111,"context_line":"        else:"},{"line_number":1112,"context_line":"            for node_dn, _t in nodes:"}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_80d64b4d","line":1109,"updated":"2014-05-19 23:20:12.000000000","message":"OpenStack policy is now to not translate debug, so remove _().","commit_id":"eb2b028adbe5f137e8cb0d4f855a95c1fc7ef277"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0ba6362c3df88179ee34141d2826571ae78b77a8","unresolved":false,"context_lines":[{"line_number":1118,"context_line":"            conn.unbind_s()"},{"line_number":1119,"context_line":""},{"line_number":1120,"context_line":"        if not_deleted_nodes:"},{"line_number":1121,"context_line":"            # NOTE(nikitins): No need to remove nodes that do not exist."},{"line_number":1122,"context_line":"            LOG.warn(_(\"Could not delete nonexistent entries %s\")"},{"line_number":1123,"context_line":"                     % not_deleted_nodes)"},{"line_number":1124,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_406603bc","line":1121,"updated":"2014-05-19 23:20:12.000000000","message":"this comment doesn\u0027t make sense -- nodes that don\u0027t exist couldn\u0027t be removed either way.","commit_id":"eb2b028adbe5f137e8cb0d4f855a95c1fc7ef277"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0ba6362c3df88179ee34141d2826571ae78b77a8","unresolved":false,"context_lines":[{"line_number":1119,"context_line":""},{"line_number":1120,"context_line":"        if not_deleted_nodes:"},{"line_number":1121,"context_line":"            # NOTE(nikitins): No need to remove nodes that do not exist."},{"line_number":1122,"context_line":"            LOG.warn(_(\"Could not delete nonexistent entries %s\")"},{"line_number":1123,"context_line":"                     % not_deleted_nodes)"},{"line_number":1124,"context_line":""},{"line_number":1125,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7adec928_800babd4","line":1122,"updated":"2014-05-19 23:20:12.000000000","message":"this needs more context -- \"When deleting entries for %(search_base)s, could not delete nonexistent entries %(entries)s\"\n\nAlso, let\u0027s limit it to some number of DNs (3 seems good enough to me, and add ... if there\u0027s more), I\u0027m worried it could fill the log if there\u0027s too many.","commit_id":"eb2b028adbe5f137e8cb0d4f855a95c1fc7ef277"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e147ab7ab07394ed261b6c527ae218576c7b18f7","unresolved":false,"context_lines":[{"line_number":1128,"context_line":""},{"line_number":1129,"context_line":"        if not_deleted_nodes:"},{"line_number":1130,"context_line":"            LOG.warn(_(\"When deleting entries for %(search_base)s, could not\""},{"line_number":1131,"context_line":"                       \" delete nonexistent entries %(entries)s%(dots)s\") %"},{"line_number":1132,"context_line":"                     {\u0027search_base\u0027: search_base,"},{"line_number":1133,"context_line":"                      \u0027entries\u0027: not_deleted_nodes[:3],"},{"line_number":1134,"context_line":"                      \u0027dots\u0027: \u0027...\u0027 if len(not_deleted_nodes) \u003e 3 else \u0027\u0027})"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_54ce9084","line":1131,"updated":"2014-05-27 21:28:22.000000000","message":"Logging should never to the string interpolation in the logging call. Instead pass in the values to the logger function. In short, replace the \u0027%\u0027 with a \u0027,\u0027 and pass the dictionary as the second argument to LOG.warn().","commit_id":"deb6f93392c4ac3c19589eff0b3faa78ba6fef87"}],"keystone/identity/backends/ldap.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b265f2aa42d0dcc3b8d4b0e3c7559aa344a454c6","unresolved":false,"context_lines":[{"line_number":278,"context_line":"            # TODO(spzala): this is only placeholder for group and domain"},{"line_number":279,"context_line":"            # role support which will be added under bug 1101287"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"            self.delete_tree_nodes(self._id_to_dn(group_id),"},{"line_number":282,"context_line":"                                   ldap.SCOPE_ONELEVEL)"},{"line_number":283,"context_line":"            super(GroupApi, self).delete(group_id)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAW3%2F%2FxpI%3D","line":281,"updated":"2014-04-10 13:47:49.000000000","message":"In this review, \n\nhttps://review.openstack.org/#/c/86302/2/keystone/assignment/backends/ldap.py\n\nself._ldap_get_list is private, shouldn\u0027t we be doing something similar here?","commit_id":"7d32ace242fccc56bb0ca9359dfccd52173547d2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87a7c96640a0791d5438d68d9dc60286c159e6a8","unresolved":false,"context_lines":[{"line_number":279,"context_line":"            # role support which will be added under bug 1101287"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"            self._delete_tree_nodes(self._id_to_dn(group_id),"},{"line_number":282,"context_line":"                                    ldap.SCOPE_ONELEVEL)"},{"line_number":283,"context_line":"            super(GroupApi, self).delete(group_id)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    def update(self, group_id, values):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAW3%2F%2FiCE%3D","line":282,"updated":"2014-04-13 16:32:07.000000000","message":"we need to keep the attributes\u003d[\u00271.1\u0027] like we had before for efficiency.","commit_id":"332c4986d2d8270a791bc9af271a3ae321c7ae7d"}]}
