)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"339846ed1b501b57ac4d6e84bd39c911ab09c0f1","unresolved":false,"context_lines":[{"line_number":11,"context_line":"trust related authentication occurs (call to /auth/tokens). If set"},{"line_number":12,"context_line":"to -1, trusts can be used indefinitely to authenticate."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"WIP for bug #1250617"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I2c80b6d548a6715da0366c6f64ee58fbce514adb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAATn%2F%2Br2g%3D","line":14,"updated":"2013-11-21 15:17:19.000000000","message":"https://wiki.openstack.org/wiki/GitCommitMessages#Including_external_references\n\nThis might help with the format of \u0027WIP for bug #1250617\u0027","commit_id":"2b79205dc5b25d5e6c084670e1ba46e005382424"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"680eaf9633d228ef65affe276cc385de5e622abb","unresolved":false,"context_lines":[{"line_number":13,"context_line":"set to null (default value), trusts can be used indefinitely to"},{"line_number":14,"context_line":"authenticate."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Fix for bug #1250617"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I2c80b6d548a6715da0366c6f64ee58fbce514adb"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"AAAATn%2F9%2BEQ%3D","line":16,"updated":"2013-12-04 17:10:49.000000000","message":"Use \u0027Closes-Bug:\u0027 format","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"55a22aa0fd41fbe8c14f44968405e8d1d71e20d8","unresolved":false,"context_lines":[{"line_number":12,"context_line":"reaches 0 and no token can be issued through this trust anymore. If"},{"line_number":13,"context_line":"set to null (default value), trusts can be used indefinitely to"},{"line_number":14,"context_line":"authenticate."},{"line_number":15,"context_line":"DocImpact"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1250617"},{"line_number":18,"context_line":"Implements: bp trusts-chained-delegation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"AAAAU3%2F%2FcMI%3D","line":15,"updated":"2014-02-26 16:32:04.000000000","message":"Should this be moved down with the rest of the tags?","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"abb502cd40d4c46f7f9a02e735a0ccf2fa6d8431","unresolved":false,"context_lines":[{"line_number":12,"context_line":"reaches 0 and no token can be issued through this trust anymore. If"},{"line_number":13,"context_line":"set to null (default value), trusts can be used indefinitely to"},{"line_number":14,"context_line":"authenticate."},{"line_number":15,"context_line":"DocImpact"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1250617"},{"line_number":18,"context_line":"Implements: bp trusts-chained-delegation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"AAAAU3%2F%2Fb8k%3D","line":15,"in_reply_to":"AAAAU3%2F%2FcMI%3D","updated":"2014-02-26 17:03:31.000000000","message":"++","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bfeb13ef58c1eade807924d870fd29eb0ceffc2","unresolved":false,"context_lines":[{"line_number":12,"context_line":"reaches 0 and no token can be issued through this trust anymore. If"},{"line_number":13,"context_line":"set to null (default value), trusts can be used indefinitely to"},{"line_number":14,"context_line":"authenticate."},{"line_number":15,"context_line":"DocImpact"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Closes-Bug: #1250617"},{"line_number":18,"context_line":"Implements: bp trusts-chained-delegation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"AAAAU3%2F%2FZs4%3D","line":15,"in_reply_to":"AAAAU3%2F%2FcMI%3D","updated":"2014-02-26 20:52:11.000000000","message":"Done","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Limited use trusts"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Trusts now have a \"remaining_uses\" field that track how many times"},{"line_number":10,"context_line":"a trust can still issue a token. It is decremented by 1 each time a"},{"line_number":11,"context_line":"trust related authentication occurs (call to /auth/tokens), until it"},{"line_number":12,"context_line":"reaches 0 and no token can be issued through this trust anymore. If"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"AAAAVX%2F%2F%2B%2BA%3D","line":9,"updated":"2014-02-27 01:37:43.000000000","message":"change \"track\" to \"tracks\"","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"}],"keystone/auth/controllers.py":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b80c75e30adc45ce814981d6d0a31d09060d67c4","unresolved":false,"context_lines":[{"line_number":294,"context_line":""},{"line_number":295,"context_line":"            if trust:"},{"line_number":296,"context_line":"                if not self.trust_api.has_remaining_uses(trust.get(\u0027id\u0027)):"},{"line_number":297,"context_line":"                    raise exception.Unauthorized(\"Trust use expired\")"},{"line_number":298,"context_line":"                else:"},{"line_number":299,"context_line":"                    self.trust_api.consume_use(trust.get(\u0027id\u0027))"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F98H8%3D","line":297,"updated":"2013-12-04 09:11:26.000000000","message":"The message here should be a translatable string","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"8830257b4a25607b6c9ea7e300e78db3ea784b1d","unresolved":false,"context_lines":[{"line_number":294,"context_line":""},{"line_number":295,"context_line":"            if trust:"},{"line_number":296,"context_line":"                if not self.trust_api.has_remaining_uses(trust.get(\u0027id\u0027)):"},{"line_number":297,"context_line":"                    raise exception.Unauthorized(\"Trust use expired\")"},{"line_number":298,"context_line":"                else:"},{"line_number":299,"context_line":"                    self.trust_api.consume_use(trust.get(\u0027id\u0027))"},{"line_number":300,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F9vxc%3D","line":297,"in_reply_to":"AAAATn%2F98H8%3D","updated":"2013-12-06 13:55:48.000000000","message":"Am I supposed to add the translatable string to a .po/.mo file? If so, is there a howto on openstack I can refer to?","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"71050df53f6e52b2e37efcc2aad4dab20f428545","unresolved":false,"context_lines":[{"line_number":296,"context_line":""},{"line_number":297,"context_line":"            if trust:"},{"line_number":298,"context_line":"                if not self.trust_api.has_remaining_uses(trust.get(\u0027id\u0027)):"},{"line_number":299,"context_line":"                    raise exception.Unauthorized(_(\"Trust use expired\"))"},{"line_number":300,"context_line":"                else:"},{"line_number":301,"context_line":"                    self.trust_api.consume_use(trust.get(\u0027id\u0027))"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F87L4%3D","line":299,"updated":"2013-12-18 18:18:35.000000000","message":"if a trust no longer has uses, should it be deleted?","commit_id":"31d3459994f13cc80aeb2f6784554e4d339e6f4e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0b8fe4b7ffe30805bf604296f32676fdabfa3867","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"            if trust:"},{"line_number":313,"context_line":"                if not self.trust_api.has_remaining_uses(trust.get(\u0027id\u0027)):"},{"line_number":314,"context_line":"                    raise exception.Unauthorized(_(\"Trust use expired\"))"},{"line_number":315,"context_line":"                else:"},{"line_number":316,"context_line":"                    self.trust_api.consume_use(trust.get(\u0027id\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2FKGw%3D","line":313,"updated":"2014-01-16 21:27:47.000000000","message":"I think trust_api will need to be added as a dependency here, might be part of the reason why the tests are failing.","commit_id":"a88359a10c047833f8186a42153cda2489d25d1e"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"2e02cf6a6d9b99b78f51822207a1bea36a34c584","unresolved":false,"context_lines":[{"line_number":310,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"            if trust:"},{"line_number":313,"context_line":"                if not self.trust_api.has_remaining_uses(trust.get(\u0027id\u0027)):"},{"line_number":314,"context_line":"                    raise exception.Unauthorized(_(\"Trust use expired\"))"},{"line_number":315,"context_line":"                else:"},{"line_number":316,"context_line":"                    self.trust_api.consume_use(trust.get(\u0027id\u0027))"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2Bwy0%3D","line":313,"in_reply_to":"AAAAUH%2F%2FKGw%3D","updated":"2014-01-22 11:58:46.000000000","message":"Done","commit_id":"a88359a10c047833f8186a42153cda2489d25d1e"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4a3a98aa9903030c34ea1445f62707bc5c02679d","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"            if trust:"},{"line_number":315,"context_line":"                if not self.trust_api.has_remaining_uses(trust.get(\u0027id\u0027)):"},{"line_number":316,"context_line":"                    raise exception.Unauthorized(_(\"Trust use expired\"))"},{"line_number":317,"context_line":"                else:"},{"line_number":318,"context_line":"                    self.trust_api.consume_use(trust.get(\u0027id\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BD3s%3D","line":315,"updated":"2014-01-30 15:46:22.000000000","message":"Since consume_one throws an exception if it\u0027s no longer able to consume then this could be rewritten as a try-except to save an extra select query.  I think that also mean the has_remaining_uses would only be used in tests.","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            (domain_id, project_id, trust) \u003d auth_info.get_scope()"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"            if trust:"},{"line_number":322,"context_line":"                if not self.trust_api.has_remaining_uses(trust.get(\u0027id\u0027)):"},{"line_number":323,"context_line":"                    raise exception.Unauthorized(_(\"Trust use expired\"))"},{"line_number":324,"context_line":"                else:"},{"line_number":325,"context_line":"                    self.trust_api.consume_use(trust.get(\u0027id\u0027))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B29U%3D","line":322,"updated":"2014-02-18 15:57:14.000000000","message":"why would a trust not have an ID attribute? if there\u0027s no reason for this to be defensive, use trust[\u0027id\u0027] instead","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":322,"context_line":"                if not self.trust_api.has_remaining_uses(trust.get(\u0027id\u0027)):"},{"line_number":323,"context_line":"                    raise exception.Unauthorized(_(\"Trust use expired\"))"},{"line_number":324,"context_line":"                else:"},{"line_number":325,"context_line":"                    self.trust_api.consume_use(trust.get(\u0027id\u0027))"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"            method_names \u003d auth_info.get_method_names()"},{"line_number":328,"context_line":"            method_names +\u003d auth_context.get(\u0027method_names\u0027, [])"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B29M%3D","line":325,"updated":"2014-02-18 15:57:14.000000000","message":"why doesn\u0027t consume_use() check for remaining uses by itself, and raise Unauthorized if there are no remaining uses?","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"}],"keystone/common/sql/core.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":42,"context_line":"Column \u003d sql.Column"},{"line_number":43,"context_line":"Index \u003d sql.Index"},{"line_number":44,"context_line":"String \u003d sql.String"},{"line_number":45,"context_line":"Integer \u003d sql.Integer"},{"line_number":46,"context_line":"Enum \u003d sql.Enum"},{"line_number":47,"context_line":"ForeignKey \u003d sql.ForeignKey"},{"line_number":48,"context_line":"Integer \u003d sql.Integer"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F56c%3D","line":45,"updated":"2014-03-03 16:06:59.000000000","message":"this is already here","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"Integer \u003d sql.Integer"},{"line_number":46,"context_line":"Enum \u003d sql.Enum"},{"line_number":47,"context_line":"ForeignKey \u003d sql.ForeignKey"},{"line_number":48,"context_line":"Integer \u003d sql.Integer"},{"line_number":49,"context_line":"DateTime \u003d sql.DateTime"},{"line_number":50,"context_line":"IntegrityError \u003d sql.exc.IntegrityError"},{"line_number":51,"context_line":"DBDuplicateEntry \u003d db_exception.DBDuplicateEntry"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F56U%3D","line":48,"updated":"2014-03-03 16:06:59.000000000","message":"undo","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"}],"keystone/common/sql/migrate_repo/versions/037_add_remaining_uses_count_to_trusts.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0b8fe4b7ffe30805bf604296f32676fdabfa3867","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2FKN0%3D","line":3,"updated":"2014-01-16 21:27:47.000000000","message":"(NIT): This will need to be updated to 2014","commit_id":"a88359a10c047833f8186a42153cda2489d25d1e"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0b8fe4b7ffe30805bf604296f32676fdabfa3867","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        table.create_column(column)"},{"line_number":34,"context_line":"    except exc.OperationalError as e:"},{"line_number":35,"context_line":"        if (e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name)"},{"line_number":36,"context_line":"                and migrate_engine.name \u003d\u003d \"sqlite\"):"},{"line_number":37,"context_line":"                    #sqlite does not drop columns, so  if we have already"},{"line_number":38,"context_line":"                    #done a downgrade and are now upgrading,  we will hit"},{"line_number":39,"context_line":"                    #this: the SQLite driver previously reported success"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2FKNs%3D","line":36,"updated":"2014-01-16 21:27:47.000000000","message":"(NIT): suggest using the format specified in the HACKING guide for Keystone for a note: \n\nhttps://github.com/openstack/keystone/blob/master/HACKING.rst#todo-vs-fixme","commit_id":"a88359a10c047833f8186a42153cda2489d25d1e"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"2e02cf6a6d9b99b78f51822207a1bea36a34c584","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        table.create_column(column)"},{"line_number":34,"context_line":"    except exc.OperationalError as e:"},{"line_number":35,"context_line":"        if (e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name)"},{"line_number":36,"context_line":"                and migrate_engine.name \u003d\u003d \"sqlite\"):"},{"line_number":37,"context_line":"                    #sqlite does not drop columns, so  if we have already"},{"line_number":38,"context_line":"                    #done a downgrade and are now upgrading,  we will hit"},{"line_number":39,"context_line":"                    #this: the SQLite driver previously reported success"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2BxBg%3D","line":36,"in_reply_to":"AAAAUH%2F%2FKNs%3D","updated":"2014-01-22 11:58:46.000000000","message":"I\u0027ll remove these comments entirely, they come from one of the existing migration scripts I used as a template for mine.","commit_id":"a88359a10c047833f8186a42153cda2489d25d1e"}],"keystone/common/sql/migrate_repo/versions/038_add_remaining_uses_count_to_trusts.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def downgrade_trust_table_with_column_drop(meta, migrate_engine):"},{"line_number":22,"context_line":"    trust_table \u003d sqlalchemy.Table(\u0027trust\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    #delete trusts with a limited use count"},{"line_number":24,"context_line":"    trust_table.delete(trust_table.c.remaining_uses \u003e 0)"},{"line_number":25,"context_line":"    trust_table.drop_column("},{"line_number":26,"context_line":"        sqlalchemy.Column(\u0027remaining_uses\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B28Y%3D","line":23,"updated":"2014-02-18 15:57:14.000000000","message":"smart!","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def create_column_forgiving(migrate_engine, table, column):"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        table.create_column(column)"},{"line_number":34,"context_line":"    except exc.OperationalError as e:"},{"line_number":35,"context_line":"        if (e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name)"},{"line_number":36,"context_line":"                and migrate_engine.name \u003d\u003d \"sqlite\"):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B28I%3D","line":33,"updated":"2014-02-18 15:57:14.000000000","message":"i believe you can just do:\n\n  table.create_column(column, checkfirst\u003dTrue)\n\nand drop this entire method?\n\nbesides that, i\u0027m not really clear as to why there would be a risk of duplicate columns? if that\u0027s a legitimate concern, it needs an inline comment explaining the scenario","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"5b95d643de294d766a88d39e675e6b83bc093063","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def create_column_forgiving(migrate_engine, table, column):"},{"line_number":32,"context_line":"    try:"},{"line_number":33,"context_line":"        table.create_column(column)"},{"line_number":34,"context_line":"    except exc.OperationalError as e:"},{"line_number":35,"context_line":"        if (e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name)"},{"line_number":36,"context_line":"                and migrate_engine.name \u003d\u003d \"sqlite\"):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAU3%2F%2Fu78%3D","line":33,"in_reply_to":"AAAAUX%2F%2B28I%3D","updated":"2014-02-25 02:08:09.000000000","message":"I\u0027ve tried your suggestion but it makes test_two_steps_forward_one_step_back (in test_sql_upgrade.py ) fail : \n\"OperationalError: (OperationalError) duplicate column name: remaining_uses \u0027\\nALTER TABLE trust ADD remaining_uses INTEGER\u0027 ()\"\n\nSo I am keeping create_column_forgiving. Should I add a comment about this ?","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"}],"keystone/common/sql/migrate_repo/versions/041_add_remaining_uses_count_to_trusts.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"55a22aa0fd41fbe8c14f44968405e8d1d71e20d8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FcLo%3D","line":1,"updated":"2014-02-26 16:32:04.000000000","message":"I don\u0027t think we add the vim modelines in new files anymore.","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bfeb13ef58c1eade807924d870fd29eb0ceffc2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FZyc%3D","line":1,"in_reply_to":"AAAAU3%2F%2FcLo%3D","updated":"2014-02-26 20:52:11.000000000","message":"Done","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"55a22aa0fd41fbe8c14f44968405e8d1d71e20d8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FcL0%3D","line":3,"updated":"2014-02-26 16:32:04.000000000","message":"Remove the copyright.","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bfeb13ef58c1eade807924d870fd29eb0ceffc2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":6,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FZyg%3D","line":3,"in_reply_to":"AAAAU3%2F%2FcL0%3D","updated":"2014-02-26 20:52:11.000000000","message":"Done","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"55a22aa0fd41fbe8c14f44968405e8d1d71e20d8","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def downgrade_trust_table_with_column_drop(meta, migrate_engine):"},{"line_number":22,"context_line":"    trust_table \u003d sqlalchemy.Table(\u0027trust\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    #delete trusts with a limited use count"},{"line_number":24,"context_line":"    trust_table.delete(trust_table.c.remaining_uses \u003e 0)"},{"line_number":25,"context_line":"    trust_table.drop_column("},{"line_number":26,"context_line":"        sqlalchemy.Column(\u0027remaining_uses\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FcLc%3D","line":23,"updated":"2014-02-26 16:32:04.000000000","message":"Space after # and it would be nice to say why and not just what. Something like: \"# Delete trusts that have remaining uses because we are downgrading and will not track uses anymore.\"\n\nDo we also need to delete the ones with 0 remaining uses? Won\u0027t they become usable after this?","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bfeb13ef58c1eade807924d870fd29eb0ceffc2","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def downgrade_trust_table_with_column_drop(meta, migrate_engine):"},{"line_number":22,"context_line":"    trust_table \u003d sqlalchemy.Table(\u0027trust\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    #delete trusts with a limited use count"},{"line_number":24,"context_line":"    trust_table.delete(trust_table.c.remaining_uses \u003e 0)"},{"line_number":25,"context_line":"    trust_table.drop_column("},{"line_number":26,"context_line":"        sqlalchemy.Column(\u0027remaining_uses\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FZys%3D","line":23,"in_reply_to":"AAAAU3%2F%2FcLc%3D","updated":"2014-02-26 20:52:11.000000000","message":"Done","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"abb502cd40d4c46f7f9a02e735a0ccf2fa6d8431","unresolved":false,"context_lines":[{"line_number":21,"context_line":"def downgrade_trust_table_with_column_drop(meta, migrate_engine):"},{"line_number":22,"context_line":"    trust_table \u003d sqlalchemy.Table(\u0027trust\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    #delete trusts with a limited use count"},{"line_number":24,"context_line":"    trust_table.delete(trust_table.c.remaining_uses \u003e 0)"},{"line_number":25,"context_line":"    trust_table.drop_column("},{"line_number":26,"context_line":"        sqlalchemy.Column(\u0027remaining_uses\u0027,"},{"line_number":27,"context_line":"                          sqlalchemy.Integer(),"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FbwQ%3D","line":24,"updated":"2014-02-26 17:03:31.000000000","message":"should be \u003e\u003d0","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bfeb13ef58c1eade807924d870fd29eb0ceffc2","unresolved":false,"context_lines":[{"line_number":21,"context_line":"def downgrade_trust_table_with_column_drop(meta, migrate_engine):"},{"line_number":22,"context_line":"    trust_table \u003d sqlalchemy.Table(\u0027trust\u0027, meta, autoload\u003dTrue)"},{"line_number":23,"context_line":"    #delete trusts with a limited use count"},{"line_number":24,"context_line":"    trust_table.delete(trust_table.c.remaining_uses \u003e 0)"},{"line_number":25,"context_line":"    trust_table.drop_column("},{"line_number":26,"context_line":"        sqlalchemy.Column(\u0027remaining_uses\u0027,"},{"line_number":27,"context_line":"                          sqlalchemy.Integer(),"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FZyk%3D","line":24,"in_reply_to":"AAAAU3%2F%2FbwQ%3D","updated":"2014-02-26 20:52:11.000000000","message":"Done","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        table.create_column(column)"},{"line_number":31,"context_line":"    except exc.OperationalError as e:"},{"line_number":32,"context_line":"        if (e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name)"},{"line_number":33,"context_line":"                and migrate_engine.name \u003d\u003d \"sqlite\"):"},{"line_number":34,"context_line":"                    pass"},{"line_number":35,"context_line":"        else:"},{"line_number":36,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B3k%3D","line":33,"updated":"2014-02-27 01:37:43.000000000","message":"why do we have to do this? Add a comment.","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e50e986a5198032872dbf4c1155ceb8036ab809c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright (c) 2014 Matthieu Huin \u003cmhu@enovance.com\u003e"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F5fk%3D","line":1,"updated":"2014-02-27 15:04:03.000000000","message":"This should be removed.","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"7a6e5530beb1206ec97972c5987d86bd719b0077","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2014 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright (c) 2014 Matthieu Huin \u003cmhu@enovance.com\u003e"},{"line_number":4,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F44I%3D","line":1,"in_reply_to":"AAAAVX%2F%2F5fk%3D","updated":"2014-02-27 15:42:42.000000000","message":"Done","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e50e986a5198032872dbf4c1155ceb8036ab809c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    try:"},{"line_number":34,"context_line":"        table.create_column(column)"},{"line_number":35,"context_line":"    except exc.OperationalError as e:"},{"line_number":36,"context_line":"        # if the column is already here, no need to create it"},{"line_number":37,"context_line":"        if (e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name)"},{"line_number":38,"context_line":"                and migrate_engine.name \u003d\u003d \"sqlite\"):"},{"line_number":39,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F5VY%3D","line":36,"updated":"2014-02-27 15:04:03.000000000","message":"Why would this only be a problem in SQLite?","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"7a6e5530beb1206ec97972c5987d86bd719b0077","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    try:"},{"line_number":34,"context_line":"        table.create_column(column)"},{"line_number":35,"context_line":"    except exc.OperationalError as e:"},{"line_number":36,"context_line":"        # if the column is already here, no need to create it"},{"line_number":37,"context_line":"        if (e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name)"},{"line_number":38,"context_line":"                and migrate_engine.name \u003d\u003d \"sqlite\"):"},{"line_number":39,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F44k%3D","line":36,"in_reply_to":"AAAAVX%2F%2F5VY%3D","updated":"2014-02-27 15:42:42.000000000","message":"Done","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa427162fa765703fffb67d7a95574fb7417aa88","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    try:"},{"line_number":32,"context_line":"        table.create_column(column)"},{"line_number":33,"context_line":"    except exc.OperationalError as e:"},{"line_number":34,"context_line":"        # if the column is already here, no need to create it"},{"line_number":35,"context_line":"        if e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name):"},{"line_number":36,"context_line":"            pass"},{"line_number":37,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVX%2F%2Ftz0%3D","line":34,"updated":"2014-03-03 01:17:08.000000000","message":"why would the column be there already?","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"196ea19e3217de5995779aeda1bedb0ad901128f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    try:"},{"line_number":32,"context_line":"        table.create_column(column)"},{"line_number":33,"context_line":"    except exc.OperationalError as e:"},{"line_number":34,"context_line":"        # if the column is already here, no need to create it"},{"line_number":35,"context_line":"        if e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name):"},{"line_number":36,"context_line":"            pass"},{"line_number":37,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F5F0%3D","line":34,"in_reply_to":"AAAAVX%2F%2Ftz0%3D","updated":"2014-03-03 17:24:16.000000000","message":"good call on test_sql_upgrade, it revealed that the upgrade/downgrade script was flawed. I\u0027ll fix this in the next patch.","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        table.create_column(column)"},{"line_number":33,"context_line":"    except exc.OperationalError as e:"},{"line_number":34,"context_line":"        # if the column is already here, no need to create it"},{"line_number":35,"context_line":"        if e.args[0].endswith(\u0027duplicate column name: %s\u0027 % column.name):"},{"line_number":36,"context_line":"            pass"},{"line_number":37,"context_line":"        else:"},{"line_number":38,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F55E%3D","line":35,"updated":"2014-03-03 16:06:59.000000000","message":"this is a really fragile way to check for the existence of a column... it would probably be more reliable to look before you leap instead","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"}],"keystone/common/utils.py":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"2777450f9e92131f5ac4fccd822e4775e3b9a6d7","unresolved":false,"context_lines":[{"line_number":416,"context_line":"    return group_info.gr_gid, group_info.gr_name"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"def trust_is_limited_in_uses(remaining_use_counter):"},{"line_number":420,"context_line":"    \u0027\u0027\u0027Verify that a trust is limited in uses, from its backend-specific"},{"line_number":421,"context_line":"    remaining_use_counter parameter."},{"line_number":422,"context_line":"    \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BIFk%3D","line":419,"updated":"2013-12-02 10:03:53.000000000","message":"Can you explain the rationale behind putting these in common.utils, as they are only used in the trusts backends?  \n\nSeems like it might be better to have them defined under keystone/trust somewhere? (e.g maybe both trust backend drivers could inherit from a common base class defining common utility functions like these?)","commit_id":"32c6efa599dca128eea53d56eb89f90ad5326770"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"d1377cd4da5d1eb6be4d709cad60458dc6fc6245","unresolved":false,"context_lines":[{"line_number":416,"context_line":"    return group_info.gr_gid, group_info.gr_name"},{"line_number":417,"context_line":""},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"def trust_is_limited_in_uses(remaining_use_counter):"},{"line_number":420,"context_line":"    \u0027\u0027\u0027Verify that a trust is limited in uses, from its backend-specific"},{"line_number":421,"context_line":"    remaining_use_counter parameter."},{"line_number":422,"context_line":"    \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BH74%3D","line":419,"in_reply_to":"AAAATn%2F%2BIFk%3D","updated":"2013-12-02 10:47:54.000000000","message":"I wasn\u0027t really sure where to put these functions actually, so I am willing to move these to some place where it makes more sense.","commit_id":"32c6efa599dca128eea53d56eb89f90ad5326770"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"3d01615fc12f3c682b36f56b10ce1a005728399a","unresolved":false,"context_lines":[{"line_number":427,"context_line":"    \u0027\u0027\u0027Assuming a trust is limited in uses, verify that there are some"},{"line_number":428,"context_line":"    uses left."},{"line_number":429,"context_line":"    \u0027\u0027\u0027"},{"line_number":430,"context_line":"    if remaining_use_counter \u003e 0:"},{"line_number":431,"context_line":"        return True"},{"line_number":432,"context_line":"    else:"},{"line_number":433,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BIxM%3D","line":430,"updated":"2013-12-02 05:43:43.000000000","message":"can just write this as:\nreturn remaining_use_counter \u003e 0","commit_id":"32c6efa599dca128eea53d56eb89f90ad5326770"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"cfa8b7130453af0bb83c5869ed90052250fa1dfd","unresolved":false,"context_lines":[{"line_number":421,"context_line":"    remaining_use_counter parameter."},{"line_number":422,"context_line":"    \u0027\u0027\u0027"},{"line_number":423,"context_line":"    return remaining_use_counter is not None"},{"line_number":424,"context_line":""},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"def trust_has_uses_left(remaining_use_counter):"},{"line_number":427,"context_line":"    \u0027\u0027\u0027Assuming a trust is limited in uses, verify that there are some"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F933k%3D","line":424,"updated":"2013-12-05 00:13:27.000000000","message":"what if null/empty it should be treated as no trust","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b80c75e30adc45ce814981d6d0a31d09060d67c4","unresolved":false,"context_lines":[{"line_number":427,"context_line":"    \u0027\u0027\u0027Assuming a trust is limited in uses, verify that there are some"},{"line_number":428,"context_line":"    uses left."},{"line_number":429,"context_line":"    \u0027\u0027\u0027"},{"line_number":430,"context_line":"    return remaining_use_counter \u003e 0"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":""},{"line_number":433,"context_line":"def set_permissions(path, mode\u003dNone, user\u003dNone, group\u003dNone, log\u003dNone):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F98Ew%3D","line":430,"updated":"2013-12-04 09:11:26.000000000","message":"Personally, considering these aren\u0027t really common (only used in the trust backends), and that each function only wraps a trivial conditional, I\u0027d be tempted to just put the conditional statements into each backend and remove these functions - IMHO they\u0027re not really needed.\n\ne.g what is more readable:\n\n  if utils.trust_is_limited_in_uses(ref.remaining_uses):  \n    if utils.trust_has_uses_left(ref.remaining_uses):\n       ...\n\nvs\n  if ref.remaining_uses \u003e 0:\n     ...","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"}],"keystone/exception.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"85ec707547ccfbd7833804241702d4c60a364a01","unresolved":false,"context_lines":[{"line_number":243,"context_line":""},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"class InvalidTrustRemainingUsesValue(ValidationError):"},{"line_number":246,"context_line":"    message_format \u003d _(\"remaining_uses must be a positive integer or null.\")"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"class CredentialNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUX%2F%2FoUM%3D","line":246,"updated":"2014-02-11 21:40:47.000000000","message":"(nit): s/remaining_uses/Remaining uses/","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3ff0930d6dcdf01e1e11e76339fc1c1c1eb67894","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"class TrustUseLimitReached(Forbidden):"},{"line_number":240,"context_line":"    message_format \u003d _(\"Trust use limit reached.\")"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"class InvalidTrustRemainingUsesValue(ValidationError):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FWsk%3D","line":240,"updated":"2014-02-13 20:23:22.000000000","message":"(NIT): add trust_id here if available to print with the message. Might also be helpful to print something more relating to remaining uses. \n\n    \"No remaining uses for trust %(trust_id)s.\"\n\nSo the user gets the idea if they want to continue using their workflow they have to modify their remaining uses or increase them with a new trust. The existing message *could* (probably not likely) be confused with quotas... thoughts?","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"class TrustUseLimitReached(Forbidden):"},{"line_number":240,"context_line":"    message_format \u003d _(\"Trust use limit reached.\")"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"class InvalidTrustRemainingUsesValue(ValidationError):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B26U%3D","line":240,"in_reply_to":"AAAAUX%2F%2FWsk%3D","updated":"2014-02-18 15:57:14.000000000","message":"++","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"291a109ea993ece72fcdf02049d45c47a927d9d3","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"class TrustUseLimitReached(Forbidden):"},{"line_number":240,"context_line":"    message_format \u003d _(\"Trust use limit reached.\")"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"class InvalidTrustRemainingUsesValue(ValidationError):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2BzQs%3D","line":240,"in_reply_to":"AAAAUX%2F%2FWsk%3D","updated":"2014-02-19 00:44:31.000000000","message":"++","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":241,"context_line":""},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"class InvalidTrustRemainingUsesValue(ValidationError):"},{"line_number":244,"context_line":"    message_format \u003d _(\"Remaining uses must be a positive integer or null.\")"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"class CredentialNotFound(NotFound):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B25o%3D","line":244,"updated":"2014-02-18 15:57:14.000000000","message":"it\u0027s not necessary to have a specific exception type for this, as i don\u0027t imagine you\u0027d handle it any differently from any other ValidationError\n\nso wherever you\u0027re using this, just:\n\n  raise ValidationError(_(\u0027remaining_uses must be a positive integer or null.\u0027))","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"}],"keystone/tests/test_backend.py":[{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"a21dee0b1135894ba745a66cb71df67d6462d8a1","unresolved":false,"context_lines":[{"line_number":3423,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3424,"context_line":"        self.assertTrue(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3425,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 0)"},{"line_number":3426,"context_line":"        self.assertFalse(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3427,"context_line":""},{"line_number":3428,"context_line":"    def test_consume_use(self):"},{"line_number":3429,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 2)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2BvDE%3D","line":3426,"updated":"2014-01-22 17:33:21.000000000","message":"It would be good to have test for \"InvalidTrustRemainingUsesValue\" by setting trust with -1","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9431c85e8a7b0411a8b2408ae8c96e1d65121ae3","unresolved":false,"context_lines":[{"line_number":3423,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3424,"context_line":"        self.assertTrue(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3425,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 0)"},{"line_number":3426,"context_line":"        self.assertFalse(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3427,"context_line":""},{"line_number":3428,"context_line":"    def test_consume_use(self):"},{"line_number":3429,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 2)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Bops%3D","line":3426,"in_reply_to":"AAAAUH%2F%2BvDE%3D","updated":"2014-01-23 17:47:21.000000000","message":"@arvind there is a test with remaining_uses \u003d -10. \nhttps://review.openstack.org/#/c/56243/15/keystone/tests/test_v3_auth.py line 2061","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"baafb06488ef09d6a81520910cbf952262b70108","unresolved":false,"context_lines":[{"line_number":3423,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3424,"context_line":"        self.assertTrue(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3425,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 0)"},{"line_number":3426,"context_line":"        self.assertFalse(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3427,"context_line":""},{"line_number":3428,"context_line":"    def test_consume_use(self):"},{"line_number":3429,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 2)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Bo0g%3D","line":3426,"in_reply_to":"AAAAUH%2F%2BvDE%3D","updated":"2014-01-23 17:33:17.000000000","message":"This check is actually done in the controller, not the backends. Should I add it there as well ?","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4a3a98aa9903030c34ea1445f62707bc5c02679d","unresolved":false,"context_lines":[{"line_number":3429,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 0)"},{"line_number":3430,"context_line":"        self.assertFalse(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3431,"context_line":""},{"line_number":3432,"context_line":"    def test_consume_use(self):"},{"line_number":3433,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 2)"},{"line_number":3434,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3435,"context_line":"        self.assertTrue(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BD4w%3D","line":3432,"updated":"2014-01-30 15:46:22.000000000","message":"It would be nice to add a test method that forces the remaining_uses to -1 to simulate double decrementing.  That way we can be sure it\u0027s handled properly.","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3ff0930d6dcdf01e1e11e76339fc1c1c1eb67894","unresolved":false,"context_lines":[{"line_number":3353,"context_line":"                        \u0027project_id\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":3354,"context_line":"                        \u0027expires_at\u0027: timeutils."},{"line_number":3355,"context_line":"                        parse_isotime(\u00272031-02-18T18:10:00Z\u0027),"},{"line_number":3356,"context_line":"                        \u0027impersonation\u0027: True},"},{"line_number":3357,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":3358,"context_line":"                              {\"id\": \"other\"},"},{"line_number":3359,"context_line":"                              {\"id\": \"browser\"}]))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FWq0%3D","side":"PARENT","line":3356,"updated":"2014-02-13 20:23:22.000000000","message":"(NIT): why remove this space?","commit_id":"7b88340f9fcea39036a338c19b97bc6a3b945404"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"033957eb342a5ba67796955c0b3a03626cb0a6df","unresolved":false,"context_lines":[{"line_number":3353,"context_line":"                        \u0027project_id\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":3354,"context_line":"                        \u0027expires_at\u0027: timeutils."},{"line_number":3355,"context_line":"                        parse_isotime(\u00272031-02-18T18:10:00Z\u0027),"},{"line_number":3356,"context_line":"                        \u0027impersonation\u0027: True},"},{"line_number":3357,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":3358,"context_line":"                              {\"id\": \"other\"},"},{"line_number":3359,"context_line":"                              {\"id\": \"browser\"}]))"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FRhg%3D","side":"PARENT","line":3356,"in_reply_to":"AAAAUX%2F%2FWq0%3D","updated":"2014-02-14 10:10:15.000000000","message":"that was a typo, I\u0027ll set it back. :)","commit_id":"7b88340f9fcea39036a338c19b97bc6a3b945404"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3ff0930d6dcdf01e1e11e76339fc1c1c1eb67894","unresolved":false,"context_lines":[{"line_number":3422,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":3423,"context_line":"        self.assertEqual(len(trusts), 3)"},{"line_number":3424,"context_line":""},{"line_number":3425,"context_line":"    def test_trust_has_remaining_uses(self):"},{"line_number":3426,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 5)"},{"line_number":3427,"context_line":"        self.assertTrue(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3428,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FWl0%3D","line":3425,"updated":"2014-02-13 20:23:22.000000000","message":"could these be broken into positive and negative tests? \n\n    def test_trust_has_remaining_users_positive(self):\n        # create trust and check we have uses left\n        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 5)\n        self.assertTrue(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))\n        # create trust with unlimited uses and check we have uses left\n        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)\n        self.assertTrue(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))\n\n    def test_trust_has_remaining_users_negative(self):\n        # create trust with no remaining uses and check we have no uses left\n        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 0)\n        self.assertFalse(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"291a109ea993ece72fcdf02049d45c47a927d9d3","unresolved":false,"context_lines":[{"line_number":3422,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":3423,"context_line":"        self.assertEqual(len(trusts), 3)"},{"line_number":3424,"context_line":""},{"line_number":3425,"context_line":"    def test_trust_has_remaining_uses(self):"},{"line_number":3426,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 5)"},{"line_number":3427,"context_line":"        self.assertTrue(self.trust_api.has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3428,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2BzP4%3D","line":3425,"in_reply_to":"AAAAUX%2F%2FWl0%3D","updated":"2014-02-19 00:44:31.000000000","message":"Please split these out as ldbragst outlined.  Unless you are testing a create/use/consumed logic flow, testing specific functionality is better.","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c9fe8211488803a48e259a3b59dd7df0b477721a","unresolved":false,"context_lines":[{"line_number":3445,"context_line":"        self.assertEqual(None, self.trust_api.get_trust(trust_data[\u0027id\u0027]))"},{"line_number":3446,"context_line":"        self.assertRaises(exception.TrustNotFound,"},{"line_number":3447,"context_line":"                          self.trust_api.has_remaining_uses,"},{"line_number":3448,"context_line":"                          trust_data[\u0027id\u0027])"},{"line_number":3449,"context_line":""},{"line_number":3450,"context_line":"    def test_consume_use(self):"},{"line_number":3451,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 2)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FnhE%3D","line":3448,"updated":"2014-02-25 16:58:13.000000000","message":"++ nice, thanks for doing this","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e7f37bd5d8e933532393362142ef2a846a1249d3","unresolved":false,"context_lines":[{"line_number":3455,"context_line":"        trust \u003d self.trust_api.get_trust(trust_id)"},{"line_number":3456,"context_line":"        if trust:"},{"line_number":3457,"context_line":"            uses \u003d trust[\u0027remaining_uses\u0027]"},{"line_number":3458,"context_line":"            return (uses is None) or (uses \u003e 0)"},{"line_number":3459,"context_line":"        else:"},{"line_number":3460,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":3461,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Fh8I%3D","line":3458,"updated":"2014-02-26 04:18:37.000000000","message":"Nice!!!","commit_id":"b0db18e33be730d99abfe188ac6dd8f2435c644a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e7f37bd5d8e933532393362142ef2a846a1249d3","unresolved":false,"context_lines":[{"line_number":3460,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":3461,"context_line":""},{"line_number":3462,"context_line":"    def test_trust_has_remaining_uses_positive(self):"},{"line_number":3463,"context_line":"        # create trust with limited uses, check we have uses left"},{"line_number":3464,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 5)"},{"line_number":3465,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3466,"context_line":"        # create trust with unlimited uses, check we have uses left"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Fh7Q%3D","line":3463,"updated":"2014-02-26 04:18:37.000000000","message":"need a \"that\" between check and we","commit_id":"b0db18e33be730d99abfe188ac6dd8f2435c644a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e7f37bd5d8e933532393362142ef2a846a1249d3","unresolved":false,"context_lines":[{"line_number":3463,"context_line":"        # create trust with limited uses, check we have uses left"},{"line_number":3464,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 5)"},{"line_number":3465,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3466,"context_line":"        # create trust with unlimited uses, check we have uses left"},{"line_number":3467,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3468,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3469,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Fh7E%3D","line":3466,"updated":"2014-02-26 04:18:37.000000000","message":"need a \"that\" between check and we","commit_id":"b0db18e33be730d99abfe188ac6dd8f2435c644a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e7f37bd5d8e933532393362142ef2a846a1249d3","unresolved":false,"context_lines":[{"line_number":3468,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3469,"context_line":""},{"line_number":3470,"context_line":"    def test_trust_has_remaining_uses_negative(self):"},{"line_number":3471,"context_line":"        # try to create trust with no remaining uses, check it fails"},{"line_number":3472,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":3473,"context_line":"                          self.create_sample_trust,"},{"line_number":3474,"context_line":"                          uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Fh7s%3D","line":3471,"updated":"2014-02-26 04:18:37.000000000","message":"put an \"a\" between create and trust and also put a \"that\" between check and it","commit_id":"b0db18e33be730d99abfe188ac6dd8f2435c644a"},{"author":{"_account_id":6460,"name":"Brad Topol","email":"btopol@us.ibm.com","username":"btopol"},"change_message_id":"e7f37bd5d8e933532393362142ef2a846a1249d3","unresolved":false,"context_lines":[{"line_number":3473,"context_line":"                          self.create_sample_trust,"},{"line_number":3474,"context_line":"                          uuid.uuid4().hex,"},{"line_number":3475,"context_line":"                          0)"},{"line_number":3476,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":3477,"context_line":"                          self.create_sample_trust,"},{"line_number":3478,"context_line":"                          uuid.uuid4().hex,"},{"line_number":3479,"context_line":"                          -12)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2Fh64%3D","line":3476,"updated":"2014-02-26 04:18:37.000000000","message":"to be consistent with your excellence use of comments you could add \"try to create a trust with negative uses, check that it fails","commit_id":"b0db18e33be730d99abfe188ac6dd8f2435c644a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":3461,"context_line":""},{"line_number":3462,"context_line":"    def test_trust_has_remaining_uses_positive(self):"},{"line_number":3463,"context_line":"        # create a trust with limited uses, check that we have uses left"},{"line_number":3464,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 5)"},{"line_number":3465,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3466,"context_line":"        # create a trust with unlimited uses, check that we have uses left"},{"line_number":3467,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B2Q%3D","line":3464,"updated":"2014-02-27 01:37:43.000000000","message":"give a name to the magic number -- remaining_uses\u003d5","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":3472,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":3473,"context_line":"                          self.create_sample_trust,"},{"line_number":3474,"context_line":"                          uuid.uuid4().hex,"},{"line_number":3475,"context_line":"                          0)"},{"line_number":3476,"context_line":"        # try to create a trust with negative remaining uses,"},{"line_number":3477,"context_line":"        # check that it fails"},{"line_number":3478,"context_line":"        self.assertRaises(exception.ValidationError,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B14%3D","line":3475,"updated":"2014-02-27 01:37:43.000000000","message":"change 0 to \"remaining_uses\u003d0\"","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":3478,"context_line":"        self.assertRaises(exception.ValidationError,"},{"line_number":3479,"context_line":"                          self.create_sample_trust,"},{"line_number":3480,"context_line":"                          uuid.uuid4().hex,"},{"line_number":3481,"context_line":"                          -12)"},{"line_number":3482,"context_line":""},{"line_number":3483,"context_line":"    def test_consume_use(self):"},{"line_number":3484,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 2)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B10%3D","line":3481,"updated":"2014-02-27 01:37:43.000000000","message":"change -12 to \"remaining_uses\u003d-12\"","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":3481,"context_line":"                          -12)"},{"line_number":3482,"context_line":""},{"line_number":3483,"context_line":"    def test_consume_use(self):"},{"line_number":3484,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 2)"},{"line_number":3485,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3486,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3487,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B1w%3D","line":3484,"updated":"2014-02-27 01:37:43.000000000","message":"change 2 to \"remaining_uses\u003d2\" ... this applies throughout these changes.","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":3489,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3490,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex, 1)"},{"line_number":3491,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3492,"context_line":"        self.assertEqual(None, self.trust_api.get_trust(trust_data[\u0027id\u0027]))"},{"line_number":3493,"context_line":"        self.assertRaises(exception.TrustNotFound,"},{"line_number":3494,"context_line":"                          self._trust_has_remaining_uses,"},{"line_number":3495,"context_line":"                          trust_data[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B1k%3D","line":3492,"updated":"2014-02-27 01:37:43.000000000","message":"use assertIsNone","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e50e986a5198032872dbf4c1155ceb8036ab809c","unresolved":false,"context_lines":[{"line_number":3378,"context_line":"                        \u0027expires_at\u0027: timeutils."},{"line_number":3379,"context_line":"                        parse_isotime(\u00272031-02-18T18:10:00Z\u0027),"},{"line_number":3380,"context_line":"                        \u0027impersonation\u0027: True,"},{"line_number":3381,"context_line":"                        \u0027remaining_uses\u0027: remaining_uses},"},{"line_number":3382,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":3383,"context_line":"                              {\"id\": \"other\"},"},{"line_number":3384,"context_line":"                              {\"id\": \"browser\"}]))"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F5d0%3D","line":3381,"updated":"2014-02-27 15:04:03.000000000","message":"Do we also need a test where this key doesn\u0027t exist?","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"7a6e5530beb1206ec97972c5987d86bd719b0077","unresolved":false,"context_lines":[{"line_number":3378,"context_line":"                        \u0027expires_at\u0027: timeutils."},{"line_number":3379,"context_line":"                        parse_isotime(\u00272031-02-18T18:10:00Z\u0027),"},{"line_number":3380,"context_line":"                        \u0027impersonation\u0027: True,"},{"line_number":3381,"context_line":"                        \u0027remaining_uses\u0027: remaining_uses},"},{"line_number":3382,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":3383,"context_line":"                              {\"id\": \"other\"},"},{"line_number":3384,"context_line":"                              {\"id\": \"browser\"}]))"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F4rc%3D","line":3381,"in_reply_to":"AAAAVX%2F%2F5d0%3D","updated":"2014-02-27 15:42:42.000000000","message":"The default behavior as implemented in the Manager is to set this key to None (unlimited use trust) by default if it is not present\n\nOr would you like to see a test where the key doesn\u0027t exist, to make sure the created trust has unlimited uses ?","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1923ff7eadb5f27f329f605ceefc2b720630e0d2","unresolved":false,"context_lines":[{"line_number":3448,"context_line":""},{"line_number":3449,"context_line":"    def _trust_has_remaining_uses(self, trust_id):"},{"line_number":3450,"context_line":"        \"\"\"Test a trust for remaining uses."},{"line_number":3451,"context_line":""},{"line_number":3452,"context_line":"        :returns: True if the trust has available uses, False otherwise"},{"line_number":3453,"context_line":"        :raises: keystone.exception.TrustNotFound"},{"line_number":3454,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F484%3D","line":3451,"updated":"2014-03-03 16:13:32.000000000","message":"(NIT): add \u0027trust_id\u0027 to the docstrings here to be consistent","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1923ff7eadb5f27f329f605ceefc2b720630e0d2","unresolved":false,"context_lines":[{"line_number":3457,"context_line":"            uses \u003d trust[\u0027remaining_uses\u0027]"},{"line_number":3458,"context_line":"            return (uses is None) or (uses \u003e 0)"},{"line_number":3459,"context_line":"        else:"},{"line_number":3460,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":3461,"context_line":""},{"line_number":3462,"context_line":"    def test_trust_has_remaining_uses_positive(self):"},{"line_number":3463,"context_line":"        # create a trust with limited uses, check that we have uses left"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F48U%3D","line":3460,"updated":"2014-03-03 16:13:32.000000000","message":"Won\u0027t get_trust throw a TrustNotFound exception in the driver/backend? If so we could do: \n\n     trust \u003d self.trust_api.get_trust(trust_id)\n     uses \u003d trust[\u0027remaining_uses\u0027]\n     return (uses is None) or (uses \u003e 0)","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":3459,"context_line":"        else:"},{"line_number":3460,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":3461,"context_line":""},{"line_number":3462,"context_line":"    def test_trust_has_remaining_uses_positive(self):"},{"line_number":3463,"context_line":"        # create a trust with limited uses, check that we have uses left"},{"line_number":3464,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex,"},{"line_number":3465,"context_line":"                                              remaining_uses\u003d5)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F52s%3D","line":3462,"updated":"2014-03-03 16:06:59.000000000","message":"this is just testing your private test method...","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":3485,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex,"},{"line_number":3486,"context_line":"                                              remaining_uses\u003d2)"},{"line_number":3487,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3488,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3489,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3490,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3491,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F5ZM%3D","line":3488,"updated":"2014-03-03 16:06:59.000000000","message":"overall this test is great, but i\u0027d be stronger if it was explicitly checking for a specific value of remaining uses (delete the private method above)\n\n  trust \u003d self.trust_api.get_trust(trust_data[\u0027id\u0027])\n  self.assertEqual(1, trust[\u0027remaining_uses\u0027])","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"196ea19e3217de5995779aeda1bedb0ad901128f","unresolved":false,"context_lines":[{"line_number":3485,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex,"},{"line_number":3486,"context_line":"                                              remaining_uses\u003d2)"},{"line_number":3487,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3488,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3489,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3490,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3491,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F4f8%3D","line":3488,"in_reply_to":"AAAAVn%2F%2F5ZM%3D","updated":"2014-03-03 17:24:16.000000000","message":"Done","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":3486,"context_line":"                                              remaining_uses\u003d2)"},{"line_number":3487,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3488,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3489,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3490,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3491,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3492,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F5QE%3D","line":3489,"updated":"2014-03-03 16:06:59.000000000","message":"rather than creating more trusts, continue using the same one to test it\u0027s overall state change","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"196ea19e3217de5995779aeda1bedb0ad901128f","unresolved":false,"context_lines":[{"line_number":3486,"context_line":"                                              remaining_uses\u003d2)"},{"line_number":3487,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3488,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3489,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3490,"context_line":"        self.trust_api.consume_use(trust_data[\u0027id\u0027])"},{"line_number":3491,"context_line":"        self.assertTrue(self._trust_has_remaining_uses(trust_data[\u0027id\u0027]))"},{"line_number":3492,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F4gI%3D","line":3489,"in_reply_to":"AAAAVn%2F%2F5QE%3D","updated":"2014-03-03 17:24:16.000000000","message":"Done","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1aaaad7ecaf799d511e66eb4c9b4847fcaacee6f","unresolved":false,"context_lines":[{"line_number":3453,"context_line":"        self.assertEqual(5, trust_data[\u0027remaining_uses\u0027])"},{"line_number":3454,"context_line":"        # create a trust with unlimited uses, check that we have uses left"},{"line_number":3455,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3456,"context_line":"        self.assertEqual(None, trust_data[\u0027remaining_uses\u0027])"},{"line_number":3457,"context_line":""},{"line_number":3458,"context_line":"    def test_trust_has_remaining_uses_negative(self):"},{"line_number":3459,"context_line":"        # try to create a trust with no remaining uses, check that it fails"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0i0%3D","line":3456,"updated":"2014-03-03 23:24:15.000000000","message":"use assertIsNone for this.","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a9d6ff12c591b02b194de8e0bd8525485db35503","unresolved":false,"context_lines":[{"line_number":3453,"context_line":"        self.assertEqual(5, trust_data[\u0027remaining_uses\u0027])"},{"line_number":3454,"context_line":"        # create a trust with unlimited uses, check that we have uses left"},{"line_number":3455,"context_line":"        trust_data \u003d self.create_sample_trust(uuid.uuid4().hex)"},{"line_number":3456,"context_line":"        self.assertEqual(None, trust_data[\u0027remaining_uses\u0027])"},{"line_number":3457,"context_line":""},{"line_number":3458,"context_line":"    def test_trust_has_remaining_uses_negative(self):"},{"line_number":3459,"context_line":"        # try to create a trust with no remaining uses, check that it fails"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0XM%3D","line":3456,"in_reply_to":"AAAAVn%2F%2F0i0%3D","updated":"2014-03-04 00:01:46.000000000","message":"Done","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"}],"keystone/tests/test_sql_upgrade.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1aaaad7ecaf799d511e66eb4c9b4847fcaacee6f","unresolved":false,"context_lines":[{"line_number":2023,"context_line":"    def test_limited_trusts_upgrade(self):"},{"line_number":2024,"context_line":"        # make sure that the remaining_uses column is created"},{"line_number":2025,"context_line":"        self.upgrade(41)"},{"line_number":2026,"context_line":"        self.assertTableColumns(\"trust\","},{"line_number":2027,"context_line":"                                [\"id\", \"trustor_user_id\","},{"line_number":2028,"context_line":"                                 \"trustee_user_id\","},{"line_number":2029,"context_line":"                                 \"project_id\", \"impersonation\","}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0h8%3D","line":2026,"updated":"2014-03-03 23:24:15.000000000","message":"use \u0027 for strings.","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1aaaad7ecaf799d511e66eb4c9b4847fcaacee6f","unresolved":false,"context_lines":[{"line_number":2075,"context_line":"        self.insert_dict(session, \"trust\", consumed_trust)"},{"line_number":2076,"context_line":"        self.insert_dict(session, \"trust\", unlimited_trust)"},{"line_number":2077,"context_line":"        # we should have 3 trusts in base"},{"line_number":2078,"context_line":"        r \u003d session.execute(\u0027select count(*) as c from trust\u0027)"},{"line_number":2079,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 3)"},{"line_number":2080,"context_line":"        self.downgrade(40)"},{"line_number":2081,"context_line":"        # Now only one trust remains ..."}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0g0%3D","line":2078,"updated":"2014-03-03 23:24:15.000000000","message":"don\u0027t hard-code SQL since it might not work on every database -- use sqlalchemy code for building the query.","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a9d6ff12c591b02b194de8e0bd8525485db35503","unresolved":false,"context_lines":[{"line_number":2075,"context_line":"        self.insert_dict(session, \"trust\", consumed_trust)"},{"line_number":2076,"context_line":"        self.insert_dict(session, \"trust\", unlimited_trust)"},{"line_number":2077,"context_line":"        # we should have 3 trusts in base"},{"line_number":2078,"context_line":"        r \u003d session.execute(\u0027select count(*) as c from trust\u0027)"},{"line_number":2079,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 3)"},{"line_number":2080,"context_line":"        self.downgrade(40)"},{"line_number":2081,"context_line":"        # Now only one trust remains ..."}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0NY%3D","line":2078,"in_reply_to":"AAAAVn%2F%2F0g0%3D","updated":"2014-03-04 00:01:46.000000000","message":"Done","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"65658f72f61baf794ade62349342904bd6746b0a","unresolved":false,"context_lines":[{"line_number":2075,"context_line":"        self.insert_dict(session, \"trust\", consumed_trust)"},{"line_number":2076,"context_line":"        self.insert_dict(session, \"trust\", unlimited_trust)"},{"line_number":2077,"context_line":"        # we should have 3 trusts in base"},{"line_number":2078,"context_line":"        r \u003d session.execute(\u0027select count(*) as c from trust\u0027)"},{"line_number":2079,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 3)"},{"line_number":2080,"context_line":"        self.downgrade(40)"},{"line_number":2081,"context_line":"        # Now only one trust remains ..."}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2Fv3U%3D","line":2078,"in_reply_to":"AAAAVn%2F%2F0g0%3D","updated":"2014-03-04 10:25:24.000000000","message":"There are other hard-coded queries around that should be replaced as well; I filed a bug report just in case: https://bugs.launchpad.net/keystone/+bug/1287637","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1aaaad7ecaf799d511e66eb4c9b4847fcaacee6f","unresolved":false,"context_lines":[{"line_number":2079,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 3)"},{"line_number":2080,"context_line":"        self.downgrade(40)"},{"line_number":2081,"context_line":"        # Now only one trust remains ..."},{"line_number":2082,"context_line":"        r \u003d session.execute(\u0027select count(*) as c from trust\u0027)"},{"line_number":2083,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 1)"},{"line_number":2084,"context_line":"        # ... and this trust is the one that was not limited in uses"},{"line_number":2085,"context_line":"        r \u003d session.execute(\u0027select id from trust\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0gI%3D","line":2082,"updated":"2014-03-03 23:24:15.000000000","message":"don\u0027t hard-code SQL since it might not work on every database -- use sqlalchemy code for building the query.","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a9d6ff12c591b02b194de8e0bd8525485db35503","unresolved":false,"context_lines":[{"line_number":2079,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 3)"},{"line_number":2080,"context_line":"        self.downgrade(40)"},{"line_number":2081,"context_line":"        # Now only one trust remains ..."},{"line_number":2082,"context_line":"        r \u003d session.execute(\u0027select count(*) as c from trust\u0027)"},{"line_number":2083,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 1)"},{"line_number":2084,"context_line":"        # ... and this trust is the one that was not limited in uses"},{"line_number":2085,"context_line":"        r \u003d session.execute(\u0027select id from trust\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0NQ%3D","line":2082,"in_reply_to":"AAAAVn%2F%2F0gI%3D","updated":"2014-03-04 00:01:46.000000000","message":"Done","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1aaaad7ecaf799d511e66eb4c9b4847fcaacee6f","unresolved":false,"context_lines":[{"line_number":2082,"context_line":"        r \u003d session.execute(\u0027select count(*) as c from trust\u0027)"},{"line_number":2083,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 1)"},{"line_number":2084,"context_line":"        # ... and this trust is the one that was not limited in uses"},{"line_number":2085,"context_line":"        r \u003d session.execute(\u0027select id from trust\u0027)"},{"line_number":2086,"context_line":"        self.assertEqual(r.fetchone()[\u0027id\u0027], unlimited_trust[\u0027id\u0027])"},{"line_number":2087,"context_line":""},{"line_number":2088,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0gE%3D","line":2085,"updated":"2014-03-03 23:24:15.000000000","message":"don\u0027t hard-code SQL since it might not work on every database -- use sqlalchemy code for building the query.","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a9d6ff12c591b02b194de8e0bd8525485db35503","unresolved":false,"context_lines":[{"line_number":2082,"context_line":"        r \u003d session.execute(\u0027select count(*) as c from trust\u0027)"},{"line_number":2083,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 1)"},{"line_number":2084,"context_line":"        # ... and this trust is the one that was not limited in uses"},{"line_number":2085,"context_line":"        r \u003d session.execute(\u0027select id from trust\u0027)"},{"line_number":2086,"context_line":"        self.assertEqual(r.fetchone()[\u0027id\u0027], unlimited_trust[\u0027id\u0027])"},{"line_number":2087,"context_line":""},{"line_number":2088,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0NI%3D","line":2085,"in_reply_to":"AAAAVn%2F%2F0gE%3D","updated":"2014-03-04 00:01:46.000000000","message":"Done","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2ac9ed2798185fb1d7682d200fa055661b3e0422","unresolved":false,"context_lines":[{"line_number":2083,"context_line":"        self.assertEqual(r.fetchone()[\u0027c\u0027], 1)"},{"line_number":2084,"context_line":"        # ... and this trust is the one that was not limited in uses"},{"line_number":2085,"context_line":"        r \u003d session.execute(\u0027select id from trust\u0027)"},{"line_number":2086,"context_line":"        self.assertEqual(r.fetchone()[\u0027id\u0027], unlimited_trust[\u0027id\u0027])"},{"line_number":2087,"context_line":""},{"line_number":2088,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":2089,"context_line":"                            with_pass_enab_domain\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0vY%3D","line":2086,"updated":"2014-03-03 22:52:57.000000000","message":"nice","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b0c45c639ce13f81090149140f1270fc486233b6","unresolved":false,"context_lines":[{"line_number":2048,"context_line":"        self.upgrade(41)"},{"line_number":2049,"context_line":"        session \u003d self.Session()"},{"line_number":2050,"context_line":"        trust_table \u003d sqlalchemy.Table("},{"line_number":2051,"context_line":"            \u0027trust\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2052,"context_line":"        limited_trust \u003d {"},{"line_number":2053,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2054,"context_line":"            \u0027trustor_user_id\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAVn%2F%2F0HQ%3D","line":2051,"updated":"2014-03-04 00:11:28.000000000","message":"this one is actually not used anymore and should be removed.","commit_id":"db9e0c6c4ab03c52e9adbf770b05315a3ead29be"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eb08f57ea761f5d39d1942e5dd397c0bb5c8211b","unresolved":false,"context_lines":[{"line_number":2079,"context_line":"        trust_table \u003d sqlalchemy.Table("},{"line_number":2080,"context_line":"            \u0027trust\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2081,"context_line":"        # we should have 3 trusts in base"},{"line_number":2082,"context_line":"        self.assertEqual(3, session.query(trust_table).count())"},{"line_number":2083,"context_line":""},{"line_number":2084,"context_line":"        self.downgrade(40)"},{"line_number":2085,"context_line":"        session \u003d self.Session()"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAVn%2F%2FzOU%3D","line":2082,"updated":"2014-03-04 02:29:18.000000000","message":"used it right here","commit_id":"db9e0c6c4ab03c52e9adbf770b05315a3ead29be"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a8cfa23848e9c5c23de464739cea2d5cc7fd61ff","unresolved":false,"context_lines":[{"line_number":2079,"context_line":"        trust_table \u003d sqlalchemy.Table("},{"line_number":2080,"context_line":"            \u0027trust\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2081,"context_line":"        # we should have 3 trusts in base"},{"line_number":2082,"context_line":"        self.assertEqual(3, session.query(trust_table).count())"},{"line_number":2083,"context_line":""},{"line_number":2084,"context_line":"        self.downgrade(40)"},{"line_number":2085,"context_line":"        session \u003d self.Session()"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAVn%2F%2FzF4%3D","line":2082,"in_reply_to":"AAAAVn%2F%2FzOU%3D","updated":"2014-03-04 02:52:49.000000000","message":"this is using the trust_table from line 2079, which hides the one from 2051.","commit_id":"db9e0c6c4ab03c52e9adbf770b05315a3ead29be"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"102805f76b2918a73b0563f2bef4a3483a29bd47","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"        self.downgrade(40)"},{"line_number":2085,"context_line":"        session \u003d self.Session()"},{"line_number":2086,"context_line":"        trust_table \u003d sqlalchemy.Table("},{"line_number":2087,"context_line":"            \u0027trust\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2088,"context_line":"        # Now only one trust remains ..."},{"line_number":2089,"context_line":"        self.assertEqual(1, session.query(trust_table.columns.id).count())"},{"line_number":2090,"context_line":"        # ... and this trust is the one that was not limited in uses"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAVn%2F%2F0KE%3D","line":2087,"updated":"2014-03-04 00:08:59.000000000","message":"the old session and trust table don\u0027t work anymore?","commit_id":"db9e0c6c4ab03c52e9adbf770b05315a3ead29be"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"eb08f57ea761f5d39d1942e5dd397c0bb5c8211b","unresolved":false,"context_lines":[{"line_number":2084,"context_line":"        self.downgrade(40)"},{"line_number":2085,"context_line":"        session \u003d self.Session()"},{"line_number":2086,"context_line":"        trust_table \u003d sqlalchemy.Table("},{"line_number":2087,"context_line":"            \u0027trust\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2088,"context_line":"        # Now only one trust remains ..."},{"line_number":2089,"context_line":"        self.assertEqual(1, session.query(trust_table.columns.id).count())"},{"line_number":2090,"context_line":"        # ... and this trust is the one that was not limited in uses"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAVn%2F%2FzNk%3D","line":2087,"in_reply_to":"AAAAVn%2F%2F0KE%3D","updated":"2014-03-04 02:29:18.000000000","message":"hmm, with a schema change, i assumed you\u0027d have to reload and get a new session... but i honestly didn\u0027t try it with the existing refs, and since the queries are only against the id column, i bet it would have worked regardless","commit_id":"db9e0c6c4ab03c52e9adbf770b05315a3ead29be"}],"keystone/tests/test_v3.py":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"2777450f9e92131f5ac4fccd822e4775e3b9a6d7","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        if remaining_uses is not None:"},{"line_number":239,"context_line":"            ref[\u0027remaining_uses\u0027] \u003d remaining_uses"},{"line_number":240,"context_line":"        else:"},{"line_number":241,"context_line":"            ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        if isinstance(expires, basestring):"},{"line_number":244,"context_line":"            ref[\u0027expires_at\u0027] \u003d expires"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BKaY%3D","line":241,"updated":"2013-12-02 10:03:53.000000000","message":"Couldn\u0027t this just be:\n\n  ref[\u0027remaining_uses\u0027] \u003d remaining_uses\n\nThe None test seems unnecessary seeing as you\u0027re then setting the ref key to None anyway","commit_id":"32c6efa599dca128eea53d56eb89f90ad5326770"}],"keystone/tests/test_v3_auth.py":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"2777450f9e92131f5ac4fccd822e4775e3b9a6d7","unresolved":false,"context_lines":[{"line_number":1880,"context_line":"        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, expected_status\u003d201)"},{"line_number":1881,"context_line":"        r \u003d self.get("},{"line_number":1882,"context_line":"            \u0027/OS-TRUST/trusts/%(trust_id)s\u0027 % {\u0027trust_id\u0027: trust[\u0027id\u0027]},"},{"line_number":1883,"context_line":"            expected_status\u003d200)"},{"line_number":1884,"context_line":"        trust \u003d r.result.get(\u0027trust\u0027)"},{"line_number":1885,"context_line":"        self.assertIsNotNone(trust)"},{"line_number":1886,"context_line":"        self.assertEqual(trust[\u0027remaining_uses\u0027], 0)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BKaU%3D","line":1883,"updated":"2013-12-02 10:03:53.000000000","message":"A couple of blank lines and/or slightly more verbose comments would make this more readable","commit_id":"32c6efa599dca128eea53d56eb89f90ad5326770"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"418aad48d89ccd8943083c8524b02f29d4155a8a","unresolved":false,"context_lines":[{"line_number":2045,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2046,"context_line":"            user_id\u003dself.trustee_user[\u0027id\u0027],"},{"line_number":2047,"context_line":"            password\u003dself.trustee_user[\u0027password\u0027])"},{"line_number":2048,"context_line":"        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, expected_status\u003d201)"},{"line_number":2049,"context_line":"        token \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":2050,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2051,"context_line":"            token\u003dtoken,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2BouA%3D","line":2048,"updated":"2014-01-23 17:25:42.000000000","message":"i\u0027m a bit confused here, remaining_uses was set to 0 initially, but you were able to get a token back?","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9431c85e8a7b0411a8b2408ae8c96e1d65121ae3","unresolved":false,"context_lines":[{"line_number":2045,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2046,"context_line":"            user_id\u003dself.trustee_user[\u0027id\u0027],"},{"line_number":2047,"context_line":"            password\u003dself.trustee_user[\u0027password\u0027])"},{"line_number":2048,"context_line":"        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, expected_status\u003d201)"},{"line_number":2049,"context_line":"        token \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":2050,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2051,"context_line":"            token\u003dtoken,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2BoqU%3D","line":2048,"in_reply_to":"AAAAUH%2F%2BorQ%3D","updated":"2014-01-23 17:47:21.000000000","message":"oh i see, hmm that\u0027s not really necessary, i think.. \nbut it\u0027s fine to keep it i suppose.","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"baafb06488ef09d6a81520910cbf952262b70108","unresolved":false,"context_lines":[{"line_number":2045,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2046,"context_line":"            user_id\u003dself.trustee_user[\u0027id\u0027],"},{"line_number":2047,"context_line":"            password\u003dself.trustee_user[\u0027password\u0027])"},{"line_number":2048,"context_line":"        r \u003d self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, expected_status\u003d201)"},{"line_number":2049,"context_line":"        token \u003d r.headers.get(\u0027X-Subject-Token\u0027)"},{"line_number":2050,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2051,"context_line":"            token\u003dtoken,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2BorQ%3D","line":2048,"in_reply_to":"AAAAUH%2F%2BouA%3D","updated":"2014-01-23 17:33:17.000000000","message":"I get a token for the trustee here, that I use on line 2050 to request a token from my trust, which in turn returns a 401 since I have no remaining uses.","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3ff0930d6dcdf01e1e11e76339fc1c1c1eb67894","unresolved":false,"context_lines":[{"line_number":2036,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027, body\u003d{\u0027trust\u0027: ref})"},{"line_number":2037,"context_line":"        self.assertValidTrustResponse(r, ref)"},{"line_number":2038,"context_line":""},{"line_number":2039,"context_line":"    def test_create_one_time_use_trust(self):"},{"line_number":2040,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2041,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2042,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FWh0%3D","line":2039,"updated":"2014-02-13 20:23:22.000000000","message":"We\u0027re starting to get a lot of trust tests in test_v3_auth.py... \n\nThoughts on moving this to its own module? test_v3_trust.py?","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"033957eb342a5ba67796955c0b3a03626cb0a6df","unresolved":false,"context_lines":[{"line_number":2036,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027, body\u003d{\u0027trust\u0027: ref})"},{"line_number":2037,"context_line":"        self.assertValidTrustResponse(r, ref)"},{"line_number":2038,"context_line":""},{"line_number":2039,"context_line":"    def test_create_one_time_use_trust(self):"},{"line_number":2040,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2041,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2042,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FRkU%3D","line":2039,"in_reply_to":"AAAAUX%2F%2FWh0%3D","updated":"2014-02-14 10:10:15.000000000","message":"This makes sense, but that should probably be done in a separate patch.","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":2067,"context_line":"            expected_status\u003d200)"},{"line_number":2068,"context_line":"        trust \u003d r.result.get(\u0027trust\u0027)"},{"line_number":2069,"context_line":"        self.assertIsNotNone(trust)"},{"line_number":2070,"context_line":"        self.assertEqual(trust[\u0027remaining_uses\u0027], 0)"},{"line_number":2071,"context_line":"        # this time we can\u0027t get a trust token"},{"line_number":2072,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2073,"context_line":"            user_id\u003dself.trustee_user[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2zk%3D","line":2070,"updated":"2014-02-18 15:57:14.000000000","message":"once it has zero remaining uses, it seems like it should just 404 as the trust is no longer useful -- what\u0027s the point of returning a trust with 0 remaining uses? if there\u0027s not one, this test should start with 2 remaining uses, and assert a 404 at the end","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"291a109ea993ece72fcdf02049d45c47a927d9d3","unresolved":false,"context_lines":[{"line_number":2067,"context_line":"            expected_status\u003d200)"},{"line_number":2068,"context_line":"        trust \u003d r.result.get(\u0027trust\u0027)"},{"line_number":2069,"context_line":"        self.assertIsNotNone(trust)"},{"line_number":2070,"context_line":"        self.assertEqual(trust[\u0027remaining_uses\u0027], 0)"},{"line_number":2071,"context_line":"        # this time we can\u0027t get a trust token"},{"line_number":2072,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2073,"context_line":"            user_id\u003dself.trustee_user[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2BzPk%3D","line":2070,"in_reply_to":"AAAAUX%2F%2B2zk%3D","updated":"2014-02-19 00:44:31.000000000","message":"++","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3ff0930d6dcdf01e1e11e76339fc1c1c1eb67894","unresolved":false,"context_lines":[{"line_number":2075,"context_line":"            trust_id\u003dtrust[\u0027id\u0027])"},{"line_number":2076,"context_line":"        self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, expected_status\u003d401)"},{"line_number":2077,"context_line":""},{"line_number":2078,"context_line":"    def test_create_zero_use_trust(self):"},{"line_number":2079,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2080,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2081,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FWfU%3D","line":2078,"updated":"2014-02-13 20:23:22.000000000","message":"(NIT): def test_create_trust_with_zero_uses(self):","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":2075,"context_line":"            trust_id\u003dtrust[\u0027id\u0027])"},{"line_number":2076,"context_line":"        self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, expected_status\u003d401)"},{"line_number":2077,"context_line":""},{"line_number":2078,"context_line":"    def test_create_zero_use_trust(self):"},{"line_number":2079,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2080,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2081,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2y4%3D","line":2078,"updated":"2014-02-18 15:57:14.000000000","message":"again, why would you have a trust that you can\u0027t use?","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"291a109ea993ece72fcdf02049d45c47a927d9d3","unresolved":false,"context_lines":[{"line_number":2075,"context_line":"            trust_id\u003dtrust[\u0027id\u0027])"},{"line_number":2076,"context_line":"        self.post(\u0027/auth/tokens\u0027, body\u003dauth_data, expected_status\u003d401)"},{"line_number":2077,"context_line":""},{"line_number":2078,"context_line":"    def test_create_zero_use_trust(self):"},{"line_number":2079,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2080,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2081,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2BzPE%3D","line":2078,"in_reply_to":"AAAAUX%2F%2B2y4%3D","updated":"2014-02-19 00:44:31.000000000","message":"This instead should raise a validation error imo. 0 is just as wrong as negative uses.","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3ff0930d6dcdf01e1e11e76339fc1c1c1eb67894","unresolved":false,"context_lines":[{"line_number":2105,"context_line":"        self.assertIsNotNone(trust)"},{"line_number":2106,"context_line":"        self.assertEqual(trust[\u0027remaining_uses\u0027], 0)"},{"line_number":2107,"context_line":""},{"line_number":2108,"context_line":"    def test_create_negative_use_trust(self):"},{"line_number":2109,"context_line":"        # negative values for the remaining_uses parameter are forbidden"},{"line_number":2110,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2111,"context_line":"            trustor_user_id\u003dself.user_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FWaQ%3D","line":2108,"updated":"2014-02-13 20:23:22.000000000","message":"(NIT): def test_create_trust_with_negative_remaining_uses(self)\n\n\nthese are just nits for readability if you want them \u003d)","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":2111,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2112,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"},{"line_number":2113,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2114,"context_line":"            remaining_uses\u003d-10,"},{"line_number":2115,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2116,"context_line":"        del ref[\u0027id\u0027]"},{"line_number":2117,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2yk%3D","line":2114,"updated":"2014-02-18 15:57:14.000000000","message":"-1 (or even better: 0)","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c02224efaa17f529f67b811930dd6bbcecdb48e","unresolved":false,"context_lines":[{"line_number":2070,"context_line":"        self.assertIsNotNone(trust)"},{"line_number":2071,"context_line":"        self.assertEqual(trust[\u0027remaining_uses\u0027], 1)"},{"line_number":2072,"context_line":""},{"line_number":2073,"context_line":"    def test_create_one_time_use_trust(self):"},{"line_number":2074,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2075,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2076,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2Fnjs%3D","line":2073,"updated":"2014-02-25 16:47:14.000000000","message":"the first half of this test is the same as the one above it (and below it), i won\u0027t -1 it if everything else is good. we can always refactor the tests later","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"97d4a6964947a11953717d2235cba3372a544043","unresolved":false,"context_lines":[{"line_number":2070,"context_line":"        self.assertIsNotNone(trust)"},{"line_number":2071,"context_line":"        self.assertEqual(trust[\u0027remaining_uses\u0027], 1)"},{"line_number":2072,"context_line":""},{"line_number":2073,"context_line":"    def test_create_one_time_use_trust(self):"},{"line_number":2074,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2075,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2076,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FmEY%3D","line":2073,"in_reply_to":"AAAAU3%2F%2Fnjs%3D","updated":"2014-02-25 18:55:24.000000000","message":"no prob","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4134e83476ac10509dcbf9413e38471c74b1dbc1","unresolved":false,"context_lines":[{"line_number":2036,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027, body\u003d{\u0027trust\u0027: ref})"},{"line_number":2037,"context_line":"        self.assertValidTrustResponse(r, ref)"},{"line_number":2038,"context_line":""},{"line_number":2039,"context_line":"    def _initialize_test_consume_trust(self, count):"},{"line_number":2040,"context_line":"        # Make sure remaining_uses is decremented as we consume the trust"},{"line_number":2041,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":2042,"context_line":"            trustor_user_id\u003dself.user_id,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAU3%2F%2FkwE%3D","line":2039,"updated":"2014-02-25 21:03:59.000000000","message":"++ nice","commit_id":"b0db18e33be730d99abfe188ac6dd8f2435c644a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":2130,"context_line":"            \u0027/OS-TRUST/trusts/%(trust_id)s\u0027 % {\u0027trust_id\u0027: trust[\u0027id\u0027]},"},{"line_number":2131,"context_line":"            expected_status\u003d200)"},{"line_number":2132,"context_line":"        trust \u003d r.result.get(\u0027trust\u0027)"},{"line_number":2133,"context_line":"        self.assertIsNotNone(trust)"},{"line_number":2134,"context_line":"        self.assertEqual(trust.get(\u0027remaining_uses\u0027), None)"},{"line_number":2135,"context_line":""},{"line_number":2136,"context_line":"    def test_trust_crud(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B0w%3D","line":2133,"updated":"2014-02-27 01:37:43.000000000","message":"remove this line since the next line does it anyways.","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":2131,"context_line":"            expected_status\u003d200)"},{"line_number":2132,"context_line":"        trust \u003d r.result.get(\u0027trust\u0027)"},{"line_number":2133,"context_line":"        self.assertIsNotNone(trust)"},{"line_number":2134,"context_line":"        self.assertEqual(trust.get(\u0027remaining_uses\u0027), None)"},{"line_number":2135,"context_line":""},{"line_number":2136,"context_line":"    def test_trust_crud(self):"},{"line_number":2137,"context_line":"        ref \u003d self.new_trust_ref("}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B04%3D","line":2134,"updated":"2014-02-27 01:37:43.000000000","message":"use assertIsNone.\n\nAlso, use [] rather than .get()","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":2094,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2095,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"},{"line_number":2096,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2097,"context_line":"            remaining_uses\u003d-1,"},{"line_number":2098,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2099,"context_line":"        del ref[\u0027id\u0027]"},{"line_number":2100,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F5Kc%3D","line":2097,"updated":"2014-03-03 16:06:59.000000000","message":"a similar test for 0 remaining_uses would be nice","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"196ea19e3217de5995779aeda1bedb0ad901128f","unresolved":false,"context_lines":[{"line_number":2094,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2095,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"},{"line_number":2096,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2097,"context_line":"            remaining_uses\u003d-1,"},{"line_number":2098,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2099,"context_line":"        del ref[\u0027id\u0027]"},{"line_number":2100,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F4Sg%3D","line":2097,"in_reply_to":"AAAAVn%2F%2F45Y%3D","updated":"2014-03-03 17:24:16.000000000","message":"Done","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"1923ff7eadb5f27f329f605ceefc2b720630e0d2","unresolved":false,"context_lines":[{"line_number":2094,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2095,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"},{"line_number":2096,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2097,"context_line":"            remaining_uses\u003d-1,"},{"line_number":2098,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2099,"context_line":"        del ref[\u0027id\u0027]"},{"line_number":2100,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F45Y%3D","line":2097,"in_reply_to":"AAAAVn%2F%2F5Kc%3D","updated":"2014-03-03 16:13:32.000000000","message":"and a case for the point made in https://review.openstack.org/#/c/56243/24/keystone/trust/controllers.py with remaining_uses being something greater than 0 but not an integer.","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1aaaad7ecaf799d511e66eb4c9b4847fcaacee6f","unresolved":false,"context_lines":[{"line_number":2116,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2117,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"},{"line_number":2118,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2119,"context_line":"            remaining_uses\u003dNone,"},{"line_number":2120,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2121,"context_line":"        del ref[\u0027id\u0027]"},{"line_number":2122,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027, body\u003d{\u0027trust\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0f8%3D","line":2119,"updated":"2014-03-03 23:24:15.000000000","message":"isn\u0027t this the default?","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"a9d6ff12c591b02b194de8e0bd8525485db35503","unresolved":false,"context_lines":[{"line_number":2116,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2117,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"},{"line_number":2118,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2119,"context_line":"            remaining_uses\u003dNone,"},{"line_number":2120,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2121,"context_line":"        del ref[\u0027id\u0027]"},{"line_number":2122,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027, body\u003d{\u0027trust\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0Mw%3D","line":2119,"in_reply_to":"AAAAVn%2F%2F0f8%3D","updated":"2014-03-04 00:01:46.000000000","message":"yes, but i think it\u0027s important for it to be explicit here, since that\u0027s exactly what it\u0027s testing","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"}],"keystone/token/controllers.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"734df785d14dceb28e00cc0aa15cac8e020bec5f","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        Alternatively, this call accepts auth with only a token and tenant"},{"line_number":73,"context_line":"        that will return a token that is scoped to that tenant."},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        if auth is None:"},{"line_number":77,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027auth\u0027,"},{"line_number":78,"context_line":"                                            target\u003d\u0027request body\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Br8E%3D","side":"PARENT","line":75,"updated":"2013-11-21 15:10:51.000000000","message":"Why remove this line?","commit_id":"2ab2c624353067ba0989720414e5cde2d4792bcc"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b80c75e30adc45ce814981d6d0a31d09060d67c4","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            if not self.trust_api.has_remaining_uses(auth[\u0027trust_id\u0027]):"},{"line_number":185,"context_line":"                raise exception.Forbidden()()"},{"line_number":186,"context_line":"            else:"},{"line_number":187,"context_line":"                self.trust_api.consume_use(auth[\u0027trust_id\u0027])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"            if trust_ref[\u0027impersonation\u0027] is True:"},{"line_number":190,"context_line":"                current_user_ref \u003d trustor_user_ref"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F979c%3D","line":187,"updated":"2013-12-04 09:11:26.000000000","message":"I\u0027m not sure how keystone scale-out works, but doesn\u0027t this have the potential to be racy?  ie what happens if two requests hit different keystone processes in a scaled-out environment, and they both hit has_remaining_uses for the same trust concurrently?\n\nSeems like it would be better to have just one DB query, ie call consume_use and have it raise exception.Forbidden if a conflict decrementing the use counter happens?","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"71050df53f6e52b2e37efcc2aad4dab20f428545","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                trust_ref[\u0027trustee_user_id\u0027])"},{"line_number":187,"context_line":"            if not trustee_user_ref[\u0027enabled\u0027]:"},{"line_number":188,"context_line":"                raise exception.Forbidden()()"},{"line_number":189,"context_line":"            if not self.trust_api.has_remaining_uses(auth[\u0027trust_id\u0027]):"},{"line_number":190,"context_line":"                raise exception.Forbidden()()"},{"line_number":191,"context_line":"            else:"},{"line_number":192,"context_line":"                self.trust_api.consume_use(auth[\u0027trust_id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F87J8%3D","line":189,"updated":"2013-12-18 18:18:35.000000000","message":"i think, ideally, this part should go under issue_token, don\u0027t subtract a use until the last possible part. \n\nif something goes further into the code, you\u0027ve already subtracted a use, without giving a token.","commit_id":"31d3459994f13cc80aeb2f6784554e4d339e6f4e"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            if not trustee_user_ref[\u0027enabled\u0027]:"},{"line_number":185,"context_line":"                raise exception.Forbidden()()"},{"line_number":186,"context_line":"            if not self.trust_api.has_remaining_uses(auth[\u0027trust_id\u0027]):"},{"line_number":187,"context_line":"                raise exception.Forbidden()()"},{"line_number":188,"context_line":"            else:"},{"line_number":189,"context_line":"                self.trust_api.consume_use(auth[\u0027trust_id\u0027])"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2xk%3D","line":187,"updated":"2014-02-18 15:57:14.000000000","message":"why is this being called twice?","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            if not self.trust_api.has_remaining_uses(auth[\u0027trust_id\u0027]):"},{"line_number":187,"context_line":"                raise exception.Forbidden()()"},{"line_number":188,"context_line":"            else:"},{"line_number":189,"context_line":"                self.trust_api.consume_use(auth[\u0027trust_id\u0027])"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            if trust_ref[\u0027impersonation\u0027] is True:"},{"line_number":192,"context_line":"                current_user_ref \u003d trustor_user_ref"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2xQ%3D","line":189,"updated":"2014-02-18 15:57:14.000000000","message":"again, this look-before-you-leap pattern should be abstracted out of this scope","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"}],"keystone/trust/backends/kvs.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"734df785d14dceb28e00cc0aa15cac8e020bec5f","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.db.set(\u0027trustor-%s\u0027 % trustor_user_id, trustor_list)"},{"line_number":58,"context_line":"        return copy.deepcopy(trust_ref)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":63,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Br4Y%3D","line":60,"updated":"2013-11-21 15:10:51.000000000","message":"Any particular reason why this is only in the kvs backend? Won\u0027t all backends need to carry out this functionality? Maybe we can find an appropriate seam for it in; \n\nhttps://github.com/openstack/keystone/blob/master/keystone/trust/controllers.py\n\nThoughts?","commit_id":"2b79205dc5b25d5e6c084670e1ba46e005382424"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"b09471fba8e9db985699cf76c76c0429e0d5ed76","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.db.set(\u0027trustor-%s\u0027 % trustor_user_id, trustor_list)"},{"line_number":58,"context_line":"        return copy.deepcopy(trust_ref)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":63,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2BrqE%3D","line":60,"in_reply_to":"AAAATn%2F%2Br4Y%3D","updated":"2013-11-21 16:01:59.000000000","message":"It is as well in the sql backend, unless I didn\u0027t understand your comment correctly ?\n\nI thought it shouldn\u0027t be exposed through the controller but I am open to argumentation.","commit_id":"2b79205dc5b25d5e6c084670e1ba46e005382424"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"972baac621ead5066c13be5f0b23a09eb539cf9f","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.db.set(\u0027trustor-%s\u0027 % trustor_user_id, trustor_list)"},{"line_number":58,"context_line":"        return copy.deepcopy(trust_ref)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":63,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Bls4%3D","line":60,"in_reply_to":"AAAATn%2F%2BrqE%3D","updated":"2013-11-22 18:56:32.000000000","message":"Responded to this in the latest patch set. Thanks for respinning!","commit_id":"2b79205dc5b25d5e6c084670e1ba46e005382424"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae434caccca8aa7e59625f66786d151de196e84a","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        except exception.NotFound:"},{"line_number":64,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":65,"context_line":"        if (ref.get(\u0027remaining_uses\u0027) is not None) \\"},{"line_number":66,"context_line":"           and ref[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":67,"context_line":"            return False"},{"line_number":68,"context_line":"        return True"},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Bltw%3D","line":66,"updated":"2013-11-22 18:55:59.000000000","message":"Suggest wrapping this in () and removing the \\ for line continuation.","commit_id":"92581d81e300c390d4ded49f5aad1a72fb3c2dfd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae434caccca8aa7e59625f66786d151de196e84a","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        if (ref.get(\u0027remaining_uses\u0027) is not None) \\"},{"line_number":66,"context_line":"           and ref[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":67,"context_line":"            return False"},{"line_number":68,"context_line":"        return True"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def consume_use(self, trust_id):"},{"line_number":71,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Blts%3D","line":68,"updated":"2013-11-22 18:55:59.000000000","message":"(NIT): if else?","commit_id":"92581d81e300c390d4ded49f5aad1a72fb3c2dfd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae434caccca8aa7e59625f66786d151de196e84a","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":75,"context_line":"        if ref.get(\u0027remaining_uses\u0027):"},{"line_number":76,"context_line":"            if ref[\u0027remaining_uses\u0027] \u003e 0:"},{"line_number":77,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d ref[\u0027remaining_uses\u0027] - 1"},{"line_number":78,"context_line":"                self.db.set(\u0027trust-%s\u0027 % trust_id, ref)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    def get_trust(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BltM%3D","line":77,"updated":"2013-11-22 18:55:59.000000000","message":"Same comment as sql implementation. This is why it would be nice to have these two methods be common code so that both sql and kvs could use the same methods to maintain this. That way if it gets refactored in the future, it will be consistent for both.","commit_id":"92581d81e300c390d4ded49f5aad1a72fb3c2dfd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e0d27018c4827583028e41e30e939ca88cbb81a4","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import copy"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from keystone.common import kvs"},{"line_number":23,"context_line":"from keystone.common.utils import trust_is_limited_in_uses, trust_has_uses_left"},{"line_number":24,"context_line":"from keystone import exception"},{"line_number":25,"context_line":"from keystone.openstack.common import timeutils"},{"line_number":26,"context_line":"from keystone import trust"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bdzo%3D","line":23,"updated":"2013-11-25 20:36:29.000000000","message":"This should probably be refactored to import utils. \n\n    from keystone.common import utils \n\nand then reference those methods using.. \n\n    utils.trust_is_limited_in_uses \n\nhttps://github.com/openstack/keystone/blob/master/HACKING.rst#imports","commit_id":"595c4b01b745f12d88fc81815001f0105d8369db"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e0d27018c4827583028e41e30e939ca88cbb81a4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":64,"context_line":"        except exception.NotFound:"},{"line_number":65,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":66,"context_line":"        if trust_is_limited_in_uses(ref.get(\u0027remaining_uses\u0027)):"},{"line_number":67,"context_line":"            if not trust_has_uses_left(ref[\u0027remaining_uses\u0027]):"},{"line_number":68,"context_line":"                return False"},{"line_number":69,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATn%2F%2Bdzk%3D","line":66,"updated":"2013-11-25 20:36:29.000000000","message":"Call these methods with utils.\u003cmethod\u003e","commit_id":"595c4b01b745f12d88fc81815001f0105d8369db"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"2777450f9e92131f5ac4fccd822e4775e3b9a6d7","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                    trust_ref[\u0027expires_at\u0027] \u003d (timeutils.normalize_time"},{"line_number":47,"context_line":"                                               (trust_ref[\u0027expires_at\u0027]))"},{"line_number":48,"context_line":"        if trust_ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":49,"context_line":"            trust_ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":50,"context_line":"        self.db.set(\u0027trust-%s\u0027 % trust_id, trust_ref)"},{"line_number":51,"context_line":"        trustee_user_id \u003d trust_ref[\u0027trustee_user_id\u0027]"},{"line_number":52,"context_line":"        trustee_list \u003d self.db.get(\u0027trustee-%s\u0027 % trustee_user_id, [])"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BKaM%3D","line":49,"updated":"2013-12-02 10:03:53.000000000","message":"This looks odd, and it\u0027s modifying the trust which was passed in as a parameter isn\u0027t it?\n\nPersonally I\u0027d prefer to see the copy.deepcopy happen when assigning trust_ref, and use setdefault for remaining_uses, since that makes it clear that None is expected to be the default value.","commit_id":"32c6efa599dca128eea53d56eb89f90ad5326770"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"2777450f9e92131f5ac4fccd822e4775e3b9a6d7","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        except exception.NotFound:"},{"line_number":65,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":66,"context_line":"        if utils.trust_is_limited_in_uses(ref.get(\u0027remaining_uses\u0027)):"},{"line_number":67,"context_line":"            if not utils.trust_has_uses_left(ref[\u0027remaining_uses\u0027]):"},{"line_number":68,"context_line":"                return False"},{"line_number":69,"context_line":"        return True"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BKaA%3D","line":67,"updated":"2013-12-02 10:03:53.000000000","message":"This already returns a boolean, so why not just return it?\n\n  return utils.trust_has_uses_left(ref[\u0027remaining_uses\u0027])","commit_id":"32c6efa599dca128eea53d56eb89f90ad5326770"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"680eaf9633d228ef65affe276cc385de5e622abb","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        try:"},{"line_number":62,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":63,"context_line":"        except exception.NotFound:"},{"line_number":64,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":65,"context_line":"        if utils.trust_is_limited_in_uses(ref.get(\u0027remaining_uses\u0027)):"},{"line_number":66,"context_line":"            return utils.trust_has_uses_left(ref[\u0027remaining_uses\u0027])"},{"line_number":67,"context_line":"        return True"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F954g%3D","line":64,"updated":"2013-12-04 17:10:49.000000000","message":"Should these be unit tested in their respective backend (kvs/sql)? So that we can verify each path in this method?","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b80c75e30adc45ce814981d6d0a31d09060d67c4","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":65,"context_line":"        if utils.trust_is_limited_in_uses(ref.get(\u0027remaining_uses\u0027)):"},{"line_number":66,"context_line":"            return utils.trust_has_uses_left(ref[\u0027remaining_uses\u0027])"},{"line_number":67,"context_line":"        return True"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def consume_use(self, trust_id):"},{"line_number":70,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F98CU%3D","line":67,"updated":"2013-12-04 09:11:26.000000000","message":"You could simplify this to just:\n\nreturn ref.get(\u0027remaining_uses\u0027)  !\u003d 0","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b80c75e30adc45ce814981d6d0a31d09060d67c4","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        except exception.NotFound:"},{"line_number":73,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":74,"context_line":"        if utils.trust_is_limited_in_uses(ref.get(\u0027remaining_uses\u0027)):"},{"line_number":75,"context_line":"            if utils.trust_has_uses_left(ref[\u0027remaining_uses\u0027]):"},{"line_number":76,"context_line":"                ref[\u0027remaining_uses\u0027] -\u003d 1"},{"line_number":77,"context_line":"                self.db.set(\u0027trust-%s\u0027 % trust_id, ref)"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F98CI%3D","line":75,"updated":"2013-12-04 09:11:26.000000000","message":"if ref.get(\u0027remaining_uses\u0027) \u003e 0:","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":9101,"name":"wanghong","email":"reviewwanghong@126.com","username":"wanghong"},"change_message_id":"6ceb7e3d4ec00a72d418a2d7063f0e0319344af7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":64,"context_line":"        return ref.get(\u0027remaining_uses\u0027) !\u003d 0"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def consume_use(self, trust_id):"},{"line_number":67,"context_line":"        try:"},{"line_number":68,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":69,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F%2FvJo%3D","line":66,"updated":"2014-01-09 01:56:16.000000000","message":"Should we consider thread safe?","commit_id":"45e8cfe08a5291231f75c5d16fcd4f851ad9feee"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7f49caf820e12c59062165276312971d1947b187","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":69,"context_line":"        except exception.NotFound:"},{"line_number":70,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":71,"context_line":"        if ref.get(\u0027remaining_uses\u0027) \u003e 0:"},{"line_number":72,"context_line":"            ref[\u0027remaining_uses\u0027] -\u003d 1"},{"line_number":73,"context_line":"            self.db.set(\u0027trust-%s\u0027 % trust_id, ref)"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Bsn8%3D","line":71,"updated":"2014-01-24 15:32:52.000000000","message":"I think you might have a potential race condition here.  If two different threads hit this code, and they are operating on the same object out of memcache, etc, then one could decrement, the  second decrement, and then the value is less than 0.  Better to do a copy before the math.","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4a3a98aa9903030c34ea1445f62707bc5c02679d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":62,"context_line":"        except exception.NotFound:"},{"line_number":63,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":64,"context_line":"        return ref.get(\u0027remaining_uses\u0027) !\u003d 0"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def consume_use(self, trust_id):"},{"line_number":67,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BEJ0%3D","line":64,"updated":"2014-01-30 15:46:22.000000000","message":"I think you want \"return ref.get(\u0027remaining_uses\u0027) \u003e 0\"\n\nYou also may want a short comment explaining that the value may be None and None is always less that numeric values in Python. Or you could have an explicit \"if is None: return True\"","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"0393ecf7c87ba74eccebc9ecd30994c5c346c1cf","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        except exception.NotFound:"},{"line_number":70,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":71,"context_line":"        ref \u003d copy.deepcopy(orig_ref)"},{"line_number":72,"context_line":"        if ref.get(\u0027remaining_uses\u0027) \u003d\u003d 0:"},{"line_number":73,"context_line":"            raise exception.TrustUseLimitReached()"},{"line_number":74,"context_line":"        if ref.get(\u0027remaining_uses\u0027) \u003e 0:"},{"line_number":75,"context_line":"            ref[\u0027remaining_uses\u0027] -\u003d 1"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BKdo%3D","line":72,"updated":"2014-01-29 15:18:05.000000000","message":"This should be in the else block below.   Keep the semantics of  checking that remaining_uses  \u003e 0","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4a3a98aa9903030c34ea1445f62707bc5c02679d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        except exception.NotFound:"},{"line_number":70,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":71,"context_line":"        ref \u003d copy.deepcopy(orig_ref)"},{"line_number":72,"context_line":"        if ref.get(\u0027remaining_uses\u0027) \u003d\u003d 0:"},{"line_number":73,"context_line":"            raise exception.TrustUseLimitReached()"},{"line_number":74,"context_line":"        if ref.get(\u0027remaining_uses\u0027) \u003e 0:"},{"line_number":75,"context_line":"            ref[\u0027remaining_uses\u0027] -\u003d 1"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BEGA%3D","line":72,"in_reply_to":"AAAAUH%2F%2BKdo%3D","updated":"2014-01-30 15:46:22.000000000","message":"I agree with this and would add that we\u0027d need an explicity elif checking for None.","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.db.set(\u0027trustor-%s\u0027 % trustor_user_id, trustor_list)"},{"line_number":55,"context_line":"        return trust_ref"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":60,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2xA%3D","line":57,"updated":"2014-02-18 15:57:14.000000000","message":"should be a private common driver method or manager method, i\u0027m not sure which","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"291a109ea993ece72fcdf02049d45c47a927d9d3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self.db.set(\u0027trustor-%s\u0027 % trustor_user_id, trustor_list)"},{"line_number":55,"context_line":"        return trust_ref"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":58,"context_line":"        try:"},{"line_number":59,"context_line":"            ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":60,"context_line":"        except exception.NotFound:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2BzOE%3D","line":57,"in_reply_to":"AAAAUX%2F%2B2xA%3D","updated":"2014-02-19 00:44:31.000000000","message":"This should be a manager method.  The resulting code (regardless of the backend) is largely the same and could be as simple as \n\n    trust \u003d self.driver.get(trust_id)\n    return trust[\u0027remaning_uses\u0027] is None or trust[\u0027remaining_uses\u0027] \u003e 0","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class Trust(kvs.Base, trust.Driver):"},{"line_number":41,"context_line":"    def create_trust(self, trust_id, trust, roles):"},{"line_number":42,"context_line":"        trust_ref \u003d copy.deepcopy(trust)"},{"line_number":43,"context_line":"        trust_ref[\u0027id\u0027] \u003d trust_id"},{"line_number":44,"context_line":"        trust_ref[\u0027deleted\u0027] \u003d False"},{"line_number":45,"context_line":"        trust_ref[\u0027roles\u0027] \u003d roles"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B0E%3D","line":42,"updated":"2014-02-27 01:37:43.000000000","message":"this looks like it\u0027s fixing a different problem?","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"16ec19cc3f6124bf7234544622cc289a8fe635c8","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"class Trust(kvs.Base, trust.Driver):"},{"line_number":41,"context_line":"    def create_trust(self, trust_id, trust, roles):"},{"line_number":42,"context_line":"        trust_ref \u003d copy.deepcopy(trust)"},{"line_number":43,"context_line":"        trust_ref[\u0027id\u0027] \u003d trust_id"},{"line_number":44,"context_line":"        trust_ref[\u0027deleted\u0027] \u003d False"},{"line_number":45,"context_line":"        trust_ref[\u0027roles\u0027] \u003d roles"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F7Lk%3D","line":42,"in_reply_to":"AAAAVX%2F%2F%2B0E%3D","updated":"2014-02-27 10:41:06.000000000","message":"Not sure I follow ? This was suggested by ayoung","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"                trust_ref[\u0027expires_at\u0027].tzinfo is not None):"},{"line_number":48,"context_line":"                    trust_ref[\u0027expires_at\u0027] \u003d (timeutils.normalize_time"},{"line_number":49,"context_line":"                                               (trust_ref[\u0027expires_at\u0027]))"},{"line_number":50,"context_line":"        self.db.set(\u0027trust-%s\u0027 % trust_id, trust_ref)"},{"line_number":51,"context_line":"        trustee_user_id \u003d trust_ref[\u0027trustee_user_id\u0027]"},{"line_number":52,"context_line":"        trustee_list \u003d self.db.get(\u0027trustee-%s\u0027 % trustee_user_id, [])"},{"line_number":53,"context_line":"        trustee_list.append(trust_id)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2B0M%3D","line":50,"updated":"2014-02-27 01:37:43.000000000","message":"revert unrelated whitespace change on previous line.","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            ref \u003d copy.deepcopy(orig_ref)"},{"line_number":68,"context_line":"            ref[\u0027remaining_uses\u0027] -\u003d 1"},{"line_number":69,"context_line":"            self.db.set(\u0027trust-%s\u0027 % trust_id, ref)"},{"line_number":70,"context_line":"        elif orig_ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":71,"context_line":"            # unlimited uses, do nothing"},{"line_number":72,"context_line":"            return"},{"line_number":73,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2By0%3D","line":70,"updated":"2014-02-27 01:37:43.000000000","message":"suggest do this check first rather than relying on obscure python behavior to get here.","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            # unlimited uses, do nothing"},{"line_number":72,"context_line":"            return"},{"line_number":73,"context_line":"        else:"},{"line_number":74,"context_line":"            raise exception.TrustUseLimitReached(trust_id)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def get_trust(self, trust_id):"},{"line_number":77,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2BzI%3D","line":74,"updated":"2014-02-27 01:37:43.000000000","message":"I think this needs to be trust_id\u003dtrust_id.","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e50e986a5198032872dbf4c1155ceb8036ab809c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            orig_ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":65,"context_line":"        except exception.NotFound:"},{"line_number":66,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":67,"context_line":"        if orig_ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":68,"context_line":"            # unlimited uses, do nothing"},{"line_number":69,"context_line":"            return"},{"line_number":70,"context_line":"        elif orig_ref.get(\u0027remaining_uses\u0027) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F5So%3D","line":67,"updated":"2014-02-27 15:04:03.000000000","message":"Is there any reason you are not saving this to a variable so that you don\u0027t have to call .get() more than once?","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"7a6e5530beb1206ec97972c5987d86bd719b0077","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            orig_ref \u003d self.db.get(\u0027trust-%s\u0027 % trust_id)"},{"line_number":65,"context_line":"        except exception.NotFound:"},{"line_number":66,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":67,"context_line":"        if orig_ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":68,"context_line":"            # unlimited uses, do nothing"},{"line_number":69,"context_line":"            return"},{"line_number":70,"context_line":"        elif orig_ref.get(\u0027remaining_uses\u0027) \u003e 0:"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F45o%3D","line":67,"in_reply_to":"AAAAVX%2F%2F5So%3D","updated":"2014-02-27 15:42:42.000000000","message":"Done","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"}],"keystone/trust/backends/sql.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"734df785d14dceb28e00cc0aa15cac8e020bec5f","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        return True"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":91,"context_line":"    def consume_use(self, trust_id):"},{"line_number":92,"context_line":"        session \u003d self.get_session()"},{"line_number":93,"context_line":"        with session.begin():"},{"line_number":94,"context_line":"            ref \u003d (session.query(TrustModel)."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F%2Br4Q%3D","line":91,"updated":"2013-11-21 15:10:51.000000000","message":"See previous comment. It would be nice to reuse this code, that way we know trusts are handled the same way no matter the backend.","commit_id":"2b79205dc5b25d5e6c084670e1ba46e005382424"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae434caccca8aa7e59625f66786d151de196e84a","unresolved":false,"context_lines":[{"line_number":85,"context_line":"            return False"},{"line_number":86,"context_line":"        if (ref.remaining_uses is not None) and ref.remaining_uses \u003c\u003d 0:"},{"line_number":87,"context_line":"            return False"},{"line_number":88,"context_line":"        return True"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":91,"context_line":"    def consume_use(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BlvY%3D","line":88,"updated":"2013-11-22 18:55:59.000000000","message":"Why not have these three returns handled in an if/elif/else?","commit_id":"92581d81e300c390d4ded49f5aad1a72fb3c2dfd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ae434caccca8aa7e59625f66786d151de196e84a","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":97,"context_line":"            if (ref.remaining_uses is not None) and ref.remaining_uses \u003e 0:"},{"line_number":98,"context_line":"                old_dict \u003d ref.to_dict()"},{"line_number":99,"context_line":"                old_dict[\u0027remaining_uses\u0027] \u003d old_dict[\u0027remaining_uses\u0027] - 1"},{"line_number":100,"context_line":"                new_ref \u003d TrustModel.from_dict(old_dict)"},{"line_number":101,"context_line":"                for attr in TrustModel.attributes:"},{"line_number":102,"context_line":"                    if attr !\u003d \u0027id\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2Blu4%3D","line":99,"updated":"2013-11-22 18:55:59.000000000","message":"(NIT): might be able to substitute \n\n    old_dict[\u0027remaining_uses\u0027] \u003d old_dict[\u0027remaining_uses\u0027] - 1\n\nfor: \n\n    old_dict[\u0027remaining_uses\u0027] \u003d- 1\n\nfor short hand format.","commit_id":"92581d81e300c390d4ded49f5aad1a72fb3c2dfd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"680eaf9633d228ef65affe276cc385de5e622abb","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        ref \u003d (session.query(TrustModel)."},{"line_number":83,"context_line":"               filter_by(deleted_at\u003dNone)."},{"line_number":84,"context_line":"               filter_by(id\u003dtrust_id).first())"},{"line_number":85,"context_line":"        if ref is None:"},{"line_number":86,"context_line":"            return False"},{"line_number":87,"context_line":"        if utils.trust_is_limited_in_uses(ref.remaining_uses):"},{"line_number":88,"context_line":"            return utils.trust_has_uses_left(ref.remaining_uses)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F954Q%3D","line":85,"updated":"2013-12-04 17:10:49.000000000","message":"Same comment here as in kvs.","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b80c75e30adc45ce814981d6d0a31d09060d67c4","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            return False"},{"line_number":87,"context_line":"        if utils.trust_is_limited_in_uses(ref.remaining_uses):"},{"line_number":88,"context_line":"            return utils.trust_has_uses_left(ref.remaining_uses)"},{"line_number":89,"context_line":"        return True"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":92,"context_line":"    def consume_use(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F98DE%3D","line":89,"updated":"2013-12-04 09:11:26.000000000","message":"This section could be simplified to:\n\nreturn ref is not None and ref.remaining_uses !\u003d 0\n\nAs mentioned in utils.py, I think the utils abstraction is obfuscating what is a basically a simple test.","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b80c75e30adc45ce814981d6d0a31d09060d67c4","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                   filter_by(deleted_at\u003dNone)."},{"line_number":97,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":98,"context_line":"            if utils.trust_is_limited_in_uses(ref.remaining_uses):"},{"line_number":99,"context_line":"                if utils.trust_has_uses_left(ref.remaining_uses):"},{"line_number":100,"context_line":"                    old_dict \u003d ref.to_dict()"},{"line_number":101,"context_line":"                    old_dict[\u0027remaining_uses\u0027] -\u003d 1"},{"line_number":102,"context_line":"                    new_ref \u003d TrustModel.from_dict(old_dict)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATn%2F98Cs%3D","line":99,"updated":"2013-12-04 09:11:26.000000000","message":"As above, this could just be:\n\n  if ref.remaining_uses \u003e 0:","commit_id":"49681e4715c936098dcf51e82e6a0c2d19ba4619"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"62e08425c33e32092b5eef6973125e300bd88a82","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        trust_dict[\u0027roles\u0027] \u003d roles"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":79,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":80,"context_line":"        session \u003d self.get_session()"},{"line_number":81,"context_line":"        ref \u003d (session.query(TrustModel)."},{"line_number":82,"context_line":"               filter_by(deleted_at\u003dNone)."}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2F5ZU%3D","line":79,"updated":"2014-01-07 03:57:46.000000000","message":"I am wondering if this should be tested in the backend for both kvs and sql. Since we have two methods that are suppose to behave the same way but require different implementations, unit testing these methods would ensure that if something down the road changes with one implementation, it should change consistently with the other.","commit_id":"674a50397ea15fb706e044f7b7fa7142a4d8c9f5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0b8fe4b7ffe30805bf604296f32676fdabfa3867","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        with session.begin():"},{"line_number":91,"context_line":"            ref \u003d (session.query(TrustModel)."},{"line_number":92,"context_line":"                   filter_by(deleted_at\u003dNone)."},{"line_number":93,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":94,"context_line":"            if ref.remaining_uses \u003e 0:"},{"line_number":95,"context_line":"                old_dict \u003d ref.to_dict()"},{"line_number":96,"context_line":"                old_dict[\u0027remaining_uses\u0027] -\u003d 1"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2FKHY%3D","line":93,"updated":"2014-01-16 21:27:47.000000000","message":"(NIT): should we check if ref returns as none, like at line 83?\n\nwith session.begin():\n    ref \u003d (session.query(TrustModel).\n              filter_by(deleted_at\u003dNone).\n              filter_by(id\u003dtrust_id).first())\n    if ref is None:\n        # Throw some exception saying that you can\u0027t\n        # consume a use from the trust because no trust was\n        # found? \n    elif ref.remaining_uses \u003e 0:\n        # Continue with consume logic here\n\n\nIt\u0027s kind of a slim change path, but does it make sense to cover it? Just thinking of consistency between the two methods (has_remaining_uses and consume_use).","commit_id":"a88359a10c047833f8186a42153cda2489d25d1e"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"2e02cf6a6d9b99b78f51822207a1bea36a34c584","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        with session.begin():"},{"line_number":91,"context_line":"            ref \u003d (session.query(TrustModel)."},{"line_number":92,"context_line":"                   filter_by(deleted_at\u003dNone)."},{"line_number":93,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":94,"context_line":"            if ref.remaining_uses \u003e 0:"},{"line_number":95,"context_line":"                old_dict \u003d ref.to_dict()"},{"line_number":96,"context_line":"                old_dict[\u0027remaining_uses\u0027] -\u003d 1"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAUH%2F%2BwzA%3D","line":93,"in_reply_to":"AAAAUH%2F%2FKHY%3D","updated":"2014-01-22 11:58:46.000000000","message":"Done","commit_id":"a88359a10c047833f8186a42153cda2489d25d1e"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9431c85e8a7b0411a8b2408ae8c96e1d65121ae3","unresolved":false,"context_lines":[{"line_number":82,"context_line":"               filter_by(id\u003dtrust_id).first())"},{"line_number":83,"context_line":"        if ref is None:"},{"line_number":84,"context_line":"            return False"},{"line_number":85,"context_line":"        return ref.remaining_uses !\u003d 0"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":88,"context_line":"    def consume_use(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Bomw%3D","line":85,"updated":"2014-01-23 17:47:21.000000000","message":"use \u003e 0 instead of !\u003d 0 ?","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":994,"name":"Arvind Tiwari","email":"arvindt7@gmail.com","username":"arvind-tiwari"},"change_message_id":"a21dee0b1135894ba745a66cb71df67d6462d8a1","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        setattr(ref, attr, getattr(new_ref, attr))"},{"line_number":103,"context_line":"                ref.extra \u003d new_ref.extra"},{"line_number":104,"context_line":"                session.flush()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":107,"context_line":"    def get_trust(self, trust_id):"},{"line_number":108,"context_line":"        session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Bu%2F4%3D","line":105,"updated":"2014-01-22 17:33:21.000000000","message":"What if \"ref.remaining_uses \u003d\u003d 0\" need to through any exception?","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"9c178264815dd3c46430abf8f958299c12712b07","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        setattr(ref, attr, getattr(new_ref, attr))"},{"line_number":103,"context_line":"                ref.extra \u003d new_ref.extra"},{"line_number":104,"context_line":"                session.flush()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":107,"context_line":"    def get_trust(self, trust_id):"},{"line_number":108,"context_line":"        session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2Busk%3D","line":105,"in_reply_to":"AAAAUH%2F%2Bu%2F4%3D","updated":"2014-01-22 18:45:43.000000000","message":"consume_use is not supposed to be called in that case, but I can add a check if you want to be extra cautious","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"7f49caf820e12c59062165276312971d1947b187","unresolved":false,"context_lines":[{"line_number":102,"context_line":"                        setattr(ref, attr, getattr(new_ref, attr))"},{"line_number":103,"context_line":"                ref.extra \u003d new_ref.extra"},{"line_number":104,"context_line":"                session.flush()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":107,"context_line":"    def get_trust(self, trust_id):"},{"line_number":108,"context_line":"        session \u003d self.get_session()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2BsnU%3D","line":105,"in_reply_to":"AAAAUH%2F%2Busk%3D","updated":"2014-01-24 15:32:52.000000000","message":"Yes, this code is done outside of a transaction.  It is possible the multiple access to the DB can lead to just that case,.","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4a3a98aa9903030c34ea1445f62707bc5c02679d","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        with session.begin():"},{"line_number":54,"context_line":"            ref \u003d TrustModel.from_dict(trust)"},{"line_number":55,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":56,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":57,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":58,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":59,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BEEo%3D","line":56,"updated":"2014-01-30 15:46:22.000000000","message":"I understand what this is doing, but it looks weird.  Is it really necessary?","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4a3a98aa9903030c34ea1445f62707bc5c02679d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"               filter_by(deleted_at\u003dNone)."},{"line_number":83,"context_line":"               filter_by(id\u003dtrust_id).first())"},{"line_number":84,"context_line":"        if ref is None:"},{"line_number":85,"context_line":"            return False"},{"line_number":86,"context_line":"        return ref.remaining_uses !\u003d 0"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BECw%3D","line":85,"updated":"2014-01-30 15:46:22.000000000","message":"The KVS backend raises a TrustNotFound here.  I think the behavior should be the same for both backends.","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"0393ecf7c87ba74eccebc9ecd30994c5c346c1cf","unresolved":false,"context_lines":[{"line_number":83,"context_line":"               filter_by(id\u003dtrust_id).first())"},{"line_number":84,"context_line":"        if ref is None:"},{"line_number":85,"context_line":"            return False"},{"line_number":86,"context_line":"        return ref.remaining_uses !\u003d 0"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":89,"context_line":"    def consume_use(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BKdk%3D","line":86,"updated":"2014-01-29 15:18:05.000000000","message":"return ref.remaining_uses \u003e 0","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"0393ecf7c87ba74eccebc9ecd30994c5c346c1cf","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":95,"context_line":"            if ref is None:"},{"line_number":96,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":97,"context_line":"            if ref.remaining_uses \u003d\u003d 0:"},{"line_number":98,"context_line":"                raise exception.TrustUseLimitReached()"},{"line_number":99,"context_line":"            if ref.remaining_uses \u003e 0:"},{"line_number":100,"context_line":"                old_dict \u003d ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BKdg%3D","line":97,"updated":"2014-01-29 15:18:05.000000000","message":"else block","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4a3a98aa9903030c34ea1445f62707bc5c02679d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            if ref.remaining_uses \u003d\u003d 0:"},{"line_number":98,"context_line":"                raise exception.TrustUseLimitReached()"},{"line_number":99,"context_line":"            if ref.remaining_uses \u003e 0:"},{"line_number":100,"context_line":"                old_dict \u003d ref.to_dict()"},{"line_number":101,"context_line":"                old_dict[\u0027remaining_uses\u0027] -\u003d 1"},{"line_number":102,"context_line":"                new_ref \u003d TrustModel.from_dict(old_dict)"},{"line_number":103,"context_line":"                for attr in TrustModel.attributes:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BD%2F0%3D","line":100,"updated":"2014-01-30 15:46:22.000000000","message":"Can\u0027t this block be simplified to:\n\n  ref.remaining_uses -\u003d 1\n  session.flush()\n\nI don\u0027t see what all the dictionary back and forth buys you...","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3ff0930d6dcdf01e1e11e76339fc1c1c1eb67894","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FWOc%3D","line":56,"updated":"2014-02-13 20:23:22.000000000","message":"Why can\u0027t we do this in the controller?","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2v4%3D","line":56,"updated":"2014-02-18 15:57:14.000000000","message":"this probably isn\u0027t behaving exactly like you\u0027re intending... use the native method instead:\n\n  ref.setdefault(\u0027remaining_uses\u0027, None)","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"291a109ea993ece72fcdf02049d45c47a927d9d3","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2BzN8%3D","line":56,"in_reply_to":"AAAAUX%2F%2B2v4%3D","updated":"2014-02-19 00:44:31.000000000","message":"++","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"a17b266de4c57fa25e339d2f8efb80494caaf4b0","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAU3%2F%2Fvgo%3D","line":56,"in_reply_to":"AAAAUX%2F%2B2v4%3D","updated":"2014-02-25 01:26:33.000000000","message":"it\u0027s a TrustModel, it hasn\u0027t got this method ... at least I am hitting errors when using setdefault","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"bef8509febc24baab77b27c89a38bc6eb194623f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FNMs%3D","line":56,"in_reply_to":"AAAAUX%2F%2FRiU%3D","updated":"2014-02-19 18:42:24.000000000","message":"Do it in the manager, not the controller.  Controller is for calling from the Web layer, manager is for common business logic.","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"033957eb342a5ba67796955c0b3a03626cb0a6df","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2FRiU%3D","line":56,"in_reply_to":"AAAAUX%2F%2FWOc%3D","updated":"2014-02-14 10:10:15.000000000","message":"Will move it there","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"291a109ea993ece72fcdf02049d45c47a927d9d3","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        trust_dict[\u0027roles\u0027] \u003d roles"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":78,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":79,"context_line":"        session \u003d db_session.get_session()"},{"line_number":80,"context_line":"        ref \u003d (session.query(TrustModel)."},{"line_number":81,"context_line":"               filter_by(deleted_at\u003dNone)."}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2BzN4%3D","line":78,"updated":"2014-02-19 00:44:31.000000000","message":"See other comment about this.","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"291a109ea993ece72fcdf02049d45c47a927d9d3","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        with session.begin():"},{"line_number":94,"context_line":"            ref \u003d (session.query(TrustModel)."},{"line_number":95,"context_line":"                   filter_by(deleted_at\u003dNone)."},{"line_number":96,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":97,"context_line":"            if ref is None:"},{"line_number":98,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":99,"context_line":"            if ref.remaining_uses is None:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2By%2FA%3D","line":96,"updated":"2014-02-19 00:44:31.000000000","message":"My Guess is this is not going to do exactly what you expect.  If there is latency (load, whatever) on accessing the db between the read and write the transaction wont save you from the race.\n\nIn this case it looks like you want to add in a .with_lockmode(\u0027update\u0027) before the filters.\n\nLets avoid issues with select / change / update / commit that could extend the life of a limited use trust.\n\nShould likely look something like:\n\n    ref \u003d (session.query(TrustModel).\n             with_lockmode(\u0027update\u0027).\n             filter_by(deleted_at\u003dNone).\n\t     filter_by(id\u003dtrust_id).first())\n\nIdeally a test case for this would be awesome, but I\u0027m not sure if we are setup to run concurrent transactions like this in testing.","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"a17b266de4c57fa25e339d2f8efb80494caaf4b0","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        with session.begin():"},{"line_number":94,"context_line":"            ref \u003d (session.query(TrustModel)."},{"line_number":95,"context_line":"                   filter_by(deleted_at\u003dNone)."},{"line_number":96,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":97,"context_line":"            if ref is None:"},{"line_number":98,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":99,"context_line":"            if ref.remaining_uses is None:"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAU3%2F%2FvPE%3D","line":96,"in_reply_to":"AAAAUX%2F%2By%2FA%3D","updated":"2014-02-25 01:26:33.000000000","message":"Thank you so much for this one, I was naively trusting session isolation would save me here.\nI don\u0027t see either how concurrent consumptions can be tested, any suggestions are welcome.","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c02224efaa17f529f67b811930dd6bbcecdb48e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FngE%3D","line":56,"updated":"2014-02-25 16:47:14.000000000","message":"could be done with: ref.setdefault(\u0027remaining_uses\u0027, None)","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"71010058e4e38a6429de6875a7773b05cab9cdf7","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2Fl2I%3D","line":56,"in_reply_to":"AAAAU3%2F%2FmDo%3D","updated":"2014-02-25 19:10:39.000000000","message":"if we do the change i suggested in core.py, then you can remove this chunk of code entirely","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"97d4a6964947a11953717d2235cba3372a544043","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            ref[\u0027id\u0027] \u003d trust_id"},{"line_number":54,"context_line":"            # making sure remaining_uses is set, unlimited use implied"},{"line_number":55,"context_line":"            if ref.get(\u0027remaining_uses\u0027) is None:"},{"line_number":56,"context_line":"                ref[\u0027remaining_uses\u0027] \u003d None"},{"line_number":57,"context_line":"            if ref.get(\u0027expires_at\u0027) and ref[\u0027expires_at\u0027].tzinfo is not None:"},{"line_number":58,"context_line":"                ref[\u0027expires_at\u0027] \u003d timeutils.normalize_time(ref[\u0027expires_at\u0027])"},{"line_number":59,"context_line":"            session.add(ref)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FmDo%3D","line":56,"in_reply_to":"AAAAU3%2F%2FngE%3D","updated":"2014-02-25 18:55:24.000000000","message":"Weird, I hit an error when I do this. ref is a TrustModel object and doesn\u0027t seem to have this method (would be cool if it did though) ? Or am I doing something wrong ?","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c9fe8211488803a48e259a3b59dd7df0b477721a","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":85,"context_line":"            if ref is None:"},{"line_number":86,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":87,"context_line":"            if ref.remaining_uses is None:"},{"line_number":88,"context_line":"                #unlimited uses, do nothing"},{"line_number":89,"context_line":"                session.flush()"},{"line_number":90,"context_line":"            elif ref.remaining_uses \u003c\u003d 0:"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FnXc%3D","line":87,"updated":"2014-02-25 16:58:13.000000000","message":"(NIT): so, here we have a difference between the logic in the kvs backend and the sql backend. In kvs we are doing the following: \n\n1.) check if trust has remaining uses greater than 0, if so decrement remaining uses and return 2.) check if remaining uses is None, which means remaining uses is unlimited 3.) lastly raise an error because the value of trust is not a positive number and not None. \n\nBut in SQL we are doing the opposite:\n\n1.) first we check if remaining uses is None, if so we just return because remaining uses is unlimited 2.) then we check if remaining uses is less than 0, and throw an exception (this was handled in the else in the KVS backend) 3.) last case if trust.remaining_uses is not None and it\u0027s not less than zero it must be valid. \n\n\nBoth of the above carry out the desired behavior but it would be nice they were the same logic and standardized such that both do the following (for example): \n\n1.) Check if remaining uses is None, if so return because we have unlimited trust use 2.) Check if remaining uses is a positive number, if so consume a use and return 3.) throw a TrustUseLimitReached error since trust.remaining_uses is neither None or a positive int.","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"97d4a6964947a11953717d2235cba3372a544043","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                   filter_by(id\u003dtrust_id).first())"},{"line_number":85,"context_line":"            if ref is None:"},{"line_number":86,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":87,"context_line":"            if ref.remaining_uses is None:"},{"line_number":88,"context_line":"                #unlimited uses, do nothing"},{"line_number":89,"context_line":"                session.flush()"},{"line_number":90,"context_line":"            elif ref.remaining_uses \u003c\u003d 0:"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FmC4%3D","line":87,"in_reply_to":"AAAAU3%2F%2FnXc%3D","updated":"2014-02-25 18:55:24.000000000","message":"Understood, and agreed","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"55a22aa0fd41fbe8c14f44968405e8d1d71e20d8","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":84,"context_line":"            if ref.remaining_uses \u003e 0:"},{"line_number":85,"context_line":"                ref.remaining_uses -\u003d 1"},{"line_number":86,"context_line":"                session.flush()"},{"line_number":87,"context_line":"            elif ref.remaining_uses is None:"},{"line_number":88,"context_line":"                # unlimited uses, do nothing"},{"line_number":89,"context_line":"                session.flush()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FcEg%3D","line":86,"updated":"2014-02-26 16:32:04.000000000","message":"Doesn\u0027t the context manager automatically flush?","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bfeb13ef58c1eade807924d870fd29eb0ceffc2","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":84,"context_line":"            if ref.remaining_uses \u003e 0:"},{"line_number":85,"context_line":"                ref.remaining_uses -\u003d 1"},{"line_number":86,"context_line":"                session.flush()"},{"line_number":87,"context_line":"            elif ref.remaining_uses is None:"},{"line_number":88,"context_line":"                # unlimited uses, do nothing"},{"line_number":89,"context_line":"                session.flush()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FZxc%3D","line":86,"in_reply_to":"AAAAU3%2F%2FcEg%3D","updated":"2014-02-26 20:52:11.000000000","message":"yes, it does","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bfeb13ef58c1eade807924d870fd29eb0ceffc2","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                session.flush()"},{"line_number":87,"context_line":"            elif ref.remaining_uses is None:"},{"line_number":88,"context_line":"                # unlimited uses, do nothing"},{"line_number":89,"context_line":"                session.flush()"},{"line_number":90,"context_line":"            else:"},{"line_number":91,"context_line":"                raise exception.TrustUseLimitReached(trust_id)"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FZtA%3D","line":89,"updated":"2014-02-26 20:52:11.000000000","message":"we still need the conditional here, because there will be trusts whose remaining_uses is set to None. \nIf we remove session.flush from here, we can pass instead.","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":84,"context_line":"            if ref.remaining_uses \u003e 0:"},{"line_number":85,"context_line":"                ref.remaining_uses -\u003d 1"},{"line_number":86,"context_line":"            elif ref.remaining_uses is None:"},{"line_number":87,"context_line":"                # unlimited uses, do nothing"},{"line_number":88,"context_line":"                pass"},{"line_number":89,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2ByE%3D","line":86,"updated":"2014-02-27 01:37:43.000000000","message":"do this check first rather than relying on obscure behavior.","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                # unlimited uses, do nothing"},{"line_number":88,"context_line":"                pass"},{"line_number":89,"context_line":"            else:"},{"line_number":90,"context_line":"                raise exception.TrustUseLimitReached(trust_id)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":93,"context_line":"    def get_trust(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2Bx0%3D","line":90,"updated":"2014-02-27 01:37:43.000000000","message":"change \"trust_id\" to \"trust_id\u003dtrust_id\"","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5e04c54aa83cd77758313473fd57a07f2ea6a22b","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            else:"},{"line_number":90,"context_line":"                raise exception.TrustUseLimitReached(trust_id)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":93,"context_line":"    def get_trust(self, trust_id):"},{"line_number":94,"context_line":"        session \u003d db_session.get_session()"},{"line_number":95,"context_line":"        ref \u003d (session.query(TrustModel)."}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F%2Bxk%3D","line":92,"updated":"2014-02-27 01:37:43.000000000","message":"how is get_trust going to have a conflict?","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e50e986a5198032872dbf4c1155ceb8036ab809c","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            else:"},{"line_number":90,"context_line":"                raise exception.TrustUseLimitReached(trust_id\u003dtrust_id)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":93,"context_line":"    def get_trust(self, trust_id):"},{"line_number":94,"context_line":"        session \u003d db_session.get_session()"},{"line_number":95,"context_line":"        ref \u003d (session.query(TrustModel)."}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F5N0%3D","line":92,"updated":"2014-02-27 15:04:03.000000000","message":"Brant had a good question about this in a previous review and I didn\u0027t see if there was an answer. What conflict can happen here?","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"7a6e5530beb1206ec97972c5987d86bd719b0077","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            else:"},{"line_number":90,"context_line":"                raise exception.TrustUseLimitReached(trust_id\u003dtrust_id)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":93,"context_line":"    def get_trust(self, trust_id):"},{"line_number":94,"context_line":"        session \u003d db_session.get_session()"},{"line_number":95,"context_line":"        ref \u003d (session.query(TrustModel)."}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F47E%3D","line":92,"in_reply_to":"AAAAVX%2F%2F5N0%3D","updated":"2014-02-27 15:42:42.000000000","message":"A good question indeed, I took it as it was from the master, assuming there was a good reason for that ... shoud I remove it ?","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"fa427162fa765703fffb67d7a95574fb7417aa88","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            else:"},{"line_number":90,"context_line":"                raise exception.TrustUseLimitReached(trust_id\u003dtrust_id)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":93,"context_line":"    def get_trust(self, trust_id):"},{"line_number":94,"context_line":"        session \u003d db_session.get_session()"},{"line_number":95,"context_line":"        ref \u003d (session.query(TrustModel)."}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVX%2F%2Ftyw%3D","line":92,"updated":"2014-03-03 01:17:08.000000000","message":"how is get_trust going to have a conflict? Is there a test for it?","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            else:"},{"line_number":90,"context_line":"                raise exception.TrustUseLimitReached(trust_id\u003dtrust_id)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":93,"context_line":"    def get_trust(self, trust_id):"},{"line_number":94,"context_line":"        session \u003d db_session.get_session()"},{"line_number":95,"context_line":"        ref \u003d (session.query(TrustModel)."}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F5Ck%3D","line":92,"in_reply_to":"AAAAVX%2F%2Ftyw%3D","updated":"2014-03-03 16:06:59.000000000","message":"++ remove handle_conflict() -- it shouldn\u0027t be possible here","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"196ea19e3217de5995779aeda1bedb0ad901128f","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            else:"},{"line_number":90,"context_line":"                raise exception.TrustUseLimitReached(trust_id\u003dtrust_id)"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027trust\u0027)"},{"line_number":93,"context_line":"    def get_trust(self, trust_id):"},{"line_number":94,"context_line":"        session \u003d db_session.get_session()"},{"line_number":95,"context_line":"        ref \u003d (session.query(TrustModel)."}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F4w4%3D","line":92,"in_reply_to":"AAAAVn%2F%2F5Ck%3D","updated":"2014-03-03 17:24:16.000000000","message":"No prob - it was in master so I didn\u0027t really pay attention to this.","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"}],"keystone/trust/controllers.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9431c85e8a7b0411a8b2408ae8c96e1d65121ae3","unresolved":false,"context_lines":[{"line_number":168,"context_line":"                                           (trust[\u0027expires_at\u0027]))"},{"line_number":169,"context_line":"                except ValueError:"},{"line_number":170,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":171,"context_line":"            if trust.get(\u0027remaining_uses\u0027) and trust[\u0027remaining_uses\u0027] \u003c 0:"},{"line_number":172,"context_line":"                raise exception.InvalidTrustRemainingUsesValue()"},{"line_number":173,"context_line":"            new_trust \u003d self.trust_api.create_trust("},{"line_number":174,"context_line":"                trust_id\u003duuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAUH%2F%2BomI%3D","line":171,"updated":"2014-01-23 17:47:21.000000000","message":"i\u0027m tempted to say \u003c\u003d 0 too. as I don\u0027t see a use case for setting remaining_uses to 0.","commit_id":"90242b1c33de6955601cf187838ad31d2408f1a1"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"            if trust.get(\u0027remaining_uses\u0027) and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":173,"context_line":"                raise exception.InvalidTrustRemainingUsesValue()"},{"line_number":174,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":175,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"},{"line_number":176,"context_line":"                                                    trust,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2vU%3D","line":173,"updated":"2014-02-18 15:57:14.000000000","message":"should be a ValidationError\n\ndo the rest of this work in the manager layer:\n\n  trust.setdefault(\u0027remaining_uses\u0027, None)\n  etc","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"a17b266de4c57fa25e339d2f8efb80494caaf4b0","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"            if trust.get(\u0027remaining_uses\u0027) and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":173,"context_line":"                raise exception.InvalidTrustRemainingUsesValue()"},{"line_number":174,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":175,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"},{"line_number":176,"context_line":"                                                    trust,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAU3%2F%2Fwsw%3D","line":173,"in_reply_to":"AAAAUX%2F%2B2vU%3D","updated":"2014-02-25 01:26:33.000000000","message":"Done for ValidationError\n\nI am not sure I get what you mean in the rest of the comment. Could you clarify a bit ?","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"55a22aa0fd41fbe8c14f44968405e8d1d71e20d8","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                except ValueError:"},{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if trust.get(\u0027remaining_uses\u0027) and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":165,"context_line":"                msg \u003d \u0027remaining_uses must be a positive integer or null.\u0027"},{"line_number":166,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":167,"context_line":"            trust_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FcCY%3D","line":164,"updated":"2014-02-26 16:32:04.000000000","message":"A more ideamatic what to do this would be:\n \n    if \u0027remaining_uses\u0027 in trust and trust[\u0027remaining_uses\u0027] \u003c\u003d 0\n\nor storing the result of .get()","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9bfeb13ef58c1eade807924d870fd29eb0ceffc2","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                except ValueError:"},{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if trust.get(\u0027remaining_uses\u0027) and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":165,"context_line":"                msg \u003d \u0027remaining_uses must be a positive integer or null.\u0027"},{"line_number":166,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":167,"context_line":"            trust_id \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FZxg%3D","line":164,"in_reply_to":"AAAAU3%2F%2FcCY%3D","updated":"2014-02-26 20:52:11.000000000","message":"Done","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cfab4fd8f471c0131f10b6f5de3342728e6218e4","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if \u0027remaining_uses\u0027 in trust and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":165,"context_line":"                msg \u003d \u0027remaining_uses must be a positive integer or null.\u0027"},{"line_number":166,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":167,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":168,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAU3%2F%2FZHg%3D","line":165,"updated":"2014-02-26 21:39:06.000000000","message":"does msg have to be wrapped in ()? \n\n     msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"16ec19cc3f6124bf7234544622cc289a8fe635c8","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if \u0027remaining_uses\u0027 in trust and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":165,"context_line":"                msg \u003d \u0027remaining_uses must be a positive integer or null.\u0027"},{"line_number":166,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":167,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":168,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F7L8%3D","line":165,"in_reply_to":"AAAAU3%2F%2FZHg%3D","updated":"2014-02-27 10:41:06.000000000","message":"I\u0027ll remove it, there\u0027s the exact same test and (localized) exception in the manager already","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2330aeafab3c1eb6e82af72ac3d21116c836fbcb","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if \u0027remaining_uses\u0027 in trust and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":165,"context_line":"                msg \u003d \u0027remaining_uses must be a positive integer or null.\u0027"},{"line_number":166,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":167,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":168,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAU3%2F%2FZDw%3D","line":165,"in_reply_to":"AAAAU3%2F%2FZHg%3D","updated":"2014-02-26 21:44:43.000000000","message":"Nice catch!","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4f89235afb51ea942bf1f6d72cd6b9098c5a7619","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if \u0027remaining_uses\u0027 in trust and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":165,"context_line":"                msg \u003d \u0027remaining_uses must be a positive integer or null.\u0027"},{"line_number":166,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":167,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":168,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F3w0%3D","line":165,"in_reply_to":"AAAAVX%2F%2F5KI%3D","updated":"2014-02-27 17:16:14.000000000","message":"++ we are validating other things here right?","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"ea9c5e66d88c5ed27f07c6969cbbe7ea0b5b6f9d","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if \u0027remaining_uses\u0027 in trust and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":165,"context_line":"                msg \u003d \u0027remaining_uses must be a positive integer or null.\u0027"},{"line_number":166,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":167,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":168,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAVX%2F%2F5KI%3D","line":165,"in_reply_to":"AAAAVX%2F%2F7L8%3D","updated":"2014-02-27 15:03:17.000000000","message":"Does the validation not belong in here?","commit_id":"5592fdf298032cac75ad25ec927e30bc9fe54784"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e50e986a5198032872dbf4c1155ceb8036ab809c","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                                           (trust[\u0027expires_at\u0027]))"},{"line_number":161,"context_line":"                except ValueError:"},{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":165,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"},{"line_number":166,"context_line":"                                                    trust,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F5cE%3D","line":163,"updated":"2014-02-27 15:04:03.000000000","message":"Remove the added whitespace","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"7a6e5530beb1206ec97972c5987d86bd719b0077","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                                           (trust[\u0027expires_at\u0027]))"},{"line_number":161,"context_line":"                except ValueError:"},{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            trust_id \u003d uuid.uuid4().hex"},{"line_number":165,"context_line":"            new_trust \u003d self.trust_api.create_trust(trust_id,"},{"line_number":166,"context_line":"                                                    trust,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAVX%2F%2F4%2BQ%3D","line":163,"in_reply_to":"AAAAVX%2F%2F5cE%3D","updated":"2014-02-27 15:42:42.000000000","message":"Done","commit_id":"7d013c921d4a94c0100c852a3d9de4fea4932574"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":"            trust.setdefault(\u0027remaining_uses\u0027, None)"},{"line_number":164,"context_line":"            if trust[\u0027remaining_uses\u0027] is not None:"},{"line_number":165,"context_line":"                if trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":166,"context_line":"                    msg \u003d _("},{"line_number":167,"context_line":"                        \u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":168,"context_line":"                    raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F4%2Bg%3D","line":165,"updated":"2014-03-03 16:06:59.000000000","message":"you\u0027re not actually testing that it\u0027s a positive integer (what does it mean if i set remaining_uses\u003d1.2 ?)\n\n  if trust[\u0027remaining_uses\u0027] is not None and (\n        not isinstance(trust[\u0027remaining_uses\u0027], int)\n        or trust[\u0027remaining_uses\u0027] \u003c\u003d 0):\n    msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)\n    raise exception.ValidationError(msg)","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"196ea19e3217de5995779aeda1bedb0ad901128f","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                    raise exception.ValidationTimeStampError()"},{"line_number":163,"context_line":"            trust.setdefault(\u0027remaining_uses\u0027, None)"},{"line_number":164,"context_line":"            if trust[\u0027remaining_uses\u0027] is not None:"},{"line_number":165,"context_line":"                if trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":166,"context_line":"                    msg \u003d _("},{"line_number":167,"context_line":"                        \u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":168,"context_line":"                    raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F4e8%3D","line":165,"in_reply_to":"AAAAVn%2F%2F4%2Bg%3D","updated":"2014-03-03 17:24:16.000000000","message":"Done","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"}],"keystone/trust/core.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"4a3a98aa9903030c34ea1445f62707bc5c02679d","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        raise exception.NotImplemented()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @abc.abstractmethod"},{"line_number":101,"context_line":"    def consume_use(self, trust_id):"},{"line_number":102,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAUH%2F%2BD8c%3D","line":101,"updated":"2014-01-30 15:46:22.000000000","message":"This reads funny to me.  I think just \u0027consume\u0027 would be good, but I\u0027d like to hear what others think.","commit_id":"dbb151091ecf619dc875050d023bef9acd14efab"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7999da24b97bfc8c397b56657201a8f8051a8581","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @abc.abstractmethod"},{"line_number":95,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":96,"context_line":"        raise exception.NotImplemented()"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @abc.abstractmethod"},{"line_number":99,"context_line":"    def consume_use(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAUX%2F%2B2q0%3D","line":96,"updated":"2014-02-18 15:57:14.000000000","message":"remove this from the driver interface","commit_id":"ec10f9f15f3ce588c6223dceb00e750b1e7477f8"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c02224efaa17f529f67b811930dd6bbcecdb48e","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    def __init__(self):"},{"line_number":45,"context_line":"        super(Manager, self).__init__(CONF.trust.driver)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @notifications.created(_TRUST)"},{"line_number":48,"context_line":"    def create_trust(self, trust_id, trust, roles):"},{"line_number":49,"context_line":"        \"\"\"Create a new trust."},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FndU%3D","line":47,"updated":"2014-02-25 16:47:14.000000000","message":"you can put: \n\n  trust.setdefault(\u0027remaining_uses\u0027, None)\n\nand \n\n  if trust.get(\u0027remaining_uses\u0027) and trust[\u0027remaining_uses\u0027] \u003c\u003d 0:\n    msg \u003d _()\n    raise exception.ValidatorError(msg)\n\nhere","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9c02224efaa17f529f67b811930dd6bbcecdb48e","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        self.driver.delete_trust(trust_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":64,"context_line":"        \"\"\"Test a trust for remaining uses."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :returns: True if the trust has available uses, False otherwise"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FneY%3D","line":63,"updated":"2014-02-25 16:47:14.000000000","message":"i doubt this is ever called?","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"71010058e4e38a6429de6875a7773b05cab9cdf7","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        self.driver.delete_trust(trust_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":64,"context_line":"        \"\"\"Test a trust for remaining uses."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :returns: True if the trust has available uses, False otherwise"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2Fl2c%3D","line":63,"in_reply_to":"AAAAU3%2F%2FmGo%3D","updated":"2014-02-25 19:10:39.000000000","message":"then it should probably be moved to tests","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"97d4a6964947a11953717d2235cba3372a544043","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\""},{"line_number":61,"context_line":"        self.driver.delete_trust(trust_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":64,"context_line":"        \"\"\"Test a trust for remaining uses."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :returns: True if the trust has available uses, False otherwise"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FmGo%3D","line":63,"in_reply_to":"AAAAU3%2F%2FneY%3D","updated":"2014-02-25 18:55:24.000000000","message":"This is called in tests only now.","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"c9fe8211488803a48e259a3b59dd7df0b477721a","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def has_remaining_uses(self, trust_id):"},{"line_number":64,"context_line":"        \"\"\"Test a trust for remaining uses."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        :returns: True if the trust has available uses, False otherwise"},{"line_number":67,"context_line":"        :raises: keystone.exception.TrustNotFound"},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        trust \u003d self.driver.get_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAU3%2F%2FnV8%3D","line":66,"updated":"2014-02-25 16:58:13.000000000","message":"if this is kept, can the docstrings be updated to include the parameters?","commit_id":"8c6e135b72f596d558cd0139e87f268e3fdf20e5"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"55a22aa0fd41fbe8c14f44968405e8d1d71e20d8","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        :returns: a new trust"},{"line_number":52,"context_line":"        \"\"\""},{"line_number":53,"context_line":"        trust.setdefault(\u0027remaining_uses\u0027, None)"},{"line_number":54,"context_line":"        if trust[\u0027remaining_uses\u0027] is not None:"},{"line_number":55,"context_line":"            if trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":56,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAU3%2F%2FcCA%3D","line":53,"updated":"2014-02-26 16:32:04.000000000","message":"nice","commit_id":"90efcc27ab7fb651cee6d166ed1afd9c5cd67561"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0e63dcab5478a1358eb731dd42ca81c20b7979d8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        if trust[\u0027remaining_uses\u0027] is not None:"},{"line_number":55,"context_line":"            if trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":56,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":57,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":58,"context_line":"        return self.driver.create_trust(trust_id, trust, roles)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @notifications.deleted(_TRUST)"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAVX%2F%2F3wA%3D","line":57,"updated":"2014-02-27 17:17:52.000000000","message":"Shouldn\u0027t this validation live in the controller?","commit_id":"d934792c3cde07f4871b728431d00d3eec34c677"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"4373da9f022569ae38e1fee9ca4f2ae0bf7a5465","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        if trust[\u0027remaining_uses\u0027] is not None:"},{"line_number":55,"context_line":"            if trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":56,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":57,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":58,"context_line":"        return self.driver.create_trust(trust_id, trust, roles)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @notifications.deleted(_TRUST)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVX%2F%2F2m0%3D","line":57,"updated":"2014-02-27 20:15:55.000000000","message":"This can probably be removed now that it is in the controller.","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        if trust[\u0027remaining_uses\u0027] is not None:"},{"line_number":55,"context_line":"            if trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":56,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":57,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":58,"context_line":"        return self.driver.create_trust(trust_id, trust, roles)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @notifications.deleted(_TRUST)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F48w%3D","line":57,"in_reply_to":"AAAAVX%2F%2F2m0%3D","updated":"2014-03-03 16:06:59.000000000","message":"i think it should be here, and not in the controller","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"196ea19e3217de5995779aeda1bedb0ad901128f","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        if trust[\u0027remaining_uses\u0027] is not None:"},{"line_number":55,"context_line":"            if trust[\u0027remaining_uses\u0027] \u003c\u003d 0:"},{"line_number":56,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":57,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":58,"context_line":"        return self.driver.create_trust(trust_id, trust, roles)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    @notifications.deleted(_TRUST)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F4NQ%3D","line":57,"in_reply_to":"AAAAVn%2F%2F48w%3D","updated":"2014-03-03 17:24:16.000000000","message":"Done","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"c3808155d4c0f71ba795f77e2e85f8a38dbc897d","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        raise exception.NotImplemented()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @abc.abstractmethod"},{"line_number":101,"context_line":"    def consume_use(self, trust_id):"},{"line_number":102,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F48g%3D","line":101,"updated":"2014-03-03 16:06:59.000000000","message":"obviously the documentation for this driver is completely lacking, but this method especially needs to be documented here, as it\u0027s implementation is completely unique","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":7186,"name":"Matthieu Huin","email":"mhuin@redhat.com","username":"mhu"},"change_message_id":"196ea19e3217de5995779aeda1bedb0ad901128f","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        raise exception.NotImplemented()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    @abc.abstractmethod"},{"line_number":101,"context_line":"    def consume_use(self, trust_id):"},{"line_number":102,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAVn%2F%2F4RU%3D","line":101,"in_reply_to":"AAAAVn%2F%2F48g%3D","updated":"2014-03-03 17:24:16.000000000","message":"Done","commit_id":"cd05b09870fa987acfbf4654c877fd97c33fa0d2"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"2ac9ed2798185fb1d7682d200fa055661b3e0422","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        \"\"\""},{"line_number":53,"context_line":"        trust.setdefault(\u0027remaining_uses\u0027, None)"},{"line_number":54,"context_line":"        if trust[\u0027remaining_uses\u0027] is not None:"},{"line_number":55,"context_line":"            if (trust[\u0027remaining_uses\u0027] \u003c\u003d 0) or\\"},{"line_number":56,"context_line":"               (not isinstance(trust[\u0027remaining_uses\u0027], int)):"},{"line_number":57,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":58,"context_line":"                raise exception.ValidationError(msg)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0sM%3D","line":55,"updated":"2014-03-03 22:52:57.000000000","message":"the backslash line continuation police are going to remove that in  favor of extra outer parens :)","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"1aaaad7ecaf799d511e66eb4c9b4847fcaacee6f","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        \"\"\"Consume one use when a trust was created with a limitation on its"},{"line_number":104,"context_line":"        uses, provided there are still uses available."},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        :raises: keystone.exception.TrustUseLimitReached"},{"line_number":107,"context_line":"        \"\"\""},{"line_number":108,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAVn%2F%2F0c8%3D","line":106,"updated":"2014-03-03 23:24:15.000000000","message":"also raises TrustNotFound.","commit_id":"120d485a020ea3cd698958b970c0e081f4d72c04"}]}
