)]}'
{"etc/keystone.conf.sample":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"90576e30396ac980531ea85b6e178c6e3b3bbe80","unresolved":false,"context_lines":[{"line_number":341,"context_line":"# user_tree_dn \u003d ou\u003dUsers,dc\u003dexample,dc\u003dcom"},{"line_number":342,"context_line":"# user_filter \u003d"},{"line_number":343,"context_line":"# user_objectclass \u003d inetOrgPerson"},{"line_number":344,"context_line":"# user_default_project_id_attribute \u003d"},{"line_number":345,"context_line":"# user_id_attribute \u003d cn"},{"line_number":346,"context_line":"# user_name_attribute \u003d sn"},{"line_number":347,"context_line":"# user_mail_attribute \u003d email"}],"source_content_type":"application/octet-stream","patch_set":14,"id":"AAAAS3%2F%2F0Ro%3D","line":344,"updated":"2013-09-18 18:51:32.000000000","message":"do we continue to support the old config option? (for backwards compatibility)","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"416d9e5c81df3ecf220ddbf4b969bff736454a76","unresolved":false,"context_lines":[{"line_number":341,"context_line":"# user_tree_dn \u003d ou\u003dUsers,dc\u003dexample,dc\u003dcom"},{"line_number":342,"context_line":"# user_filter \u003d"},{"line_number":343,"context_line":"# user_objectclass \u003d inetOrgPerson"},{"line_number":344,"context_line":"# user_default_project_id_attribute \u003d"},{"line_number":345,"context_line":"# user_id_attribute \u003d cn"},{"line_number":346,"context_line":"# user_name_attribute \u003d sn"},{"line_number":347,"context_line":"# user_mail_attribute \u003d email"}],"source_content_type":"application/octet-stream","patch_set":14,"id":"AAAAS3%2F%2Fz%2BY%3D","line":344,"in_reply_to":"AAAAS3%2F%2F0Ro%3D","updated":"2013-09-18 20:18:18.000000000","message":"The old config option did nothing.  LDAP backends were not domain aware, so we explicitly stripped it out every time in either case.  There isn\u0027t a point in maintaining the old option.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"}],"keystone/assignment/backends/kvs.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2ffffc1b7b93a7772d42e07be85841a41dffbeec","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        except exception.NotFound:"},{"line_number":52,"context_line":"            raise exception.ProjectNotFound(project_id\u003dtenant_name)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def get_project_user_ids(self, tenant_id):"},{"line_number":55,"context_line":"        self.get_project(tenant_id)"},{"line_number":56,"context_line":"        user_keys \u003d filter(lambda x: x.startswith(\"user-\"), self.db.keys())"},{"line_number":57,"context_line":"        user_refs \u003d [self.db.get(key) for key in user_keys]"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAS3%2F%2F2nA%3D","line":54,"updated":"2013-09-18 08:07:54.000000000","message":"So Change: https://review.openstack.org/#/c/45584/ (now merged) has removed this function, with \"list_projects_for_user()\" in its place.","commit_id":"d7b2216b9a9ac2e3ac9bc69a2dd10754fea6d8bb"}],"keystone/assignment/backends/ldap.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2ffffc1b7b93a7772d42e07be85841a41dffbeec","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        return [self._set_default_domain(x) for x in"},{"line_number":130,"context_line":"                self.project.get_user_projects(user_dn, associations)]"},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def get_project_user_ids(self, tenant_id):"},{"line_number":133,"context_line":"        self.get_project(tenant_id)"},{"line_number":134,"context_line":"        tenant_dn \u003d self.project._id_to_dn(tenant_id)"},{"line_number":135,"context_line":"        rolegrants \u003d self.role.get_role_assignments(tenant_dn)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAS3%2F%2F2nI%3D","line":132,"updated":"2013-09-18 08:07:54.000000000","message":"So Change: https://review.openstack.org/#/c/45584/ (now merged) has removed this function, with \"list_projects_for_user()\" in its place.","commit_id":"d7b2216b9a9ac2e3ac9bc69a2dd10754fea6d8bb"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"90576e30396ac980531ea85b6e178c6e3b3bbe80","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        self.get_project(tenant_id)"},{"line_number":134,"context_line":"        tenant_dn \u003d self.project._id_to_dn(tenant_id)"},{"line_number":135,"context_line":"        rolegrants \u003d self.role.get_role_assignments(tenant_dn)"},{"line_number":136,"context_line":"        return [self.user._dn_to_id(user_id) for user_id in"},{"line_number":137,"context_line":"                self.project.get_user_dns(tenant_id, rolegrants)]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _subrole_id_to_dn(self, role_id, tenant_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0PU%3D","line":136,"updated":"2013-09-18 18:51:32.000000000","message":"suggest change user_id here to user_dn.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"416d9e5c81df3ecf220ddbf4b969bff736454a76","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        self.get_project(tenant_id)"},{"line_number":134,"context_line":"        tenant_dn \u003d self.project._id_to_dn(tenant_id)"},{"line_number":135,"context_line":"        rolegrants \u003d self.role.get_role_assignments(tenant_dn)"},{"line_number":136,"context_line":"        return [self.user._dn_to_id(user_id) for user_id in"},{"line_number":137,"context_line":"                self.project.get_user_dns(tenant_id, rolegrants)]"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def _subrole_id_to_dn(self, role_id, tenant_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz8M%3D","line":136,"in_reply_to":"AAAAS3%2F%2F0PU%3D","updated":"2013-09-18 20:18:18.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"}],"keystone/assignment/backends/sql.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2ffffc1b7b93a7772d42e07be85841a41dffbeec","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            raise exception.ProjectNotFound(project_id\u003dtenant_name)"},{"line_number":55,"context_line":"        return project_ref.to_dict()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def get_project_user_ids(self, tenant_id):"},{"line_number":58,"context_line":"        session \u003d self.get_session()"},{"line_number":59,"context_line":"        self.get_project(tenant_id)"},{"line_number":60,"context_line":"        query \u003d session.query(UserProjectGrant)"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAS3%2F%2F2nQ%3D","line":57,"updated":"2013-09-18 08:07:54.000000000","message":"So Change: https://review.openstack.org/#/c/45584/ (now merged) has removed this function, with \"list_projects_for_user()\" in its place.","commit_id":"d7b2216b9a9ac2e3ac9bc69a2dd10754fea6d8bb"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a537d088aa1269eeeefcd352f1730c6ce25635e2","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            raise exception.ProjectNotFound(project_id\u003dtenant_name)"},{"line_number":55,"context_line":"        return project_ref.to_dict()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def get_project_user_ids(self, tenant_id):"},{"line_number":58,"context_line":"        session \u003d self.get_session()"},{"line_number":59,"context_line":"        self.get_project(tenant_id)"},{"line_number":60,"context_line":"        query \u003d session.query(UserProjectGrant)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2F2Ow%3D","line":57,"updated":"2013-09-18 09:52:10.000000000","message":"So one thing to ask ourselves, is what is the intention of this method?  Is it to list all the user_ids that have an explicit role on this project? Or is it to list all users_ids that have an effective role on this project (for example, by virtue of group membership)? I suspect it is the latter.  If so, then we need to amend this method to do a similar job to \"list_projects_for_user()\".  However, I think this is probably outside the scope of this change.","commit_id":"523eb0da2c458ceef90af3c50c5ae6a7c66fdef7"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1e957edeafcda493aef3be4caeacf8efe449dde9","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            raise exception.ProjectNotFound(project_id\u003dtenant_name)"},{"line_number":55,"context_line":"        return project_ref.to_dict()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def get_project_user_ids(self, tenant_id):"},{"line_number":58,"context_line":"        session \u003d self.get_session()"},{"line_number":59,"context_line":"        self.get_project(tenant_id)"},{"line_number":60,"context_line":"        query \u003d session.query(UserProjectGrant)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2F0bo%3D","line":57,"in_reply_to":"AAAAS3%2F%2F2Ow%3D","updated":"2013-09-18 18:02:05.000000000","message":"The intention here is to list the ids.  most consumers of this were using a list comprehension to extract the ids.  This is really a v2ism and delete tokens.  I think changing this is outside the scope of this change, but should be revisited in I.","commit_id":"523eb0da2c458ceef90af3c50c5ae6a7c66fdef7"}],"keystone/assignment/core.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2ffffc1b7b93a7772d42e07be85841a41dffbeec","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        \"\"\""},{"line_number":361,"context_line":"        raise exception.NotImplemented()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def get_project_user_ids(self, tenant_id):"},{"line_number":364,"context_line":"        \"\"\"Lists all user ids with a relationship to the specified project."},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :returns: a list of user_ids or an empty set."}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAS3%2F%2F2nc%3D","line":363,"updated":"2013-09-18 08:07:54.000000000","message":"So Change: https://review.openstack.org/#/c/45584/ (now merged) has removed this function, with \"list_projects_for_user()\" in its place.","commit_id":"d7b2216b9a9ac2e3ac9bc69a2dd10754fea6d8bb"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"a537d088aa1269eeeefcd352f1730c6ce25635e2","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        \"\"\""},{"line_number":361,"context_line":"        raise exception.NotImplemented()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def get_project_user_ids(self, tenant_id):"},{"line_number":364,"context_line":"        \"\"\"Lists all user ids with a relationship to the specified project."},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :returns: a list of user_ids or an empty set."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2F2g4%3D","line":363,"updated":"2013-09-18 09:52:10.000000000","message":"How about we call this \"list_users_ids_for_project()\", which then  sits nicely against the existing \"list_projects_for_user()\"?","commit_id":"523eb0da2c458ceef90af3c50c5ae6a7c66fdef7"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1e957edeafcda493aef3be4caeacf8efe449dde9","unresolved":false,"context_lines":[{"line_number":360,"context_line":"        \"\"\""},{"line_number":361,"context_line":"        raise exception.NotImplemented()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def get_project_user_ids(self, tenant_id):"},{"line_number":364,"context_line":"        \"\"\"Lists all user ids with a relationship to the specified project."},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :returns: a list of user_ids or an empty set."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2F0bk%3D","line":363,"in_reply_to":"AAAAS3%2F%2F2g4%3D","updated":"2013-09-18 18:02:05.000000000","message":"done in next patchset.","commit_id":"523eb0da2c458ceef90af3c50c5ae6a7c66fdef7"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"90576e30396ac980531ea85b6e178c6e3b3bbe80","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        raise exception.NotImplemented()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def list_user_ids_for_project(self, tenant_id):"},{"line_number":364,"context_line":"        \"\"\"Lists all user ids with a relationship to the specified project."},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :returns: a list of user_ids or an empty set."},{"line_number":367,"context_line":"        :raises: keystone.exception.ProjectNotFound"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0O0%3D","line":364,"updated":"2013-09-18 18:51:32.000000000","message":"(nit) capitalize IDs\n\nwhat does relationship mean?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"416d9e5c81df3ecf220ddbf4b969bff736454a76","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        raise exception.NotImplemented()"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def list_user_ids_for_project(self, tenant_id):"},{"line_number":364,"context_line":"        \"\"\"Lists all user ids with a relationship to the specified project."},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :returns: a list of user_ids or an empty set."},{"line_number":367,"context_line":"        :raises: keystone.exception.ProjectNotFound"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz78%3D","line":364,"in_reply_to":"AAAAS3%2F%2F0O0%3D","updated":"2013-09-18 20:18:18.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b610b222ec1de3dfdbbbb98d64696e1f8de0cbd6","unresolved":false,"context_lines":[{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def list_user_ids_for_project(self, tenant_id):"},{"line_number":364,"context_line":"        \"\"\"Lists all user IDs with a role assignment in the specified project."},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"        :returns: a list of user_ids or an empty set."},{"line_number":367,"context_line":"        :raises: keystone.exception.ProjectNotFound"},{"line_number":368,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAS3%2F%2FtWU%3D","line":365,"updated":"2013-09-20 20:22:55.000000000","message":"(NIT): this is picky but since we are documenting the return and raise values, we should probably be consistent and doc the parameter (tenant_id) as well. Thought?","commit_id":"54585bbcd680b00b8334a1f2ffedbd45a7cbc440"}],"keystone/auth/plugins/password.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            LOG.exception(e)"},{"line_number":95,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":96,"context_line":"        self._assert_user_is_enabled(user_ref)"},{"line_number":97,"context_line":"        self.user_ref \u003d V3Controller.normalize_default_project_id(user_ref)"},{"line_number":98,"context_line":"        self.user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":99,"context_line":"        self.domain_id \u003d domain_ref[\u0027id\u0027]"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0Fw%3D","line":97,"updated":"2013-09-18 20:53:05.000000000","message":"why do we need to do this? add a comment.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            LOG.exception(e)"},{"line_number":95,"context_line":"            raise exception.Unauthorized(e)"},{"line_number":96,"context_line":"        self._assert_user_is_enabled(user_ref)"},{"line_number":97,"context_line":"        self.user_ref \u003d V3Controller.normalize_default_project_id(user_ref)"},{"line_number":98,"context_line":"        self.user_id \u003d user_ref[\u0027id\u0027]"},{"line_number":99,"context_line":"        self.domain_id \u003d domain_ref[\u0027id\u0027]"},{"line_number":100,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzLg%3D","line":97,"in_reply_to":"AAAAS3%2F%2F0Fw%3D","updated":"2013-09-19 01:10:54.000000000","message":"It appears to not be required.  removed.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"}],"keystone/common/config.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        cfg.StrOpt(\u0027user_pass_attribute\u0027, default\u003d\u0027userPassword\u0027),"},{"line_number":180,"context_line":"        cfg.StrOpt(\u0027user_enabled_attribute\u0027, default\u003d\u0027enabled\u0027),"},{"line_number":181,"context_line":"        cfg.StrOpt(\u0027user_default_project_id_attribute\u0027,"},{"line_number":182,"context_line":"                   default\u003d\u0027businessCategory\u0027),"},{"line_number":183,"context_line":"        cfg.IntOpt(\u0027user_enabled_mask\u0027, default\u003d0),"},{"line_number":184,"context_line":"        cfg.StrOpt(\u0027user_enabled_default\u0027, default\u003d\u0027True\u0027),"},{"line_number":185,"context_line":"        cfg.ListOpt(\u0027user_attribute_ignore\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0FU%3D","line":182,"updated":"2013-09-18 20:53:05.000000000","message":"why businessCategory? It made more sense for domains because needed something that worked with both inetOrgPerson and groupOfNames, but default_project_id is user-only. There\u0027s no good choice... how about departmentNumber .","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        cfg.StrOpt(\u0027user_pass_attribute\u0027, default\u003d\u0027userPassword\u0027),"},{"line_number":180,"context_line":"        cfg.StrOpt(\u0027user_enabled_attribute\u0027, default\u003d\u0027enabled\u0027),"},{"line_number":181,"context_line":"        cfg.StrOpt(\u0027user_default_project_id_attribute\u0027,"},{"line_number":182,"context_line":"                   default\u003d\u0027businessCategory\u0027),"},{"line_number":183,"context_line":"        cfg.IntOpt(\u0027user_enabled_mask\u0027, default\u003d0),"},{"line_number":184,"context_line":"        cfg.StrOpt(\u0027user_enabled_default\u0027, default\u003d\u0027True\u0027),"},{"line_number":185,"context_line":"        cfg.ListOpt(\u0027user_attribute_ignore\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzqk%3D","line":182,"in_reply_to":"AAAAS3%2F%2F0FU%3D","updated":"2013-09-19 01:10:54.000000000","message":"This is now None.  If someone wants to use it, they need to explicitly map it first.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        cfg.IntOpt(\u0027user_enabled_mask\u0027, default\u003d0),"},{"line_number":184,"context_line":"        cfg.StrOpt(\u0027user_enabled_default\u0027, default\u003d\u0027True\u0027),"},{"line_number":185,"context_line":"        cfg.ListOpt(\u0027user_attribute_ignore\u0027,"},{"line_number":186,"context_line":"                    default\u003d\u0027default_project_id,tenants\u0027),"},{"line_number":187,"context_line":"        cfg.BoolOpt(\u0027user_allow_create\u0027, default\u003dTrue),"},{"line_number":188,"context_line":"        cfg.BoolOpt(\u0027user_allow_update\u0027, default\u003dTrue),"},{"line_number":189,"context_line":"        cfg.BoolOpt(\u0027user_allow_delete\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0Ec%3D","line":186,"updated":"2013-09-18 20:53:05.000000000","message":"btw - what\u0027s tenants, is it some user property?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":183,"context_line":"        cfg.IntOpt(\u0027user_enabled_mask\u0027, default\u003d0),"},{"line_number":184,"context_line":"        cfg.StrOpt(\u0027user_enabled_default\u0027, default\u003d\u0027True\u0027),"},{"line_number":185,"context_line":"        cfg.ListOpt(\u0027user_attribute_ignore\u0027,"},{"line_number":186,"context_line":"                    default\u003d\u0027default_project_id,tenants\u0027),"},{"line_number":187,"context_line":"        cfg.BoolOpt(\u0027user_allow_create\u0027, default\u003dTrue),"},{"line_number":188,"context_line":"        cfg.BoolOpt(\u0027user_allow_update\u0027, default\u003dTrue),"},{"line_number":189,"context_line":"        cfg.BoolOpt(\u0027user_allow_delete\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzpI%3D","line":186,"in_reply_to":"AAAAS3%2F%2F0Ec%3D","updated":"2013-09-19 01:10:54.000000000","message":"Not sure.  I wanted to leave that in since it was there before hand.  I figure this can be chased down/removed in I when we do further cleanup.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        cfg.StrOpt(\u0027tenant_name_attribute\u0027, default\u003d\u0027ou\u0027),"},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027tenant_desc_attribute\u0027, default\u003d\u0027description\u0027),"},{"line_number":202,"context_line":"        cfg.StrOpt(\u0027tenant_enabled_attribute\u0027, default\u003d\u0027enabled\u0027),"},{"line_number":203,"context_line":"        cfg.StrOpt(\u0027tenant_domain_id_attribute\u0027, default\u003dNone),"},{"line_number":204,"context_line":"        cfg.ListOpt(\u0027tenant_attribute_ignore\u0027, default\u003d\u0027\u0027),"},{"line_number":205,"context_line":"        cfg.BoolOpt(\u0027tenant_allow_create\u0027, default\u003dTrue),"},{"line_number":206,"context_line":"        cfg.BoolOpt(\u0027tenant_allow_update\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0EQ%3D","line":203,"updated":"2013-09-18 20:53:05.000000000","message":"why changing this? doesn\u0027t it cause a problem with existing deployments?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        cfg.StrOpt(\u0027tenant_name_attribute\u0027, default\u003d\u0027ou\u0027),"},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027tenant_desc_attribute\u0027, default\u003d\u0027description\u0027),"},{"line_number":202,"context_line":"        cfg.StrOpt(\u0027tenant_enabled_attribute\u0027, default\u003d\u0027enabled\u0027),"},{"line_number":203,"context_line":"        cfg.StrOpt(\u0027tenant_domain_id_attribute\u0027, default\u003dNone),"},{"line_number":204,"context_line":"        cfg.ListOpt(\u0027tenant_attribute_ignore\u0027, default\u003d\u0027\u0027),"},{"line_number":205,"context_line":"        cfg.BoolOpt(\u0027tenant_allow_create\u0027, default\u003dTrue),"},{"line_number":206,"context_line":"        cfg.BoolOpt(\u0027tenant_allow_update\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzqI%3D","line":203,"in_reply_to":"AAAAS3%2F%2F0EQ%3D","updated":"2013-09-19 01:10:54.000000000","message":"Good catch.  this one shouldn\u0027t have been changed.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        cfg.StrOpt(\u0027tenant_name_attribute\u0027, default\u003d\u0027ou\u0027),"},{"line_number":200,"context_line":"        cfg.StrOpt(\u0027tenant_desc_attribute\u0027, default\u003d\u0027description\u0027),"},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027tenant_enabled_attribute\u0027, default\u003d\u0027enabled\u0027),"},{"line_number":202,"context_line":"        cfg.StrOpt(\u0027tenant_domain_id_attribute\u0027, default\u003d\u0027businessCategory\u0027),"},{"line_number":203,"context_line":"        cfg.ListOpt(\u0027tenant_attribute_ignore\u0027, default\u003d\u0027\u0027),"},{"line_number":204,"context_line":"        cfg.BoolOpt(\u0027tenant_allow_create\u0027, default\u003dTrue),"},{"line_number":205,"context_line":"        cfg.BoolOpt(\u0027tenant_allow_update\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwhQ%3D","line":202,"updated":"2013-09-19 20:34:05.000000000","message":"(nit) revert whitespace change","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b2f422390db77d59ecd5bf6bb531c1c31d24af4","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        cfg.StrOpt(\u0027tenant_name_attribute\u0027, default\u003d\u0027ou\u0027),"},{"line_number":200,"context_line":"        cfg.StrOpt(\u0027tenant_desc_attribute\u0027, default\u003d\u0027description\u0027),"},{"line_number":201,"context_line":"        cfg.StrOpt(\u0027tenant_enabled_attribute\u0027, default\u003d\u0027enabled\u0027),"},{"line_number":202,"context_line":"        cfg.StrOpt(\u0027tenant_domain_id_attribute\u0027, default\u003d\u0027businessCategory\u0027),"},{"line_number":203,"context_line":"        cfg.ListOpt(\u0027tenant_attribute_ignore\u0027, default\u003d\u0027\u0027),"},{"line_number":204,"context_line":"        cfg.BoolOpt(\u0027tenant_allow_create\u0027, default\u003dTrue),"},{"line_number":205,"context_line":"        cfg.BoolOpt(\u0027tenant_allow_update\u0027, default\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwKI%3D","line":202,"in_reply_to":"AAAAS3%2F%2FwhQ%3D","updated":"2013-09-20 01:11:40.000000000","message":"Done","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"947d93d1b61f69c8cc91c1c40e9d36048b0d8f2e","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        cfg.StrOpt(\u0027user_enabled_attribute\u0027, default\u003d\u0027enabled\u0027),"},{"line_number":181,"context_line":"        cfg.StrOpt(\u0027user_domain_id_attribute\u0027,"},{"line_number":182,"context_line":"                   default\u003d\u0027businessCategory\u0027),"},{"line_number":183,"context_line":"        cfg.StrOpt(\u0027user_default_project_id_attribute\u0027, default\u003dNone),"},{"line_number":184,"context_line":"        cfg.IntOpt(\u0027user_enabled_mask\u0027, default\u003d0),"},{"line_number":185,"context_line":"        cfg.StrOpt(\u0027user_enabled_default\u0027, default\u003d\u0027True\u0027),"},{"line_number":186,"context_line":"        cfg.ListOpt(\u0027user_attribute_ignore\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FuVk%3D","line":183,"updated":"2013-09-20 15:36:18.000000000","message":"(nit) move this to after line 187. It will be a little easier to maintain keystone.conf.sample and config.py if the options are in the same order in both.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e33188808be0c826052fe60c30c8095b3daaf42a","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        cfg.StrOpt(\u0027user_enabled_attribute\u0027, default\u003d\u0027enabled\u0027),"},{"line_number":181,"context_line":"        cfg.StrOpt(\u0027user_domain_id_attribute\u0027,"},{"line_number":182,"context_line":"                   default\u003d\u0027businessCategory\u0027),"},{"line_number":183,"context_line":"        cfg.StrOpt(\u0027user_default_project_id_attribute\u0027, default\u003dNone),"},{"line_number":184,"context_line":"        cfg.IntOpt(\u0027user_enabled_mask\u0027, default\u003d0),"},{"line_number":185,"context_line":"        cfg.StrOpt(\u0027user_enabled_default\u0027, default\u003d\u0027True\u0027),"},{"line_number":186,"context_line":"        cfg.ListOpt(\u0027user_attribute_ignore\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FtxQ%3D","line":183,"in_reply_to":"AAAAS3%2F%2FuVk%3D","updated":"2013-09-20 18:14:44.000000000","message":"Done","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"}],"keystone/common/controller.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        return ref"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @classmethod"},{"line_number":243,"context_line":"    def normalize_default_project_id(cls, ref):"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        def _format_default_project_id(ref):"},{"line_number":246,"context_line":"            ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0Do%3D","line":243,"updated":"2013-09-18 20:53:05.000000000","message":"I don\u0027t see cls used in this function. Suggest make it a staticmethod.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        return ref"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @classmethod"},{"line_number":243,"context_line":"    def normalize_default_project_id(cls, ref):"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        def _format_default_project_id(ref):"},{"line_number":246,"context_line":"            ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzos%3D","line":243,"in_reply_to":"AAAAS3%2F%2F0Do%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            ref \u003d ref.copy()"},{"line_number":247,"context_line":"            default_project_id \u003d ref.pop(\u0027default_project_id\u0027, None)"},{"line_number":248,"context_line":"            if default_project_id is not None:"},{"line_number":249,"context_line":"                ref[\u0027tenantId\u0027] \u003d default_project_id"},{"line_number":250,"context_line":"            return ref"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        if isinstance(ref, dict):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0C8%3D","line":249,"updated":"2013-09-18 20:53:05.000000000","message":"what if ref already has a tenantId? Should it get overridden?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":246,"context_line":"            ref \u003d ref.copy()"},{"line_number":247,"context_line":"            default_project_id \u003d ref.pop(\u0027default_project_id\u0027, None)"},{"line_number":248,"context_line":"            if default_project_id is not None:"},{"line_number":249,"context_line":"                ref[\u0027tenantId\u0027] \u003d default_project_id"},{"line_number":250,"context_line":"            return ref"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        if isinstance(ref, dict):"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzow%3D","line":249,"in_reply_to":"AAAAS3%2F%2F0C8%3D","updated":"2013-09-19 01:10:54.000000000","message":"default_project_id is the V3 mechanism, I\u0027ve erred on the side of always letting that one win in the case of a conflict.  So in short, yes, it would be overwritten.\n\nIn the case of a SQL ID backend, we pull that out in the migration and put it into the default_project_id column.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        return ref"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    @classmethod"},{"line_number":405,"context_line":"    def normalize_default_project_id(cls, ref):"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        def _format_default_project_id(ref):"},{"line_number":408,"context_line":"            ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0DM%3D","line":405,"updated":"2013-09-18 20:53:05.000000000","message":"I don\u0027t see cls used in this function. Suggest make it a staticmethod.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        return ref"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    @classmethod"},{"line_number":405,"context_line":"    def normalize_default_project_id(cls, ref):"},{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        def _format_default_project_id(ref):"},{"line_number":408,"context_line":"            ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzog%3D","line":405,"in_reply_to":"AAAAS3%2F%2F0DM%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        def _format_default_project_id(ref):"},{"line_number":408,"context_line":"            ref \u003d ref.copy()"},{"line_number":409,"context_line":"            if ref.get(\u0027default_project_id\u0027) is None:"},{"line_number":410,"context_line":"                ref.pop(\u0027default_project_id\u0027, None)"},{"line_number":411,"context_line":"            return ref"},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0CI%3D","line":409,"updated":"2013-09-18 20:53:05.000000000","message":"why need to do this? Add a comment.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":406,"context_line":""},{"line_number":407,"context_line":"        def _format_default_project_id(ref):"},{"line_number":408,"context_line":"            ref \u003d ref.copy()"},{"line_number":409,"context_line":"            if ref.get(\u0027default_project_id\u0027) is None:"},{"line_number":410,"context_line":"                ref.pop(\u0027default_project_id\u0027, None)"},{"line_number":411,"context_line":"            return ref"},{"line_number":412,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzng%3D","line":409,"in_reply_to":"AAAAS3%2F%2F0CI%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        return ref"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @staticmethod"},{"line_number":243,"context_line":"    def normalize_default_project_id(ref):"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        def _format_default_project_id(ref):"},{"line_number":246,"context_line":"            ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwhI%3D","line":243,"updated":"2013-09-19 20:34:05.000000000","message":"add a comment what this is for.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b2f422390db77d59ecd5bf6bb531c1c31d24af4","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        return ref"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    @staticmethod"},{"line_number":243,"context_line":"    def normalize_default_project_id(ref):"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"        def _format_default_project_id(ref):"},{"line_number":246,"context_line":"            ref \u003d ref.copy()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwJ8%3D","line":243,"in_reply_to":"AAAAS3%2F%2FwhI%3D","updated":"2013-09-20 01:11:40.000000000","message":"Done","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                # NOTE(morganfainberg): Don\u0027t leave the default_project_id on"},{"line_number":411,"context_line":"                # the ref if it is None. Previous behavior was to not have the"},{"line_number":412,"context_line":"                # default_project_id or tenantId if it didn\u0027t exist. With"},{"line_number":413,"context_line":"                # default_project_id being a column in the SQL backend, we"},{"line_number":414,"context_line":"                # should remove it if it is None (empty) to mirror previous"},{"line_number":415,"context_line":"                # behavior."},{"line_number":416,"context_line":"                ref.pop(\u0027default_project_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2Fwj0%3D","line":413,"updated":"2013-09-19 20:34:05.000000000","message":"seems like the SQL backend should take care of this, and the controller shouldn\u0027t have to know anything about what\u0027s going on with the different backends.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b2f422390db77d59ecd5bf6bb531c1c31d24af4","unresolved":false,"context_lines":[{"line_number":410,"context_line":"                # NOTE(morganfainberg): Don\u0027t leave the default_project_id on"},{"line_number":411,"context_line":"                # the ref if it is None. Previous behavior was to not have the"},{"line_number":412,"context_line":"                # default_project_id or tenantId if it didn\u0027t exist. With"},{"line_number":413,"context_line":"                # default_project_id being a column in the SQL backend, we"},{"line_number":414,"context_line":"                # should remove it if it is None (empty) to mirror previous"},{"line_number":415,"context_line":"                # behavior."},{"line_number":416,"context_line":"                ref.pop(\u0027default_project_id\u0027, None)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwCk%3D","line":413,"in_reply_to":"AAAAS3%2F%2Fwj0%3D","updated":"2013-09-20 01:11:40.000000000","message":"Done","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"947d93d1b61f69c8cc91c1c40e9d36048b0d8f2e","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        return ref"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    @staticmethod"},{"line_number":244,"context_line":"    def v3_to_v2_user(ref):"},{"line_number":245,"context_line":"        \"\"\"Convert a user_ref from v3 to v2 compatible."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        * v2.0 users are not domain aware, and should have domain_id removed"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FuVE%3D","line":244,"updated":"2013-09-20 15:36:18.000000000","message":"This is beautiful. Wish there were a few testcases that called it directly (because this has to work correctly for v2 to be correct).","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e33188808be0c826052fe60c30c8095b3daaf42a","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        return ref"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"    @staticmethod"},{"line_number":244,"context_line":"    def v3_to_v2_user(ref):"},{"line_number":245,"context_line":"        \"\"\"Convert a user_ref from v3 to v2 compatible."},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        * v2.0 users are not domain aware, and should have domain_id removed"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FtxA%3D","line":244,"in_reply_to":"AAAAS3%2F%2FuVE%3D","updated":"2013-09-20 18:14:44.000000000","message":"I figured that this was exercised by a lot of test code; but you are correct it is much better to directly test this as well.  I\u0027ll add a couple specific tests. Thanks for the recommendation.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"}],"keystone/common/ldap/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    def search_s(self, dn, scope, query, attrlist\u003dNone):"},{"line_number":545,"context_line":"        filtered_attrlist \u003d [attr for attr in attrlist if attr is not None]"},{"line_number":546,"context_line":"        attrlist \u003d filtered_attrlist"},{"line_number":547,"context_line":"        LOG.debug(_("},{"line_number":548,"context_line":"            \u0027LDAP search: dn\u003d%(dn)s, scope\u003d%(scope)s, query\u003d%(query)s, \u0027"},{"line_number":549,"context_line":"            \u0027attrs\u003d%(attrlist)s\u0027) % {"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0CE%3D","line":546,"updated":"2013-09-18 20:53:05.000000000","message":"can this be done in 1 line?\n\n attrlist \u003d [attr for attr in attrlist if attr is not None]","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    def search_s(self, dn, scope, query, attrlist\u003dNone):"},{"line_number":545,"context_line":"        filtered_attrlist \u003d [attr for attr in attrlist if attr is not None]"},{"line_number":546,"context_line":"        attrlist \u003d filtered_attrlist"},{"line_number":547,"context_line":"        LOG.debug(_("},{"line_number":548,"context_line":"            \u0027LDAP search: dn\u003d%(dn)s, scope\u003d%(scope)s, query\u003d%(query)s, \u0027"},{"line_number":549,"context_line":"            \u0027attrs\u003d%(attrlist)s\u0027) % {"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FziE%3D","line":546,"in_reply_to":"AAAAS3%2F%2F0CE%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":542,"context_line":"        return self.conn.add_s(dn, ldap_attrs)"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    def search_s(self, dn, scope, query, attrlist\u003dNone):"},{"line_number":545,"context_line":"        attrlist \u003d [attr for attr in attrlist if attr is not None]"},{"line_number":546,"context_line":"        LOG.debug(_("},{"line_number":547,"context_line":"            \u0027LDAP search: dn\u003d%(dn)s, scope\u003d%(scope)s, query\u003d%(query)s, \u0027"},{"line_number":548,"context_line":"            \u0027attrs\u003d%(attrlist)s\u0027) % {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwgY%3D","line":545,"updated":"2013-09-19 20:34:05.000000000","message":"add a comment why need to do this since it\u0027s not obvious.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b2f422390db77d59ecd5bf6bb531c1c31d24af4","unresolved":false,"context_lines":[{"line_number":542,"context_line":"        return self.conn.add_s(dn, ldap_attrs)"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"    def search_s(self, dn, scope, query, attrlist\u003dNone):"},{"line_number":545,"context_line":"        attrlist \u003d [attr for attr in attrlist if attr is not None]"},{"line_number":546,"context_line":"        LOG.debug(_("},{"line_number":547,"context_line":"            \u0027LDAP search: dn\u003d%(dn)s, scope\u003d%(scope)s, query\u003d%(query)s, \u0027"},{"line_number":548,"context_line":"            \u0027attrs\u003d%(attrlist)s\u0027) % {"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwJ4%3D","line":545,"in_reply_to":"AAAAS3%2F%2FwgY%3D","updated":"2013-09-20 01:11:40.000000000","message":"Done","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"}],"keystone/common/models.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        password"},{"line_number":95,"context_line":"        description"},{"line_number":96,"context_line":"        email"},{"line_number":97,"context_line":"        enabled (bool, default True)"},{"line_number":98,"context_line":"    \"\"\""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    required_keys \u003d (\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0Ag%3D","line":97,"updated":"2013-09-18 20:53:05.000000000","message":"add default_project_id ... not sure why this information is duplicated, but it is.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        password"},{"line_number":95,"context_line":"        description"},{"line_number":96,"context_line":"        email"},{"line_number":97,"context_line":"        enabled (bool, default True)"},{"line_number":98,"context_line":"    \"\"\""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    required_keys \u003d (\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzLs%3D","line":97,"in_reply_to":"AAAAS3%2F%2F0Ag%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"}],"keystone/common/sql/migrate_repo/versions/034_add_default_project_id_column_to_user.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f0bc2fc6761fe1033fd91650c7e7f9b1eae67aa5","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import sqlalchemy as sql"},{"line_number":20,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def migrate_default_project_from_json(meta, migrate_engine):"},{"line_number":24,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FEnk%3D","line":22,"updated":"2013-09-12 14:58:44.000000000","message":"i\u0027m guessing one of the user.extra references here caused the last jenkins failure?","commit_id":"d9a10454ab0c666c4fb09eff77174796ad718715"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":23,"context_line":"def migrate_default_project_from_json(meta, migrate_engine):"},{"line_number":24,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    user_list \u003d list(user_table.select().execute())"},{"line_number":27,"context_line":"    session \u003d sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":28,"context_line":"    for user in user_list:"},{"line_number":29,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0BI%3D","line":26,"updated":"2013-09-18 20:53:05.000000000","message":"is list() necessary here?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"def migrate_default_project_from_json(meta, migrate_engine):"},{"line_number":24,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    user_list \u003d list(user_table.select().execute())"},{"line_number":27,"context_line":"    session \u003d sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":28,"context_line":"    for user in user_list:"},{"line_number":29,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzL4%3D","line":26,"in_reply_to":"AAAAS3%2F%2F0BI%3D","updated":"2013-09-19 01:10:54.000000000","message":"Looks like not.  Removing.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            # NOTE(morganfainberg): Somehow we have non-json data here.  This"},{"line_number":36,"context_line":"            # is a broken user, but it was broken beforehand.  Cleaning it up"},{"line_number":37,"context_line":"            # is not in the scope of this migration."},{"line_number":38,"context_line":"            continue"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        values \u003d {}"},{"line_number":41,"context_line":"        if default_project_id is not None:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2F0A4%3D","line":38,"updated":"2013-09-18 20:53:05.000000000","message":"should we log a warning or something?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":35,"context_line":"            # NOTE(morganfainberg): Somehow we have non-json data here.  This"},{"line_number":36,"context_line":"            # is a broken user, but it was broken beforehand.  Cleaning it up"},{"line_number":37,"context_line":"            # is not in the scope of this migration."},{"line_number":38,"context_line":"            continue"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        values \u003d {}"},{"line_number":41,"context_line":"        if default_project_id is not None:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzL0%3D","line":38,"in_reply_to":"AAAAS3%2F%2F0A4%3D","updated":"2013-09-19 01:10:54.000000000","message":"I don\u0027t think it is required.  The user would likely cause other issues across keystone long before we got here if it was used.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        elif v2_tenant_id is not None:"},{"line_number":44,"context_line":"            values[\u0027default_project_id\u0027] \u003d v2_tenant_id"},{"line_number":45,"context_line":"        elif alt_v2_tenant_id is not None:"},{"line_number":46,"context_line":"            values[\u0027default_project_id\u0027] \u003d alt_v2_tenant_id"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        values[\u0027extra\u0027] \u003d json.dumps(data)"},{"line_number":49,"context_line":"        update \u003d user_table.update().where("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz%2FE%3D","line":46,"updated":"2013-09-18 20:53:05.000000000","message":"what if the user has more than 1 of default_project_id, tenantId, or tenant_id and they\u0027re all different? add a unit test.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        elif v2_tenant_id is not None:"},{"line_number":44,"context_line":"            values[\u0027default_project_id\u0027] \u003d v2_tenant_id"},{"line_number":45,"context_line":"        elif alt_v2_tenant_id is not None:"},{"line_number":46,"context_line":"            values[\u0027default_project_id\u0027] \u003d alt_v2_tenant_id"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        values[\u0027extra\u0027] \u003d json.dumps(data)"},{"line_number":49,"context_line":"        update \u003d user_table.update().where("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzgs%3D","line":46,"in_reply_to":"AAAAS3%2F%2Fz%2FE%3D","updated":"2013-09-19 01:10:54.000000000","message":"I\u0027ve erred on the side of always accepting the V3 version as the correct version when dealing with multiples.  This continues here and we clean out the mishmash of options to represent the same data.  At the very least, v2 tenantId and v3 default_project_id should be smashed down.\n\nOrder of selection:\ndefault_project_id\ntenantId\ntenant_id (this is a strange one that likely shouldn\u0027t have occurred, but was referenced in some places)\n\nI am not sure what a unit test here would show, this is a fairly straightforward if/elif/elif block.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        values[\u0027extra\u0027] \u003d json.dumps(data)"},{"line_number":49,"context_line":"        update \u003d user_table.update().where("},{"line_number":50,"context_line":"            user_table.c.id \u003d\u003d user[\u0027id\u0027]).values(values)"},{"line_number":51,"context_line":"        migrate_engine.execute(update)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    session.commit()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz%2FY%3D","line":50,"updated":"2013-09-18 20:53:05.000000000","message":"seems like if the user didn\u0027t have default_project_id, tenantId, or tenant_id, then should not do the update.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        values[\u0027extra\u0027] \u003d json.dumps(data)"},{"line_number":49,"context_line":"        update \u003d user_table.update().where("},{"line_number":50,"context_line":"            user_table.c.id \u003d\u003d user[\u0027id\u0027]).values(values)"},{"line_number":51,"context_line":"        migrate_engine.execute(update)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    session.commit()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzhQ%3D","line":50,"in_reply_to":"AAAAS3%2F%2Fz%2FY%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":57,"context_line":"def migrate_default_project_to_json(meta, migrate_engine):"},{"line_number":58,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    user_list \u003d list(user_table.select().execute())"},{"line_number":61,"context_line":"    session \u003d sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":62,"context_line":"    for user in user_list:"},{"line_number":63,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz%2FA%3D","line":60,"updated":"2013-09-18 20:53:05.000000000","message":"is list() necessary here?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"def migrate_default_project_to_json(meta, migrate_engine):"},{"line_number":58,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    user_list \u003d list(user_table.select().execute())"},{"line_number":61,"context_line":"    session \u003d sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":62,"context_line":"    for user in user_list:"},{"line_number":63,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzMA%3D","line":60,"in_reply_to":"AAAAS3%2F%2Fz%2FA%3D","updated":"2013-09-19 01:10:54.000000000","message":"Looks like not.  Removing.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        # NOTE(morganfainberg): We don\u0027t really know what the original \u0027extra\u0027"},{"line_number":72,"context_line":"        # property was here.  Go with the V3 version. We should backport"},{"line_number":73,"context_line":"        # a compatability fix to previous releases so that v2.0 user_get"},{"line_number":74,"context_line":"        # can return tenantId instead of default_project_id"},{"line_number":75,"context_line":"        if user.default_project_id is not None:"},{"line_number":76,"context_line":"            data[\u0027default_project_id\u0027] \u003d user.default_project_id"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz%2Bc%3D","line":74,"updated":"2013-09-18 20:53:05.000000000","message":"suggest put all 3 in, then client can use tenantId, tenant_id, or default_project_id as they want.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        # NOTE(morganfainberg): We don\u0027t really know what the original \u0027extra\u0027"},{"line_number":72,"context_line":"        # property was here.  Go with the V3 version. We should backport"},{"line_number":73,"context_line":"        # a compatability fix to previous releases so that v2.0 user_get"},{"line_number":74,"context_line":"        # can return tenantId instead of default_project_id"},{"line_number":75,"context_line":"        if user.default_project_id is not None:"},{"line_number":76,"context_line":"            data[\u0027default_project_id\u0027] \u003d user.default_project_id"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzhk%3D","line":74,"in_reply_to":"AAAAS3%2F%2Fz%2Bc%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done, though tenant_id will be omitted as this was just cleanup in the case it snuck through (it was referenced in a couple places but not part of the spec).","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        values \u003d {\u0027extra\u0027: json.dumps(data)}"},{"line_number":79,"context_line":"        update \u003d user_table.update().where("},{"line_number":80,"context_line":"            user_table.c.id \u003d\u003d user.id).values(values)"},{"line_number":81,"context_line":"        migrate_engine.execute(update)"},{"line_number":82,"context_line":"    session.commit()"},{"line_number":83,"context_line":"    session.close()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz%2BA%3D","line":80,"updated":"2013-09-18 20:53:05.000000000","message":"suggest don\u0027t do update if the value didn\u0027t change.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        values \u003d {\u0027extra\u0027: json.dumps(data)}"},{"line_number":79,"context_line":"        update \u003d user_table.update().where("},{"line_number":80,"context_line":"            user_table.c.id \u003d\u003d user.id).values(values)"},{"line_number":81,"context_line":"        migrate_engine.execute(update)"},{"line_number":82,"context_line":"    session.commit()"},{"line_number":83,"context_line":"    session.close()"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzhM%3D","line":80,"in_reply_to":"AAAAS3%2F%2Fz%2BA%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":91,"context_line":"    default_project_id \u003d sql.Column(\u0027default_project_id\u0027, sql.String(64),"},{"line_number":92,"context_line":"                                    nullable\u003dTrue)"},{"line_number":93,"context_line":"    user_table.create_column(default_project_id)"},{"line_number":94,"context_line":"    migrate_default_project_from_json(meta, migrate_engine)"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz98%3D","line":92,"updated":"2013-09-18 20:53:05.000000000","message":"remove nullable\u003dTrue since it\u0027s the default, and it wasn\u0027t used in keystone/identity/backends/sql.py","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":91,"context_line":"    default_project_id \u003d sql.Column(\u0027default_project_id\u0027, sql.String(64),"},{"line_number":92,"context_line":"                                    nullable\u003dTrue)"},{"line_number":93,"context_line":"    user_table.create_column(default_project_id)"},{"line_number":94,"context_line":"    migrate_default_project_from_json(meta, migrate_engine)"},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzhw%3D","line":92,"in_reply_to":"AAAAS3%2F%2Fz98%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":93,"context_line":"    default_project_id \u003d sql.Column(\u0027default_project_id\u0027, sql.String(64))"},{"line_number":94,"context_line":"    user_table.create_column(default_project_id)"},{"line_number":95,"context_line":"    migrate_default_project_from_json(meta, migrate_engine)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwgE%3D","line":95,"updated":"2013-09-19 20:34:05.000000000","message":"we a test in keystone/tests/test_sql_upgrade.py to show that this works with some data.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b2f422390db77d59ecd5bf6bb531c1c31d24af4","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":93,"context_line":"    default_project_id \u003d sql.Column(\u0027default_project_id\u0027, sql.String(64))"},{"line_number":94,"context_line":"    user_table.create_column(default_project_id)"},{"line_number":95,"context_line":"    migrate_default_project_from_json(meta, migrate_engine)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwCg%3D","line":95,"in_reply_to":"AAAAS3%2F%2FwgE%3D","updated":"2013-09-20 01:11:40.000000000","message":"Done","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":100,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    migrate_default_project_to_json(meta, migrate_engine)"},{"line_number":103,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":104,"context_line":"    user_table.drop_column(\u0027default_project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwgA%3D","line":102,"updated":"2013-09-19 20:34:05.000000000","message":"we a test in keystone/tests/test_sql_upgrade.py to show that this works with some data.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b2f422390db77d59ecd5bf6bb531c1c31d24af4","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":100,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    migrate_default_project_to_json(meta, migrate_engine)"},{"line_number":103,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":104,"context_line":"    user_table.drop_column(\u0027default_project_id\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwCc%3D","line":102,"in_reply_to":"AAAAS3%2F%2FwgA%3D","updated":"2013-09-20 01:11:40.000000000","message":"Done","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"947d93d1b61f69c8cc91c1c40e9d36048b0d8f2e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def migrate_default_project_from_json(meta, migrate_engine):"},{"line_number":24,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    user_list \u003d user_table.select().execute()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FuRw%3D","line":23,"updated":"2013-09-20 15:36:18.000000000","message":"suggest change name to \"migrate_default_project_from_extra\" since that\u0027s the column name.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e33188808be0c826052fe60c30c8095b3daaf42a","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def migrate_default_project_from_json(meta, migrate_engine):"},{"line_number":24,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    user_list \u003d user_table.select().execute()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2Ftw8%3D","line":23,"in_reply_to":"AAAAS3%2F%2FuRw%3D","updated":"2013-09-20 18:14:44.000000000","message":"Done","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"947d93d1b61f69c8cc91c1c40e9d36048b0d8f2e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    session.close()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def migrate_default_project_to_json(meta, migrate_engine):"},{"line_number":59,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    user_list \u003d user_table.select().execute()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FuRs%3D","line":58,"updated":"2013-09-20 15:36:18.000000000","message":"suggest change name to \"migrate_default_project_to_extra\" since that\u0027s the column name.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e33188808be0c826052fe60c30c8095b3daaf42a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"    session.close()"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"def migrate_default_project_to_json(meta, migrate_engine):"},{"line_number":59,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    user_list \u003d user_table.select().execute()"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2Ftw4%3D","line":58,"in_reply_to":"AAAAS3%2F%2FuRs%3D","updated":"2013-09-20 18:14:44.000000000","message":"Done","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"73877e9228300ea9e5329295974118b815277579","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        # can return tenantId instead of default_project_id"},{"line_number":76,"context_line":"        if user.default_project_id is not None:"},{"line_number":77,"context_line":"            data[\u0027default_project_id\u0027] \u003d user.default_project_id"},{"line_number":78,"context_line":"            data[\u0027tenantId\u0027] \u003d user.default_project_id"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"            values \u003d {\u0027extra\u0027: json.dumps(data)}"},{"line_number":81,"context_line":"            update \u003d user_table.update().where("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2Fvgg%3D","line":78,"updated":"2013-09-20 06:23:19.000000000","message":"might want to account for \u0027tenant_id\u0027 as well since you are looking for it in upgrade\n\ndata[\u0027tenant_id\u0027] \u003d user.default_project_id","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"799d7356686cd45bf7cf4d75a7f85172148fb988","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        # can return tenantId instead of default_project_id"},{"line_number":76,"context_line":"        if user.default_project_id is not None:"},{"line_number":77,"context_line":"            data[\u0027default_project_id\u0027] \u003d user.default_project_id"},{"line_number":78,"context_line":"            data[\u0027tenantId\u0027] \u003d user.default_project_id"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"            values \u003d {\u0027extra\u0027: json.dumps(data)}"},{"line_number":81,"context_line":"            update \u003d user_table.update().where("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2Fveo%3D","line":78,"in_reply_to":"AAAAS3%2F%2Fvgg%3D","updated":"2013-09-20 06:44:29.000000000","message":"tenant_id is really only being accounted for in the upgrade because of a reference in the ldap identity backend (in-case someone converted data).  It isn\u0027t part of the spec and therefore was left out in the down-grade.  If anything, I\u0027d be more inclined to remove it from the tests and upgrade than add it in here since it was used in such a limited capacity.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b610b222ec1de3dfdbbbb98d64696e1f8de0cbd6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        except (ValueError, TypeError):"},{"line_number":35,"context_line":"            # NOTE(morganfainberg): Somehow we have non-json data here.  This"},{"line_number":36,"context_line":"            # is a broken user, but it was broken beforehand.  Cleaning it up"},{"line_number":37,"context_line":"            # is not in the scope of this migration."},{"line_number":38,"context_line":"            continue"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        values \u003d {}"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAS3%2F%2FtV8%3D","line":37,"updated":"2013-09-20 20:22:55.000000000","message":"Should a TODO be added to clean up?","commit_id":"54585bbcd680b00b8334a1f2ffedbd45a7cbc440"}],"keystone/contrib/ec2/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":102,"context_line":"        tenant_ref \u003d self.identity_api.get_project(creds_ref[\u0027tenant_id\u0027])"},{"line_number":103,"context_line":"        user_ref \u003d self.normalize_default_project_id("},{"line_number":104,"context_line":"            self.identity_api.get_user(creds_ref[\u0027user_id\u0027]))"},{"line_number":105,"context_line":"        metadata_ref \u003d {}"},{"line_number":106,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d ("},{"line_number":107,"context_line":"            self.identity_api.get_roles_for_user_and_project("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz70%3D","line":104,"updated":"2013-09-18 20:53:05.000000000","message":"I don\u0027t see why identity_api.get_user can\u0027t normalize_default_project_id so all the callers don\u0027t have to remember to do it.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":102,"context_line":"        tenant_ref \u003d self.identity_api.get_project(creds_ref[\u0027tenant_id\u0027])"},{"line_number":103,"context_line":"        user_ref \u003d self.normalize_default_project_id("},{"line_number":104,"context_line":"            self.identity_api.get_user(creds_ref[\u0027user_id\u0027]))"},{"line_number":105,"context_line":"        metadata_ref \u003d {}"},{"line_number":106,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d ("},{"line_number":107,"context_line":"            self.identity_api.get_roles_for_user_and_project("}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzgc%3D","line":104,"in_reply_to":"AAAAS3%2F%2Fz70%3D","updated":"2013-09-19 01:10:54.000000000","message":"Short of making the manager version aware, it isn\u0027t possible.  For v2.0 requests, \"tenantId\" is needed where v3 would be \"default_project_id\". I was determined that the controller should be smart here instead of needing to pass a \"Version\" argument to the manager (look at the first couple patchsets, it\u0027s a less-elegant solution).","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # TODO(termie): this is copied from TokenController.authenticate"},{"line_number":101,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":102,"context_line":"        tenant_ref \u003d self.identity_api.get_project(creds_ref[\u0027tenant_id\u0027])"},{"line_number":103,"context_line":"        user_ref \u003d self.normalize_default_project_id("},{"line_number":104,"context_line":"            self.identity_api.get_user(creds_ref[\u0027user_id\u0027]))"},{"line_number":105,"context_line":"        metadata_ref \u003d {}"},{"line_number":106,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2Fwjo%3D","line":103,"updated":"2013-09-19 20:34:05.000000000","message":"add a comment why we need to do this, since it\u0027s not intuitive.\n\nWhat if there was some other property that we need to normalize, are we going to have another function to call?\n\nSuggest call the function self.normalize_user_properties() or something.\n\nAlso, add some documentation to self.identity_api.get_user() that callers need to normalize the default_project_id or other properties (or whatever it is that they need to do) because of ... (whatever the reason is).\n\nAlternatively, maybe it would make more sense to have a static function in V2 controller (don\u0027t bother overriding in V3 since it would never be called from a V3 controller) to normalize a V3 user to V2...\n\n controller.V2Controller.V3_user_to_V2(user_ref)","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":102,"context_line":"        tenant_ref \u003d self.identity_api.get_project(creds_ref[\u0027tenant_id\u0027])"},{"line_number":103,"context_line":"        user_ref \u003d self.normalize_default_project_id("},{"line_number":104,"context_line":"            self.identity_api.get_user(creds_ref[\u0027user_id\u0027]))"},{"line_number":105,"context_line":"        metadata_ref \u003d {}"},{"line_number":106,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d ("},{"line_number":107,"context_line":"            self.identity_api.get_roles_for_user_and_project("}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2Fwi4%3D","line":104,"updated":"2013-09-19 20:34:05.000000000","message":"the reply to \"I don\u0027t see why identity_api.get_user can\u0027t normalize_default_project_id so all the callers don\u0027t have to remember to do it.\" was \"Short of making the manager version aware, it isn\u0027t possible.\" ... seems like the identity_api would always return a canonical \"v3\" version and only if a \"v2\" user was required then it would be translated.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1b2f422390db77d59ecd5bf6bb531c1c31d24af4","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        token_id \u003d uuid.uuid4().hex"},{"line_number":102,"context_line":"        tenant_ref \u003d self.identity_api.get_project(creds_ref[\u0027tenant_id\u0027])"},{"line_number":103,"context_line":"        user_ref \u003d self.normalize_default_project_id("},{"line_number":104,"context_line":"            self.identity_api.get_user(creds_ref[\u0027user_id\u0027]))"},{"line_number":105,"context_line":"        metadata_ref \u003d {}"},{"line_number":106,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d ("},{"line_number":107,"context_line":"            self.identity_api.get_roles_for_user_and_project("}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwIY%3D","line":104,"in_reply_to":"AAAAS3%2F%2Fwi4%3D","updated":"2013-09-20 01:11:40.000000000","message":"Done.  Fair enough assessment on how to handle it.  Went with static method that does the filtering.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"947d93d1b61f69c8cc91c1c40e9d36048b0d8f2e","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        catalog_ref \u003d self.catalog_api.get_catalog("},{"line_number":119,"context_line":"            user_ref[\u0027id\u0027], tenant_ref[\u0027id\u0027], metadata_ref)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        # NOTE(morganfainberg): Normalize any v3-specific information on the"},{"line_number":122,"context_line":"        # user ref down to v2.0 as this controller is v2.0 and this data"},{"line_number":123,"context_line":"        # could be consumed by an entity outside of keystone."},{"line_number":124,"context_line":"        user_ref \u003d controller.V2Controller.v3_to_v2_user(user_ref)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FuRQ%3D","line":121,"updated":"2013-09-20 15:36:18.000000000","message":"while I think the comment was needed when the function was about removing default_project_id, I think it\u0027s pretty obvious why we would need to convert a v3 user to a v2 user, so I don\u0027t think this comment is needed.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"947d93d1b61f69c8cc91c1c40e9d36048b0d8f2e","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        # NOTE(morganfainberg): Normalize any v3-specific information on the"},{"line_number":122,"context_line":"        # user ref down to v2.0 as this controller is v2.0 and this data"},{"line_number":123,"context_line":"        # could be consumed by an entity outside of keystone."},{"line_number":124,"context_line":"        user_ref \u003d controller.V2Controller.v3_to_v2_user(user_ref)"},{"line_number":125,"context_line":"        auth_token_data \u003d dict(user\u003duser_ref,"},{"line_number":126,"context_line":"                               tenant\u003dtenant_ref,"},{"line_number":127,"context_line":"                               metadata\u003dmetadata_ref,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FuRI%3D","line":124,"updated":"2013-09-20 15:36:18.000000000","message":"I\u0027m surprised that the token provider API expects v2 users and not \"canonical\"/v3 users. Please add a comment that this is the case.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e33188808be0c826052fe60c30c8095b3daaf42a","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        # NOTE(morganfainberg): Normalize any v3-specific information on the"},{"line_number":122,"context_line":"        # user ref down to v2.0 as this controller is v2.0 and this data"},{"line_number":123,"context_line":"        # could be consumed by an entity outside of keystone."},{"line_number":124,"context_line":"        user_ref \u003d controller.V2Controller.v3_to_v2_user(user_ref)"},{"line_number":125,"context_line":"        auth_token_data \u003d dict(user\u003duser_ref,"},{"line_number":126,"context_line":"                               tenant\u003dtenant_ref,"},{"line_number":127,"context_line":"                               metadata\u003dmetadata_ref,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2Ftwk%3D","line":124,"in_reply_to":"AAAAS3%2F%2FuRI%3D","updated":"2013-09-20 18:14:44.000000000","message":"It isn\u0027t that the token api expects it, it is that the data might be consumed by an external source, it is part of the token data.  Since this is V2.0, we should have the \"correct\" form of tenantId vs default_project_id.  Comment will be added.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class User(sql.ModelBase, sql.DictBase):"},{"line_number":26,"context_line":"    __tablename__ \u003d \u0027user\u0027"},{"line_number":27,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027]"},{"line_number":28,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":29,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":30,"context_line":"    domain_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027domain.id\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz%2Fg%3D","line":27,"updated":"2013-09-18 20:53:05.000000000","message":"default_project_id ?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class User(sql.ModelBase, sql.DictBase):"},{"line_number":26,"context_line":"    __tablename__ \u003d \u0027user\u0027"},{"line_number":27,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027name\u0027, \u0027domain_id\u0027, \u0027password\u0027, \u0027enabled\u0027]"},{"line_number":28,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":29,"context_line":"    name \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":30,"context_line":"    domain_id \u003d sql.Column(sql.String(64), sql.ForeignKey(\u0027domain.id\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzgU%3D","line":27,"in_reply_to":"AAAAS3%2F%2Fz%2Fg%3D","updated":"2013-09-19 01:10:54.000000000","message":"Done","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"947d93d1b61f69c8cc91c1c40e9d36048b0d8f2e","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # rather than just only \u0027name\u0027 being unique"},{"line_number":39,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":42,"context_line":"        d \u003d super(User, self).to_dict(include_extra_dict\u003dinclude_extra_dict)"},{"line_number":43,"context_line":"        if \u0027default_project_id\u0027 in d and d[\u0027default_project_id\u0027] is None:"},{"line_number":44,"context_line":"            del d[\u0027default_project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FuQY%3D","line":41,"updated":"2013-09-20 15:36:18.000000000","message":"would be nice to have a testcase that calls this directly if possible.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e33188808be0c826052fe60c30c8095b3daaf42a","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    # rather than just only \u0027name\u0027 being unique"},{"line_number":39,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027domain_id\u0027, \u0027name\u0027), {})"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def to_dict(self, include_extra_dict\u003dFalse):"},{"line_number":42,"context_line":"        d \u003d super(User, self).to_dict(include_extra_dict\u003dinclude_extra_dict)"},{"line_number":43,"context_line":"        if \u0027default_project_id\u0027 in d and d[\u0027default_project_id\u0027] is None:"},{"line_number":44,"context_line":"            del d[\u0027default_project_id\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2Ftwg%3D","line":41,"in_reply_to":"AAAAS3%2F%2FuQY%3D","updated":"2013-09-20 18:14:44.000000000","message":"I\u0027ll see if I can craft something to test this explicitly.  It is tested as a side effect of the Multiple Domain backend test (where we mix SQL and LDAP) as the ldap backend doesn\u0027t return default_project_id and the SQL one does even if null in the DB, so this filters it out.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"}],"keystone/identity/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            msg \u003d \u0027Enabled field must be a boolean\u0027"},{"line_number":207,"context_line":"            raise exception.ValidationError(message\u003dmsg)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        default_project_id \u003d user.get(\u0027tenantId\u0027, None)"},{"line_number":210,"context_line":"        if (default_project_id is not None"},{"line_number":211,"context_line":"                and self.identity_api.get_project(default_project_id) is None):"},{"line_number":212,"context_line":"            raise exception.ProjectNotFound(project_id\u003ddefault_project_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz4U%3D","line":209,"updated":"2013-09-18 20:53:05.000000000","message":"what about tenant_id ? Should that be supported, too?","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":206,"context_line":"            msg \u003d \u0027Enabled field must be a boolean\u0027"},{"line_number":207,"context_line":"            raise exception.ValidationError(message\u003dmsg)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        default_project_id \u003d user.get(\u0027tenantId\u0027, None)"},{"line_number":210,"context_line":"        if (default_project_id is not None"},{"line_number":211,"context_line":"                and self.identity_api.get_project(default_project_id) is None):"},{"line_number":212,"context_line":"            raise exception.ProjectNotFound(project_id\u003ddefault_project_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fzf8%3D","line":209,"in_reply_to":"AAAAS3%2F%2Fz4U%3D","updated":"2013-09-19 01:10:54.000000000","message":"tenant_id is not part of the spec, but was referenced in the LDAP backend a couple places.  To ensure we didn\u0027t lose that information (e.g. if someone converted) I captured it in the migration.  It was more of an edge-case than anything else.  If we want to support it, I can add it in.","commit_id":"734c38de74a0a719c5ffa15916a1a6c0462dca29"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"26d3daff8127d5c214cbd5239f6a1fbe413347d9","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        user_ref \u003d controller.V2Controller.v3_to_v2_user("},{"line_number":233,"context_line":"            self.identity_api.update_user(user_id, user))"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        if \u0027tenantId\u0027 in user_ref:"},{"line_number":236,"context_line":"            if user_ref[\u0027tenantId\u0027] !\u003d old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":237,"context_line":"                if old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":238,"context_line":"                    self.assignment_api.remove_user_from_project("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FvE8%3D","line":235,"updated":"2013-09-20 09:57:43.000000000","message":"(I know we discussed this on the keystone meting...) but this is attempting to fix the the same problem as: https://review.openstack.org/#/c/42826/23/keystone/identity/controllers.py.  However, I think the code may be incorrect, since I don\u0027t think you want to remove ALL the roles from the old project (which is what remove_user_from_project() does), rather just remove the membership role.\n\nIf there a reason why we can\u0027t let https://review.openstack.org/#/c/42826/23/keystone/identity/controllers.py just be laid on top of the general clean up here?","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e33188808be0c826052fe60c30c8095b3daaf42a","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        user_ref \u003d controller.V2Controller.v3_to_v2_user("},{"line_number":233,"context_line":"            self.identity_api.update_user(user_id, user))"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        if \u0027tenantId\u0027 in user_ref:"},{"line_number":236,"context_line":"            if user_ref[\u0027tenantId\u0027] !\u003d old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":237,"context_line":"                if old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":238,"context_line":"                    self.assignment_api.remove_user_from_project("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FtxU%3D","line":235,"in_reply_to":"AAAAS3%2F%2Fucg%3D","updated":"2013-09-20 18:14:44.000000000","message":"This change is specific to maintaining compatibility with the LDAP backend - so moving it to the controller made sense so this patchset was \"working\": https://github.com/openstack/keystone/blob/master/keystone/identity/backends/ldap.py#L108\n\nThe other review would still need to occur and be applied over the top.  Either that or i could make my changeset dependent on that review.  Both work, just need to pick the approach.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f9bf5302e4d608e13820d458145d1ec033eafff0","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        user_ref \u003d controller.V2Controller.v3_to_v2_user("},{"line_number":233,"context_line":"            self.identity_api.update_user(user_id, user))"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        if \u0027tenantId\u0027 in user_ref:"},{"line_number":236,"context_line":"            if user_ref[\u0027tenantId\u0027] !\u003d old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":237,"context_line":"                if old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":238,"context_line":"                    self.assignment_api.remove_user_from_project("}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2Fucg%3D","line":235,"in_reply_to":"AAAAS3%2F%2FvE8%3D","updated":"2013-09-20 14:35:01.000000000","message":"So remove_user_from_project() WAS intended to be the inverse operation of add_user_to_project() -- it\u0027s supposed to remove the member_role (_member_) and that\u0027s it. Just like add_user_to_project() adds the _member_ role, and that\u0027s it. It looks like morgan added remove_user_membership_from_project() to satisfy the original use case :-/","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        new_user_ref \u003d controller.V2Controller.v3_to_v2_user("},{"line_number":214,"context_line":"            self.identity_api.create_user(user_id, user_ref))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        if default_project_id:"},{"line_number":217,"context_line":"            self.identity_api.add_user_to_project(default_project_id, user_id)"},{"line_number":218,"context_line":"        return {\u0027user\u0027: new_user_ref}"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrBc%3D","line":216,"updated":"2013-09-22 20:51:25.000000000","message":"since used \"if default_project_id is not None:\" for this check at line 205, should use the same test here.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        new_user_ref \u003d controller.V2Controller.v3_to_v2_user("},{"line_number":214,"context_line":"            self.identity_api.create_user(user_id, user_ref))"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        if default_project_id:"},{"line_number":217,"context_line":"            self.identity_api.add_user_to_project(default_project_id, user_id)"},{"line_number":218,"context_line":"        return {\u0027user\u0027: new_user_ref}"},{"line_number":219,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2FU%3D","line":216,"in_reply_to":"AAAAS3%2F%2FrBc%3D","updated":"2013-09-22 22:13:12.000000000","message":"Done","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":238,"context_line":"            if user_ref[\u0027tenantId\u0027] !\u003d old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":239,"context_line":"                if old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":240,"context_line":"                    self.assignment_api.remove_user_from_project("},{"line_number":241,"context_line":"                        user_id, old_user_ref[\u0027tenantId\u0027])"},{"line_number":242,"context_line":"                if user_ref[\u0027tenantId\u0027]:"},{"line_number":243,"context_line":"                    try:"},{"line_number":244,"context_line":"                        self.assignment_api.add_user_to_project("}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrBU%3D","line":241,"updated":"2013-09-22 20:51:25.000000000","message":"Am I crazy or does this function take tenant_id, user_id and not user_id, tenant_id (see https://github.com/openstack/keystone/blob/master/keystone/assignment/core.py#L233 ) ? Not tested?\n\nAlso, this function can raise ProjectNotFound and UserNotFound. It seems inappropriate to return a 404 when the user was updated (at line 235). So need to revert the change if this fails, or ignore NotFound from this?","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":238,"context_line":"            if user_ref[\u0027tenantId\u0027] !\u003d old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":239,"context_line":"                if old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":240,"context_line":"                    self.assignment_api.remove_user_from_project("},{"line_number":241,"context_line":"                        user_id, old_user_ref[\u0027tenantId\u0027])"},{"line_number":242,"context_line":"                if user_ref[\u0027tenantId\u0027]:"},{"line_number":243,"context_line":"                    try:"},{"line_number":244,"context_line":"                        self.assignment_api.add_user_to_project("}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2Bw%3D","line":241,"in_reply_to":"AAAAS3%2F%2FrBU%3D","updated":"2013-09-22 22:13:12.000000000","message":"good catch.  working on handling exception.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a81a1ccc189993a837d0da7788b9626d8433b54","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                        # for the user on that project."},{"line_number":260,"context_line":"                        msg \u003d _(\u0027Unable to remove user %(user)s from \u0027"},{"line_number":261,"context_line":"                                \u0027%(tenant)s.\u0027)"},{"line_number":262,"context_line":"                        LOG.exception(msg,"},{"line_number":263,"context_line":"                                      {\u0027user\u0027: user_id,"},{"line_number":264,"context_line":"                                       \u0027tenant\u0027: old_user_ref[\u0027tenantId\u0027]})"},{"line_number":265,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq6g%3D","line":262,"updated":"2013-09-22 22:52:29.000000000","message":"should not use LOG.exception here since this should be more like a warning than an error, use LOG.warning. Can add exc_info\u003dTrue if really need to dump exception.","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9385d327a8b869a323ca364858b6df0b5e07664a","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                        # for the user on that project."},{"line_number":260,"context_line":"                        msg \u003d _(\u0027Unable to remove user %(user)s from \u0027"},{"line_number":261,"context_line":"                                \u0027%(tenant)s.\u0027)"},{"line_number":262,"context_line":"                        LOG.exception(msg,"},{"line_number":263,"context_line":"                                      {\u0027user\u0027: user_id,"},{"line_number":264,"context_line":"                                       \u0027tenant\u0027: old_user_ref[\u0027tenantId\u0027]})"},{"line_number":265,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq4M%3D","line":262,"in_reply_to":"AAAAS3%2F%2Fq6g%3D","updated":"2013-09-22 23:10:16.000000000","message":"Done","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a81a1ccc189993a837d0da7788b9626d8433b54","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                        # incorrect.  This shouldn\u0027t prevent the return of the"},{"line_number":279,"context_line":"                        # new ref."},{"line_number":280,"context_line":"                        msg \u003d _(\u0027Unable to add user %(user)s to %(tenant)s.\u0027)"},{"line_number":281,"context_line":"                        LOG.exception(msg, {\u0027user\u0027: user_id,"},{"line_number":282,"context_line":"                                            \u0027tenant\u0027: user_ref[\u0027tenantId\u0027]})"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        return {\u0027user\u0027: user_ref}"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq6c%3D","line":281,"updated":"2013-09-22 22:52:29.000000000","message":"should not use LOG.exception here since this should be more like a warning than an error, use LOG.warning. Can add exc_info\u003dTrue if really need to dump exception.","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9385d327a8b869a323ca364858b6df0b5e07664a","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                        # incorrect.  This shouldn\u0027t prevent the return of the"},{"line_number":279,"context_line":"                        # new ref."},{"line_number":280,"context_line":"                        msg \u003d _(\u0027Unable to add user %(user)s to %(tenant)s.\u0027)"},{"line_number":281,"context_line":"                        LOG.exception(msg, {\u0027user\u0027: user_id,"},{"line_number":282,"context_line":"                                            \u0027tenant\u0027: user_ref[\u0027tenantId\u0027]})"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        return {\u0027user\u0027: user_ref}"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq4I%3D","line":281,"in_reply_to":"AAAAS3%2F%2Fq6c%3D","updated":"2013-09-22 23:10:16.000000000","message":"Done","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1e0fdde47ada3f6c1566033bf6fa57bbf233d285","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        default_project_id \u003d user.pop(\u0027tenantId\u0027, None)"},{"line_number":205,"context_line":"        if default_project_id is not None:"},{"line_number":206,"context_line":"            if self.identity_api.get_project(default_project_id) is None:"},{"line_number":207,"context_line":"                raise exception.ProjectNotFound(project_id\u003ddefault_project_id)"},{"line_number":208,"context_line":"            user[\u0027default_project_id\u0027] \u003d default_project_id"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAS3%2F%2Fq1k%3D","line":206,"updated":"2013-09-22 23:39:38.000000000","message":"should this be assignment_api rather than identity_api (see line 233).\n\nAlso, if get_project raises ProjectNotFound (as implied by line 233), then don\u0027t need to raise it here... alternativerly, line 233 needs to be fixed to check for None like this line.","commit_id":"68b599227b62ed3de095c95f80b409b8febcc9dc"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"42710de759b976ff51bbc6851bd2563c037615cc","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"        default_project_id \u003d user.pop(\u0027tenantId\u0027, None)"},{"line_number":205,"context_line":"        if default_project_id is not None:"},{"line_number":206,"context_line":"            if self.identity_api.get_project(default_project_id) is None:"},{"line_number":207,"context_line":"                raise exception.ProjectNotFound(project_id\u003ddefault_project_id)"},{"line_number":208,"context_line":"            user[\u0027default_project_id\u0027] \u003d default_project_id"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAS3%2F%2Fq1I%3D","line":206,"in_reply_to":"AAAAS3%2F%2Fq1k%3D","updated":"2013-09-22 23:50:01.000000000","message":"retargeting to assignment_api, also removing the old superfluous raise logic.  get_project does always raise ProjectNotFound if the project is non-existant (vs. returning None)","commit_id":"68b599227b62ed3de095c95f80b409b8febcc9dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1e0fdde47ada3f6c1566033bf6fa57bbf233d285","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        # If the password was changed or the user was disabled we clear tokens"},{"line_number":247,"context_line":"            self._delete_tokens_for_user(user_id)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        if \u0027tenantId\u0027 in user_ref:"},{"line_number":250,"context_line":"            if user_ref[\u0027tenantId\u0027] !\u003d old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":251,"context_line":"                if old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":252,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAS3%2F%2Fq1c%3D","line":249,"updated":"2013-09-22 23:39:38.000000000","message":"if the tenant isn\u0027t present in user_ref but was present in original user (tenantId was removed with tenantId: None), then don\u0027t we need to self.assignment_api.remove_user_from_project() ?","commit_id":"68b599227b62ed3de095c95f80b409b8febcc9dc"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"42710de759b976ff51bbc6851bd2563c037615cc","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        # If the password was changed or the user was disabled we clear tokens"},{"line_number":247,"context_line":"            self._delete_tokens_for_user(user_id)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        if \u0027tenantId\u0027 in user_ref:"},{"line_number":250,"context_line":"            if user_ref[\u0027tenantId\u0027] !\u003d old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":251,"context_line":"                if old_user_ref.get(\u0027tenantId\u0027):"},{"line_number":252,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAS3%2F%2Fq1M%3D","line":249,"in_reply_to":"AAAAS3%2F%2Fq1c%3D","updated":"2013-09-22 23:50:01.000000000","message":"Done","commit_id":"68b599227b62ed3de095c95f80b409b8febcc9dc"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"0a8f498d1f7ce6713ffb9460ddf4e7b0c41c8cbb","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        tenant_ref \u003d self.identity_api.get_project_users(self.tenant_baz[\u0027id\u0027])"},{"line_number":145,"context_line":"        user_ids \u003d []"},{"line_number":146,"context_line":"        for user in tenant_ref:"},{"line_number":147,"context_line":"            self.assertNotIn(\u0027password\u0027, user)"},{"line_number":148,"context_line":"            user_ids.append(user.get(\u0027id\u0027))"},{"line_number":149,"context_line":"        self.assertEquals(len(user_ids), 2)"},{"line_number":150,"context_line":"        self.assertIn(self.user_two[\u0027id\u0027], user_ids)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2Fz3w%3D","side":"PARENT","line":147,"updated":"2013-09-18 20:53:05.000000000","message":"where does this test belong? We still need to make sure we don\u0027t return users\u0027 passwords.","commit_id":"5a5023bea0fad8e0c1461fe5763d3befc5bde514"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f888737948a7d6db193f657239f94baad0a04fb8","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        tenant_ref \u003d self.identity_api.get_project_users(self.tenant_baz[\u0027id\u0027])"},{"line_number":145,"context_line":"        user_ids \u003d []"},{"line_number":146,"context_line":"        for user in tenant_ref:"},{"line_number":147,"context_line":"            self.assertNotIn(\u0027password\u0027, user)"},{"line_number":148,"context_line":"            user_ids.append(user.get(\u0027id\u0027))"},{"line_number":149,"context_line":"        self.assertEquals(len(user_ids), 2)"},{"line_number":150,"context_line":"        self.assertIn(self.user_two[\u0027id\u0027], user_ids)"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAS3%2F%2FzX4%3D","side":"PARENT","line":147,"in_reply_to":"AAAAS3%2F%2Fz3w%3D","updated":"2013-09-19 01:10:54.000000000","message":"This is handled by the various methods on the driver that does the get_user.  I think we have a couple tests that are not accurate (get_user, get_users, etc).  I\u0027ll update those to reflect this test.  Since the controller does the ids-\u003erefs now via the identity_api, that should be sufficient.","commit_id":"5a5023bea0fad8e0c1461fe5763d3befc5bde514"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0480e3aaef6a569d90b0f003d09dbc2d02a4439f","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                          uuid.uuid4().hex,"},{"line_number":146,"context_line":"                          DEFAULT_DOMAIN_ID)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_get_project_user_ids(self):"},{"line_number":149,"context_line":"        user_ids \u003d self.assignment_api.list_user_ids_for_project("},{"line_number":150,"context_line":"            self.tenant_baz[\u0027id\u0027])"},{"line_number":151,"context_line":"        self.assertEquals(len(user_ids), 2)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FzDA%3D","line":148,"updated":"2013-09-19 02:28:11.000000000","message":"*could* change these test names, but that\u0027s inconsequential","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a507e204344eeb4e61de3d0df1baa3ecb6ac1484","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                          uuid.uuid4().hex,"},{"line_number":146,"context_line":"                          DEFAULT_DOMAIN_ID)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_get_project_user_ids(self):"},{"line_number":149,"context_line":"        user_ids \u003d self.assignment_api.list_user_ids_for_project("},{"line_number":150,"context_line":"            self.tenant_baz[\u0027id\u0027])"},{"line_number":151,"context_line":"        self.assertEquals(len(user_ids), 2)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2Fy6I%3D","line":148,"in_reply_to":"AAAAS3%2F%2FzDA%3D","updated":"2013-09-19 05:34:13.000000000","message":"If another patchset is required, I\u0027ll change the test name.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        user_ref \u003d self.identity_api.authenticate("},{"line_number":78,"context_line":"            user_id\u003dself.user_sna[\u0027id\u0027],"},{"line_number":79,"context_line":"            password\u003dself.user_sna[\u0027password\u0027])"},{"line_number":80,"context_line":"        self.assertNotIn(\u0027password\u0027, user_ref)"},{"line_number":81,"context_line":"        self.user_sna[\u0027enabled\u0027] \u003d True"},{"line_number":82,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":83,"context_line":"        # comparing the user_ref to.  The API should never return password in"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrBI%3D","line":80,"updated":"2013-09-22 20:51:25.000000000","message":"this is already done by assertDictEqual at line 86.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        user_ref \u003d self.identity_api.authenticate("},{"line_number":78,"context_line":"            user_id\u003dself.user_sna[\u0027id\u0027],"},{"line_number":79,"context_line":"            password\u003dself.user_sna[\u0027password\u0027])"},{"line_number":80,"context_line":"        self.assertNotIn(\u0027password\u0027, user_ref)"},{"line_number":81,"context_line":"        self.user_sna[\u0027enabled\u0027] \u003d True"},{"line_number":82,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":83,"context_line":"        # comparing the user_ref to.  The API should never return password in"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2Fk%3D","line":80,"in_reply_to":"AAAAS3%2F%2FrBI%3D","updated":"2013-09-22 22:13:12.000000000","message":"Done","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_get_user(self):"},{"line_number":161,"context_line":"        user_ref \u003d self.identity_api.get_user(self.user_foo[\u0027id\u0027])"},{"line_number":162,"context_line":"        self.assertNotIn(\u0027password\u0027, user_ref)"},{"line_number":163,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":164,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":165,"context_line":"        # the ref."}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrBE%3D","line":162,"updated":"2013-09-22 20:51:25.000000000","message":"already done by assertDictEqual at line 167, so suggest remove.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_get_user(self):"},{"line_number":161,"context_line":"        user_ref \u003d self.identity_api.get_user(self.user_foo[\u0027id\u0027])"},{"line_number":162,"context_line":"        self.assertNotIn(\u0027password\u0027, user_ref)"},{"line_number":163,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":164,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":165,"context_line":"        # the ref."}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2Fg%3D","line":162,"in_reply_to":"AAAAS3%2F%2FrBE%3D","updated":"2013-09-22 22:13:12.000000000","message":"Done","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def test_get_user_by_name(self):"},{"line_number":175,"context_line":"        user_ref \u003d self.identity_api.get_user_by_name("},{"line_number":176,"context_line":"            self.user_foo[\u0027name\u0027], DEFAULT_DOMAIN_ID)"},{"line_number":177,"context_line":"        self.assertNotIn(\u0027password\u0027, user_ref)"},{"line_number":178,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":179,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":180,"context_line":"        # the ref."}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrBA%3D","line":177,"updated":"2013-09-22 20:51:25.000000000","message":"already done by assertDictEqual at line 182, so suggest remove.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":174,"context_line":"    def test_get_user_by_name(self):"},{"line_number":175,"context_line":"        user_ref \u003d self.identity_api.get_user_by_name("},{"line_number":176,"context_line":"            self.user_foo[\u0027name\u0027], DEFAULT_DOMAIN_ID)"},{"line_number":177,"context_line":"        self.assertNotIn(\u0027password\u0027, user_ref)"},{"line_number":178,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":179,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":180,"context_line":"        # the ref."}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2Fc%3D","line":177,"in_reply_to":"AAAAS3%2F%2FrBA%3D","updated":"2013-09-22 22:13:12.000000000","message":"Done","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a81a1ccc189993a837d0da7788b9626d8433b54","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            user_id\u003dself.user_sna[\u0027id\u0027],"},{"line_number":79,"context_line":"            password\u003dself.user_sna[\u0027password\u0027])"},{"line_number":80,"context_line":"        self.user_sna[\u0027enabled\u0027] \u003d True"},{"line_number":81,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":82,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":83,"context_line":"        # the ref."},{"line_number":84,"context_line":"        self.user_sna.pop(\u0027password\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq5w%3D","line":81,"updated":"2013-09-22 22:52:29.000000000","message":"seems like this change could be reverted (back to the original with NOTE(termie)","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9385d327a8b869a323ca364858b6df0b5e07664a","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            user_id\u003dself.user_sna[\u0027id\u0027],"},{"line_number":79,"context_line":"            password\u003dself.user_sna[\u0027password\u0027])"},{"line_number":80,"context_line":"        self.user_sna[\u0027enabled\u0027] \u003d True"},{"line_number":81,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":82,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":83,"context_line":"        # the ref."},{"line_number":84,"context_line":"        self.user_sna.pop(\u0027password\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq4w%3D","line":81,"in_reply_to":"AAAAS3%2F%2Fq5w%3D","updated":"2013-09-22 23:10:16.000000000","message":"Done","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a81a1ccc189993a837d0da7788b9626d8433b54","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def test_get_user(self):"},{"line_number":160,"context_line":"        user_ref \u003d self.identity_api.get_user(self.user_foo[\u0027id\u0027])"},{"line_number":161,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":162,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":163,"context_line":"        # the ref."},{"line_number":164,"context_line":"        self.user_foo.pop(\u0027password\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq5o%3D","line":161,"updated":"2013-09-22 22:52:29.000000000","message":"seems like this change could be reverted (back to the original with NOTE(termie)","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9385d327a8b869a323ca364858b6df0b5e07664a","unresolved":false,"context_lines":[{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def test_get_user(self):"},{"line_number":160,"context_line":"        user_ref \u003d self.identity_api.get_user(self.user_foo[\u0027id\u0027])"},{"line_number":161,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":162,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":163,"context_line":"        # the ref."},{"line_number":164,"context_line":"        self.user_foo.pop(\u0027password\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq4s%3D","line":161,"in_reply_to":"AAAAS3%2F%2Fq5o%3D","updated":"2013-09-22 23:10:16.000000000","message":"Done","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3a81a1ccc189993a837d0da7788b9626d8433b54","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def test_get_user_by_name(self):"},{"line_number":173,"context_line":"        user_ref \u003d self.identity_api.get_user_by_name("},{"line_number":174,"context_line":"            self.user_foo[\u0027name\u0027], DEFAULT_DOMAIN_ID)"},{"line_number":175,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":176,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":177,"context_line":"        # the ref."},{"line_number":178,"context_line":"        self.user_foo.pop(\u0027password\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq5k%3D","line":175,"updated":"2013-09-22 22:52:29.000000000","message":"seems like this change could be reverted (back to the original with NOTE(termie)","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"9385d327a8b869a323ca364858b6df0b5e07664a","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def test_get_user_by_name(self):"},{"line_number":173,"context_line":"        user_ref \u003d self.identity_api.get_user_by_name("},{"line_number":174,"context_line":"            self.user_foo[\u0027name\u0027], DEFAULT_DOMAIN_ID)"},{"line_number":175,"context_line":"        # NOTE(morganfainberg): remove password from the original we are"},{"line_number":176,"context_line":"        # comparing the user_ref to.  The API should never return password in"},{"line_number":177,"context_line":"        # the ref."},{"line_number":178,"context_line":"        self.user_foo.pop(\u0027password\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAS3%2F%2Fq4o%3D","line":175,"in_reply_to":"AAAAS3%2F%2Fq5k%3D","updated":"2013-09-22 23:10:16.000000000","message":"Done","commit_id":"87bd51876b605fd8bcfe68df20582d0909d02746"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"baa88ace80bc5802c78d0e0e6916d8146a8c6f9b","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                          uuid.uuid4().hex,"},{"line_number":145,"context_line":"                          DEFAULT_DOMAIN_ID)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def list_user_ids_for_project(self):"},{"line_number":148,"context_line":"        user_ids \u003d self.assignment_api.list_user_ids_for_project("},{"line_number":149,"context_line":"            self.tenant_baz[\u0027id\u0027])"},{"line_number":150,"context_line":"        self.assertEquals(len(user_ids), 2)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAS3%2F%2Fq3o%3D","line":147,"updated":"2013-09-22 23:18:08.000000000","message":"I think this needs to start with test_ otherwise it won\u0027t run.","commit_id":"919ea74715817382ea251c94fd35302944e62b8b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8be84b4858dbab6251b4d103522b3bb4cb809052","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                          uuid.uuid4().hex,"},{"line_number":145,"context_line":"                          DEFAULT_DOMAIN_ID)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def list_user_ids_for_project(self):"},{"line_number":148,"context_line":"        user_ids \u003d self.assignment_api.list_user_ids_for_project("},{"line_number":149,"context_line":"            self.tenant_baz[\u0027id\u0027])"},{"line_number":150,"context_line":"        self.assertEquals(len(user_ids), 2)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAS3%2F%2Fq28%3D","line":147,"in_reply_to":"AAAAS3%2F%2Fq3o%3D","updated":"2013-09-22 23:21:40.000000000","message":"Done","commit_id":"919ea74715817382ea251c94fd35302944e62b8b"}],"keystone/tests/test_backend_ldap.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":1100,"context_line":"        ref \u003d self.identity_api.get_user("},{"line_number":1101,"context_line":"            userd[\u0027id\u0027], domain_scope\u003dCONF.identity.default_domain_id)"},{"line_number":1102,"context_line":"        del userd[\u0027password\u0027]"},{"line_number":1103,"context_line":"        # NOTE(morganfainberg): LDAP backend doesn\u0027t always store"},{"line_number":1104,"context_line":"        # default_project_id, so we don\u0027t pass it in during this test.  Since"},{"line_number":1105,"context_line":"        # normalization happens at the controller, the SQL backends will see"},{"line_number":1106,"context_line":"        # default_project_id (it is a proper column now).  For the purposes"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwiM%3D","line":1103,"updated":"2013-09-19 20:34:05.000000000","message":"seems like it would be easier to change the default LDAP backend test config to store default_project_id (also, I think this is a more likely configuration out in the field)","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e22429d63359dc83059f4bc03eab44bfebfc1787","unresolved":false,"context_lines":[{"line_number":1107,"context_line":"        # of this test, default_project_id isn\u0027t relevant, so remove it if it"},{"line_number":1108,"context_line":"        # exists. This is repeated throughout this test on all refs returned"},{"line_number":1109,"context_line":"        # by get_user."},{"line_number":1110,"context_line":"        ref.pop(\u0027default_project_id\u0027, None)"},{"line_number":1111,"context_line":"        self.assertDictEqual(ref, userd)"},{"line_number":1112,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":1113,"context_line":"                          self.identity_api.get_user,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FwdM%3D","line":1110,"updated":"2013-09-19 20:34:05.000000000","message":"suggest do \"del ref[\u0027default_project_id\u0027]\" ... I\u0027m not a fan of tests not knowing whether something is going to be there or not.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"}],"keystone/tests/test_backend_sql.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        query \u003d session.query(identity_sql.User)"},{"line_number":342,"context_line":"        query \u003d query.filter_by(id\u003duser_id)"},{"line_number":343,"context_line":"        raw_user_ref \u003d query.one()"},{"line_number":344,"context_line":"        self.assertEqual(raw_user_ref.default_project_id, None)"},{"line_number":345,"context_line":"        user_ref \u003d raw_user_ref.to_dict()"},{"line_number":346,"context_line":"        self.assertNotIn(\u0027default_project_id\u0027, user_ref)"},{"line_number":347,"context_line":"        session.close()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrDU%3D","line":344,"updated":"2013-09-22 20:51:25.000000000","message":"use assertIsNone","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":341,"context_line":"        query \u003d session.query(identity_sql.User)"},{"line_number":342,"context_line":"        query \u003d query.filter_by(id\u003duser_id)"},{"line_number":343,"context_line":"        raw_user_ref \u003d query.one()"},{"line_number":344,"context_line":"        self.assertEqual(raw_user_ref.default_project_id, None)"},{"line_number":345,"context_line":"        user_ref \u003d raw_user_ref.to_dict()"},{"line_number":346,"context_line":"        self.assertNotIn(\u0027default_project_id\u0027, user_ref)"},{"line_number":347,"context_line":"        session.close()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2FY%3D","line":344,"in_reply_to":"AAAAS3%2F%2FrDU%3D","updated":"2013-09-22 22:13:12.000000000","message":"Done","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"}],"keystone/tests/test_content_types.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"0480e3aaef6a569d90b0f003d09dbc2d02a4439f","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        super(JsonTestCase, self).assertValidUser(user)"},{"line_number":636,"context_line":"        self.assertNotIn(\u0027default_project_id\u0027, user)"},{"line_number":637,"context_line":"        if \u0027tenantId\u0027 in user:"},{"line_number":638,"context_line":"            self.assertIsNotNone(user.get(\u0027tenantId\u0027))"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def assertValidAuthenticationResponse(self, r,"},{"line_number":641,"context_line":"                                          require_service_catalog\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2FzCs%3D","line":638,"updated":"2013-09-19 02:28:11.000000000","message":"?","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"a507e204344eeb4e61de3d0df1baa3ecb6ac1484","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        super(JsonTestCase, self).assertValidUser(user)"},{"line_number":636,"context_line":"        self.assertNotIn(\u0027default_project_id\u0027, user)"},{"line_number":637,"context_line":"        if \u0027tenantId\u0027 in user:"},{"line_number":638,"context_line":"            self.assertIsNotNone(user.get(\u0027tenantId\u0027))"},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"    def assertValidAuthenticationResponse(self, r,"},{"line_number":641,"context_line":"                                          require_service_catalog\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAS3%2F%2Fy6Q%3D","line":638,"in_reply_to":"AAAAS3%2F%2FzCs%3D","updated":"2013-09-19 05:34:13.000000000","message":"tenantId should never be \"None\" in the new mechanism for normalizing the default_project_id.  The normalize should strip it out if it exists and is None.  This probably should have had a comment.","commit_id":"03d754e54ff01f3c5aa26b1ef6cc5afb6d6a31a6"}],"keystone/tests/test_sql_upgrade.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":1596,"context_line":"        old_json_data \u003d json.loads(user1[\u0027extra\u0027])"},{"line_number":1597,"context_line":"        new_json_data \u003d json.loads(updated_user1.extra)"},{"line_number":1598,"context_line":"        self.assertNotIn(\u0027tenantId\u0027, new_json_data)"},{"line_number":1599,"context_line":"        self.assertEquals(old_json_data[\u0027tenantId\u0027],"},{"line_number":1600,"context_line":"                          updated_user1.default_project_id)"},{"line_number":1601,"context_line":"        updated_user2 \u003d session.query(user_table).filter_by(id\u003d\u0027foo2\u0027).one()"},{"line_number":1602,"context_line":"        old_json_data \u003d json.loads(user2[\u0027extra\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrAw%3D","line":1599,"updated":"2013-09-22 20:51:25.000000000","message":"I think we\u0027re using assertEqual now?","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":1596,"context_line":"        old_json_data \u003d json.loads(user1[\u0027extra\u0027])"},{"line_number":1597,"context_line":"        new_json_data \u003d json.loads(updated_user1.extra)"},{"line_number":1598,"context_line":"        self.assertNotIn(\u0027tenantId\u0027, new_json_data)"},{"line_number":1599,"context_line":"        self.assertEquals(old_json_data[\u0027tenantId\u0027],"},{"line_number":1600,"context_line":"                          updated_user1.default_project_id)"},{"line_number":1601,"context_line":"        updated_user2 \u003d session.query(user_table).filter_by(id\u003d\u0027foo2\u0027).one()"},{"line_number":1602,"context_line":"        old_json_data \u003d json.loads(user2[\u0027extra\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2FQ%3D","line":1599,"in_reply_to":"AAAAS3%2F%2FrAw%3D","updated":"2013-09-22 22:13:12.000000000","message":"Ah yep, I had it backwards I thought assertEqual was deprecated.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"}],"keystone/tests/test_v3_identity.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":1571,"context_line":"        self.delete(member_url, expected_status\u003d404)"},{"line_number":1572,"context_line":""},{"line_number":1573,"context_line":""},{"line_number":1574,"context_line":"class TestV3toV2Methods(tests.TestCase):"},{"line_number":1575,"context_line":"    \"\"\"Test V3 to V2 conversion convenience methods.\"\"\""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrDE%3D","line":1574,"updated":"2013-09-22 20:51:25.000000000","message":"Not sure that this belongs in \"test_v3_identity.py\" since it\u0027s in the V2 controller and not the V3 controller. (But I\u0027m also fine leaving it here... the tests are poorly organized in general.)","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":1571,"context_line":"        self.delete(member_url, expected_status\u003d404)"},{"line_number":1572,"context_line":""},{"line_number":1573,"context_line":""},{"line_number":1574,"context_line":"class TestV3toV2Methods(tests.TestCase):"},{"line_number":1575,"context_line":"    \"\"\"Test V3 to V2 conversion convenience methods.\"\"\""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2FI%3D","line":1574,"in_reply_to":"AAAAS3%2F%2FrDE%3D","updated":"2013-09-22 22:13:12.000000000","message":"I wasn\u0027t sure where to put it, and it isn\u0027t something I wanted to run each time for each backend.  Lets plan to reorg if possible tests to be better in Icehouse.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":1572,"context_line":""},{"line_number":1573,"context_line":""},{"line_number":1574,"context_line":"class TestV3toV2Methods(tests.TestCase):"},{"line_number":1575,"context_line":"    \"\"\"Test V3 to V2 conversion convenience methods.\"\"\""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"    def setUp(self):"},{"line_number":1578,"context_line":"        super(TestV3toV2Methods, self).setUp()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrC4%3D","line":1575,"updated":"2013-09-22 20:51:25.000000000","message":"convenience method? Not sure what that is or how it applies in this case.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":1572,"context_line":""},{"line_number":1573,"context_line":""},{"line_number":1574,"context_line":"class TestV3toV2Methods(tests.TestCase):"},{"line_number":1575,"context_line":"    \"\"\"Test V3 to V2 conversion convenience methods.\"\"\""},{"line_number":1576,"context_line":""},{"line_number":1577,"context_line":"    def setUp(self):"},{"line_number":1578,"context_line":"        super(TestV3toV2Methods, self).setUp()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2FE%3D","line":1575,"in_reply_to":"AAAAS3%2F%2FrC4%3D","updated":"2013-09-22 22:13:12.000000000","message":"will remove \"convenience\" from the docstring.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"c438f08c0f44718063d8a1ef28474ce643ab4828","unresolved":false,"context_lines":[{"line_number":1606,"context_line":"        controller.V2Controller.v3_to_v2_user(self.user1)"},{"line_number":1607,"context_line":"        self.assertIn(\u0027tenantId\u0027, self.user1)"},{"line_number":1608,"context_line":"        self.assertNotIn(\u0027domain_id\u0027, self.user1)"},{"line_number":1609,"context_line":"        self.assertNotIn(\u0027default_project_id\u0027, self.user1)"},{"line_number":1610,"context_line":"        self.assertEquals(self.user1[\u0027tenantId\u0027], self.default_project_id)"},{"line_number":1611,"context_line":"        controller.V2Controller.v3_to_v2_user(self.user2)"},{"line_number":1612,"context_line":"        self.assertNotIn(\u0027tenantId\u0027, self.user2)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2FrCc%3D","line":1609,"updated":"2013-09-22 20:51:25.000000000","message":"seems like we know exactly what the resulting user should look like, so why not using like assertEqual(self.user1, expected_v2_user1) ?","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"5842570372bbb54637d35164562e6196aa1dbaa5","unresolved":false,"context_lines":[{"line_number":1606,"context_line":"        controller.V2Controller.v3_to_v2_user(self.user1)"},{"line_number":1607,"context_line":"        self.assertIn(\u0027tenantId\u0027, self.user1)"},{"line_number":1608,"context_line":"        self.assertNotIn(\u0027domain_id\u0027, self.user1)"},{"line_number":1609,"context_line":"        self.assertNotIn(\u0027default_project_id\u0027, self.user1)"},{"line_number":1610,"context_line":"        self.assertEquals(self.user1[\u0027tenantId\u0027], self.default_project_id)"},{"line_number":1611,"context_line":"        controller.V2Controller.v3_to_v2_user(self.user2)"},{"line_number":1612,"context_line":"        self.assertNotIn(\u0027tenantId\u0027, self.user2)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAS3%2F%2Fq%2FM%3D","line":1609,"in_reply_to":"AAAAS3%2F%2FrCc%3D","updated":"2013-09-22 22:13:12.000000000","message":"Fair enough, I\u0027ll build a \"expected result\" version as well.","commit_id":"dd5c6935bd476c99ef8ee4f27fd08f55ec3bd7a4"}],"keystone/token/controllers.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"947d93d1b61f69c8cc91c1c40e9d36048b0d8f2e","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        user_ref, tenant_ref, metadata_ref, expiry, bind \u003d auth_info"},{"line_number":97,"context_line":"        core.validate_auth_info(self, user_ref, tenant_ref)"},{"line_number":98,"context_line":"        user_ref \u003d controller.V2Controller.v3_to_v2_user(user_ref)"},{"line_number":99,"context_line":"        if tenant_ref:"},{"line_number":100,"context_line":"            tenant_ref \u003d self._filter_domain_id(tenant_ref)"},{"line_number":101,"context_line":"        auth_token_data \u003d self._get_auth_token_data(user_ref,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FuNg%3D","line":98,"updated":"2013-09-20 15:36:18.000000000","message":"Seems strange that core.validate_auth_info takes a \"canonical\"/v3 user but the rest of this function uses v2 users. Please add a comment why this is the case.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"e33188808be0c826052fe60c30c8095b3daaf42a","unresolved":false,"context_lines":[{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        user_ref, tenant_ref, metadata_ref, expiry, bind \u003d auth_info"},{"line_number":97,"context_line":"        core.validate_auth_info(self, user_ref, tenant_ref)"},{"line_number":98,"context_line":"        user_ref \u003d controller.V2Controller.v3_to_v2_user(user_ref)"},{"line_number":99,"context_line":"        if tenant_ref:"},{"line_number":100,"context_line":"            tenant_ref \u003d self._filter_domain_id(tenant_ref)"},{"line_number":101,"context_line":"        auth_token_data \u003d self._get_auth_token_data(user_ref,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAS3%2F%2FtwE%3D","line":98,"in_reply_to":"AAAAS3%2F%2FuNg%3D","updated":"2013-09-20 18:14:44.000000000","message":"Same as with the ec2 one, this is that the data could be consumed externally, therefore we make sure the correct version.  comment will be added.","commit_id":"d8984c6be247b7b712a2919a10f81a2991afd094"}]}
