)]}'
{"keystone/assignment/__init__.py":[{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a661f584994adc5d7c7bff465231fc0cbaaf3979","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"# flake8: noqa"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Copyright 2012 OpenStack LLC"},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":7,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FqNk%3D","line":4,"updated":"2013-06-25 20:01:55.000000000","message":"2013?","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"4b893ae344f70507dfb38ae18cd729de34e95d59","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"# flake8: noqa"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Copyright 2012 OpenStack LLC"},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":7,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fn3I%3D","line":4,"in_reply_to":"AAAAPn%2F%2FqNk%3D","updated":"2013-06-26 15:48:41.000000000","message":"Done","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"08d4a4a5a12299be6346bea22217dc2d8bfdb2ee","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"# under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.assignment.core import *"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fo6Q%3D","line":18,"updated":"2013-06-26 06:34:36.000000000","message":"I believe  import * in  init is a bad practice","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"20340052a5bc45b30dc158a4c30b21ec503e4395","unresolved":false,"context_lines":[{"line_number":15,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"# under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from keystone.assignment.core import *"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FoHM%3D","line":18,"in_reply_to":"AAAAPn%2F%2Fo6Q%3D","updated":"2013-06-26 14:38:15.000000000","message":"This is how the other modules do it:\n\nhttps://github.com/openstack/keystone/blob/master/keystone/identity/__init__.py\n\nIt says that \"everything in core is in the top level namespace of this package.\"","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b25a3807cf64a2bb3c8426f41503dbfc1a0bc48a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"# flake8: noqa"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Copyright 2012 OpenStack LLC"},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":7,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAP3%2F%2F84M%3D","line":4,"updated":"2013-07-08 17:43:57.000000000","message":"2013\n\nI wish this stuff can be automated in Jenkins. I mean automatically injecting the copyright and license statement at the top of each file.","commit_id":"3a19f450afe8875175da58df073a3409c9f9bb65"}],"keystone/assignment/backends/kvs.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"306e9a98842828aacca3c9e9fbdd6dddba5d83fd","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        roles.remove(role_id)"},{"line_number":154,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d list(roles)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        if not len(roles):"},{"line_number":157,"context_line":"            self.db.delete(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id))"},{"line_number":158,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":159,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2Ftcs%3D","line":156,"updated":"2013-06-24 19:52:45.000000000","message":"If this is a set, do we need to call length? \n\nif not roles should return the same thing as if not len(roles)?","commit_id":"ae1453d9af9e96d7664c9f4d329ad4810a6d421e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ac267b9a116093751c109011c2be9f7d4f76466f","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        roles.remove(role_id)"},{"line_number":154,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d list(roles)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        if not len(roles):"},{"line_number":157,"context_line":"            self.db.delete(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id))"},{"line_number":158,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":159,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FtO8%3D","line":156,"in_reply_to":"AAAAPn%2F%2FtTI%3D","updated":"2013-06-24 21:02:04.000000000","message":"Gotcha, makes sense","commit_id":"ae1453d9af9e96d7664c9f4d329ad4810a6d421e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"bfb6dc918e2b194bfbdfd065152786f0f575a597","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        roles.remove(role_id)"},{"line_number":154,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d list(roles)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        if not len(roles):"},{"line_number":157,"context_line":"            self.db.delete(\u0027metadata-%s-%s\u0027 % (tenant_id, user_id))"},{"line_number":158,"context_line":"            user_ref \u003d self._get_user(user_id)"},{"line_number":159,"context_line":"            tenants \u003d set(user_ref.get(\u0027tenants\u0027, []))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FtTI%3D","line":156,"in_reply_to":"AAAAPn%2F%2Ftcs%3D","updated":"2013-06-24 20:35:19.000000000","message":"Yep.  But this change is just shuffling around code, trying not to make functionality changes.  I would suggest doing that cleanup in a different patch.","commit_id":"ae1453d9af9e96d7664c9f4d329ad4810a6d421e"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a661f584994adc5d7c7bff465231fc0cbaaf3979","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack LLC"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FqNg%3D","line":3,"updated":"2013-06-25 20:01:55.000000000","message":"2012-13 like other?","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"4b893ae344f70507dfb38ae18cd729de34e95d59","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack LLC"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fn3A%3D","line":3,"in_reply_to":"AAAAPn%2F%2FqNg%3D","updated":"2013-06-26 15:48:41.000000000","message":"Done","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"59fc6a3ea64ee6dc1b1da17ee9ad950873d57433","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Assignment(kvs.Base, assignment.Driver):"},{"line_number":25,"context_line":"    def __init__(self, identity):"},{"line_number":26,"context_line":"        super(Assignment, self).__init__(identity.db)"},{"line_number":27,"context_line":"        self.identity \u003d identity"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FjmY%3D","line":25,"updated":"2013-06-27 20:42:35.000000000","message":"I\u0027m wondering why identity needs to be passed in... isn\u0027t the current identity driver available globally?","commit_id":"3d51644dd5c667f98f57cbd6087379736d69743d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5991d36d0c9979323acc211b032075ac65c647c1","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Assignment(kvs.Base, assignment.Driver):"},{"line_number":25,"context_line":"    def __init__(self, identity):"},{"line_number":26,"context_line":"        super(Assignment, self).__init__(identity.db)"},{"line_number":27,"context_line":"        self.identity \u003d identity"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FhoI%3D","line":25,"in_reply_to":"AAAAPn%2F%2FjmY%3D","updated":"2013-06-28 17:07:43.000000000","message":"circular dependency.  One of them needs to be created first.","commit_id":"3d51644dd5c667f98f57cbd6087379736d69743d"}],"keystone/assignment/backends/sql.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"54ffc6f9d3b36218e9d2e229ef1772fdf0f4a4e2","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.identity \u003d identity"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # Internal interface to manage the database"},{"line_number":31,"context_line":"    def db_sync(self, version\u003dNone):"},{"line_number":32,"context_line":"        migration.db_sync(version\u003dversion)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def authorize_for_project(self, user_ref, tenant_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FsVg%3D","line":31,"updated":"2013-06-25 05:59:42.000000000","message":"you need to add this to cli.py","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"4b893ae344f70507dfb38ae18cd729de34e95d59","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        self.identity \u003d identity"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    # Internal interface to manage the database"},{"line_number":31,"context_line":"    def db_sync(self, version\u003dNone):"},{"line_number":32,"context_line":"        migration.db_sync(version\u003dversion)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def authorize_for_project(self, user_ref, tenant_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fn20%3D","line":31,"in_reply_to":"AAAAPn%2F%2FsVg%3D","updated":"2013-06-26 15:48:41.000000000","message":"Done","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"}],"keystone/assignment/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"306e9a98842828aacca3c9e9fbdd6dddba5d83fd","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        \"\"\""},{"line_number":342,"context_line":"        raise exception.NotImplemented()"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"#TODO(ayoung): determine what else these two functions raise"},{"line_number":345,"context_line":"    def delete_user(self, user_id):"},{"line_number":346,"context_line":"        \"\"\"Deletes all assignments for a user."},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FtX0%3D","line":344,"updated":"2013-06-24 19:52:45.000000000","message":"(NIT), should this be # TODO(ayoung)? Thought I saw a change of dolphm\u0027s come through that changed TODOs to be of that format.","commit_id":"ae1453d9af9e96d7664c9f4d329ad4810a6d421e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ac267b9a116093751c109011c2be9f7d4f76466f","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        \"\"\""},{"line_number":342,"context_line":"        raise exception.NotImplemented()"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"#TODO(ayoung): determine what else these two functions raise"},{"line_number":345,"context_line":"    def delete_user(self, user_id):"},{"line_number":346,"context_line":"        \"\"\"Deletes all assignments for a user."},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FtOQ%3D","line":344,"in_reply_to":"AAAAPn%2F%2FtS4%3D","updated":"2013-06-24 21:02:04.000000000","message":"Yep, you\u0027re right. https://review.openstack.org/#/c/30293/\n\nI had my spaces mixed up.","commit_id":"ae1453d9af9e96d7664c9f4d329ad4810a6d421e"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"bfb6dc918e2b194bfbdfd065152786f0f575a597","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        \"\"\""},{"line_number":342,"context_line":"        raise exception.NotImplemented()"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"#TODO(ayoung): determine what else these two functions raise"},{"line_number":345,"context_line":"    def delete_user(self, user_id):"},{"line_number":346,"context_line":"        \"\"\"Deletes all assignments for a user."},{"line_number":347,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAPn%2F%2FtS4%3D","line":344,"in_reply_to":"AAAAPn%2F%2FtX0%3D","updated":"2013-06-24 20:35:19.000000000","message":"I thought this was to proper format","commit_id":"ae1453d9af9e96d7664c9f4d329ad4810a6d421e"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a661f584994adc5d7c7bff465231fc0cbaaf3979","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2012 OpenStack LLC"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FqO0%3D","line":3,"updated":"2013-06-25 20:01:55.000000000","message":"2013?","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"54ffc6f9d3b36218e9d2e229ef1772fdf0f4a4e2","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        \"\"\""},{"line_number":297,"context_line":"        raise exception.NotImplemented()"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    \"\"\"Interface description for an assignment driver.\"\"\""},{"line_number":300,"context_line":"    # role crud"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def create_role(self, role_id, role):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FsYE%3D","line":299,"updated":"2013-06-25 05:59:42.000000000","message":"Floating string?","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"4b893ae344f70507dfb38ae18cd729de34e95d59","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        \"\"\""},{"line_number":297,"context_line":"        raise exception.NotImplemented()"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    \"\"\"Interface description for an assignment driver.\"\"\""},{"line_number":300,"context_line":"    # role crud"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def create_role(self, role_id, role):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fn2g%3D","line":299,"in_reply_to":"AAAAPn%2F%2FsYE%3D","updated":"2013-06-26 15:48:41.000000000","message":"Done","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2657e15d82609c283424c9599b1a71610058e81c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        super(Manager, self).__init__(assignment_driver)"},{"line_number":50,"context_line":"        self.driver.identity_api \u003d identity_api"},{"line_number":51,"context_line":"        self.identity_api \u003d identity_api"},{"line_number":52,"context_line":"        self.identity_api.assignment_api \u003d self"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_roles_for_user_and_project(self, user_id, tenant_id):"},{"line_number":55,"context_line":"        def _get_group_project_roles(user_id, tenant_id):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fs8I%3D","line":52,"updated":"2013-07-12 18:49:20.000000000","message":"seriously wtf","commit_id":"fafdf072f5a34ee12ffe9d7651551c83459759bb"}],"keystone/common/config.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"b25a3807cf64a2bb3c8426f41503dbfc1a0bc48a","unresolved":false,"context_lines":[{"line_number":262,"context_line":"    register_str("},{"line_number":263,"context_line":"        \u0027driver\u0027,"},{"line_number":264,"context_line":"        group\u003d\u0027assignment\u0027,"},{"line_number":265,"context_line":"        default\u003dNone)"},{"line_number":266,"context_line":"    register_str("},{"line_number":267,"context_line":"        \u0027driver\u0027,"},{"line_number":268,"context_line":"        group\u003d\u0027catalog\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAP3%2F%2F8zw%3D","line":265,"updated":"2013-07-08 17:43:57.000000000","message":"no default?","commit_id":"3a19f450afe8875175da58df073a3409c9f9bb65"}],"keystone/common/sql/legacy.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"59fc6a3ea64ee6dc1b1da17ee9ad950873d57433","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            # create"},{"line_number":116,"context_line":"            #print \u0027create_project(%s, %s)\u0027 % (new_dict[\u0027id\u0027], new_dict)"},{"line_number":117,"context_line":"            (self.assignment."},{"line_number":118,"context_line":"             create_project(new_dict[\u0027id\u0027], new_dict))"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _migrate_users(self):"},{"line_number":121,"context_line":"        for x in self._data[\u0027users\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2Fjl4%3D","line":118,"updated":"2013-06-27 20:42:35.000000000","message":"Why split this line?","commit_id":"3d51644dd5c667f98f57cbd6087379736d69743d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5991d36d0c9979323acc211b032075ac65c647c1","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            # create"},{"line_number":116,"context_line":"            #print \u0027create_project(%s, %s)\u0027 % (new_dict[\u0027id\u0027], new_dict)"},{"line_number":117,"context_line":"            (self.assignment."},{"line_number":118,"context_line":"             create_project(new_dict[\u0027id\u0027], new_dict))"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def _migrate_users(self):"},{"line_number":121,"context_line":"        for x in self._data[\u0027users\u0027]:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2Fhnw%3D","line":118,"in_reply_to":"AAAAPn%2F%2Fjl4%3D","updated":"2013-06-28 17:07:43.000000000","message":"undone","commit_id":"3d51644dd5c667f98f57cbd6087379736d69743d"}],"keystone/identity/backends/kvs.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"59fc6a3ea64ee6dc1b1da17ee9ad950873d57433","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        self.assignment \u003d assignments.Assignment(self)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_assignment(self):"},{"line_number":30,"context_line":"        self.assignment \u003d assignments.Assignment(self)"},{"line_number":31,"context_line":"        return self.assignment"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    # Public interface"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2Fjmk%3D","line":30,"updated":"2013-06-27 20:42:35.000000000","message":"why does this reset self.assignment?","commit_id":"3d51644dd5c667f98f57cbd6087379736d69743d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"5991d36d0c9979323acc211b032075ac65c647c1","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        self.assignment \u003d assignments.Assignment(self)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def get_assignment(self):"},{"line_number":30,"context_line":"        self.assignment \u003d assignments.Assignment(self)"},{"line_number":31,"context_line":"        return self.assignment"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    # Public interface"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAPn%2F%2FhnI%3D","line":30,"in_reply_to":"AAAAPn%2F%2Fjmk%3D","updated":"2013-06-28 17:07:43.000000000","message":"removed","commit_id":"3d51644dd5c667f98f57cbd6087379736d69743d"}],"keystone/identity/backends/ldap.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"54ffc6f9d3b36218e9d2e229ef1772fdf0f4a4e2","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.assignment \u003d assignment.Assignment(self)"},{"line_number":58,"context_line":"        return self.assignment"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def create_project(self, project_id, project):"},{"line_number":61,"context_line":"        return self.assignment.create_project(project_id, project)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def get_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FsWQ%3D","line":60,"updated":"2013-06-25 05:59:42.000000000","message":"why do these need to be added back in?","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"4b893ae344f70507dfb38ae18cd729de34e95d59","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.assignment \u003d assignment.Assignment(self)"},{"line_number":58,"context_line":"        return self.assignment"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def create_project(self, project_id, project):"},{"line_number":61,"context_line":"        return self.assignment.create_project(project_id, project)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def get_project(self, project_id):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2Fnwk%3D","line":60,"in_reply_to":"AAAAPn%2F%2FsWQ%3D","updated":"2013-06-26 15:48:41.000000000","message":"The top level functions perform some operations that break the LDAP specific tests.","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":6456,"name":"Sahdev Zala","email":"spzala@us.ibm.com","username":"spzala"},"change_message_id":"a661f584994adc5d7c7bff465231fc0cbaaf3979","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def delete_user(self, user_id):"},{"line_number":136,"context_line":"        user_dn \u003d self.user._id_to_dn(user_id)"},{"line_number":137,"context_line":"        for ref in self.role.list_global_roles_for_user(user_dn):"},{"line_number":138,"context_line":"            self.role.delete_user(ref.role_dn, ref.user_dn, ref.project_dn,"},{"line_number":139,"context_line":"                                  user_id, self.role._dn_to_id(ref.role_dn))"},{"line_number":140,"context_line":"        for ref in self.role.list_project_roles_for_user(user_dn,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FqIQ%3D","line":137,"updated":"2013-06-25 20:01:55.000000000","message":"Hi Adam, Do we still need to delete role? Trying to understand. I thought with this patch, we will only do authentication in LDAP? and no more roles for user and groups? (may be not this patch? or I misunderstood?) Thanks!","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"4b893ae344f70507dfb38ae18cd729de34e95d59","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    def delete_user(self, user_id):"},{"line_number":136,"context_line":"        user_dn \u003d self.user._id_to_dn(user_id)"},{"line_number":137,"context_line":"        for ref in self.role.list_global_roles_for_user(user_dn):"},{"line_number":138,"context_line":"            self.role.delete_user(ref.role_dn, ref.user_dn, ref.project_dn,"},{"line_number":139,"context_line":"                                  user_id, self.role._dn_to_id(ref.role_dn))"},{"line_number":140,"context_line":"        for ref in self.role.list_project_roles_for_user(user_dn,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAPn%2F%2FnwM%3D","line":137,"in_reply_to":"AAAAPn%2F%2FqIQ%3D","updated":"2013-06-26 15:48:41.000000000","message":"There is still a cross over of behavior between Identity and assignments.  LDAP in particular is messy, and needs some special cases.  I\u0027d like to get rid of them long term.  However, in this case, the logic is wrong and needs to be cleaned up any way.  This piece needs to move to the LDAP assignment back end.","commit_id":"9a7dab8225c2fcc18549c33983cc94f435d70b5d"},{"author":{"_account_id":8183,"name":"alexius ludeman","email":"lex-launchpad@lexinator.com","username":"lex"},"change_message_id":"3316c56d84ca792a9a6cc53927ce9bcf12f336f6","unresolved":false,"context_lines":[{"line_number":389,"context_line":"        self.project_dn \u003d tenant_dn"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"# TODO(termie): turn this into a data object and move logic to driver"},{"line_number":393,"context_line":"class RoleApi(common_ldap.BaseLdap):"},{"line_number":394,"context_line":"    DEFAULT_OU \u003d \u0027ou\u003dRoles\u0027"},{"line_number":395,"context_line":"    DEFAULT_STRUCTURAL_CLASSES \u003d []"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FhbI%3D","line":392,"updated":"2013-07-17 01:27:26.000000000","message":"it looks like RoleApi() and ProjectApi() have moved to assignment/backends/ldap.py so these should be removed...","commit_id":"fafdf072f5a34ee12ffe9d7651551c83459759bb"}],"keystone/identity/core.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"563617e95bbd1b0214295fdf91dea9e40af4d131","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __init__(self):"},{"line_number":64,"context_line":"        super(Manager, self).__init__(CONF.identity.driver)"},{"line_number":65,"context_line":"        self.assignment \u003d self.driver.get_assignment()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def authenticate(self, context, user_id\u003dNone,"},{"line_number":68,"context_line":"                     tenant_id\u003dNone, password\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fp2o%3D","line":65,"updated":"2013-06-25 21:43:47.000000000","message":"why get_assignment()? Shouldn\u0027t we be invoking assignment.Manager() instead?","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"20340052a5bc45b30dc158a4c30b21ec503e4395","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def __init__(self):"},{"line_number":64,"context_line":"        super(Manager, self).__init__(CONF.identity.driver)"},{"line_number":65,"context_line":"        self.assignment \u003d self.driver.get_assignment()"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def authenticate(self, context, user_id\u003dNone,"},{"line_number":68,"context_line":"                     tenant_id\u003dNone, password\u003dNone):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FoIA%3D","line":65,"in_reply_to":"AAAAPn%2F%2Fp2o%3D","updated":"2013-06-26 14:38:15.000000000","message":"Interim step, but doing more than this will require new unit tests , and I am trying to keep this patch down to just refactoring.  This is binding the identity and assignment backends to the same backing store, which is necessary to keep from breaking existing deployments.  When we provide a way to configure assignments separate from deployments we will make everything go through Manager.","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"563617e95bbd1b0214295fdf91dea9e40af4d131","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    def update_metadata(self, context, user_id, tenant_id, metadata,"},{"line_number":232,"context_line":"                        domain_id\u003dNone, group_id\u003dNone):"},{"line_number":233,"context_line":"        return (self.assignment.update_metadata"},{"line_number":234,"context_line":"                (user_id, tenant_id, metadata, domain_id, group_id))"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class Driver(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fp4A%3D","line":234,"updated":"2013-06-25 21:43:47.000000000","message":"What are the group assignments omitted? add_user_to_group(), remove_user_from_group(), etc","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"20340052a5bc45b30dc158a4c30b21ec503e4395","unresolved":false,"context_lines":[{"line_number":231,"context_line":"    def update_metadata(self, context, user_id, tenant_id, metadata,"},{"line_number":232,"context_line":"                        domain_id\u003dNone, group_id\u003dNone):"},{"line_number":233,"context_line":"        return (self.assignment.update_metadata"},{"line_number":234,"context_line":"                (user_id, tenant_id, metadata, domain_id, group_id))"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"class Driver(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FoJU%3D","line":234,"in_reply_to":"AAAAPn%2F%2Fp4A%3D","updated":"2013-06-26 14:38:15.000000000","message":"Those are in the identity backend, not in assignments, as they come out of LDAP etc.","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"563617e95bbd1b0214295fdf91dea9e40af4d131","unresolved":false,"context_lines":[{"line_number":237,"context_line":"class Driver(object):"},{"line_number":238,"context_line":"    \"\"\"Interface description for an Identity driver.\"\"\""},{"line_number":239,"context_line":"    def get_assignment(self):"},{"line_number":240,"context_line":"        raise exception.NotImplemented()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def authenticate_user(self, user_id, password):"},{"line_number":243,"context_line":"        \"\"\"Authenticate a given user and password."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fp2c%3D","line":240,"updated":"2013-06-25 21:43:47.000000000","message":"See my previous comment, not sure why this interface is necessary.","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"20340052a5bc45b30dc158a4c30b21ec503e4395","unresolved":false,"context_lines":[{"line_number":237,"context_line":"class Driver(object):"},{"line_number":238,"context_line":"    \"\"\"Interface description for an Identity driver.\"\"\""},{"line_number":239,"context_line":"    def get_assignment(self):"},{"line_number":240,"context_line":"        raise exception.NotImplemented()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def authenticate_user(self, user_id, password):"},{"line_number":243,"context_line":"        \"\"\"Authenticate a given user and password."}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2FoI4%3D","line":240,"in_reply_to":"AAAAPn%2F%2Fp2c%3D","updated":"2013-06-26 14:38:15.000000000","message":"It is a step to avoid breaking current deployments.  Currently, the identity and assignment backends need to cross talk to get certain jobs done, and up until now, that was done doing back end specific logic.  What this does is forces the changes to go through the interface, but still allows the default configuration behavior to be \"if id is in sql, assignments is in sql\" and \"if id is in ldap, assignments are in ldap\"","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"563617e95bbd1b0214295fdf91dea9e40af4d131","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        \"\"\""},{"line_number":324,"context_line":"        raise exception.NotImplemented()"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def get_user_by_name(self, user_name, domain_id):"},{"line_number":327,"context_line":"        \"\"\"Get a user by name."},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"        :returns: user_ref"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAPn%2F%2Fp2A%3D","line":326,"updated":"2013-06-25 21:43:47.000000000","message":"What is this for? Thought we\u0027ve agreed that this types of functionality will be implemented by the get_user() method where name is part of the query parameter.","commit_id":"4e01769020f47f4f5062e42409472df307fd3adf"}],"keystone/token/controllers.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"f99c4027055b80819de457b873a511ca2cd7ab26","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    \"\"\"External authentication is not applicable.\"\"\""},{"line_number":22,"context_line":"    pass"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class Auth(controller.V2Controller):"},{"line_number":26,"context_line":"    def ca_cert(self, context, auth\u003dNone):"},{"line_number":27,"context_line":"        ca_file \u003d open(CONF.signing.ca_certs, \u0027r\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAP3%2F%2F8DA%3D","line":24,"updated":"2013-07-08 21:36:58.000000000","message":"good catch!","commit_id":"504dbc21490a4c7c9291e782c340b915764626ee"}]}
