)]}'
{"keystone/common/controller.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"b7c6f2c045402eb97e67f8c0037da7188634699f","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                    domain_id \u003d token_ref[\u0027user\u0027].get(\u0027domain_id\u0027)"},{"line_number":125,"context_line":"                except AttributeError:"},{"line_number":126,"context_line":"                    LOG.warning(_(\u0027v3 user entity in token has no domain_id\u0027))"},{"line_number":127,"context_line":"                    raise exception.Unauthorized()"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"                ref[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":130,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAM3%2F%2FZ08%3D","line":127,"updated":"2013-01-23 20:58:34.000000000","message":"the more i think about this, the more i think we should ignore the user\u0027s domain_id... this sort of assumes that the user has and is using a role grant on their own domain.\n\nUsing this instead assumes the token\u0027s domain-scoped authorization:\n\n  token_ref[\u0027domain\u0027][\u0027id\u0027]\n\nI\u0027m not sure how to handle a static admin_token creating a user / project / group though. You have to be able to allow the admin_token user to specify a domain for the user / project / group, I think?","commit_id":"727b438465d1729d98924b1a23c5b3415f0e5610"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"66a3bc0120e77577cb8dc43956bc0c7731b77aca","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                    domain_id \u003d token_ref[\u0027user\u0027].get(\u0027domain_id\u0027)"},{"line_number":125,"context_line":"                except AttributeError:"},{"line_number":126,"context_line":"                    LOG.warning(_(\u0027v3 user entity in token has no domain_id\u0027))"},{"line_number":127,"context_line":"                    raise exception.Unauthorized()"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"                ref[\u0027domain_id\u0027] \u003d domain_id"},{"line_number":130,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAM3%2F%2FY%2FQ%3D","line":127,"in_reply_to":"AAAAM3%2F%2FZ08%3D","updated":"2013-01-24 11:54:21.000000000","message":"Done.\nAnd agree that I think we have to still let the domain_id be passed in as an optional parameter, to allow for the admin case (or if we ever have multi-domain tokens)","commit_id":"727b438465d1729d98924b1a23c5b3415f0e5610"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        if \u0027domain_id\u0027 not in ref:"},{"line_number":114,"context_line":"            if context[\u0027is_admin\u0027]:"},{"line_number":115,"context_line":"                ref[\u0027domain_id\u0027] \u003d DEFAULT_DOMAIN_ID"},{"line_number":116,"context_line":"            else:"},{"line_number":117,"context_line":"                # Fish the domain_id out of the token"},{"line_number":118,"context_line":"                #"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJsE%3D","line":115,"updated":"2013-02-05 17:10:40.000000000","message":"we shouldn\u0027t be assuming the default domain on v3...\n\nis_admin is set to true as a result of using the static admin_token, correct?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        if \u0027domain_id\u0027 not in ref:"},{"line_number":114,"context_line":"            if context[\u0027is_admin\u0027]:"},{"line_number":115,"context_line":"                ref[\u0027domain_id\u0027] \u003d DEFAULT_DOMAIN_ID"},{"line_number":116,"context_line":"            else:"},{"line_number":117,"context_line":"                # Fish the domain_id out of the token"},{"line_number":118,"context_line":"                #"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI7c%3D","line":115,"in_reply_to":"AAAAM3%2F%2FJsE%3D","updated":"2013-02-07 01:45:01.000000000","message":"so this is in the cases of the static admin token when they have not specified a domain_id in the call.  I think that has to be the default domain?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                    # TODO(henry-nash) Potentially remove this (or error)"},{"line_number":136,"context_line":"                    # once domain scoped tokens are fully implemented,"},{"line_number":137,"context_line":"                    # since I don\u0027t think you can get here then"},{"line_number":138,"context_line":"                    ref[\u0027domain_id\u0027] \u003d DEFAULT_DOMAIN_ID"},{"line_number":139,"context_line":"        return ref"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _filter_domain_id(self, ref):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJrM%3D","line":138,"updated":"2013-02-05 17:10:40.000000000","message":"this should be a FIXME at the very least\n\nwill project-scoped tokens and \"unscoped\" tokens not reach this block?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                    # TODO(henry-nash) Potentially remove this (or error)"},{"line_number":136,"context_line":"                    # once domain scoped tokens are fully implemented,"},{"line_number":137,"context_line":"                    # since I don\u0027t think you can get here then"},{"line_number":138,"context_line":"                    ref[\u0027domain_id\u0027] \u003d DEFAULT_DOMAIN_ID"},{"line_number":139,"context_line":"        return ref"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def _filter_domain_id(self, ref):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FHn4%3D","line":138,"in_reply_to":"AAAAM3%2F%2FJrM%3D","updated":"2013-02-07 01:45:01.000000000","message":"I\u0027ll change it to a FIXME.  I\u0027ll come back and re-visit this once we have settled on the various token scopes as part of the domain name spaces api re-work","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":12,"context_line":"CONF \u003d config.CONF"},{"line_number":13,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF[\u0027identity\u0027][\u0027default_domain_id\u0027]"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"def protected(f):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBK0%3D","line":13,"updated":"2013-02-11 15:45:37.000000000","message":"Side note, I think I started a poor trend... this can/should be accessed through it\u0027s object interface:\n\n    CONF.identity.default_domain_id","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":12,"context_line":"CONF \u003d config.CONF"},{"line_number":13,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF[\u0027identity\u0027][\u0027default_domain_id\u0027]"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"def protected(f):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBAg%3D","line":13,"in_reply_to":"AAAAM3%2F%2FBK0%3D","updated":"2013-02-11 18:33:08.000000000","message":"Done","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            raise exception.ValidationError(message\u003dmsg)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _normalize_domain_id(self, context, ref):"},{"line_number":73,"context_line":"        \"\"\"Fill in domain_id since v2 calls are not domain-aware.\"\"\""},{"line_number":74,"context_line":"        ref[\u0027domain_id\u0027] \u003d DEFAULT_DOMAIN_ID"},{"line_number":75,"context_line":"        return ref"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBHI%3D","line":73,"updated":"2013-02-11 15:45:37.000000000","message":"maybe worth a comment that this intentionally overrides any previously-set domain_id value","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            raise exception.ValidationError(message\u003dmsg)"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _normalize_domain_id(self, context, ref):"},{"line_number":73,"context_line":"        \"\"\"Fill in domain_id since v2 calls are not domain-aware.\"\"\""},{"line_number":74,"context_line":"        ref[\u0027domain_id\u0027] \u003d DEFAULT_DOMAIN_ID"},{"line_number":75,"context_line":"        return ref"},{"line_number":76,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBAk%3D","line":73,"in_reply_to":"AAAAM3%2F%2FBHI%3D","updated":"2013-02-11 18:33:08.000000000","message":"Done","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def _filter_domain_id(self, ref):"},{"line_number":78,"context_line":"        \"\"\"Remove domain_id since v2 calls are not domain-aware.\"\"\""},{"line_number":79,"context_line":"        ref.pop(\u0027domain_id\u0027, None)"},{"line_number":80,"context_line":"        return ref"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class V3Controller(V2Controller):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBGs%3D","line":80,"updated":"2013-02-11 15:45:37.000000000","message":"these two functions are fine, but it might be useful to wrap them so we\u0027re not refactoring later when users \u0026 projects need different normalization behaviors...\n\n  def v2_tenant_to_v3_project(self, context, ref):\n    ...\n\n  def v3_project_to_v2_tenant(self, context, ref):\n    ...","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"809153a84500e800f5a17ff04493459bddd664e7","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def _filter_domain_id(self, ref):"},{"line_number":78,"context_line":"        \"\"\"Remove domain_id since v2 calls are not domain-aware.\"\"\""},{"line_number":79,"context_line":"        ref.pop(\u0027domain_id\u0027, None)"},{"line_number":80,"context_line":"        return ref"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class V3Controller(V2Controller):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FAqg%3D","line":80,"in_reply_to":"AAAAM3%2F%2FA%2F4%3D","updated":"2013-02-11 18:42:56.000000000","message":"well, i\u0027m thinking we\u0027ll end up with functions for both v2 tenant -\u003e v3 project and v2 user \u003c--\u003e v3 user (4 altogether)... it\u0027d be nice to have that abstraction now. two of those four can call _normalize_domain_id() and the other two can call _filter_domain_id()\n\ni\u0027m open to better names on the functions, but that\u0027s the least verbose + most specific naming i could come up with","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f7fabdefb207f2a7e1495b612569aaeddb7885fe","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def _filter_domain_id(self, ref):"},{"line_number":78,"context_line":"        \"\"\"Remove domain_id since v2 calls are not domain-aware.\"\"\""},{"line_number":79,"context_line":"        ref.pop(\u0027domain_id\u0027, None)"},{"line_number":80,"context_line":"        return ref"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class V3Controller(V2Controller):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2B%2Fc4%3D","line":80,"in_reply_to":"AAAAM3%2F%2FAqg%3D","updated":"2013-02-12 09:21:39.000000000","message":"So doesn\u0027t the fact that these are (by design) specific to the version (i.e. they are part of the V2Controller) mean that this determines one side of the \"name\"?  Also do you think we need to make them entity specific?  I do agree that changing them to (for example):\n\n_normalize_to_v3()\n_filter_from_v3()\n\nwould make sense, since when there is v4 we might need the v2\u003c-\u003ev4 equivalents.","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    def _filter_domain_id(self, ref):"},{"line_number":78,"context_line":"        \"\"\"Remove domain_id since v2 calls are not domain-aware.\"\"\""},{"line_number":79,"context_line":"        ref.pop(\u0027domain_id\u0027, None)"},{"line_number":80,"context_line":"        return ref"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"class V3Controller(V2Controller):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FA%2F4%3D","line":80,"in_reply_to":"AAAAM3%2F%2FBGs%3D","updated":"2013-02-11 18:33:08.000000000","message":"Understand the desire...do you mean just rename these functions to something like you suggest?","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        This will overwrite any domain_id that was inadvertently"},{"line_number":76,"context_line":"        specified in the v2 call."},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        ref[\u0027domain_id\u0027] \u003d DEFAULT_DOMAIN_ID"},{"line_number":80,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2FDk%3D","line":77,"updated":"2013-02-12 15:04:08.000000000","message":"blank line is on the \"wrong\" side of the end of the docstr, according to our established convention","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        This will overwrite any domain_id that was inadvertently"},{"line_number":76,"context_line":"        specified in the v2 call."},{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        ref[\u0027domain_id\u0027] \u003d DEFAULT_DOMAIN_ID"},{"line_number":80,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B50%3D","line":77,"in_reply_to":"AAAAM3%2F%2B%2FDk%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"keystone/common/models.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        domain_id"},{"line_number":97,"context_line":"    \"\"\""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    required_keys \u003d (\u0027id\u0027, \u0027name\u0027)"},{"line_number":100,"context_line":"    optional_keys \u003d (\u0027domain_id\u0027, \u0027password\u0027, \u0027description\u0027, \u0027email\u0027, \u0027enabled\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi5g%3D","line":99,"updated":"2013-01-16 17:04:06.000000000","message":"we don\u0027t want to require this? I think these are only used for ldap","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        domain_id"},{"line_number":97,"context_line":"    \"\"\""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    required_keys \u003d (\u0027id\u0027, \u0027name\u0027)"},{"line_number":100,"context_line":"    optional_keys \u003d (\u0027domain_id\u0027, \u0027password\u0027, \u0027description\u0027, \u0027email\u0027, \u0027enabled\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FidA%3D","line":99,"in_reply_to":"AAAAM3%2F%2Fi5g%3D","updated":"2013-01-16 20:13:02.000000000","message":"Agreed...now that we are putting your default domain change ahead of this (when I first wrote this I was assuming domain_id was nullable)","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"}],"keystone/common/sql/migrate_repo/versions/007_add_domain_tables.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        sql.String(64),"},{"line_number":38,"context_line":"        sql.ForeignKey(\u0027domain.id\u0027))"},{"line_number":39,"context_line":"    user.create_column(domain_id)"},{"line_number":40,"context_line":"    "},{"line_number":41,"context_line":"    user_domain_metadata_table \u003d sql.Table("},{"line_number":42,"context_line":"        \u0027user_domain_metadata\u0027,"},{"line_number":43,"context_line":"        meta,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi5c%3D","line":40,"updated":"2013-01-16 17:04:06.000000000","message":"pep8","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        sql.String(64),"},{"line_number":38,"context_line":"        sql.ForeignKey(\u0027domain.id\u0027))"},{"line_number":39,"context_line":"    user.create_column(domain_id)"},{"line_number":40,"context_line":"    "},{"line_number":41,"context_line":"    user_domain_metadata_table \u003d sql.Table("},{"line_number":42,"context_line":"        \u0027user_domain_metadata\u0027,"},{"line_number":43,"context_line":"        meta,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FihA%3D","line":40,"in_reply_to":"AAAAM3%2F%2Fi5c%3D","updated":"2013-01-16 20:13:02.000000000","message":"Done","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"}],"keystone/common/sql/migrate_repo/versions/008_create_default_domain.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"CONF \u003d config.CONF"},{"line_number":25,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2FDU%3D","line":25,"updated":"2013-02-12 15:04:08.000000000","message":"thank you","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"keystone/common/sql/migrate_repo/versions/009_normalize_identity.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def _disable_foreign_constraints(session, migrate_engine):"},{"line_number":23,"context_line":"    if migrate_engine.name !\u003d \"sqlite\":"},{"line_number":24,"context_line":"        session.execute(\"SET foreign_key_checks \u003d 0;\")"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJpw%3D","line":23,"updated":"2013-02-05 17:10:40.000000000","message":"HACKING nit -- use single quotes where possible; there\u0027s lots of double quotes added here","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def _disable_foreign_constraints(session, migrate_engine):"},{"line_number":23,"context_line":"    if migrate_engine.name !\u003d \"sqlite\":"},{"line_number":24,"context_line":"        session.execute(\"SET foreign_key_checks \u003d 0;\")"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI84%3D","line":23,"in_reply_to":"AAAAM3%2F%2FJpw%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"db60bc8332cff3b847cedb1f34cbe1a1bf9874ad","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sql.Column(\u0027name\u0027, sql.String(64), unique\u003dTrue, nullable\u003dFalse),"},{"line_number":44,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":45,"context_line":"        sql.Column(\"password\", sql.String(128)),"},{"line_number":46,"context_line":"        sql.Column(\"enabled\", sql.Boolean, default\u003dTrue))"},{"line_number":47,"context_line":"    temp_user_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJX4%3D","line":46,"updated":"2013-02-05 20:43:01.000000000","message":"do the password/enabled attributes need to be copied if its not used in final table? is it just for the sake of completeness?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sql.Column(\u0027name\u0027, sql.String(64), unique\u003dTrue, nullable\u003dFalse),"},{"line_number":44,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":45,"context_line":"        sql.Column(\"password\", sql.String(128)),"},{"line_number":46,"context_line":"        sql.Column(\"enabled\", sql.Boolean, default\u003dTrue))"},{"line_number":47,"context_line":"    temp_user_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI8w%3D","line":46,"in_reply_to":"AAAAM3%2F%2FI9s%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1d9636ae1729b5894fa0e2e298d798c376fd163d","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        sql.Column(\u0027name\u0027, sql.String(64), unique\u003dTrue, nullable\u003dFalse),"},{"line_number":44,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":45,"context_line":"        sql.Column(\"password\", sql.String(128)),"},{"line_number":46,"context_line":"        sql.Column(\"enabled\", sql.Boolean, default\u003dTrue))"},{"line_number":47,"context_line":"    temp_user_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI9s%3D","line":46,"in_reply_to":"AAAAM3%2F%2FJX4%3D","updated":"2013-02-05 20:50:46.000000000","message":"good catch, they are definitely missing below","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # Now switch off constraints while we drop and then re-create the"},{"line_number":62,"context_line":"    # user table, less the columns we wanted to drop"},{"line_number":63,"context_line":"    _disable_foreign_constraints(session, migrate_engine)"},{"line_number":64,"context_line":"    session.execute(\"drop table user;\")"},{"line_number":65,"context_line":"    # Need to create a new metadata stream since we are going to load a"},{"line_number":66,"context_line":"    # different version of the user table"},{"line_number":67,"context_line":"    meta2 \u003d sql.MetaData()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJps%3D","line":64,"updated":"2013-02-05 17:10:40.000000000","message":"user_table.drop() ?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    # Now switch off constraints while we drop and then re-create the"},{"line_number":62,"context_line":"    # user table, less the columns we wanted to drop"},{"line_number":63,"context_line":"    _disable_foreign_constraints(session, migrate_engine)"},{"line_number":64,"context_line":"    session.execute(\"drop table user;\")"},{"line_number":65,"context_line":"    # Need to create a new metadata stream since we are going to load a"},{"line_number":66,"context_line":"    # different version of the user table"},{"line_number":67,"context_line":"    meta2 \u003d sql.MetaData()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI8M%3D","line":64,"in_reply_to":"AAAAM3%2F%2FJps%3D","updated":"2013-02-07 01:45:01.000000000","message":"This does not seem reliable - causes hangs (with MySQL), using as many direct session.execute() cmds as possible seem s to prevent this","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"db60bc8332cff3b847cedb1f34cbe1a1bf9874ad","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        sql.Column(\u0027name\u0027, sql.String(64), unique\u003dTrue, nullable\u003dFalse),"},{"line_number":101,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":102,"context_line":"        sql.Column(\"description\", sql.Text()),"},{"line_number":103,"context_line":"        sql.Column(\"enabled\", sql.Boolean, default\u003dTrue))"},{"line_number":104,"context_line":"    temp_tenant_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    tenant_table \u003d sql.Table(\u0027tenant\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJXg%3D","line":103,"updated":"2013-02-05 20:43:01.000000000","message":"same thing, except for description/enabled.","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        sql.Column(\u0027name\u0027, sql.String(64), unique\u003dTrue, nullable\u003dFalse),"},{"line_number":101,"context_line":"        sql.Column(\u0027extra\u0027, sql.Text()),"},{"line_number":102,"context_line":"        sql.Column(\"description\", sql.Text()),"},{"line_number":103,"context_line":"        sql.Column(\"enabled\", sql.Boolean, default\u003dTrue))"},{"line_number":104,"context_line":"    temp_tenant_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    tenant_table \u003d sql.Table(\u0027tenant\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI8I%3D","line":103,"in_reply_to":"AAAAM3%2F%2FJXg%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":148,"context_line":"    user_table.create_column(sql.Column(\"password\", sql.String(128)))"},{"line_number":149,"context_line":"    user_table.create_column(sql.Column(\"enabled\", sql.Boolean,"},{"line_number":150,"context_line":"                             default\u003dTrue))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def upgrade_tenant_table(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJls%3D","line":150,"updated":"2013-02-05 17:10:40.000000000","message":"looks like the indentation on default was correct before","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":148,"context_line":"    user_table.create_column(sql.Column(\"password\", sql.String(128)))"},{"line_number":149,"context_line":"    user_table.create_column(sql.Column(\"enabled\", sql.Boolean,"},{"line_number":150,"context_line":"                             default\u003dTrue))"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"def upgrade_tenant_table(meta, migrate_engine):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI8E%3D","line":150,"in_reply_to":"AAAAM3%2F%2FJls%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    downgrade_user_table(meta, migrate_engine, session)"},{"line_number":171,"context_line":"    downgrade_tenant_table(meta, migrate_engine, session)"},{"line_number":172,"context_line":"    session.commit()"},{"line_number":173,"context_line":"    session.close()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJlc%3D","line":173,"updated":"2013-02-05 17:10:40.000000000","message":"why commit and close, but only in the downgrade? i would assume that you especially don\u0027t need close()","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":170,"context_line":"    downgrade_user_table(meta, migrate_engine, session)"},{"line_number":171,"context_line":"    downgrade_tenant_table(meta, migrate_engine, session)"},{"line_number":172,"context_line":"    session.commit()"},{"line_number":173,"context_line":"    session.close()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI78%3D","line":173,"in_reply_to":"AAAAM3%2F%2FJlc%3D","updated":"2013-02-07 01:45:01.000000000","message":"although I suspect it is benign here, the lack of closing sessions causes the MySQL engine to hang.  I don;t do this in upgrade since we don\u0027t do any session specific work","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                        \u0027values ( :id, :name, :extra);\u0027,"},{"line_number":78,"context_line":"                        {\u0027id\u0027: user.id,"},{"line_number":79,"context_line":"                         \u0027name\u0027: user.name,"},{"line_number":80,"context_line":"                         \u0027extra\u0027: user.extra})"},{"line_number":81,"context_line":"    session.execute(\u0027drop table temp_user;\u0027)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBJ8%3D","line":80,"updated":"2013-02-11 15:45:37.000000000","message":"use the insertion technique from migration 8:\n\n    domain \u003d { ... }\n    session \u003d orm.sessionmaker(bind\u003dmigrate_engine)()\n    domain_table.insert().execute(domain)\n    session.commit()","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                        \u0027values ( :id, :name, :extra);\u0027,"},{"line_number":78,"context_line":"                        {\u0027id\u0027: user.id,"},{"line_number":79,"context_line":"                         \u0027name\u0027: user.name,"},{"line_number":80,"context_line":"                         \u0027extra\u0027: user.extra})"},{"line_number":81,"context_line":"    session.execute(\u0027drop table temp_user;\u0027)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FAyc%3D","line":80,"in_reply_to":"AAAAM3%2F%2FBJ8%3D","updated":"2013-02-11 18:33:08.000000000","message":"...will be re-basing onto Adam\u0027s change...","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"}],"keystone/common/sql/migrate_repo/versions/009_normalize_identity_migration.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    session \u003d maker()"},{"line_number":42,"context_line":"    user_data \u003d []"},{"line_number":43,"context_line":"    for a_user in session.query(user_table):"},{"line_number":44,"context_line":"        id, name, domain_id, extra, password, enabled \u003d a_user"},{"line_number":45,"context_line":"        extra_parsed \u003d json.loads(extra)"},{"line_number":46,"context_line":"        extra_parsed[\u0027password\u0027] \u003d password"},{"line_number":47,"context_line":"        extra_parsed[\u0027enabled\u0027] \u003d \"%r\" % enabled"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi5U%3D","line":44,"updated":"2013-01-16 17:04:06.000000000","message":"rebase this change on https://review.openstack.org/#/c/19788/ and you don\u0027t have to make any changes here","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    session \u003d maker()"},{"line_number":42,"context_line":"    user_data \u003d []"},{"line_number":43,"context_line":"    for a_user in session.query(user_table):"},{"line_number":44,"context_line":"        id, name, domain_id, extra, password, enabled \u003d a_user"},{"line_number":45,"context_line":"        extra_parsed \u003d json.loads(extra)"},{"line_number":46,"context_line":"        extra_parsed[\u0027password\u0027] \u003d password"},{"line_number":47,"context_line":"        extra_parsed[\u0027enabled\u0027] \u003d \"%r\" % enabled"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fic8%3D","line":44,"in_reply_to":"AAAAM3%2F%2Fi5U%3D","updated":"2013-01-16 20:13:02.000000000","message":"Done","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"}],"keystone/common/sql/migrate_repo/versions/010_normalize_identity_migration.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        values \u003d {\u0027extra\u0027: json.dumps(extra)}"},{"line_number":42,"context_line":"        update \u003d user_table.update().\\"},{"line_number":43,"context_line":"            where(user_table.c.id \u003d\u003d user.id).\\"},{"line_number":44,"context_line":"            values(values)"},{"line_number":45,"context_line":"        migrate_engine.execute(update)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBJg%3D","line":44,"updated":"2013-02-11 15:45:37.000000000","message":"I personally prefer this style:\n\n  values(extra\u003djson.dumps(extra))","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        values \u003d {\u0027extra\u0027: json.dumps(extra)}"},{"line_number":42,"context_line":"        update \u003d user_table.update().\\"},{"line_number":43,"context_line":"            where(user_table.c.id \u003d\u003d user.id).\\"},{"line_number":44,"context_line":"            values(values)"},{"line_number":45,"context_line":"        migrate_engine.execute(update)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FAyA%3D","line":44,"in_reply_to":"AAAAM3%2F%2FBJg%3D","updated":"2013-02-11 18:33:08.000000000","message":"...will be re-basing onto Adam\u0027s change","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    session \u003d sessionmaker(bind\u003dmigrate_engine)()"},{"line_number":91,"context_line":"    upgrade_user_table(meta, migrate_engine, session)"},{"line_number":92,"context_line":"    upgrade_tenant_table(meta, migrate_engine, session)"},{"line_number":93,"context_line":"    session.commit()"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2FDQ%3D","line":93,"updated":"2013-02-12 15:04:08.000000000","message":"much cleaner","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"keystone/common/sql/migrate_repo/versions/016_normalize_domain_ids.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"82a944412c6e56667bb1088ab226a67975f8a933","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _enable_foreign_constraints(session, migrate_engine, table_name):"},{"line_number":35,"context_line":"    if migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":36,"context_line":"        session.execute(\u0027ALTER TABLE \"%s\" ENABLE TRIGGER ALL;\u0027 % table_name)"},{"line_number":37,"context_line":"    elif migrate_engine.name !\u003d \u0027sqlite\u0027:"},{"line_number":38,"context_line":"        session.execute(\u0027SET foreign_key_checks \u003d 1;\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2FFFE%3D","line":35,"updated":"2013-02-07 20:08:19.000000000","message":"you must deal with mysql as well.","commit_id":"2e18d92f14d83334adc37ef4bddd58a3a013785b"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"15ecc839023a16051aae94ef6dc516e84820cc29","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def _enable_foreign_constraints(session, migrate_engine, table_name):"},{"line_number":35,"context_line":"    if migrate_engine.name \u003d\u003d \u0027postgresql\u0027:"},{"line_number":36,"context_line":"        session.execute(\u0027ALTER TABLE \"%s\" ENABLE TRIGGER ALL;\u0027 % table_name)"},{"line_number":37,"context_line":"    elif migrate_engine.name !\u003d \u0027sqlite\u0027:"},{"line_number":38,"context_line":"        session.execute(\u0027SET foreign_key_checks \u003d 1;\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAM3%2F%2FE%2FY%3D","line":35,"in_reply_to":"AAAAM3%2F%2FFFE%3D","updated":"2013-02-07 20:32:54.000000000","message":"the unquoted form appears to work for both mySQL and sqlite","commit_id":"2e18d92f14d83334adc37ef4bddd58a3a013785b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":15,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"# under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sqlalchemy as sql"},{"line_number":19,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":20,"context_line":"from keystone import config"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBH8%3D","line":17,"updated":"2013-02-11 15:45:37.000000000","message":"this change is huge and \"normalize\" is vague -- can you include a module docstr to explain the gist","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":14,"context_line":"# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":15,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"# under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import sqlalchemy as sql"},{"line_number":19,"context_line":"from sqlalchemy.orm import sessionmaker"},{"line_number":20,"context_line":"from keystone import config"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FA%2Fk%3D","line":17,"in_reply_to":"AAAAM3%2F%2FBH8%3D","updated":"2013-02-11 18:33:08.000000000","message":"Done","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    # pointing at the right table, we need to be able and do a table"},{"line_number":42,"context_line":"    # DROP then CREATE, rather than ALTERing the name of the table."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # Fist make a copy of the user table"},{"line_number":45,"context_line":"    temp_user_table \u003d sql.Table("},{"line_number":46,"context_line":"        \u0027temp_user\u0027,"},{"line_number":47,"context_line":"        meta,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBII%3D","line":44,"updated":"2013-02-11 15:45:37.000000000","message":"fist -\u003e first","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    # pointing at the right table, we need to be able and do a table"},{"line_number":42,"context_line":"    # DROP then CREATE, rather than ALTERing the name of the table."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    # Fist make a copy of the user table"},{"line_number":45,"context_line":"    temp_user_table \u003d sql.Table("},{"line_number":46,"context_line":"        \u0027temp_user\u0027,"},{"line_number":47,"context_line":"        meta,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FA%2Fs%3D","line":44,"in_reply_to":"AAAAM3%2F%2FBII%3D","updated":"2013-02-11 18:33:08.000000000","message":"Done","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":35,"context_line":"that support dropping columns, and one for those that don\u0027t.  For"},{"line_number":36,"context_line":"the latter we are forced to do table copy AND control the triggering"},{"line_number":37,"context_line":"of integrity constraints."},{"line_number":38,"context_line":"\"\"\""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"import sqlalchemy as sql"},{"line_number":41,"context_line":"from sqlalchemy.orm import sessionmaker"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2FDI%3D","line":38,"updated":"2013-02-12 15:04:08.000000000","message":"thanks","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"keystone/common/sql/nova.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        tenant_dict \u003d {"},{"line_number":52,"context_line":"            \u0027id\u0027: _generate_uuid(),"},{"line_number":53,"context_line":"            \u0027name\u0027: tenant[\u0027id\u0027],"},{"line_number":54,"context_line":"            \u0027domain_id\u0027: tenant[\u0027domain_id\u0027],"},{"line_number":55,"context_line":"            \u0027description\u0027: tenant[\u0027description\u0027],"},{"line_number":56,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":57,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJiQ%3D","line":54,"updated":"2013-02-05 17:10:40.000000000","message":"tenant.get(\u0027domain_id\u0027, DEFAULT_DOMAIN_ID) ?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        tenant_dict \u003d {"},{"line_number":52,"context_line":"            \u0027id\u0027: _generate_uuid(),"},{"line_number":53,"context_line":"            \u0027name\u0027: tenant[\u0027id\u0027],"},{"line_number":54,"context_line":"            \u0027domain_id\u0027: tenant[\u0027domain_id\u0027],"},{"line_number":55,"context_line":"            \u0027description\u0027: tenant[\u0027description\u0027],"},{"line_number":56,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":57,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI7I%3D","line":54,"in_reply_to":"AAAAM3%2F%2FJiQ%3D","updated":"2013-02-07 01:45:01.000000000","message":"ahh, nice idea","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        user_dict \u003d {"},{"line_number":68,"context_line":"            \u0027id\u0027: _generate_uuid(),"},{"line_number":69,"context_line":"            \u0027name\u0027: user[\u0027id\u0027],"},{"line_number":70,"context_line":"            \u0027domain_id\u0027: user[\u0027domain_id\u0027],"},{"line_number":71,"context_line":"            \u0027email\u0027: \u0027\u0027,"},{"line_number":72,"context_line":"            \u0027password\u0027: user[\u0027password\u0027],"},{"line_number":73,"context_line":"            \u0027enabled\u0027: True,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJiI%3D","line":70,"updated":"2013-02-05 17:10:40.000000000","message":"same question as above","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        user_dict \u003d {"},{"line_number":68,"context_line":"            \u0027id\u0027: _generate_uuid(),"},{"line_number":69,"context_line":"            \u0027name\u0027: user[\u0027id\u0027],"},{"line_number":70,"context_line":"            \u0027domain_id\u0027: user[\u0027domain_id\u0027],"},{"line_number":71,"context_line":"            \u0027email\u0027: \u0027\u0027,"},{"line_number":72,"context_line":"            \u0027password\u0027: user[\u0027password\u0027],"},{"line_number":73,"context_line":"            \u0027enabled\u0027: True,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI6M%3D","line":70,"in_reply_to":"AAAAM3%2F%2FJiI%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"}],"keystone/identity/backends/kvs.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"db60bc8332cff3b847cedb1f34cbe1a1bf9874ad","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        try:"},{"line_number":551,"context_line":"            return self.db.get(\u0027domain_name-%s\u0027 % domain_name)"},{"line_number":552,"context_line":"        except exception.NotFound:"},{"line_number":553,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_name)"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    def update_domain(self, domain_id, domain):"},{"line_number":556,"context_line":"        orig_domain \u003d self.get_domain(domain_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJFI%3D","line":553,"updated":"2013-02-05 20:43:01.000000000","message":"domain_name\u003ddomain_name","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        try:"},{"line_number":551,"context_line":"            return self.db.get(\u0027domain_name-%s\u0027 % domain_name)"},{"line_number":552,"context_line":"        except exception.NotFound:"},{"line_number":553,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_name)"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"    def update_domain(self, domain_id, domain):"},{"line_number":556,"context_line":"        orig_domain \u003d self.get_domain(domain_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI58%3D","line":553,"in_reply_to":"AAAAM3%2F%2FJFI%3D","updated":"2013-02-07 01:45:01.000000000","message":"Matches current \"abusive\" system report name errors, future refactor required","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"}],"keystone/identity/backends/ldap/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        self.attribute_mapping[\u0027password\u0027] \u003d conf.ldap.user_pass_attribute"},{"line_number":370,"context_line":"        self.attribute_mapping[\u0027enabled\u0027] \u003d conf.ldap.user_enabled_attribute"},{"line_number":371,"context_line":"        self.attribute_mapping[\u0027domain_id\u0027] \u003d conf.ldap.\\"},{"line_number":372,"context_line":"            user_domain_id_attribute"},{"line_number":373,"context_line":"        self.enabled_mask \u003d conf.ldap.user_enabled_mask"},{"line_number":374,"context_line":"        self.enabled_default \u003d conf.ldap.user_enabled_default"},{"line_number":375,"context_line":"        self.attribute_ignore \u003d (getattr(conf.ldap, \u0027user_attribute_ignore\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2FBA%3D","line":372,"updated":"2013-02-12 15:04:08.000000000","message":"(HACKING) instead of using a backslash continuation, put the value in parens\n\n  self.attribute_mapping[\u0027domain_id\u0027] \u003d (\n      conf.ldap.user_domain_id_attribute)","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":369,"context_line":"        self.attribute_mapping[\u0027password\u0027] \u003d conf.ldap.user_pass_attribute"},{"line_number":370,"context_line":"        self.attribute_mapping[\u0027enabled\u0027] \u003d conf.ldap.user_enabled_attribute"},{"line_number":371,"context_line":"        self.attribute_mapping[\u0027domain_id\u0027] \u003d conf.ldap.\\"},{"line_number":372,"context_line":"            user_domain_id_attribute"},{"line_number":373,"context_line":"        self.enabled_mask \u003d conf.ldap.user_enabled_mask"},{"line_number":374,"context_line":"        self.enabled_default \u003d conf.ldap.user_enabled_default"},{"line_number":375,"context_line":"        self.attribute_ignore \u003d (getattr(conf.ldap, \u0027user_attribute_ignore\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B48%3D","line":372,"in_reply_to":"AAAAM3%2F%2B%2FBA%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":528,"context_line":"        self.attribute_mapping[\u0027description\u0027] \u003d conf.ldap.tenant_desc_attribute"},{"line_number":529,"context_line":"        self.attribute_mapping[\u0027enabled\u0027] \u003d conf.ldap.tenant_enabled_attribute"},{"line_number":530,"context_line":"        self.attribute_mapping[\u0027domain_id\u0027] \u003d conf.ldap.\\"},{"line_number":531,"context_line":"            tenant_domain_id_attribute"},{"line_number":532,"context_line":"        self.member_attribute \u003d (getattr(conf.ldap, \u0027tenant_member_attribute\u0027)"},{"line_number":533,"context_line":"                                 or self.DEFAULT_MEMBER_ATTRIBUTE)"},{"line_number":534,"context_line":"        self.attribute_ignore \u003d (getattr(conf.ldap, \u0027tenant_attribute_ignore\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2FA4%3D","line":531,"updated":"2013-02-12 15:04:08.000000000","message":"same as above","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":528,"context_line":"        self.attribute_mapping[\u0027description\u0027] \u003d conf.ldap.tenant_desc_attribute"},{"line_number":529,"context_line":"        self.attribute_mapping[\u0027enabled\u0027] \u003d conf.ldap.tenant_enabled_attribute"},{"line_number":530,"context_line":"        self.attribute_mapping[\u0027domain_id\u0027] \u003d conf.ldap.\\"},{"line_number":531,"context_line":"            tenant_domain_id_attribute"},{"line_number":532,"context_line":"        self.member_attribute \u003d (getattr(conf.ldap, \u0027tenant_member_attribute\u0027)"},{"line_number":533,"context_line":"                                 or self.DEFAULT_MEMBER_ATTRIBUTE)"},{"line_number":534,"context_line":"        self.attribute_ignore \u003d (getattr(conf.ldap, \u0027tenant_attribute_ignore\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B44%3D","line":531,"in_reply_to":"AAAAM3%2F%2B%2FA4%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    def get_domain_by_name(self, domain_name):"},{"line_number":604,"context_line":"        session \u003d self.get_session()"},{"line_number":605,"context_line":"        domain_ref \u003d session.query(Domain).filter_by(name\u003ddomain_name).first()"},{"line_number":606,"context_line":"        if not domain_ref:"},{"line_number":607,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_name)"},{"line_number":608,"context_line":"        return domain_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi4c%3D","line":605,"updated":"2013-01-16 17:04:06.000000000","message":".first() -\u003e .one()\n\n... and then wrap that call into a try/except, catching sql.NotFound.\n\none() has a slightly different behavior in that it raises an exception instead of returning None, and it\u0027ll also raise an exception if more than one result is found, which would appropriately result in a 500. (.first() suppresses that condition by simply returning the first result).","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    def get_domain_by_name(self, domain_name):"},{"line_number":604,"context_line":"        session \u003d self.get_session()"},{"line_number":605,"context_line":"        domain_ref \u003d session.query(Domain).filter_by(name\u003ddomain_name).first()"},{"line_number":606,"context_line":"        if not domain_ref:"},{"line_number":607,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_name)"},{"line_number":608,"context_line":"        return domain_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fick%3D","line":605,"in_reply_to":"AAAAM3%2F%2Fi4c%3D","updated":"2013-01-16 20:13:02.000000000","message":"....understand the point...although since sql is already ensuring name is unique, do you think it makes that much difference?  Won\u0027t the same apply to get by id?  And in fact all the other entities too here!?  If it really is better, I\u0027m happy to re-factor","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68975c83ed624ee18495a364895f1df7568d5066","unresolved":false,"context_lines":[{"line_number":602,"context_line":""},{"line_number":603,"context_line":"    def get_domain_by_name(self, domain_name):"},{"line_number":604,"context_line":"        session \u003d self.get_session()"},{"line_number":605,"context_line":"        domain_ref \u003d session.query(Domain).filter_by(name\u003ddomain_name).first()"},{"line_number":606,"context_line":"        if not domain_ref:"},{"line_number":607,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_name)"},{"line_number":608,"context_line":"        return domain_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FiJg%3D","line":605,"in_reply_to":"AAAAM3%2F%2Fick%3D","updated":"2013-01-16 23:20:48.000000000","message":"I think it\u0027s semantically what we want in this case. Because it also raises exceptions when multiple matches are unexpectedly returned, it also prevents us from suppressing our own mistakes when we implement TopLevelDomains or whatever, and suddenly Domain names *aren\u0027t* unique ;)\n\nFor get by primary key, you can actually just do session.query(TableClass).get(some_id) which can be vastly superior because it prevents unnecessarily reloading objects from the database. I\u0027m not aware that we use it at all :(","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"db60bc8332cff3b847cedb1f34cbe1a1bf9874ad","unresolved":false,"context_lines":[{"line_number":613,"context_line":"        try:"},{"line_number":614,"context_line":"            ref \u003d session.query(Domain).filter_by(name\u003ddomain_name).one()"},{"line_number":615,"context_line":"        except sql.NotFound:"},{"line_number":616,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_name)"},{"line_number":617,"context_line":"        return ref.to_dict()"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @handle_conflicts(type\u003d\u0027domain\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJFQ%3D","line":616,"updated":"2013-02-05 20:43:01.000000000","message":"assuming this should be domain_name\u003ddomain_name","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":613,"context_line":"        try:"},{"line_number":614,"context_line":"            ref \u003d session.query(Domain).filter_by(name\u003ddomain_name).one()"},{"line_number":615,"context_line":"        except sql.NotFound:"},{"line_number":616,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_name)"},{"line_number":617,"context_line":"        return ref.to_dict()"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @handle_conflicts(type\u003d\u0027domain\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI54%3D","line":616,"in_reply_to":"AAAAM3%2F%2FI%2BE%3D","updated":"2013-02-07 01:45:01.000000000","message":"Agree - future refactor required.","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1d9636ae1729b5894fa0e2e298d798c376fd163d","unresolved":false,"context_lines":[{"line_number":613,"context_line":"        try:"},{"line_number":614,"context_line":"            ref \u003d session.query(Domain).filter_by(name\u003ddomain_name).one()"},{"line_number":615,"context_line":"        except sql.NotFound:"},{"line_number":616,"context_line":"            raise exception.DomainNotFound(domain_id\u003ddomain_name)"},{"line_number":617,"context_line":"        return ref.to_dict()"},{"line_number":618,"context_line":""},{"line_number":619,"context_line":"    @handle_conflicts(type\u003d\u0027domain\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI%2BE%3D","line":616,"in_reply_to":"AAAAM3%2F%2FJFQ%3D","updated":"2013-02-05 20:50:46.000000000","message":"We don\u0027t have [Object]NotFoundByName exceptions, so we\u0027ve simply abused the original error messages which were intended for ID\u0027s. The error messages make sense at the end of the day, so it\u0027s just an issue of refactoring, outside the scope of this change.","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        query \u003d session.query(Project)"},{"line_number":233,"context_line":"        query \u003d query.filter_by(name\u003dtenant_name)"},{"line_number":234,"context_line":"        query \u003d query.filter_by(domain_id\u003ddomain_id)"},{"line_number":235,"context_line":"        project_ref \u003d query.first()"},{"line_number":236,"context_line":"        if not project_ref:"},{"line_number":237,"context_line":"            raise exception.ProjectNotFound(project_id\u003dtenant_name)"},{"line_number":238,"context_line":"        return project_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBHk%3D","line":235,"updated":"2013-02-11 15:45:37.000000000","message":"wrap\n\n  q.one()\n\nin a try/except (catching sql.NotFound) instead of using first()\n\nTwo projects with the same name in the same domain needs to raise an unhandled exception","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        query \u003d session.query(Project)"},{"line_number":233,"context_line":"        query \u003d query.filter_by(name\u003dtenant_name)"},{"line_number":234,"context_line":"        query \u003d query.filter_by(domain_id\u003ddomain_id)"},{"line_number":235,"context_line":"        project_ref \u003d query.first()"},{"line_number":236,"context_line":"        if not project_ref:"},{"line_number":237,"context_line":"            raise exception.ProjectNotFound(project_id\u003dtenant_name)"},{"line_number":238,"context_line":"        return project_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FAtw%3D","line":235,"in_reply_to":"AAAAM3%2F%2FBHk%3D","updated":"2013-02-11 18:33:08.000000000","message":"Done","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        query \u003d session.query(User)"},{"line_number":697,"context_line":"        query \u003d query.filter_by(name\u003duser_name)"},{"line_number":698,"context_line":"        query \u003d query.filter_by(domain_id\u003ddomain_id)"},{"line_number":699,"context_line":"        user_ref \u003d query.first()"},{"line_number":700,"context_line":"        if not user_ref:"},{"line_number":701,"context_line":"            raise exception.UserNotFound(user_id\u003duser_name)"},{"line_number":702,"context_line":"        return user_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBHc%3D","line":699,"updated":"2013-02-11 15:45:37.000000000","message":"same as above, call .one()","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":696,"context_line":"        query \u003d session.query(User)"},{"line_number":697,"context_line":"        query \u003d query.filter_by(name\u003duser_name)"},{"line_number":698,"context_line":"        query \u003d query.filter_by(domain_id\u003ddomain_id)"},{"line_number":699,"context_line":"        user_ref \u003d query.first()"},{"line_number":700,"context_line":"        if not user_ref:"},{"line_number":701,"context_line":"            raise exception.UserNotFound(user_id\u003duser_name)"},{"line_number":702,"context_line":"        return user_ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FAtk%3D","line":699,"in_reply_to":"AAAAM3%2F%2FBHc%3D","updated":"2013-02-11 18:33:08.000000000","message":"Done","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"}],"keystone/identity/controllers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        new_user_ref \u003d self.identity_api.create_user("},{"line_number":186,"context_line":"            context, user_id, user_ref)"},{"line_number":187,"context_line":"        if default_tenant_id:"},{"line_number":188,"context_line":"            self.identity_api.add_user_to_tenant(context, default_tenant_id, user_id)"},{"line_number":189,"context_line":"        return {\u0027user\u0027: new_user_ref}"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def update_user(self, context, user_id, user):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi38%3D","line":188,"updated":"2013-01-16 17:04:06.000000000","message":"nice","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":185,"context_line":"        new_user_ref \u003d self.identity_api.create_user("},{"line_number":186,"context_line":"            context, user_id, user_ref)"},{"line_number":187,"context_line":"        if default_tenant_id:"},{"line_number":188,"context_line":"            self.identity_api.add_user_to_tenant(context, default_tenant_id, user_id)"},{"line_number":189,"context_line":"        return {\u0027user\u0027: new_user_ref}"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"    def update_user(self, context, user_id, user):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FidI%3D","line":188,"in_reply_to":"AAAAM3%2F%2Fi38%3D","updated":"2013-01-16 20:13:02.000000000","message":":-)","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":408,"context_line":"    def get_domain_by_name(self, context, domain_name):"},{"line_number":409,"context_line":"        ref \u003d self.identity_api.get_domain_by_name("},{"line_number":410,"context_line":"                  context, domain_name)"},{"line_number":411,"context_line":"        return {\u0027domain\u0027: ref}"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @controller.protected"},{"line_number":414,"context_line":"    def update_domain(self, context, domain_id, domain):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi30%3D","line":411,"updated":"2013-01-16 17:04:06.000000000","message":"-2! GET /domains?name\u003d{domain_name} should, according to it\u0027s semantics, return a collection... even if you know it\u0027s going to be a collection of one. So the implementation for this should go into list_domains rather than creating a new protected controller method, and would work there as short circuit logic.","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":408,"context_line":"    def get_domain_by_name(self, context, domain_name):"},{"line_number":409,"context_line":"        ref \u003d self.identity_api.get_domain_by_name("},{"line_number":410,"context_line":"                  context, domain_name)"},{"line_number":411,"context_line":"        return {\u0027domain\u0027: ref}"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @controller.protected"},{"line_number":414,"context_line":"    def update_domain(self, context, domain_id, domain):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fifg%3D","line":411,"in_reply_to":"AAAAM3%2F%2Fi30%3D","updated":"2013-01-16 20:13:02.000000000","message":"So I was not intending this to be part of the public api (so maybe that\u0027s part to of the problem, it shouldn\u0027t be here as a protected controller method).  It\u0027s for ease of use from the token controller to look up the id of a domain if the token specifies a domain name (the equivalent of the existing get_tenant_by_name()).  Of course, we could funnel that through list_domain, but thought it was better to have a direct call.","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68975c83ed624ee18495a364895f1df7568d5066","unresolved":false,"context_lines":[{"line_number":408,"context_line":"    def get_domain_by_name(self, context, domain_name):"},{"line_number":409,"context_line":"        ref \u003d self.identity_api.get_domain_by_name("},{"line_number":410,"context_line":"                  context, domain_name)"},{"line_number":411,"context_line":"        return {\u0027domain\u0027: ref}"},{"line_number":412,"context_line":""},{"line_number":413,"context_line":"    @controller.protected"},{"line_number":414,"context_line":"    def update_domain(self, context, domain_id, domain):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FiJc%3D","line":411,"in_reply_to":"AAAAM3%2F%2Fifg%3D","updated":"2013-01-16 23:20:48.000000000","message":"I\u0027d make it unprotected and start the method name with an underscore then, to indicate that it\u0027s private and shouldn\u0027t be mapped to a router. I guarantee that someone will try, at some point.","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return {\u0027tenant\u0027: self._filter_domain_id(ref)}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def get_project_by_name(self, context, tenant_name):"},{"line_number":88,"context_line":"        self.assert_admin(context)"},{"line_number":89,"context_line":"        ref \u003d self.identity_api.get_project_by_name("},{"line_number":90,"context_line":"            context, tenant_name)"},{"line_number":91,"context_line":"        return {\u0027tenant\u0027: self._filter_domain_id(ref)}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJeI%3D","line":88,"updated":"2013-02-05 17:10:40.000000000","message":"don\u0027t you need to normalize the domain_id, so that it only looks for projects in the default domain?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        return {\u0027tenant\u0027: self._filter_domain_id(ref)}"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def get_project_by_name(self, context, tenant_name):"},{"line_number":88,"context_line":"        self.assert_admin(context)"},{"line_number":89,"context_line":"        ref \u003d self.identity_api.get_project_by_name("},{"line_number":90,"context_line":"            context, tenant_name)"},{"line_number":91,"context_line":"        return {\u0027tenant\u0027: self._filter_domain_id(ref)}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FGps%3D","line":88,"in_reply_to":"AAAAM3%2F%2FJeI%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return {\u0027tenant\u0027: self._filter_domain_id(tenant)}"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def update_project(self, context, tenant_id, tenant):"},{"line_number":109,"context_line":"        self.assert_admin(context)"},{"line_number":110,"context_line":"        tenant_ref \u003d self.identity_api.update_project("},{"line_number":111,"context_line":"            context, tenant_id, tenant)"},{"line_number":112,"context_line":"        return {\u0027tenant\u0027: tenant_ref}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJeA%3D","line":109,"updated":"2013-02-05 17:10:40.000000000","message":"i think we should pop() the domain_id here, if one is provided, so that it cannot be manipulated by the v2 api ... or raise a 400","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return {\u0027tenant\u0027: self._filter_domain_id(tenant)}"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def update_project(self, context, tenant_id, tenant):"},{"line_number":109,"context_line":"        self.assert_admin(context)"},{"line_number":110,"context_line":"        tenant_ref \u003d self.identity_api.update_project("},{"line_number":111,"context_line":"            context, tenant_id, tenant)"},{"line_number":112,"context_line":"        return {\u0027tenant\u0027: tenant_ref}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FGpM%3D","line":109,"in_reply_to":"AAAAM3%2F%2FJeA%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    def get_project_users(self, context, tenant_id, **kw):"},{"line_number":119,"context_line":"        self.assert_admin(context)"},{"line_number":120,"context_line":"        user_refs \u003d self.identity_api.get_project_users(context, tenant_id)"},{"line_number":121,"context_line":"        return {\u0027users\u0027: user_refs}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _format_project_list(self, tenant_refs, **kwargs):"},{"line_number":124,"context_line":"        marker \u003d kwargs.get(\u0027marker\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJd8%3D","line":121,"updated":"2013-02-05 17:10:40.000000000","message":"filter domain id on result list","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":118,"context_line":"    def get_project_users(self, context, tenant_id, **kw):"},{"line_number":119,"context_line":"        self.assert_admin(context)"},{"line_number":120,"context_line":"        user_refs \u003d self.identity_api.get_project_users(context, tenant_id)"},{"line_number":121,"context_line":"        return {\u0027users\u0027: user_refs}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"    def _format_project_list(self, tenant_refs, **kwargs):"},{"line_number":124,"context_line":"        marker \u003d kwargs.get(\u0027marker\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FGow%3D","line":121,"in_reply_to":"AAAAM3%2F%2FJd8%3D","updated":"2013-02-07 01:45:01.000000000","message":"nice catch","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":150,"context_line":"        for x in tenant_refs:"},{"line_number":151,"context_line":"            if \u0027enabled\u0027 not in x:"},{"line_number":152,"context_line":"                x[\u0027enabled\u0027] \u003d True"},{"line_number":153,"context_line":"        o \u003d {\u0027tenants\u0027: tenant_refs,"},{"line_number":154,"context_line":"             \u0027tenants_links\u0027: []}"},{"line_number":155,"context_line":"        return o"},{"line_number":156,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJd0%3D","line":153,"updated":"2013-02-05 17:10:40.000000000","message":"filter domain id out?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def get_user_by_name(self, context, user_name):"},{"line_number":178,"context_line":"        self.assert_admin(context)"},{"line_number":179,"context_line":"        ref \u003d self.identity_api.get_user_by_name(context, user_name)"},{"line_number":180,"context_line":"        return {\u0027user\u0027: self._filter_domain_id(ref)}"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    # CRUD extension"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJdc%3D","line":179,"updated":"2013-02-05 17:10:40.000000000","message":"assume default domain id?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def get_user_by_name(self, context, user_name):"},{"line_number":178,"context_line":"        self.assert_admin(context)"},{"line_number":179,"context_line":"        ref \u003d self.identity_api.get_user_by_name(context, user_name)"},{"line_number":180,"context_line":"        return {\u0027user\u0027: self._filter_domain_id(ref)}"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    # CRUD extension"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FGpo%3D","line":179,"in_reply_to":"AAAAM3%2F%2FJdc%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        return self.identity_api.delete_domain(context, domain_id)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    # For use by token authentication - not for hooking to the identity"},{"line_number":471,"context_line":"    # router as a public api"},{"line_number":472,"context_line":"    def _get_domain_by_name(self, context, domain_name):"},{"line_number":473,"context_line":"        ref \u003d self.identity_api.get_domain_by_name("},{"line_number":474,"context_line":"            context, domain_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJc8%3D","line":471,"updated":"2013-02-05 17:10:40.000000000","message":"make this a \"\"\"doc string\"\"\" inside the function","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":468,"context_line":"        return self.identity_api.delete_domain(context, domain_id)"},{"line_number":469,"context_line":""},{"line_number":470,"context_line":"    # For use by token authentication - not for hooking to the identity"},{"line_number":471,"context_line":"    # router as a public api"},{"line_number":472,"context_line":"    def _get_domain_by_name(self, context, domain_name):"},{"line_number":473,"context_line":"        ref \u003d self.identity_api.get_domain_by_name("},{"line_number":474,"context_line":"            context, domain_name)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FGpg%3D","line":471,"in_reply_to":"AAAAM3%2F%2FJc8%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        return self.identity_api.delete_domain(context, domain_id)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    \"\"\"\"For use by token authentication - not for hooking to the identity"},{"line_number":481,"context_line":"        router as a public api\"\"\""},{"line_number":482,"context_line":"    def _get_domain_by_name(self, context, domain_name):"},{"line_number":483,"context_line":"        ref \u003d self.identity_api.get_domain_by_name("},{"line_number":484,"context_line":"            context, domain_name)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2FAY%3D","line":481,"updated":"2013-02-12 15:04:08.000000000","message":"put the docstr inside the function. I\u0027d also suggest adding a one line summary and using this as the body of the docstr. There\u0027s also an extra quotation mark at the beginning.","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        return self.identity_api.delete_domain(context, domain_id)"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    \"\"\"\"For use by token authentication - not for hooking to the identity"},{"line_number":481,"context_line":"        router as a public api\"\"\""},{"line_number":482,"context_line":"    def _get_domain_by_name(self, context, domain_name):"},{"line_number":483,"context_line":"        ref \u003d self.identity_api.get_domain_by_name("},{"line_number":484,"context_line":"            context, domain_name)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B4g%3D","line":481,"in_reply_to":"AAAAM3%2F%2B%2FAY%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"keystone/identity/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\"Filter out private items in a user dict"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    \u0027password\u0027, \u0027tenants\u0027 and \u0027groups\u0027 are never returned."},{"line_number":35,"context_line":"    \u0027domain_id\u0027 is not returned if it is null"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    :returns: user_ref"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi3w%3D","line":35,"updated":"2013-01-16 17:04:06.000000000","message":"but domain_id \"will\" never be null..?","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    \"\"\"Filter out private items in a user dict"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    \u0027password\u0027, \u0027tenants\u0027 and \u0027groups\u0027 are never returned."},{"line_number":35,"context_line":"    \u0027domain_id\u0027 is not returned if it is null"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    :returns: user_ref"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FifU%3D","line":35,"in_reply_to":"AAAAM3%2F%2Fi3w%3D","updated":"2013-01-16 20:13:02.000000000","message":"..when I wrote this I had been assuming it could be....now that we are putting this behind your default domain change, then you are correct","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                if user_ref[\u0027domain_id\u0027] is None:"},{"line_number":51,"context_line":"                    user_ref.pop(\u0027domain_id\u0027)"},{"line_number":52,"context_line":"            except KeyError:"},{"line_number":53,"context_line":"                pass"},{"line_number":54,"context_line":"    return user_ref"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi24%3D","line":53,"updated":"2013-01-16 17:04:06.000000000","message":"I\u0027m not sure why you want to do this in the outer try/except\u0027s except block, but what you wrote can be done in a one liner:\n\n  user_ref.pop(\u0027domain_id\u0027, None)\n\nwhich is also equivalent to:\n\n  if \u0027domain_id\u0027 in user_ref:\n    del user_ref[\u0027domain_id\u0027]\n\nYou also only want to filter it out for the v2 api, the v3 api should include the domain_id in user objects","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"                if user_ref[\u0027domain_id\u0027] is None:"},{"line_number":51,"context_line":"                    user_ref.pop(\u0027domain_id\u0027)"},{"line_number":52,"context_line":"            except KeyError:"},{"line_number":53,"context_line":"                pass"},{"line_number":54,"context_line":"    return user_ref"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FifE%3D","line":53,"in_reply_to":"AAAAM3%2F%2Fi24%3D","updated":"2013-01-16 20:13:02.000000000","message":"agreed","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def filter_user(user_ref):"},{"line_number":32,"context_line":"    \"\"\"Filter out private items in a user dict"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    \u0027password\u0027, \u0027tenants\u0027 and \u0027groups\u0027 are never returned."},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2FAQ%3D","line":32,"updated":"2013-02-12 15:04:08.000000000","message":"one line summary should end with a period","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def filter_user(user_ref):"},{"line_number":32,"context_line":"    \"\"\"Filter out private items in a user dict"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    \u0027password\u0027, \u0027tenants\u0027 and \u0027groups\u0027 are never returned."},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B38%3D","line":32,"in_reply_to":"AAAAM3%2F%2B%2FAQ%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"keystone/token/controllers.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # TODO (henry-nash) If no tenant was specified, instead check"},{"line_number":178,"context_line":"        # for a domain and find any related user/group roles"},{"line_number":179,"context_line":"        "},{"line_number":180,"context_line":"        self._append_roles(metadata_ref,"},{"line_number":181,"context_line":"                           self._get_group_metadata_ref("},{"line_number":182,"context_line":"                               context, user_id, tenant_id))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi14%3D","line":179,"updated":"2013-01-16 17:04:06.000000000","message":"pep8","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # TODO (henry-nash) If no tenant was specified, instead check"},{"line_number":178,"context_line":"        # for a domain and find any related user/group roles"},{"line_number":179,"context_line":"        "},{"line_number":180,"context_line":"        self._append_roles(metadata_ref,"},{"line_number":181,"context_line":"                           self._get_group_metadata_ref("},{"line_number":182,"context_line":"                               context, user_id, tenant_id))"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2FifA%3D","line":179,"in_reply_to":"AAAAM3%2F%2Fi14%3D","updated":"2013-01-16 20:13:02.000000000","message":"Done","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":316,"context_line":"        Returns a valid domain_id if it exists, or None if not specified."},{"line_number":317,"context_line":"        \"\"\""},{"line_number":318,"context_line":"        domain_id \u003d auth.get(\u0027domainId\u0027, None)"},{"line_number":319,"context_line":"        domain_name \u003d auth.get(\u0027domainName\u0027, None)"},{"line_number":320,"context_line":"        if domain_name:"},{"line_number":321,"context_line":"            try:"},{"line_number":322,"context_line":"                domain_ref \u003d self.identity_api.get_domain_by_name("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi1Y%3D","line":319,"updated":"2013-01-16 17:04:06.000000000","message":"those attributes will never be set like that... these are v2 style attributes... in v3, these will be:\n\n  \u0027domain\u0027: {\u0027id\u0027: \u0027abc\u0027}\n\nor \n\n  \u0027domain\u0027: {\u0027name\u0027: \u0027Abc\u0027}","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bcab19265c9b809338c2b632c249f5207d7c5603","unresolved":false,"context_lines":[{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        Returns a valid domain_id if it exists, or None if not specified."},{"line_number":317,"context_line":"        \"\"\""},{"line_number":318,"context_line":"        domain_id \u003d auth.get(\u0027domainId\u0027, None)"},{"line_number":319,"context_line":"        domain_name \u003d auth.get(\u0027domainName\u0027, None)"},{"line_number":320,"context_line":"        if domain_name:"},{"line_number":321,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAM3%2F%2FfP8%3D","line":318,"updated":"2013-01-18 20:37:38.000000000","message":"Still need to fix these (henry-nash)","commit_id":"e913c98182ca98daeafeaeee670b1d7051e232e6"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        \"\"\""},{"line_number":334,"context_line":"        # TODO(henry-nash): Convert these to v3 format"},{"line_number":335,"context_line":"        domain_id \u003d auth.get(\u0027domainId\u0027, None)"},{"line_number":336,"context_line":"        domain_name \u003d auth.get(\u0027domainName\u0027, None)"},{"line_number":337,"context_line":"        if domain_name:"},{"line_number":338,"context_line":"            try:"},{"line_number":339,"context_line":"                domain_ref \u003d self.identity_api._get_domain_by_name("}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJcM%3D","line":336,"updated":"2013-02-05 17:10:40.000000000","message":"i\u0027m not clear on why you\u0027re checking a domain id / name in a v2 context at all?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        \"\"\""},{"line_number":334,"context_line":"        # TODO(henry-nash): Convert these to v3 format"},{"line_number":335,"context_line":"        domain_id \u003d auth.get(\u0027domainId\u0027, None)"},{"line_number":336,"context_line":"        domain_name \u003d auth.get(\u0027domainName\u0027, None)"},{"line_number":337,"context_line":"        if domain_name:"},{"line_number":338,"context_line":"            try:"},{"line_number":339,"context_line":"                domain_ref \u003d self.identity_api._get_domain_by_name("}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI5I%3D","line":336,"in_reply_to":"AAAAM3%2F%2FJcM%3D","updated":"2013-02-07 01:45:01.000000000","message":"This will only be called in a v3 context....it\u0027s a placeholder function ready to plug into Guang\u0027s changes - I\u0027ll make that clearer..","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"CONF \u003d config.CONF"},{"line_number":15,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":16,"context_line":"CONF \u003d config.CONF"},{"line_number":17,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B%2Fs%3D","line":16,"updated":"2013-02-12 15:04:08.000000000","message":"this line is a dupe","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"CONF \u003d config.CONF"},{"line_number":15,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":16,"context_line":"CONF \u003d config.CONF"},{"line_number":17,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B3k%3D","line":16,"in_reply_to":"AAAAM3%2F%2B%2B%2Fs%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"tests/default_fixtures.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":18,"context_line":"#              performance may be negatively affected."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone import config"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"DEFAULT_DOMAIN_ID \u003d config.CONF[\u0027identity\u0027][\u0027default_domain_id\u0027]"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"TENANTS \u003d ["}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJcE%3D","line":21,"updated":"2013-02-05 17:10:40.000000000","message":"2 line breaks here","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":18,"context_line":"#              performance may be negatively affected."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone import config"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"DEFAULT_DOMAIN_ID \u003d config.CONF[\u0027identity\u0027][\u0027default_domain_id\u0027]"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"TENANTS \u003d ["}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI5A%3D","line":21,"in_reply_to":"AAAAM3%2F%2FJcE%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystone import config"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"DEFAULT_DOMAIN_ID \u003d config.CONF[\u0027identity\u0027][\u0027default_domain_id\u0027]"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"TENANTS \u003d ["},{"line_number":25,"context_line":"    {"},{"line_number":26,"context_line":"        \u0027id\u0027: \u0027bar\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJcA%3D","line":23,"updated":"2013-02-05 17:10:40.000000000","message":"2 line breaks here","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystone import config"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"DEFAULT_DOMAIN_ID \u003d config.CONF[\u0027identity\u0027][\u0027default_domain_id\u0027]"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"TENANTS \u003d ["},{"line_number":25,"context_line":"    {"},{"line_number":26,"context_line":"        \u0027id\u0027: \u0027bar\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI48%3D","line":23,"in_reply_to":"AAAAM3%2F%2FJcA%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"}],"tests/test_backend.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                    \u0027password\u0027: \u0027secret\u0027, \u0027enabled\u0027: True}"},{"line_number":511,"context_line":"        self.identity_api.create_user(new_user[\u0027id\u0027], new_user)"},{"line_number":512,"context_line":"        new_user2 \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: \u0027new_user_u2\u0027,"},{"line_number":513,"context_line":"                    \u0027password\u0027: \u0027secret\u0027, \u0027enabled\u0027: True}"},{"line_number":514,"context_line":"        self.identity_api.create_user(new_user2[\u0027id\u0027], new_user2)"},{"line_number":515,"context_line":"        self.identity_api.add_user_to_group(new_user[\u0027id\u0027],"},{"line_number":516,"context_line":"                                            new_group[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi0w%3D","line":513,"updated":"2013-01-16 17:04:06.000000000","message":"use uuid\u0027s and variable names instead of arbitrary values that readers must chase down","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":510,"context_line":"                    \u0027password\u0027: \u0027secret\u0027, \u0027enabled\u0027: True}"},{"line_number":511,"context_line":"        self.identity_api.create_user(new_user[\u0027id\u0027], new_user)"},{"line_number":512,"context_line":"        new_user2 \u003d {\u0027id\u0027: uuid.uuid4().hex, \u0027name\u0027: \u0027new_user_u2\u0027,"},{"line_number":513,"context_line":"                    \u0027password\u0027: \u0027secret\u0027, \u0027enabled\u0027: True}"},{"line_number":514,"context_line":"        self.identity_api.create_user(new_user2[\u0027id\u0027], new_user2)"},{"line_number":515,"context_line":"        self.identity_api.add_user_to_group(new_user[\u0027id\u0027],"},{"line_number":516,"context_line":"                                            new_group[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fiec%3D","line":513,"in_reply_to":"AAAAM3%2F%2Fi0w%3D","updated":"2013-01-16 20:13:02.000000000","message":"Done","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                                       role_id\u003d\u0027keystone_admin\u0027)"},{"line_number":530,"context_line":"        self.identity_api.create_grant(user_id\u003dnew_user2[\u0027id\u0027],"},{"line_number":531,"context_line":"                                       domain_id\u003dnew_domain[\u0027id\u0027],"},{"line_number":532,"context_line":"                                       role_id\u003d\u0027keystone_admin\u0027)"},{"line_number":533,"context_line":"        roles_ref \u003d self.identity_api.list_grants("},{"line_number":534,"context_line":"            group_id\u003dnew_group[\u0027id\u0027],"},{"line_number":535,"context_line":"            domain_id\u003dnew_domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi1I%3D","line":532,"updated":"2013-01-16 17:04:06.000000000","message":"you\u0027re doing a lot here... i feel like you should be writing a new test instead?","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":529,"context_line":"                                       role_id\u003d\u0027keystone_admin\u0027)"},{"line_number":530,"context_line":"        self.identity_api.create_grant(user_id\u003dnew_user2[\u0027id\u0027],"},{"line_number":531,"context_line":"                                       domain_id\u003dnew_domain[\u0027id\u0027],"},{"line_number":532,"context_line":"                                       role_id\u003d\u0027keystone_admin\u0027)"},{"line_number":533,"context_line":"        roles_ref \u003d self.identity_api.list_grants("},{"line_number":534,"context_line":"            group_id\u003dnew_group[\u0027id\u0027],"},{"line_number":535,"context_line":"            domain_id\u003dnew_domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fies%3D","line":532,"in_reply_to":"AAAAM3%2F%2Fi1I%3D","updated":"2013-01-16 20:13:02.000000000","message":"yeah, probably right","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"                   \u0027domain_id\u0027: uuid.uuid4().hex}"},{"line_number":1136,"context_line":"        self.identity_api.create_project(project[\u0027id\u0027], project)"},{"line_number":1137,"context_line":"        project_ref \u003d self.identity_api.get_project(project[\u0027id\u0027])"},{"line_number":1138,"context_line":"        project_ref_dict \u003d dict((x, project_ref[x]) for x in project_ref)"},{"line_number":1139,"context_line":"        self.assertDictEqual(project_ref_dict, project)"},{"line_number":1140,"context_line":""},{"line_number":1141,"context_line":"        project[\u0027name\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJas%3D","line":1138,"updated":"2013-02-05 17:10:40.000000000","message":"if you\u0027re just trying to copy it, there\u0027s a couple shorter methods:\n\n  \u003e\u003e\u003e d \u003d dict()\n  \u003e\u003e\u003e id(d)\n  140595792556880\n  \u003e\u003e\u003e id(d.copy())\n  140595792572144\n  \u003e\u003e\u003e id(dict(d))\n  140595792571712\n\nbut i don\u0027t see a reason to copy it?","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":1135,"context_line":"                   \u0027domain_id\u0027: uuid.uuid4().hex}"},{"line_number":1136,"context_line":"        self.identity_api.create_project(project[\u0027id\u0027], project)"},{"line_number":1137,"context_line":"        project_ref \u003d self.identity_api.get_project(project[\u0027id\u0027])"},{"line_number":1138,"context_line":"        project_ref_dict \u003d dict((x, project_ref[x]) for x in project_ref)"},{"line_number":1139,"context_line":"        self.assertDictEqual(project_ref_dict, project)"},{"line_number":1140,"context_line":""},{"line_number":1141,"context_line":"        project[\u0027name\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FHmo%3D","line":1138,"in_reply_to":"AAAAM3%2F%2FJas%3D","updated":"2013-02-07 01:45:01.000000000","message":"Done","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":24,"context_line":"from keystone import config"},{"line_number":25,"context_line":"from keystone import test"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d config.CONF"},{"line_number":28,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B%2FY%3D","line":26,"updated":"2013-02-12 15:04:08.000000000","message":"two blank lines between imports and constants","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":24,"context_line":"from keystone import config"},{"line_number":25,"context_line":"from keystone import test"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"CONF \u003d config.CONF"},{"line_number":28,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B3Y%3D","line":26,"in_reply_to":"AAAAM3%2F%2B%2B%2FY%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"tests/test_backend_ldap.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d0e4539c20ef24e926e9794315b2345cc713abb2","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    def test_get_and_remove_role_grant_by_user_and_domain(self):"},{"line_number":444,"context_line":"        pass"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def test_domain_crud(self):"},{"line_number":447,"context_line":"        pass"},{"line_number":448,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fi0k%3D","line":446,"updated":"2013-01-16 17:04:06.000000000","message":"raise a skiptest and cite a bug number?","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"b3cf49bbb2a4e63e00549afc1bc7fe78e243b00b","unresolved":false,"context_lines":[{"line_number":443,"context_line":"    def test_get_and_remove_role_grant_by_user_and_domain(self):"},{"line_number":444,"context_line":"        pass"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    def test_domain_crud(self):"},{"line_number":447,"context_line":"        pass"},{"line_number":448,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2Fido%3D","line":446,"in_reply_to":"AAAAM3%2F%2Fi0k%3D","updated":"2013-01-16 20:13:02.000000000","message":"Will raise bug","commit_id":"7fd3cb636ee2165cdb8204416e8c324e65739a5f"}],"tests/test_migrate_nova_auth.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7aeba13b3ca95e0aaf15ceb6c7976e03a13d0363","unresolved":false,"context_lines":[{"line_number":29,"context_line":"FIXTURE \u003d {"},{"line_number":30,"context_line":"    \u0027users\u0027: ["},{"line_number":31,"context_line":"        {\u0027id\u0027: \u0027user1\u0027, \u0027name\u0027: \u0027uname1\u0027, \u0027password\u0027: \u0027acc1\u0027,"},{"line_number":32,"context_line":"         \u0027domain_id\u0027: DEFAULT_DOMAIN_ID},"},{"line_number":33,"context_line":"        {\u0027id\u0027: \u0027user4\u0027, \u0027name\u0027: \u0027uname4\u0027, \u0027password\u0027: \u0027acc1\u0027,"},{"line_number":34,"context_line":"         \u0027domain_id\u0027: DEFAULT_DOMAIN_ID},"},{"line_number":35,"context_line":"        {\u0027id\u0027: \u0027user2\u0027, \u0027name\u0027: \u0027uname2\u0027, \u0027password\u0027: \u0027acc2\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FJaQ%3D","line":32,"updated":"2013-02-05 17:10:40.000000000","message":"i don\u0027t think this file should have any changes at all, as this represents what nova auth looked like","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"dbc4f0de72efb4c4007be8345adec063424f76ae","unresolved":false,"context_lines":[{"line_number":29,"context_line":"FIXTURE \u003d {"},{"line_number":30,"context_line":"    \u0027users\u0027: ["},{"line_number":31,"context_line":"        {\u0027id\u0027: \u0027user1\u0027, \u0027name\u0027: \u0027uname1\u0027, \u0027password\u0027: \u0027acc1\u0027,"},{"line_number":32,"context_line":"         \u0027domain_id\u0027: DEFAULT_DOMAIN_ID},"},{"line_number":33,"context_line":"        {\u0027id\u0027: \u0027user4\u0027, \u0027name\u0027: \u0027uname4\u0027, \u0027password\u0027: \u0027acc1\u0027,"},{"line_number":34,"context_line":"         \u0027domain_id\u0027: DEFAULT_DOMAIN_ID},"},{"line_number":35,"context_line":"        {\u0027id\u0027: \u0027user2\u0027, \u0027name\u0027: \u0027uname2\u0027, \u0027password\u0027: \u0027acc2\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FI6c%3D","line":32,"in_reply_to":"AAAAM3%2F%2FJaQ%3D","updated":"2013-02-07 01:45:01.000000000","message":"Yep, a better way to do this, agreed.","commit_id":"8b0255fbfa37c44cc8e9ed752ea57e4b1c111b68"}],"tests/test_sql_upgrade.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def initialize_sql(self):"},{"line_number":50,"context_line":"        self.metadata \u003d sqlalchemy.MetaData()"},{"line_number":51,"context_line":"        self.metadata.bind \u003d self.engine"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def setUp(self):"},{"line_number":54,"context_line":"        super(SqlUpgradeTests, self).setUp()"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBGI%3D","line":51,"updated":"2013-02-11 15:45:37.000000000","message":"i\u0027m confused -- rebase your change on adams, rather than competing for authorship over his change","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def initialize_sql(self):"},{"line_number":50,"context_line":"        self.metadata \u003d sqlalchemy.MetaData()"},{"line_number":51,"context_line":"        self.metadata.bind \u003d self.engine"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def setUp(self):"},{"line_number":54,"context_line":"        super(SqlUpgradeTests, self).setUp()"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FAtc%3D","line":51,"in_reply_to":"AAAAM3%2F%2FBGI%3D","updated":"2013-02-11 18:33:08.000000000","message":"No competition intended....we were both working on this over the weekend with various patches at different levels...will be re-basing on Adam\u0027s change","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":41,"context_line":"CONF \u003d config.CONF"},{"line_number":42,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"import default_fixtures"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class SqlUpgradeTests(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B%2FE%3D","line":44,"updated":"2013-02-12 15:04:08.000000000","message":"imports first","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":41,"context_line":"CONF \u003d config.CONF"},{"line_number":42,"context_line":"DEFAULT_DOMAIN_ID \u003d CONF.identity.default_domain_id"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"import default_fixtures"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class SqlUpgradeTests(test.TestCase):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B3M%3D","line":44,"in_reply_to":"AAAAM3%2F%2B%2B%2FE%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.max_version \u003d self.schema.repository.version().version"},{"line_number":73,"context_line":"        # debug only - setting this to True in a test will stop the database"},{"line_number":74,"context_line":"        # from being torn down so you can inspect it after an assert failure"},{"line_number":75,"context_line":"        self.stop_tearDown \u003d False"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def tearDown(self):"},{"line_number":78,"context_line":"        if not self.stop_tearDown:"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B%2Bw%3D","line":75,"updated":"2013-02-12 15:04:08.000000000","message":"please remove this -- you can handle this offline and just not check the change in","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        self.max_version \u003d self.schema.repository.version().version"},{"line_number":73,"context_line":"        # debug only - setting this to True in a test will stop the database"},{"line_number":74,"context_line":"        # from being torn down so you can inspect it after an assert failure"},{"line_number":75,"context_line":"        self.stop_tearDown \u003d False"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    def tearDown(self):"},{"line_number":78,"context_line":"        if not self.stop_tearDown:"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B2w%3D","line":75,"in_reply_to":"AAAAM3%2F%2B%2B%2Bw%3D","updated":"2013-02-12 16:00:29.000000000","message":"Done","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eba5484b2894bb1855124315c68e2cf813862a36","unresolved":false,"context_lines":[{"line_number":553,"context_line":"    def assertTableDoesNotExist(self, table_name):"},{"line_number":554,"context_line":"        \"\"\"Asserts that a given table exists cannot be selected by name.\"\"\""},{"line_number":555,"context_line":"        # Switch to a different metadata otherwise you might still"},{"line_number":556,"context_line":"        # detect renamed or dropped tables"},{"line_number":557,"context_line":"        try:"},{"line_number":558,"context_line":"            temp_metadata \u003d sqlalchemy.MetaData()"},{"line_number":559,"context_line":"            temp_metadata.bind \u003d self.engine"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B%2Bo%3D","line":556,"updated":"2013-02-12 15:04:08.000000000","message":"ayoung has something similar in review -- i haven\u0027t experienced the issue myself, but i\u0027d rather only merge one fix or the other","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1270739e5efbd8843cadc24032bcc67b2303d942","unresolved":false,"context_lines":[{"line_number":553,"context_line":"    def assertTableDoesNotExist(self, table_name):"},{"line_number":554,"context_line":"        \"\"\"Asserts that a given table exists cannot be selected by name.\"\"\""},{"line_number":555,"context_line":"        # Switch to a different metadata otherwise you might still"},{"line_number":556,"context_line":"        # detect renamed or dropped tables"},{"line_number":557,"context_line":"        try:"},{"line_number":558,"context_line":"            temp_metadata \u003d sqlalchemy.MetaData()"},{"line_number":559,"context_line":"            temp_metadata.bind \u003d self.engine"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAM3%2F%2B%2B1k%3D","line":556,"in_reply_to":"AAAAM3%2F%2B%2B%2Bo%3D","updated":"2013-02-12 16:00:29.000000000","message":"If this is the additional self.initializesql(), then I have this change included here, since I have merged up with his (initializesql is called elsewhere).  However, calling that function here instead of this does not fix this particular problem - since that was one of the things I tried.  So until we understand it a bit better, then I think we need to go with this change as well.","commit_id":"933ddae04b492d8dedf79c82aafaf9595035640f"}],"tests/test_v3_identity.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"68be01602f6e0ea1e2ba79141e767d7b5d083d1a","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if ref:"},{"line_number":114,"context_line":"            self.assertEqual(ref[\u0027email\u0027], entity[\u0027email\u0027])"},{"line_number":115,"context_line":"            if \u0027domain_id\u0027 in ref:"},{"line_number":116,"context_line":"                self.assertEqual(ref[\u0027domain_id\u0027], entity[\u0027domain_id\u0027])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        return entity"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FBGM%3D","line":116,"updated":"2013-02-11 15:45:37.000000000","message":"-2 undo","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"541e0855f6f80ed8cb386ace6c9bb672fdb18984","unresolved":false,"context_lines":[{"line_number":113,"context_line":"        if ref:"},{"line_number":114,"context_line":"            self.assertEqual(ref[\u0027email\u0027], entity[\u0027email\u0027])"},{"line_number":115,"context_line":"            if \u0027domain_id\u0027 in ref:"},{"line_number":116,"context_line":"                self.assertEqual(ref[\u0027domain_id\u0027], entity[\u0027domain_id\u0027])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        return entity"},{"line_number":119,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAM3%2F%2FArw%3D","line":116,"in_reply_to":"AAAAM3%2F%2FBGM%3D","updated":"2013-02-11 18:33:08.000000000","message":"nice catch...had this in there before I really had the controller-level domain stuff done","commit_id":"a33c81d12c240498a1df30cdd205fb58e7811c69"}]}
