)]}'
{"doc/source/configuration.rst":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"39a5a26c19c038edc4f3e97f518608d506d89eb5","unresolved":false,"context_lines":[{"line_number":491,"context_line":""},{"line_number":492,"context_line":"Keystone provides an optional extension that adds the capability to assign roles to a domain that, rather than"},{"line_number":493,"context_line":"affect the domain itself, are instead inherited to all projects owned by theat domain.  This extension is disabled by"},{"line_number":494,"context_line":"default, but can be enabled by including the following in the keystone.conf file.  Once enabled, role assignments"},{"line_number":495,"context_line":"made via the v3 API can be suffixed with \u0027/inherited_to_projects\u0027 to specify and inherited assignment, for example:"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"PUT /OS-INHERIT/domains/--domain_id--/users/--user_id--/roles/--role_id--/inherited_to_projects"}],"source_content_type":"text/x-rst","patch_set":18,"id":"AAAAP3%2F%2FiPI%3D","line":494,"updated":"2013-07-16 21:21:04.000000000","message":"remove the sentence starting with \u0027once enabled\u0027 .. it\u0027s way out of scope for this doc\n\nalso remove the corresponding PUT example\n\n``keystone.conf``","commit_id":"38018a7a8f5c02d63e8cd4182239d82caf89122b"}],"etc/keystone.conf.sample":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":112,"context_line":"[os_inherit]"},{"line_number":113,"context_line":"# role-assignment inheritance to projects from owning domain can be"},{"line_number":114,"context_line":"# optionally disabled"},{"line_number":115,"context_line":"# enabled \u003d True"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"[catalog]"},{"line_number":118,"context_line":"# dynamic, sql-based backend (supports API/CLI-based management commands)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAP3%2F%2FoDk%3D","line":115,"updated":"2013-07-15 19:50:07.000000000","message":"Not sure what\u0027s the proper way to do extension. I was under the impression that we need to park the extensions in keystone/contrib. Disabling an extension simply means removing it from the pipeline.\n\nBut OS-TRUST didn\u0027t follow this pattern so I am not sure. But since OS-INHERIT have heavy dependency on the existing role schema so I don\u0027t have strong objection for mingling the code. But should the routers be in keystone/contrib then? I still prefer the pipeline approach. But I got a feeling I am minority on this one. :)","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fbc246aaeb5fd7961397090f6ac4764d5baa00c2","unresolved":false,"context_lines":[{"line_number":112,"context_line":"[os_inherit]"},{"line_number":113,"context_line":"# role-assignment inheritance to projects from owning domain can be"},{"line_number":114,"context_line":"# optionally disabled"},{"line_number":115,"context_line":"# enabled \u003d True"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"[catalog]"},{"line_number":118,"context_line":"# dynamic, sql-based backend (supports API/CLI-based management commands)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAP3%2F%2FlII%3D","line":115,"in_reply_to":"AAAAP3%2F%2FlzA%3D","updated":"2013-07-16 13:28:47.000000000","message":"So as to a use case, I just thought that this was sensible practice, but I can be persuaded out of it if we feel it is not necessary to support :-)","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cd259936423021764f57f5384feff7ab0a4a742e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"[os_inherit]"},{"line_number":113,"context_line":"# role-assignment inheritance to projects from owning domain can be"},{"line_number":114,"context_line":"# optionally disabled"},{"line_number":115,"context_line":"# enabled \u003d True"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"[catalog]"},{"line_number":118,"context_line":"# dynamic, sql-based backend (supports API/CLI-based management commands)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAP3%2F%2FlzA%3D","line":115,"in_reply_to":"AAAAP3%2F%2FnRA%3D","updated":"2013-07-16 05:57:29.000000000","message":"We have such use case? I would think you either enable it at the beginning or you don\u0027t.\n\nYou really don\u0027t need a flag to tell you if the extension is enabled or not. You can just inspect the pipeline to see if your extension is there.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":112,"context_line":"[os_inherit]"},{"line_number":113,"context_line":"# role-assignment inheritance to projects from owning domain can be"},{"line_number":114,"context_line":"# optionally disabled"},{"line_number":115,"context_line":"# enabled \u003d True"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"[catalog]"},{"line_number":118,"context_line":"# dynamic, sql-based backend (supports API/CLI-based management commands)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAP3%2F%2FnRA%3D","line":115,"in_reply_to":"AAAAP3%2F%2FoDk%3D","updated":"2013-07-15 21:00:07.000000000","message":"One of the main reasons to have the config switch is so that if you enable it for a bit, create some inherited roles, then you want to be able to mute all those inherited roles if you decide you want to turn off the extension.  So it is not just about removing the ability to call one of the grant APIs","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"}],"keystone/assignment/backends/kvs.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            metadata_ref \u003d self._get_metadata(user_id, tenant_id)"},{"line_number":106,"context_line":"        except exception.MetadataNotFound:"},{"line_number":107,"context_line":"            metadata_ref \u003d {}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        try:"},{"line_number":110,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d self._add_role_to_role_dicts("}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FoDQ%3D","line":107,"updated":"2013-07-15 19:50:07.000000000","message":"Just a general statement. Why are we even wasting time supporting KVS for the assignment stuff?","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cd259936423021764f57f5384feff7ab0a4a742e","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            metadata_ref \u003d self._get_metadata(user_id, tenant_id)"},{"line_number":106,"context_line":"        except exception.MetadataNotFound:"},{"line_number":107,"context_line":"            metadata_ref \u003d {}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        try:"},{"line_number":110,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d self._add_role_to_role_dicts("}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fly8%3D","line":107,"in_reply_to":"AAAAP3%2F%2FnQY%3D","updated":"2013-07-16 05:57:29.000000000","message":"+1","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        try:"},{"line_number":105,"context_line":"            metadata_ref \u003d self._get_metadata(user_id, tenant_id)"},{"line_number":106,"context_line":"        except exception.MetadataNotFound:"},{"line_number":107,"context_line":"            metadata_ref \u003d {}"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        try:"},{"line_number":110,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d self._add_role_to_role_dicts("}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnQY%3D","line":107,"in_reply_to":"AAAAP3%2F%2FoDQ%3D","updated":"2013-07-15 21:00:07.000000000","message":"...we just need decide to drop that as a team!","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"26d307837d6a3b003f1d613ff2160b222fd1cb86","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                                  project_refs)"},{"line_number":45,"context_line":"        return project_refs"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _list_projects_for_domain(self, domain_id):"},{"line_number":48,"context_line":"        self.get_domain(domain_id)"},{"line_number":49,"context_line":"        project_keys \u003d filter(lambda x: x.startswith(\"tenant-\"),"},{"line_number":50,"context_line":"                              self.db.keys())"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FjRk%3D","line":47,"updated":"2013-07-16 17:46:15.000000000","message":"Not sure where this is being called from/used (couldn\u0027t find a reference).  \n\nLikely the need for a function to extract IDs explicitly from the project_refs that does almost exactly the same work as list_projects() is in violation of DRY.\n\nIf this method is needed, you should call list_projects() and then extract the IDs instead of duplicating the code to get the project_refs.","commit_id":"1bc9d6643cd79fd788f4fd850dd9cc21db40e982"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"29a86bbdc106752e345cc6b76afaa019c642e050","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                                  project_refs)"},{"line_number":45,"context_line":"        return project_refs"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def _list_projects_for_domain(self, domain_id):"},{"line_number":48,"context_line":"        self.get_domain(domain_id)"},{"line_number":49,"context_line":"        project_keys \u003d filter(lambda x: x.startswith(\"tenant-\"),"},{"line_number":50,"context_line":"                              self.db.keys())"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FjIM%3D","line":47,"in_reply_to":"AAAAP3%2F%2FjRk%3D","updated":"2013-07-16 18:11:01.000000000","message":"oops, that was meant to be deleted...I had already done as you suggested and added a domain_is parameter to list_projects().  Just forgot to delete this WIP.  Good catch.","commit_id":"1bc9d6643cd79fd788f4fd850dd9cc21db40e982"}],"keystone/assignment/backends/sql.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        except exception.MetadataNotFound:"},{"line_number":119,"context_line":"            metadata_ref \u003d {}"},{"line_number":120,"context_line":"            is_new \u003d True"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d self._add_role_to_role_dicts("},{"line_number":123,"context_line":"            role_id, inherited_to_projects, metadata_ref.get(\u0027roles\u0027, []))"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FneU%3D","line":121,"updated":"2013-07-15 19:50:07.000000000","message":"you should check to make sure inherited_to_projects flag is only applicable to domain role grant only, and make sure the extension is enabled.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        except exception.MetadataNotFound:"},{"line_number":119,"context_line":"            metadata_ref \u003d {}"},{"line_number":120,"context_line":"            is_new \u003d True"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        metadata_ref[\u0027roles\u0027] \u003d self._add_role_to_role_dicts("},{"line_number":123,"context_line":"            role_id, inherited_to_projects, metadata_ref.get(\u0027roles\u0027, []))"},{"line_number":124,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnPQ%3D","line":121,"in_reply_to":"AAAAP3%2F%2FneU%3D","updated":"2013-07-15 21:00:07.000000000","message":"So we know that we can\u0027t get called if the extension is disabled (the controller checks this)...but we should check \u0026 refuse inherited roles on projects","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        if is_new:"},{"line_number":213,"context_line":"            # TODO(henry-nash) It seems odd that you would create a new"},{"line_number":214,"context_line":"            # entry in response to trying to delete a role that was not"},{"line_number":215,"context_line":"            # assigned.  Although benign, this should probably be removed."},{"line_number":216,"context_line":"            self._create_metadata(user_id, project_id, metadata_ref,"},{"line_number":217,"context_line":"                                  domain_id, group_id)"},{"line_number":218,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fn%2FE%3D","line":215,"updated":"2013-07-15 19:50:07.000000000","message":"yeah, wtf\n\nif MetadataNotFound or role_id not in metadata_ref[\u0027roles\u0027], we should just returned. What\u0027s the point of creating a new ref?","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        if is_new:"},{"line_number":213,"context_line":"            # TODO(henry-nash) It seems odd that you would create a new"},{"line_number":214,"context_line":"            # entry in response to trying to delete a role that was not"},{"line_number":215,"context_line":"            # assigned.  Although benign, this should probably be removed."},{"line_number":216,"context_line":"            self._create_metadata(user_id, project_id, metadata_ref,"},{"line_number":217,"context_line":"                                  domain_id, group_id)"},{"line_number":218,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnOs%3D","line":215,"in_reply_to":"AAAAP3%2F%2Fn%2FE%3D","updated":"2013-07-15 21:00:07.000000000","message":"beats the hell out of me...but thought I should fix that in a separate patch","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cd259936423021764f57f5384feff7ab0a4a742e","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        if is_new:"},{"line_number":213,"context_line":"            # TODO(henry-nash) It seems odd that you would create a new"},{"line_number":214,"context_line":"            # entry in response to trying to delete a role that was not"},{"line_number":215,"context_line":"            # assigned.  Although benign, this should probably be removed."},{"line_number":216,"context_line":"            self._create_metadata(user_id, project_id, metadata_ref,"},{"line_number":217,"context_line":"                                  domain_id, group_id)"},{"line_number":218,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fly0%3D","line":215,"in_reply_to":"AAAAP3%2F%2FnOs%3D","updated":"2013-07-16 05:57:29.000000000","message":"agreed","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        # calling \u0027get_roles_for_user_and_project()\u0027.  Further, this"},{"line_number":233,"context_line":"        # call seems essentially the same as \u0027list_user_projects()\u0027"},{"line_number":234,"context_line":"        # later in this driver.  Both should be removed."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        self.identity_api.get_user(user_id)"},{"line_number":237,"context_line":"        session \u003d self.get_session()"},{"line_number":238,"context_line":"        query \u003d session.query(UserProjectGrant)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fnm4%3D","line":235,"updated":"2013-07-15 19:50:07.000000000","message":"yeah, we don\u0027t have the list projects for user API anymore. We need to go back to the drawing board on that one after we finish the role APIs.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        # calling \u0027get_roles_for_user_and_project()\u0027.  Further, this"},{"line_number":233,"context_line":"        # call seems essentially the same as \u0027list_user_projects()\u0027"},{"line_number":234,"context_line":"        # later in this driver.  Both should be removed."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        self.identity_api.get_user(user_id)"},{"line_number":237,"context_line":"        session \u003d self.get_session()"},{"line_number":238,"context_line":"        query \u003d session.query(UserProjectGrant)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnOo%3D","line":235,"in_reply_to":"AAAAP3%2F%2Fnm4%3D","updated":"2013-07-15 21:00:07.000000000","message":"agreed.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            metadata_ref \u003d {}"},{"line_number":253,"context_line":"            is_new \u003d True"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        try:"},{"line_number":256,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d self._add_role_to_role_dicts("},{"line_number":257,"context_line":"                role_id, False, metadata_ref.get(\u0027roles\u0027, []),"},{"line_number":258,"context_line":"                allow_existing\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnlA%3D","line":255,"updated":"2013-07-15 19:50:07.000000000","message":"wait, this logic looks the same as create_grant(). Time for refactor?","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fbc246aaeb5fd7961397090f6ac4764d5baa00c2","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            metadata_ref \u003d {}"},{"line_number":253,"context_line":"            is_new \u003d True"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        try:"},{"line_number":256,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d self._add_role_to_role_dicts("},{"line_number":257,"context_line":"                role_id, False, metadata_ref.get(\u0027roles\u0027, []),"},{"line_number":258,"context_line":"                allow_existing\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FlBQ%3D","line":255,"in_reply_to":"AAAAP3%2F%2FnOU%3D","updated":"2013-07-16 13:28:47.000000000","message":"I think I\u0027d rather leave that to a separate patch...some minor subtleties in error reporting etc....don\u0027t want to confuse that with an extension patch","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            metadata_ref \u003d {}"},{"line_number":253,"context_line":"            is_new \u003d True"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        try:"},{"line_number":256,"context_line":"            metadata_ref[\u0027roles\u0027] \u003d self._add_role_to_role_dicts("},{"line_number":257,"context_line":"                role_id, False, metadata_ref.get(\u0027roles\u0027, []),"},{"line_number":258,"context_line":"                allow_existing\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnOU%3D","line":255,"in_reply_to":"AAAAP3%2F%2FnlA%3D","updated":"2013-07-15 21:00:07.000000000","message":"maybe right","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        except KeyError:"},{"line_number":260,"context_line":"            msg \u003d (\u0027User %s already has role %s in tenant %s\u0027"},{"line_number":261,"context_line":"                   % (user_id, role_id, tenant_id))"},{"line_number":262,"context_line":"            raise exception.Conflict(type\u003d\u0027role grant\u0027, details\u003dmsg)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"        if is_new:"},{"line_number":265,"context_line":"            self._create_metadata(user_id, tenant_id, metadata_ref)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fnkk%3D","line":262,"updated":"2013-07-15 19:50:07.000000000","message":"I am not sure about raising Conflict here. If grant already exist, just do nothing.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cd259936423021764f57f5384feff7ab0a4a742e","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        except KeyError:"},{"line_number":260,"context_line":"            msg \u003d (\u0027User %s already has role %s in tenant %s\u0027"},{"line_number":261,"context_line":"                   % (user_id, role_id, tenant_id))"},{"line_number":262,"context_line":"            raise exception.Conflict(type\u003d\u0027role grant\u0027, details\u003dmsg)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"        if is_new:"},{"line_number":265,"context_line":"            self._create_metadata(user_id, tenant_id, metadata_ref)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Flyw%3D","line":262,"in_reply_to":"AAAAP3%2F%2FnOg%3D","updated":"2013-07-16 05:57:29.000000000","message":"that\u0027s fine. We can decide on that one later, in a separate patch.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        except KeyError:"},{"line_number":260,"context_line":"            msg \u003d (\u0027User %s already has role %s in tenant %s\u0027"},{"line_number":261,"context_line":"                   % (user_id, role_id, tenant_id))"},{"line_number":262,"context_line":"            raise exception.Conflict(type\u003d\u0027role grant\u0027, details\u003dmsg)"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"        if is_new:"},{"line_number":265,"context_line":"            self._create_metadata(user_id, tenant_id, metadata_ref)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnOg%3D","line":262,"in_reply_to":"AAAAP3%2F%2Fnkk%3D","updated":"2013-07-15 21:00:07.000000000","message":"I was just keeping the existing behaviour....in case something relied on it...","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"},{"line_number":270,"context_line":"        try:"},{"line_number":271,"context_line":"            metadata_ref \u003d self._get_metadata(user_id, tenant_id)"},{"line_number":272,"context_line":"            try:"},{"line_number":273,"context_line":"                metadata_ref[\u0027roles\u0027] \u003d self._remove_role_from_role_dicts("},{"line_number":274,"context_line":"                    role_id, False, metadata_ref.get(\u0027roles\u0027, []))"},{"line_number":275,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnkY%3D","line":272,"updated":"2013-07-15 19:50:07.000000000","message":"delete_grant()?","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fbc246aaeb5fd7961397090f6ac4764d5baa00c2","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"},{"line_number":270,"context_line":"        try:"},{"line_number":271,"context_line":"            metadata_ref \u003d self._get_metadata(user_id, tenant_id)"},{"line_number":272,"context_line":"            try:"},{"line_number":273,"context_line":"                metadata_ref[\u0027roles\u0027] \u003d self._remove_role_from_role_dicts("},{"line_number":274,"context_line":"                    role_id, False, metadata_ref.get(\u0027roles\u0027, []))"},{"line_number":275,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FlBI%3D","line":272,"in_reply_to":"AAAAP3%2F%2FnOI%3D","updated":"2013-07-16 13:28:47.000000000","message":"I think I\u0027d rather leave that to a separate patch...some minor subtleties in error reporting etc....don\u0027t want to confuse that with an extension patch","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    def remove_role_from_user_and_project(self, user_id, tenant_id, role_id):"},{"line_number":270,"context_line":"        try:"},{"line_number":271,"context_line":"            metadata_ref \u003d self._get_metadata(user_id, tenant_id)"},{"line_number":272,"context_line":"            try:"},{"line_number":273,"context_line":"                metadata_ref[\u0027roles\u0027] \u003d self._remove_role_from_role_dicts("},{"line_number":274,"context_line":"                    role_id, False, metadata_ref.get(\u0027roles\u0027, []))"},{"line_number":275,"context_line":"            except KeyError:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnOI%3D","line":272,"in_reply_to":"AAAAP3%2F%2FnkY%3D","updated":"2013-07-15 21:00:07.000000000","message":"as per comment on create grant.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"26d307837d6a3b003f1d613ff2160b222fd1cb86","unresolved":false,"context_lines":[{"line_number":696,"context_line":"    - Group for Project"},{"line_number":697,"context_line":"    - Group for Domain"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"    Each is a table with the two attributes above as a combined prime key,"},{"line_number":700,"context_line":"    with the data field holding all roles for that combination.  The data"},{"line_number":701,"context_line":"    field is a list of dicts.  For regular role assignments each dict in"},{"line_number":702,"context_line":"    the list of of the form:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FjP0%3D","line":699,"updated":"2013-07-16 17:46:15.000000000","message":"Nit: \"prime key\" should be \"primary key\"","commit_id":"1bc9d6643cd79fd788f4fd850dd9cc21db40e982"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"29a86bbdc106752e345cc6b76afaa019c642e050","unresolved":false,"context_lines":[{"line_number":696,"context_line":"    - Group for Project"},{"line_number":697,"context_line":"    - Group for Domain"},{"line_number":698,"context_line":""},{"line_number":699,"context_line":"    Each is a table with the two attributes above as a combined prime key,"},{"line_number":700,"context_line":"    with the data field holding all roles for that combination.  The data"},{"line_number":701,"context_line":"    field is a list of dicts.  For regular role assignments each dict in"},{"line_number":702,"context_line":"    the list of of the form:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FjIU%3D","line":699,"in_reply_to":"AAAAP3%2F%2FjP0%3D","updated":"2013-07-16 18:11:01.000000000","message":"Done","commit_id":"1bc9d6643cd79fd788f4fd850dd9cc21db40e982"}],"keystone/assignment/core.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.identity_api.assignment_api \u003d self"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_roles_for_user_and_project(self, user_id, tenant_id):"},{"line_number":62,"context_line":"        \"\"\"Get the roles associated with a user within given tenant."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        This includes roles directly assigned to the user on the"},{"line_number":65,"context_line":"        project, as well as those by virtue of group membership. If"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fnjw%3D","line":62,"updated":"2013-07-15 19:50:07.000000000","message":"s/tenant/project/g","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.identity_api.assignment_api \u003d self"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def get_roles_for_user_and_project(self, user_id, tenant_id):"},{"line_number":62,"context_line":"        \"\"\"Get the roles associated with a user within given tenant."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        This includes roles directly assigned to the user on the"},{"line_number":65,"context_line":"        project, as well as those by virtue of group membership. If"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnNo%3D","line":62,"in_reply_to":"AAAAP3%2F%2Fnjw%3D","updated":"2013-07-15 21:00:07.000000000","message":"yep, good idea","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                            exception.NotImplemented):"},{"line_number":98,"context_line":"                        pass"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            return role_list"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        def _get_user_project_roles(user_id, project_ref):"},{"line_number":103,"context_line":"            role_list \u003d []"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fnis%3D","line":100,"updated":"2013-07-15 19:50:07.000000000","message":"is role_list unique?","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fbc246aaeb5fd7961397090f6ac4764d5baa00c2","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                            exception.NotImplemented):"},{"line_number":98,"context_line":"                        pass"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            return role_list"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        def _get_user_project_roles(user_id, project_ref):"},{"line_number":103,"context_line":"            role_list \u003d []"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FlA8%3D","line":100,"in_reply_to":"AAAAP3%2F%2Flyc%3D","updated":"2013-07-16 13:28:47.000000000","message":"Ah, ok, understand your point - It is made unique in the function that calls it below, when the two lists are combined.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cd259936423021764f57f5384feff7ab0a4a742e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                            exception.NotImplemented):"},{"line_number":98,"context_line":"                        pass"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            return role_list"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        def _get_user_project_roles(user_id, project_ref):"},{"line_number":103,"context_line":"            role_list \u003d []"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Flyc%3D","line":100,"in_reply_to":"AAAAP3%2F%2FnNc%3D","updated":"2013-07-16 05:57:29.000000000","message":"we need to make sure role_list contains unique members. Say I have a role \"Admin\" granted to a user for a project. Then later I grant the same \"Admin\" role to the domain, inherited by projects. Would role_list ended up with two same \"Admin\" roles?","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                            exception.NotImplemented):"},{"line_number":98,"context_line":"                        pass"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"            return role_list"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        def _get_user_project_roles(user_id, project_ref):"},{"line_number":103,"context_line":"            role_list \u003d []"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnNc%3D","line":100,"in_reply_to":"AAAAP3%2F%2Fnis%3D","updated":"2013-07-15 21:00:07.000000000","message":"not sure what you mean, sorry?","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        return role_list"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def _add_role_to_role_dicts(self, role_id, inherited, dict_list,"},{"line_number":219,"context_line":"                                allow_existing\u003dTrue):"},{"line_number":220,"context_line":"        role_set \u003d set([frozenset(r.items()) for r in dict_list])"},{"line_number":221,"context_line":"        key \u003d frozenset(self._role_to_dict(role_id, inherited).items())"},{"line_number":222,"context_line":"        if not allow_existing and key in role_set:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnuY%3D","line":219,"updated":"2013-07-15 19:50:07.000000000","message":"may want to drop a comment here to clarify what \u0027allow_existing\u0027 is for","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        return role_list"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def _add_role_to_role_dicts(self, role_id, inherited, dict_list,"},{"line_number":219,"context_line":"                                allow_existing\u003dTrue):"},{"line_number":220,"context_line":"        role_set \u003d set([frozenset(r.items()) for r in dict_list])"},{"line_number":221,"context_line":"        key \u003d frozenset(self._role_to_dict(role_id, inherited).items())"},{"line_number":222,"context_line":"        if not allow_existing and key in role_set:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnNM%3D","line":219,"in_reply_to":"AAAAP3%2F%2FnuY%3D","updated":"2013-07-15 21:00:07.000000000","message":"Good idea","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        return [dict(r) for r in role_set]"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def _remove_role_from_role_dicts(self, role_id, inherited, dict_list):"},{"line_number":228,"context_line":"        role_set \u003d set([frozenset(r.items()) for r in dict_list])"},{"line_number":229,"context_line":"        role_set.remove(frozenset(self._role_to_dict(role_id,"},{"line_number":230,"context_line":"                                                     inherited).items()))"},{"line_number":231,"context_line":"        return [dict(r) for r in role_set]"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fnq0%3D","line":228,"updated":"2013-07-15 19:50:07.000000000","message":"may want to check to see if the set exist first before removing it","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        return [dict(r) for r in role_set]"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def _remove_role_from_role_dicts(self, role_id, inherited, dict_list):"},{"line_number":228,"context_line":"        role_set \u003d set([frozenset(r.items()) for r in dict_list])"},{"line_number":229,"context_line":"        role_set.remove(frozenset(self._role_to_dict(role_id,"},{"line_number":230,"context_line":"                                                     inherited).items()))"},{"line_number":231,"context_line":"        return [dict(r) for r in role_set]"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnMg%3D","line":228,"in_reply_to":"AAAAP3%2F%2Fnq0%3D","updated":"2013-07-15 21:00:07.000000000","message":"Done","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        \"\"\""},{"line_number":277,"context_line":"        raise exception.NotImplemented()"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _list_projects_for_domain(self, domain_id):"},{"line_number":280,"context_line":"        \"\"\"Get the projects owned by a given domain."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        :returns: a list of project_id\u0027s."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnfQ%3D","line":279,"updated":"2013-07-15 19:50:07.000000000","message":"why is this one needed? Can\u0027t you use identity.controller.get_projects() filtered by domain_id?","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fbc246aaeb5fd7961397090f6ac4764d5baa00c2","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        \"\"\""},{"line_number":277,"context_line":"        raise exception.NotImplemented()"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _list_projects_for_domain(self, domain_id):"},{"line_number":280,"context_line":"        \"\"\"Get the projects owned by a given domain."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        :returns: a list of project_id\u0027s."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fk2c%3D","line":279,"in_reply_to":"AAAAP3%2F%2FlyM%3D","updated":"2013-07-16 13:28:47.000000000","message":"Have added domain_id as an optionally parameter to the driver list_projects() call and now use that.  This is what an optimized controller call would need to use anyway.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"cd259936423021764f57f5384feff7ab0a4a742e","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        \"\"\""},{"line_number":277,"context_line":"        raise exception.NotImplemented()"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _list_projects_for_domain(self, domain_id):"},{"line_number":280,"context_line":"        \"\"\"Get the projects owned by a given domain."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        :returns: a list of project_id\u0027s."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FlyM%3D","line":279,"in_reply_to":"AAAAP3%2F%2FnJ0%3D","updated":"2013-07-16 05:57:29.000000000","message":"We\u0027ll need to optimized the filters eventually anyway. We should avoid having to maintain different code paths if we don\u0027t have to. I made that mistake with the v2 and v3 auth.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        \"\"\""},{"line_number":277,"context_line":"        raise exception.NotImplemented()"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def _list_projects_for_domain(self, domain_id):"},{"line_number":280,"context_line":"        \"\"\"Get the projects owned by a given domain."},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        :returns: a list of project_id\u0027s."}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnJ0%3D","line":279,"in_reply_to":"AAAAP3%2F%2FnfQ%3D","updated":"2013-07-15 21:00:07.000000000","message":"wouldn\u0027t it be hard to use the actual controller call (since the filtering is done via the v3 wrapper).  I could just call the list_projects driver call and filer that....but thought it more efficient to actually pass the search filter into the DB.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"26d307837d6a3b003f1d613ff2160b222fd1cb86","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        If the assignment is to a domain, then optionally it may be"},{"line_number":292,"context_line":"        specified as inherited to owned projects (this requires"},{"line_number":293,"context_line":"        the OS-INHERIT extension to be enabled)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        :raises: keystone.exception.UserNotFound,"},{"line_number":296,"context_line":"                 keystone.exception.GroupNotFound,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FjO4%3D","line":293,"updated":"2013-07-16 17:46:15.000000000","message":"Nit: period at the end of the sentence.","commit_id":"1bc9d6643cd79fd788f4fd850dd9cc21db40e982"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"29a86bbdc106752e345cc6b76afaa019c642e050","unresolved":false,"context_lines":[{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        If the assignment is to a domain, then optionally it may be"},{"line_number":292,"context_line":"        specified as inherited to owned projects (this requires"},{"line_number":293,"context_line":"        the OS-INHERIT extension to be enabled)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        :raises: keystone.exception.UserNotFound,"},{"line_number":296,"context_line":"                 keystone.exception.GroupNotFound,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FjIc%3D","line":293,"in_reply_to":"AAAAP3%2F%2FjO4%3D","updated":"2013-07-16 18:11:01.000000000","message":"Done","commit_id":"1bc9d6643cd79fd788f4fd850dd9cc21db40e982"}],"keystone/common/sql/migrate_repo/versions/028_fixup_group_metadata.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ec12237a755b9b0ce2fc4e11513fc52030704f13","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    if migrate_engine.name !\u003d \u0027sqlite\u0027:"},{"line_number":31,"context_line":"        return"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    temp_tenant_table \u003d sql.Table("},{"line_number":34,"context_line":"        \u0027tenant\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAP3%2F%2Fie4%3D","line":31,"updated":"2013-07-16 20:30:42.000000000","message":"(perhaps) a more conventional way to do this would be to include an empty sqlite-specific migration script","commit_id":"f6d127e60e1d213aa91565255fd6f0530f9e7efe"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"39a5a26c19c038edc4f3e97f518608d506d89eb5","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    temp_tenant_table.drop()"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    # Now do a final table copy to get the table of the right name."},{"line_number":75,"context_line":"    # Re-init the metadata so that sqlalchemy does not get confused with"},{"line_number":76,"context_line":"    # multiple versions of the same named table."},{"line_number":77,"context_line":"    meta2 \u003d sql.MetaData()"},{"line_number":78,"context_line":"    meta2.bind \u003d migrate_engine"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAP3%2F%2FiO0%3D","line":75,"updated":"2013-07-16 21:21:04.000000000","message":"nice catch lol","commit_id":"38018a7a8f5c02d63e8cd4182239d82caf89122b"}],"keystone/common/sql/migrate_repo/versions/028_update_assignment_metadata.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def dict_list_to_list(metadata):"},{"line_number":68,"context_line":"        json_metadata \u003d json.loads(metadata)"},{"line_number":69,"context_line":"        if \u0027roles\u0027 in json_metadata:"},{"line_number":70,"context_line":"            json_metadata[\u0027roles\u0027] \u003d [x[\u0027id\u0027] for x in json_metadata[\u0027roles\u0027]]"},{"line_number":71,"context_line":"        return json.dumps(json_metadata)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2Fno8%3D","line":69,"updated":"2013-07-15 19:50:07.000000000","message":"may want to discard the inherited roles are they are meaningless in the older versions","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def dict_list_to_list(metadata):"},{"line_number":68,"context_line":"        json_metadata \u003d json.loads(metadata)"},{"line_number":69,"context_line":"        if \u0027roles\u0027 in json_metadata:"},{"line_number":70,"context_line":"            json_metadata[\u0027roles\u0027] \u003d [x[\u0027id\u0027] for x in json_metadata[\u0027roles\u0027]]"},{"line_number":71,"context_line":"        return json.dumps(json_metadata)"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnJg%3D","line":69,"in_reply_to":"AAAAP3%2F%2Fno8%3D","updated":"2013-07-15 21:00:07.000000000","message":"actually, that\u0027s a good point - nice catch.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"}],"keystone/identity/backends/ldap.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bdcb45e9e9b56816690e91dda6a8e8f48b810050","unresolved":false,"context_lines":[{"line_number":74,"context_line":"                raise AssertionError(\u0027Invalid user / password\u0027)"},{"line_number":75,"context_line":"        except Exception:"},{"line_number":76,"context_line":"            raise AssertionError(\u0027Invalid user / password\u0027)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        return self.assignment._set_default_domain("},{"line_number":79,"context_line":"            identity.filter_user(user_ref))"},{"line_number":80,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAP3%2F%2Ftuk%3D","line":77,"updated":"2013-07-12 15:11:17.000000000","message":"remove blank line - should be no change to this file","commit_id":"d3e0a7d01d09a8f162c6472b5e7cee27b8e91169"}],"keystone/identity/controllers.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d19ac80d1da5fb3e8bfa206b19e05d479f803662","unresolved":false,"context_lines":[{"line_number":748,"context_line":"            msg \u003d \u0027Specify a user or group, not both\u0027"},{"line_number":749,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"    def _check_if_inherited(self, context):"},{"line_number":752,"context_line":"        result \u003d False"},{"line_number":753,"context_line":"        if context[\u0027path\u0027].startswith(\u0027/OS-INHERIT\u0027):"},{"line_number":754,"context_line":"            if not CONF.os_inherit.enabled:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FneA%3D","line":751,"updated":"2013-07-15 19:50:07.000000000","message":"that\u0027s the reason I like the extension routes in keystone/contrib, disabling it is as simple as remoting it from the pipeline.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e6588a52b0bfa8e34b723bd91fc2df3367ddabaf","unresolved":false,"context_lines":[{"line_number":748,"context_line":"            msg \u003d \u0027Specify a user or group, not both\u0027"},{"line_number":749,"context_line":"            raise exception.ValidationError(msg)"},{"line_number":750,"context_line":""},{"line_number":751,"context_line":"    def _check_if_inherited(self, context):"},{"line_number":752,"context_line":"        result \u003d False"},{"line_number":753,"context_line":"        if context[\u0027path\u0027].startswith(\u0027/OS-INHERIT\u0027):"},{"line_number":754,"context_line":"            if not CONF.os_inherit.enabled:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAP3%2F%2FnJI%3D","line":751,"in_reply_to":"AAAAP3%2F%2FneA%3D","updated":"2013-07-15 21:00:07.000000000","message":"ahh, but the idea is that if we disable the extension, then we want to filter out any DB entries made while the extension was enabled...hence it is not as simple as just removing the pipeline entries.","commit_id":"4e19586108e5a29a2dc59676d5e4013edb000efd"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3098a325ca9905cfe9af14eb5605886168767f89","unresolved":false,"context_lines":[{"line_number":753,"context_line":"        if context[\u0027path\u0027].startswith(\u0027/OS-INHERIT\u0027):"},{"line_number":754,"context_line":"            if not CONF.os_inherit.enabled:"},{"line_number":755,"context_line":"                raise exception.Forbidden("},{"line_number":756,"context_line":"                    _(\u0027OS-INERIT Extension is disabled.\u0027))"},{"line_number":757,"context_line":"            if context[\u0027path\u0027].endswith(\u0027inherited_to_projects\u0027):"},{"line_number":758,"context_line":"                result \u003d True"},{"line_number":759,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2FkBA%3D","line":756,"updated":"2013-07-16 15:34:54.000000000","message":"if an extension is disabled, then then a 404 should have been raised by the router... i don\u0027t understand how/why you would get this far, but a disabled extension should not be allowed to introduce a 403","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ae78ef36aa70cbddfcd743ae9cfb4002e6976f9c","unresolved":false,"context_lines":[{"line_number":753,"context_line":"        if context[\u0027path\u0027].startswith(\u0027/OS-INHERIT\u0027):"},{"line_number":754,"context_line":"            if not CONF.os_inherit.enabled:"},{"line_number":755,"context_line":"                raise exception.Forbidden("},{"line_number":756,"context_line":"                    _(\u0027OS-INERIT Extension is disabled.\u0027))"},{"line_number":757,"context_line":"            if context[\u0027path\u0027].endswith(\u0027inherited_to_projects\u0027):"},{"line_number":758,"context_line":"                result \u003d True"},{"line_number":759,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2FjvA%3D","line":756,"in_reply_to":"AAAAP3%2F%2FkBA%3D","updated":"2013-07-16 16:30:00.000000000","message":"agreed.","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3098a325ca9905cfe9af14eb5605886168767f89","unresolved":false,"context_lines":[{"line_number":754,"context_line":"            if not CONF.os_inherit.enabled:"},{"line_number":755,"context_line":"                raise exception.Forbidden("},{"line_number":756,"context_line":"                    _(\u0027OS-INERIT Extension is disabled.\u0027))"},{"line_number":757,"context_line":"            if context[\u0027path\u0027].endswith(\u0027inherited_to_projects\u0027):"},{"line_number":758,"context_line":"                result \u003d True"},{"line_number":759,"context_line":"        return result"},{"line_number":760,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2FkAI%3D","line":757,"updated":"2013-07-16 15:34:54.000000000","message":"this whole method can also be reduced to\n\n  return (CONF.os_inherit.enabled and\n          context[\u0027path\u0027].startswith(\u0027/OS-INHERIT\u0027) and\n          context[\u0027path\u0027].endswith(\u0027/inherited_to_projects\u0027))","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ae78ef36aa70cbddfcd743ae9cfb4002e6976f9c","unresolved":false,"context_lines":[{"line_number":754,"context_line":"            if not CONF.os_inherit.enabled:"},{"line_number":755,"context_line":"                raise exception.Forbidden("},{"line_number":756,"context_line":"                    _(\u0027OS-INERIT Extension is disabled.\u0027))"},{"line_number":757,"context_line":"            if context[\u0027path\u0027].endswith(\u0027inherited_to_projects\u0027):"},{"line_number":758,"context_line":"                result \u003d True"},{"line_number":759,"context_line":"        return result"},{"line_number":760,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fju8%3D","line":757,"in_reply_to":"AAAAP3%2F%2FkAI%3D","updated":"2013-07-16 16:30:00.000000000","message":"Done","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3098a325ca9905cfe9af14eb5605886168767f89","unresolved":false,"context_lines":[{"line_number":828,"context_line":"        # the wrapper as have already included the links in the entities"},{"line_number":829,"context_line":"        pass"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"    def _format_entity(self, entity):"},{"line_number":832,"context_line":"        formatted_entity \u003d {}"},{"line_number":833,"context_line":"        trailer_link \u003d \"\""},{"line_number":834,"context_line":"        if \u0027user_id\u0027 in entity:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fj%2Fc%3D","line":831,"updated":"2013-07-16 15:34:54.000000000","message":"this needs a docstring badly","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ae78ef36aa70cbddfcd743ae9cfb4002e6976f9c","unresolved":false,"context_lines":[{"line_number":828,"context_line":"        # the wrapper as have already included the links in the entities"},{"line_number":829,"context_line":"        pass"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"    def _format_entity(self, entity):"},{"line_number":832,"context_line":"        formatted_entity \u003d {}"},{"line_number":833,"context_line":"        trailer_link \u003d \"\""},{"line_number":834,"context_line":"        if \u0027user_id\u0027 in entity:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fjg4%3D","line":831,"in_reply_to":"AAAAP3%2F%2Fj%2Fc%3D","updated":"2013-07-16 16:30:00.000000000","message":"An excellent idea!  Done.","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3098a325ca9905cfe9af14eb5605886168767f89","unresolved":false,"context_lines":[{"line_number":830,"context_line":""},{"line_number":831,"context_line":"    def _format_entity(self, entity):"},{"line_number":832,"context_line":"        formatted_entity \u003d {}"},{"line_number":833,"context_line":"        trailer_link \u003d \"\""},{"line_number":834,"context_line":"        if \u0027user_id\u0027 in entity:"},{"line_number":835,"context_line":"            formatted_entity[\u0027user\u0027] \u003d {\u0027id\u0027: entity[\u0027user_id\u0027]}"},{"line_number":836,"context_line":"            actor_link \u003d \u0027users/%s\u0027 % entity[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fj%2Bw%3D","line":833,"updated":"2013-07-16 15:34:54.000000000","message":"suffix?","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ae78ef36aa70cbddfcd743ae9cfb4002e6976f9c","unresolved":false,"context_lines":[{"line_number":830,"context_line":""},{"line_number":831,"context_line":"    def _format_entity(self, entity):"},{"line_number":832,"context_line":"        formatted_entity \u003d {}"},{"line_number":833,"context_line":"        trailer_link \u003d \"\""},{"line_number":834,"context_line":"        if \u0027user_id\u0027 in entity:"},{"line_number":835,"context_line":"            formatted_entity[\u0027user\u0027] \u003d {\u0027id\u0027: entity[\u0027user_id\u0027]}"},{"line_number":836,"context_line":"            actor_link \u003d \u0027users/%s\u0027 % entity[\u0027user_id\u0027]"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2FjhE%3D","line":833,"in_reply_to":"AAAAP3%2F%2Fj%2Bw%3D","updated":"2013-07-16 16:30:00.000000000","message":"nice.  Done","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"26d307837d6a3b003f1d613ff2160b222fd1cb86","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            \"\"\""},{"line_number":984,"context_line":"            project_entry \u003d copy.deepcopy(template)"},{"line_number":985,"context_line":"            project_entry[\u0027scope\u0027][\u0027project\u0027] \u003d {\u0027id\u0027: project_id}"},{"line_number":986,"context_line":"            project_entry[\u0027links\u0027][\u0027assignment\u0027] \u003d ("},{"line_number":987,"context_line":"                self.base_url("},{"line_number":988,"context_line":"                    \u0027/OS-INHERIT/domains/%s/users/%s/roles/%s\u0027"},{"line_number":989,"context_line":"                    \u0027/inherited_to_projects\u0027 % ("}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FjNg%3D","line":986,"updated":"2013-07-16 17:46:15.000000000","message":"This might be easier to read if you define the string in it\u0027s own variable.  It might also be easier to read with the dict style substitutions: %(domain_id)s instead of just %s.  \n\nThis is more of an thought than saying this can\u0027t be left as is.","commit_id":"1bc9d6643cd79fd788f4fd850dd9cc21db40e982"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"29a86bbdc106752e345cc6b76afaa019c642e050","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            \"\"\""},{"line_number":984,"context_line":"            project_entry \u003d copy.deepcopy(template)"},{"line_number":985,"context_line":"            project_entry[\u0027scope\u0027][\u0027project\u0027] \u003d {\u0027id\u0027: project_id}"},{"line_number":986,"context_line":"            project_entry[\u0027links\u0027][\u0027assignment\u0027] \u003d ("},{"line_number":987,"context_line":"                self.base_url("},{"line_number":988,"context_line":"                    \u0027/OS-INHERIT/domains/%s/users/%s/roles/%s\u0027"},{"line_number":989,"context_line":"                    \u0027/inherited_to_projects\u0027 % ("}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAP3%2F%2FjH4%3D","line":986,"in_reply_to":"AAAAP3%2F%2FjNg%3D","updated":"2013-07-16 18:11:01.000000000","message":"Thanks for the idea, you may be right, might come back in and do a little refactor later.","commit_id":"1bc9d6643cd79fd788f4fd850dd9cc21db40e982"}],"keystone/identity/routers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3098a325ca9905cfe9af14eb5605886168767f89","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                   action\u003d\u0027revoke_grant\u0027,"},{"line_number":175,"context_line":"                   conditions\u003ddict(method\u003d[\u0027DELETE\u0027]))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    # URLs for the OS-INHERIT extension"},{"line_number":178,"context_line":"    mapper.connect((\u0027/OS-INHERIT/domains/{domain_id}/users/{user_id}\u0027"},{"line_number":179,"context_line":"                    \u0027/roles/{role_id}/inherited_to_projects\u0027),"},{"line_number":180,"context_line":"                   controller\u003drole_controller,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fj9c%3D","line":177,"updated":"2013-07-16 15:34:54.000000000","message":"check if the extension is enabled here, and only here... this is what extension routers are for","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ae78ef36aa70cbddfcd743ae9cfb4002e6976f9c","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                   action\u003d\u0027revoke_grant\u0027,"},{"line_number":175,"context_line":"                   conditions\u003ddict(method\u003d[\u0027DELETE\u0027]))"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    # URLs for the OS-INHERIT extension"},{"line_number":178,"context_line":"    mapper.connect((\u0027/OS-INHERIT/domains/{domain_id}/users/{user_id}\u0027"},{"line_number":179,"context_line":"                    \u0027/roles/{role_id}/inherited_to_projects\u0027),"},{"line_number":180,"context_line":"                   controller\u003drole_controller,"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fjvw%3D","line":177,"in_reply_to":"AAAAP3%2F%2Fj9c%3D","updated":"2013-07-16 16:30:00.000000000","message":"Done","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"}],"tests/test_sql_upgrade.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3098a325ca9905cfe9af14eb5605886168767f89","unresolved":false,"context_lines":[{"line_number":829,"context_line":"    def test_assignment_metadata_migration(self):"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"        if self.engine.name \u003d\u003d \u0027sqlite\u0027:"},{"line_number":832,"context_line":"            raise nose.exc.SkipTest(\u0027sqlite migrations no longer supported\u0027)"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"        self.upgrade(27)"},{"line_number":835,"context_line":"        # Scaffolding"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2Fj0A%3D","line":832,"updated":"2013-07-16 15:34:54.000000000","message":":( see latest posts on list ... we need to support sqlite at least through havana\n\ncheck out nova\u0027s approach to shuffling data around in sqlite","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ae78ef36aa70cbddfcd743ae9cfb4002e6976f9c","unresolved":false,"context_lines":[{"line_number":829,"context_line":"    def test_assignment_metadata_migration(self):"},{"line_number":830,"context_line":""},{"line_number":831,"context_line":"        if self.engine.name \u003d\u003d \u0027sqlite\u0027:"},{"line_number":832,"context_line":"            raise nose.exc.SkipTest(\u0027sqlite migrations no longer supported\u0027)"},{"line_number":833,"context_line":""},{"line_number":834,"context_line":"        self.upgrade(27)"},{"line_number":835,"context_line":"        # Scaffolding"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAP3%2F%2FjgY%3D","line":832,"in_reply_to":"AAAAP3%2F%2Fj0A%3D","updated":"2013-07-16 16:30:00.000000000","message":"Ok, have to work at this - it\u0027l be harder than we think - since I can\u0027t even load the table without it blowing up.  Have to see if I can recreate a tenant table and see if that get\u0027s us over the hump!","commit_id":"26953cbcd3a77d2ec359617199dbc4b7a259180c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5c54a7a562b1709d228d638385f7679aa7d94d54","unresolved":false,"context_lines":[{"line_number":943,"context_line":"        self.upgrade(29)"},{"line_number":944,"context_line":""},{"line_number":945,"context_line":"        r \u003d session.execute(\u0027select data from user_project_metadata where \u0027"},{"line_number":946,"context_line":"                            \u0027user_id\u003d:user and project_id\u003d:project\u0027,"},{"line_number":947,"context_line":"                            {\u0027user\u0027: user[\u0027id\u0027], \u0027project\u0027: project[\u0027id\u0027]})"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        data \u003d json.loads(r.fetchone()[\u0027data\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fh50%3D","line":946,"updated":"2013-07-16 22:22:33.000000000","message":"we shouldn\u0027t have explicit SQL because it might not work with all databases. Use sqlalchemy\u0027s ability to build queries.","commit_id":"c7e9c3ec7c91dabe5aaad5b9be9983d9a08478cc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"69c8eb4c8a83f27d84e1cb58a24b099e24d9c18d","unresolved":false,"context_lines":[{"line_number":943,"context_line":"        self.upgrade(29)"},{"line_number":944,"context_line":""},{"line_number":945,"context_line":"        r \u003d session.execute(\u0027select data from user_project_metadata where \u0027"},{"line_number":946,"context_line":"                            \u0027user_id\u003d:user and project_id\u003d:project\u0027,"},{"line_number":947,"context_line":"                            {\u0027user\u0027: user[\u0027id\u0027], \u0027project\u0027: project[\u0027id\u0027]})"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        data \u003d json.loads(r.fetchone()[\u0027data\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fhr4%3D","line":946,"in_reply_to":"AAAAP3%2F%2Fh34%3D","updated":"2013-07-16 23:38:21.000000000","message":"OK, new patch on its way!!!!","commit_id":"c7e9c3ec7c91dabe5aaad5b9be9983d9a08478cc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"15d82281782494e733b4a27c671ca358e0ef21a7","unresolved":false,"context_lines":[{"line_number":943,"context_line":"        self.upgrade(29)"},{"line_number":944,"context_line":""},{"line_number":945,"context_line":"        r \u003d session.execute(\u0027select data from user_project_metadata where \u0027"},{"line_number":946,"context_line":"                            \u0027user_id\u003d:user and project_id\u003d:project\u0027,"},{"line_number":947,"context_line":"                            {\u0027user\u0027: user[\u0027id\u0027], \u0027project\u0027: project[\u0027id\u0027]})"},{"line_number":948,"context_line":""},{"line_number":949,"context_line":"        data \u003d json.loads(r.fetchone()[\u0027data\u0027])"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAP3%2F%2Fh34%3D","line":946,"in_reply_to":"AAAAP3%2F%2Fh50%3D","updated":"2013-07-16 22:30:55.000000000","message":"So as a general principle, I agree with you.  Unfortunately we do this quite a lot - and hence I test it against all supported databases to eb sure.  Can I suggest, we raised a separate issue to come back and refactor all of that i one go?","commit_id":"c7e9c3ec7c91dabe5aaad5b9be9983d9a08478cc"}]}
