)]}'
{"keystone/common/config.py":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"5f2ec65e4cc7d654de0499a2801dd529f0bef708","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                         \u0027optionally disabled.\u0027),"},{"line_number":219,"context_line":"        cfg.BoolOpt(\u0027allow_redelegation\u0027, default\u003dFalse,"},{"line_number":220,"context_line":"                    help\u003d\u0027Redelegation feature can be \u0027"},{"line_number":221,"context_line":"                         \u0027optionally enabled.\u0027),"},{"line_number":222,"context_line":"        cfg.IntOpt(\u0027max_redelegation_count\u0027, default\u003d3,"},{"line_number":223,"context_line":"                   help\u003d\u0027Maximum depth of trust redelegation.\u0027),"},{"line_number":224,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aa7fdbe_8ac85fa9","line":221,"updated":"2014-10-24 13:27:36.000000000","message":"I was hoping that redelegation would be enabled by default, but that creating a trust would require a specific flag to enable it per-trust.\n\nGlobally disabling it by default will make it harder for projects such as Heat/Solum/Murano to consume it, because chances are most deployers won\u0027t switch it on.","commit_id":"310ec5315089c8efd6b9abbf80eee4852aa0e7d2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8f84aec68567df2bac466d803960d38baf0237f6","unresolved":false,"context_lines":[{"line_number":217,"context_line":"                    help\u003d\u0027Delegation and impersonation features can be \u0027"},{"line_number":218,"context_line":"                         \u0027optionally disabled.\u0027),"},{"line_number":219,"context_line":"        cfg.BoolOpt(\u0027allow_redelegation\u0027, default\u003dFalse,"},{"line_number":220,"context_line":"                    help\u003d\u0027Redelegation feature can be \u0027"},{"line_number":221,"context_line":"                         \u0027optionally enabled.\u0027),"},{"line_number":222,"context_line":"        cfg.IntOpt(\u0027max_redelegation_count\u0027, default\u003d3,"},{"line_number":223,"context_line":"                   help\u003d\u0027Maximum depth of trust redelegation.\u0027),"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_4bfc86b8","line":220,"updated":"2014-10-27 21:25:40.000000000","message":"This is really describing a boolean option and not what the option does.","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"}],"keystone/tests/test_v3_auth.py":[{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"ee488320d871c470fd95b603c5e95489d6936143","unresolved":false,"context_lines":[{"line_number":3069,"context_line":"                         self.project[\u0027name\u0027])"},{"line_number":3070,"context_line":""},{"line_number":3071,"context_line":"    def test_impersonation_token_cannot_create_new_trust(self):"},{"line_number":3072,"context_line":"        self.skipTest(\"Redelegation implemented\")"},{"line_number":3073,"context_line":"        ref \u003d self.new_trust_ref("},{"line_number":3074,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":3075,"context_line":"            trustee_user_id\u003dself.trustee_user_id,"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_a2537c15","line":3072,"updated":"2014-10-16 10:15:25.000000000","message":"redelegation should be disabled by default, e.g this test should still work, so can we remove the skip?","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"ee488320d871c470fd95b603c5e95489d6936143","unresolved":false,"context_lines":[{"line_number":3326,"context_line":"            expected_status\u003d204)"},{"line_number":3327,"context_line":"        headers \u003d {\u0027X-Subject-Token\u0027: trust_token2}"},{"line_number":3328,"context_line":"        self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d404)"},{"line_number":3329,"context_line":"        self.assertTrustTokensRevoked(trust_id)"},{"line_number":3330,"context_line":""},{"line_number":3331,"context_line":"    def disable_user(self, user):"},{"line_number":3332,"context_line":"        user[\u0027enabled\u0027] \u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_62b3544d","line":3329,"updated":"2014-10-16 10:15:25.000000000","message":"Do we also need to test that creating a new token via trust2 doesn\u0027t work?","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"22cb7ea509384b40c8bb3f34888056538a1b02aa","unresolved":false,"context_lines":[{"line_number":2839,"context_line":"        role \u003d self.new_role_ref()"},{"line_number":2840,"context_line":"        self.assignment_api.create_role(role[\u0027id\u0027], role)"},{"line_number":2841,"context_line":""},{"line_number":2842,"context_line":"        # assign a new role to the user"},{"line_number":2843,"context_line":"        grant_url \u003d ("},{"line_number":2844,"context_line":"            \u0027/projects/%(project_id)s/users/%(user_id)s/\u0027"},{"line_number":2845,"context_line":"            \u0027roles/%(role_id)s\u0027 % {"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aa7fdbe_37344e49","line":2842,"updated":"2014-10-24 13:01:38.000000000","message":"\"assign a new role to the trustor\"","commit_id":"310ec5315089c8efd6b9abbf80eee4852aa0e7d2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8f84aec68567df2bac466d803960d38baf0237f6","unresolved":false,"context_lines":[{"line_number":2593,"context_line":""},{"line_number":2594,"context_line":""},{"line_number":2595,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":2596,"context_line":"class TestTrustRedelegation(test_v3.RestfulTestCase):"},{"line_number":2597,"context_line":"    \"\"\"Redelegation valid and secure"},{"line_number":2598,"context_line":""},{"line_number":2599,"context_line":"    Redelegation is a hierarchical structure of trusts between initial trustor"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_8b9e6e61","line":2596,"updated":"2014-10-27 21:25:40.000000000","message":"It would be nice to break this up into multiple classes. The setUp appears to create lots of objects that are only used in some of the tests.","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8f84aec68567df2bac466d803960d38baf0237f6","unresolved":false,"context_lines":[{"line_number":2740,"context_line":"            expires\u003ddict(minutes\u003d10),"},{"line_number":2741,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2742,"context_line":""},{"line_number":2743,"context_line":"    def assertUserAuthenticate(self, user):"},{"line_number":2744,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2745,"context_line":"            user_id\u003duser[\u0027id\u0027],"},{"line_number":2746,"context_line":"            password\u003duser[\u0027password\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_cb8b161d","line":2743,"updated":"2014-10-27 21:25:40.000000000","message":"Any reason the camel case these?","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"15aaf8a38ef05bc9610fbd393d88db01d00546e1","unresolved":false,"context_lines":[{"line_number":2740,"context_line":"            expires\u003ddict(minutes\u003d10),"},{"line_number":2741,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2742,"context_line":""},{"line_number":2743,"context_line":"    def assertUserAuthenticate(self, user):"},{"line_number":2744,"context_line":"        auth_data \u003d self.build_authentication_request("},{"line_number":2745,"context_line":"            user_id\u003duser[\u0027id\u0027],"},{"line_number":2746,"context_line":"            password\u003duser[\u0027password\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_1dba8e0a","line":2743,"in_reply_to":"9aa7fdbe_cb8b161d","updated":"2014-10-29 13:15:54.000000000","message":"Actually, no reason - just inherited it from TestTrustAuth. Agree to correct it.","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"99dd9a48d00e9b76e88effb184fb7a4daa5f1390","unresolved":false,"context_lines":[{"line_number":2632,"context_line":"            revoke_by_id\u003dFalse)"},{"line_number":2633,"context_line":"        self.config_fixture.config("},{"line_number":2634,"context_line":"            debug\u003dTrue"},{"line_number":2635,"context_line":"        )"},{"line_number":2636,"context_line":"        self.config_fixture.config("},{"line_number":2637,"context_line":"            group\u003d\u0027trust\u0027,"},{"line_number":2638,"context_line":"            enabled\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_b9067884","line":2635,"updated":"2014-12-11 03:53:52.000000000","message":"Do we really need this debug config?","commit_id":"cacff3e4bb4d7a38f03bc23d9834da5901c2d28d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"99dd9a48d00e9b76e88effb184fb7a4daa5f1390","unresolved":false,"context_lines":[{"line_number":2678,"context_line":"            expires\u003ddict(minutes\u003d10),"},{"line_number":2679,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2680,"context_line":""},{"line_number":2681,"context_line":"    def test_depleted_redelegation_count_error(self):"},{"line_number":2682,"context_line":"        ref \u003d dict(self.redelegated_trust_ref,"},{"line_number":2683,"context_line":"                   redelegation_count\u003d0)"},{"line_number":2684,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_99bffca9","line":2681,"updated":"2014-12-11 03:53:52.000000000","message":"s/depleted/deleted","commit_id":"cacff3e4bb4d7a38f03bc23d9834da5901c2d28d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"f9421b980eec919e7019345ab42491f243c6b51e","unresolved":false,"context_lines":[{"line_number":2678,"context_line":"            expires\u003ddict(minutes\u003d10),"},{"line_number":2679,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2680,"context_line":""},{"line_number":2681,"context_line":"    def test_depleted_redelegation_count_error(self):"},{"line_number":2682,"context_line":"        ref \u003d dict(self.redelegated_trust_ref,"},{"line_number":2683,"context_line":"                   redelegation_count\u003d0)"},{"line_number":2684,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_1c105aa7","line":2681,"in_reply_to":"3a961159_99bffca9","updated":"2014-12-11 04:54:22.000000000","message":"Well, maybe you want depleted here :)\nSorry, my fault","commit_id":"cacff3e4bb4d7a38f03bc23d9834da5901c2d28d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"99dd9a48d00e9b76e88effb184fb7a4daa5f1390","unresolved":false,"context_lines":[{"line_number":2749,"context_line":"                  token\u003dtrust_token,"},{"line_number":2750,"context_line":"                  expected_status\u003d403)"},{"line_number":2751,"context_line":""},{"line_number":2752,"context_line":"    def test_redelegation_remaining_uses(self):"},{"line_number":2753,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2754,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2755,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_3928c8e1","line":2752,"updated":"2014-12-11 03:53:52.000000000","message":"I think you should either rename the method to reflect what\u0027s being testes or add a documentation here clarifying what you want to test.","commit_id":"cacff3e4bb4d7a38f03bc23d9834da5901c2d28d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"99dd9a48d00e9b76e88effb184fb7a4daa5f1390","unresolved":false,"context_lines":[{"line_number":2915,"context_line":"            revoke_by_id\u003dFalse)"},{"line_number":2916,"context_line":"        self.config_fixture.config("},{"line_number":2917,"context_line":"            debug\u003dTrue"},{"line_number":2918,"context_line":"        )"},{"line_number":2919,"context_line":"        self.config_fixture.config("},{"line_number":2920,"context_line":"            group\u003d\u0027trust\u0027,"},{"line_number":2921,"context_line":"            enabled\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_b962f83b","line":2918,"updated":"2014-12-11 03:53:52.000000000","message":"Same as line 2635.\nDo we really need this debug config?","commit_id":"cacff3e4bb4d7a38f03bc23d9834da5901c2d28d"},{"author":{"_account_id":9142,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@lsd.ufcg.edu.br","username":"samuel-z","inactive":true},"change_message_id":"99dd9a48d00e9b76e88effb184fb7a4daa5f1390","unresolved":false,"context_lines":[{"line_number":2926,"context_line":"    def setUp(self):"},{"line_number":2927,"context_line":"        super(TestTrustChain, self).setUp()"},{"line_number":2928,"context_line":""},{"line_number":2929,"context_line":"        # create trust chain"},{"line_number":2930,"context_line":"        self.user_chain \u003d list()"},{"line_number":2931,"context_line":"        self.trust_chain \u003d list()"},{"line_number":2932,"context_line":"        for _ in xrange(3):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_7975f0f8","line":2929,"updated":"2014-12-11 03:53:52.000000000","message":"Make comments style consistent over your patch.\nPut uppercase letter in the beginning of sentences :)","commit_id":"cacff3e4bb4d7a38f03bc23d9834da5901c2d28d"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"a77ff13ffb6efb1fa5460dff774f2ed7da85c6e0","unresolved":false,"context_lines":[{"line_number":2926,"context_line":"    def setUp(self):"},{"line_number":2927,"context_line":"        super(TestTrustChain, self).setUp()"},{"line_number":2928,"context_line":""},{"line_number":2929,"context_line":"        # create trust chain"},{"line_number":2930,"context_line":"        self.user_chain \u003d list()"},{"line_number":2931,"context_line":"        self.trust_chain \u003d list()"},{"line_number":2932,"context_line":"        for _ in xrange(3):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a961159_43391640","line":2929,"in_reply_to":"3a961159_7975f0f8","updated":"2014-12-11 12:27:26.000000000","message":"This is a problem across the code, so if I do as you ask, I\u0027ll have to do irrelevant changes in other places. A take your point though, thank you for the review!","commit_id":"cacff3e4bb4d7a38f03bc23d9834da5901c2d28d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2575,"context_line":"        self.v3_authenticate_token(auth_data, expected_status\u003d403)"},{"line_number":2576,"context_line":""},{"line_number":2577,"context_line":""},{"line_number":2578,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":2579,"context_line":"class TestTrustRedelegation(test_v3.RestfulTestCase):"},{"line_number":2580,"context_line":"    \"\"\"Redelegation valid and secure"},{"line_number":2581,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_385037d4","line":2578,"updated":"2014-12-26 17:03:11.000000000","message":"revoke_api isn\u0027t used by this test so remove this line.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2575,"context_line":"        self.v3_authenticate_token(auth_data, expected_status\u003d403)"},{"line_number":2576,"context_line":""},{"line_number":2577,"context_line":""},{"line_number":2578,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":2579,"context_line":"class TestTrustRedelegation(test_v3.RestfulTestCase):"},{"line_number":2580,"context_line":"    \"\"\"Redelegation valid and secure"},{"line_number":2581,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_c6a49fbb","line":2578,"in_reply_to":"3a961159_385037d4","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2601,"context_line":"     * one of the parent trusts was deleted"},{"line_number":2602,"context_line":""},{"line_number":2603,"context_line":"    \"\"\""},{"line_number":2604,"context_line":"    EXTENSION_NAME \u003d \u0027revoke\u0027"},{"line_number":2605,"context_line":"    EXTENSION_TO_ADD \u003d \u0027revoke_extension\u0027"},{"line_number":2606,"context_line":""},{"line_number":2607,"context_line":"    def config_overrides(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_b886e7d9","line":2604,"updated":"2014-12-26 17:03:11.000000000","message":"why are these 2 lines here? They don\u0027t seem to do anything. I tried removing them and the test still passes.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2601,"context_line":"     * one of the parent trusts was deleted"},{"line_number":2602,"context_line":""},{"line_number":2603,"context_line":"    \"\"\""},{"line_number":2604,"context_line":"    EXTENSION_NAME \u003d \u0027revoke\u0027"},{"line_number":2605,"context_line":"    EXTENSION_TO_ADD \u003d \u0027revoke_extension\u0027"},{"line_number":2606,"context_line":""},{"line_number":2607,"context_line":"    def config_overrides(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_06af8795","line":2604,"in_reply_to":"3a961159_b886e7d9","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2608,"context_line":"        super(TestTrustRedelegation, self).config_overrides()"},{"line_number":2609,"context_line":"        self.config_fixture.config("},{"line_number":2610,"context_line":"            group\u003d\u0027revoke\u0027,"},{"line_number":2611,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":2612,"context_line":"        self.config_fixture.config("},{"line_number":2613,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":2614,"context_line":"            provider\u003d\u0027keystone.token.providers.pki.Provider\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_535c04f1","line":2611,"updated":"2014-12-26 17:03:11.000000000","message":"I removed this setting and the tests still passed. If this isn\u0027t required then remove it, otherwise add a comment why the revoke backend needs to be set to kvs.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2608,"context_line":"        super(TestTrustRedelegation, self).config_overrides()"},{"line_number":2609,"context_line":"        self.config_fixture.config("},{"line_number":2610,"context_line":"            group\u003d\u0027revoke\u0027,"},{"line_number":2611,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":2612,"context_line":"        self.config_fixture.config("},{"line_number":2613,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":2614,"context_line":"            provider\u003d\u0027keystone.token.providers.pki.Provider\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_4690af4e","line":2611,"in_reply_to":"3a961159_535c04f1","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2612,"context_line":"        self.config_fixture.config("},{"line_number":2613,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":2614,"context_line":"            provider\u003d\u0027keystone.token.providers.pki.Provider\u0027,"},{"line_number":2615,"context_line":"            revoke_by_id\u003dFalse)"},{"line_number":2616,"context_line":"        self.config_fixture.config("},{"line_number":2617,"context_line":"            group\u003d\u0027trust\u0027,"},{"line_number":2618,"context_line":"            enabled\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_93566ccd","line":2615,"updated":"2014-12-26 17:03:11.000000000","message":"I tried removing this and the test still passed... if this isn\u0027t required then remove it. Otherwise add a comment why this is here.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2612,"context_line":"        self.config_fixture.config("},{"line_number":2613,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":2614,"context_line":"            provider\u003d\u0027keystone.token.providers.pki.Provider\u0027,"},{"line_number":2615,"context_line":"            revoke_by_id\u003dFalse)"},{"line_number":2616,"context_line":"        self.config_fixture.config("},{"line_number":2617,"context_line":"            group\u003d\u0027trust\u0027,"},{"line_number":2618,"context_line":"            enabled\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_669dab66","line":2615,"in_reply_to":"3a961159_93566ccd","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2630,"context_line":"        self.trustee_user[\u0027password\u0027] \u003d password"},{"line_number":2631,"context_line":""},{"line_number":2632,"context_line":"        # trustor-\u003etrustee"},{"line_number":2633,"context_line":"        self.redelegated_trust_ref \u003d self.new_trust_ref("},{"line_number":2634,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2635,"context_line":"            trustee_user_id\u003dself.trustee_user[\u0027id\u0027],"},{"line_number":2636,"context_line":"            project_id\u003dself.project_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_986bebf0","line":2633,"updated":"2014-12-26 17:03:11.000000000","message":"As far as I can tell this isn\u0027t actually used anywhere... whereever it\u0027s used it\u0027s copied and modified. So there\u0027s no reason to create this in setUp. Should just have a method to create a redelegated trust ref and call that when the test needs one.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2630,"context_line":"        self.trustee_user[\u0027password\u0027] \u003d password"},{"line_number":2631,"context_line":""},{"line_number":2632,"context_line":"        # trustor-\u003etrustee"},{"line_number":2633,"context_line":"        self.redelegated_trust_ref \u003d self.new_trust_ref("},{"line_number":2634,"context_line":"            trustor_user_id\u003dself.user_id,"},{"line_number":2635,"context_line":"            trustee_user_id\u003dself.trustee_user[\u0027id\u0027],"},{"line_number":2636,"context_line":"            project_id\u003dself.project_id,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_4177b93b","line":2633,"in_reply_to":"3a961159_986bebf0","updated":"2014-12-29 19:10:56.000000000","message":"Replaced creation with modification. I think it shows difference for each test clearly, so I\u0027d like to stick to modification rather than a function.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2637,"context_line":"            impersonation\u003dTrue,"},{"line_number":2638,"context_line":"            expires\u003ddict(minutes\u003d1),"},{"line_number":2639,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2640,"context_line":"        self.redelegated_trust_ref.update("},{"line_number":2641,"context_line":"            allow_redelegation\u003dTrue,"},{"line_number":2642,"context_line":"            redelegation_count\u003d2)"},{"line_number":2643,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_58c50309","line":2640,"updated":"2014-12-26 17:03:11.000000000","message":"rather than do the update, new_trust_ref should allow you to create the trust ref with these values set as needed.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2637,"context_line":"            impersonation\u003dTrue,"},{"line_number":2638,"context_line":"            expires\u003ddict(minutes\u003d1),"},{"line_number":2639,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2640,"context_line":"        self.redelegated_trust_ref.update("},{"line_number":2641,"context_line":"            allow_redelegation\u003dTrue,"},{"line_number":2642,"context_line":"            redelegation_count\u003d2)"},{"line_number":2643,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_6174b536","line":2640,"in_reply_to":"3a961159_58c50309","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2656,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2657,"context_line":"            impersonation\u003dTrue,"},{"line_number":2658,"context_line":"            expires\u003ddict(minutes\u003d10),"},{"line_number":2659,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2660,"context_line":""},{"line_number":2661,"context_line":"    def test_depleted_redelegation_count_error(self):"},{"line_number":2662,"context_line":"        ref \u003d dict(self.redelegated_trust_ref,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_f8d5cfb7","line":2659,"updated":"2014-12-26 17:03:11.000000000","message":"what makes this expired? It\u0027s the same as chained_trust_ref but the expiration is in 10 mins rather than 1 min.\n\nAlso, this is only used in the one test so could move its creation there.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2656,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2657,"context_line":"            impersonation\u003dTrue,"},{"line_number":2658,"context_line":"            expires\u003ddict(minutes\u003d10),"},{"line_number":2659,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2660,"context_line":""},{"line_number":2661,"context_line":"    def test_depleted_redelegation_count_error(self):"},{"line_number":2662,"context_line":"        ref \u003d dict(self.redelegated_trust_ref,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_a18dbd2c","line":2659,"in_reply_to":"3a961159_f8d5cfb7","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2662,"context_line":"        ref \u003d dict(self.redelegated_trust_ref,"},{"line_number":2663,"context_line":"                   redelegation_count\u003d0)"},{"line_number":2664,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2665,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2666,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"},{"line_number":2667,"context_line":"        trust_id \u003d trust[\u0027id\u0027]"},{"line_number":2668,"context_line":"        auth_data \u003d self.build_authentication_request("}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_18fa9b43","line":2665,"updated":"2014-12-26 17:03:11.000000000","message":"I\u0027d rather these calls were made right to the controller rather than going through the whole HTTP call.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2662,"context_line":"        ref \u003d dict(self.redelegated_trust_ref,"},{"line_number":2663,"context_line":"                   redelegation_count\u003d0)"},{"line_number":2664,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2665,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2666,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"},{"line_number":2667,"context_line":"        trust_id \u003d trust[\u0027id\u0027]"},{"line_number":2668,"context_line":"        auth_data \u003d self.build_authentication_request("}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_5c187e1e","line":2665,"in_reply_to":"3a961159_18fa9b43","updated":"2014-12-29 19:10:56.000000000","message":"I thought it would be better to leave context preparation to HTTP framework as there is no actual network round-trip...","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2680,"context_line":""},{"line_number":2681,"context_line":"    def test_modified_redelegation_count_error(self):"},{"line_number":2682,"context_line":"        ref \u003d dict(self.redelegated_trust_ref,"},{"line_number":2683,"context_line":"                   redelegation_count\u003d10)"},{"line_number":2684,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2685,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2686,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_d85bb353","line":2683,"updated":"2014-12-26 17:03:11.000000000","message":"The redelegation_count was 2 already, why does it need to change to 10? I tried changing the code to use self.redelegated_trust_ref and it worked fine.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2680,"context_line":""},{"line_number":2681,"context_line":"    def test_modified_redelegation_count_error(self):"},{"line_number":2682,"context_line":"        ref \u003d dict(self.redelegated_trust_ref,"},{"line_number":2683,"context_line":"                   redelegation_count\u003d10)"},{"line_number":2684,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2685,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2686,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_41c5f93b","line":2683,"in_reply_to":"3a961159_d85bb353","updated":"2014-12-29 19:10:56.000000000","message":"Done\nIt tests that each subsequent trust has redelegation count decremented by 1.\nI removed this line, removed 2 from setUp leaving resulting count to be set by controller to default (10).","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2762,"context_line":"                \u0027user_id\u0027: self.user_id,"},{"line_number":2763,"context_line":"                \u0027role_id\u0027: role[\u0027id\u0027]})"},{"line_number":2764,"context_line":""},{"line_number":2765,"context_line":"        self.put(grant_url)"},{"line_number":2766,"context_line":""},{"line_number":2767,"context_line":"        # Create first trust with extended set of roles"},{"line_number":2768,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_d310f451","line":2765,"updated":"2014-12-26 17:03:11.000000000","message":"This shoud be calling the assignment API just like at line 2755.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2762,"context_line":"                \u0027user_id\u0027: self.user_id,"},{"line_number":2763,"context_line":"                \u0027role_id\u0027: role[\u0027id\u0027]})"},{"line_number":2764,"context_line":""},{"line_number":2765,"context_line":"        self.put(grant_url)"},{"line_number":2766,"context_line":""},{"line_number":2767,"context_line":"        # Create first trust with extended set of roles"},{"line_number":2768,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_c17c89ee","line":2765,"in_reply_to":"3a961159_d310f451","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2766,"context_line":""},{"line_number":2767,"context_line":"        # Create first trust with extended set of roles"},{"line_number":2768,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2769,"context_line":"        ref[\u0027roles\u0027].append({\u0027id\u0027: role[\u0027id\u0027]})"},{"line_number":2770,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2771,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2772,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_537244b1","line":2769,"updated":"2014-12-26 17:03:11.000000000","message":"This bit of code is confusing because the previous line creates a shallow copy of self.redelegated_trust_ref, which I assume is done to protect self.redelegated_trust_ref from being modified, but then this line goes and modifies it anyways. A deep copy of self.redelegated_trust_ref needs to be made to actually protect it from modification.\n\nAlternatively, don\u0027t create a copy since it shouldn\u0027t matter.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2766,"context_line":""},{"line_number":2767,"context_line":"        # Create first trust with extended set of roles"},{"line_number":2768,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2769,"context_line":"        ref[\u0027roles\u0027].append({\u0027id\u0027: role[\u0027id\u0027]})"},{"line_number":2770,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2771,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2772,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_21f62d91","line":2769,"in_reply_to":"3a961159_537244b1","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2794,"context_line":"        # Second trust contains roles subset"},{"line_number":2795,"context_line":"        role_id_set1 \u003d set(r[\u0027id\u0027] for r in trust[\u0027roles\u0027])"},{"line_number":2796,"context_line":"        role_id_set2 \u003d set(r[\u0027id\u0027] for r in trust2[\u0027roles\u0027])"},{"line_number":2797,"context_line":"        self.assertTrue(role_id_set1 \u003e role_id_set2)"},{"line_number":2798,"context_line":""},{"line_number":2799,"context_line":"    def test_redelegation_roles(self):"},{"line_number":2800,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_f36250d8","line":2797,"updated":"2014-12-26 17:03:11.000000000","message":"Testtools provides a matcher for this that should print out a nicer failure message: matchers.GreaterThan ( https://github.com/testing-cabal/testtools/blob/master/testtools/matchers/__init__.py#L62 )","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2797,"context_line":"        self.assertTrue(role_id_set1 \u003e role_id_set2)"},{"line_number":2798,"context_line":""},{"line_number":2799,"context_line":"    def test_redelegation_roles(self):"},{"line_number":2800,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2801,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2802,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2803,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_13b7dc3b","line":2800,"updated":"2014-12-26 17:03:11.000000000","message":"This doesn\u0027t need to be copied.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2797,"context_line":"        self.assertTrue(role_id_set1 \u003e role_id_set2)"},{"line_number":2798,"context_line":""},{"line_number":2799,"context_line":"    def test_redelegation_roles(self):"},{"line_number":2800,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2801,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2802,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2803,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_a1293df4","line":2800,"in_reply_to":"3a961159_13b7dc3b","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2809,"context_line":""},{"line_number":2810,"context_line":"        trust_token \u003d self.get_requested_token(auth_data)"},{"line_number":2811,"context_line":""},{"line_number":2812,"context_line":"        # Build second trust"},{"line_number":2813,"context_line":"        role \u003d self.new_role_ref()"},{"line_number":2814,"context_line":"        self.assignment_api.create_role(role[\u0027id\u0027], role)"},{"line_number":2815,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_53808449","line":2812,"updated":"2014-12-26 17:03:11.000000000","message":"This is creating a role not a trust.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2809,"context_line":""},{"line_number":2810,"context_line":"        trust_token \u003d self.get_requested_token(auth_data)"},{"line_number":2811,"context_line":""},{"line_number":2812,"context_line":"        # Build second trust"},{"line_number":2813,"context_line":"        role \u003d self.new_role_ref()"},{"line_number":2814,"context_line":"        self.assignment_api.create_role(role[\u0027id\u0027], role)"},{"line_number":2815,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_011051a7","line":2812,"in_reply_to":"3a961159_53808449","updated":"2014-12-29 19:10:56.000000000","message":"Actually, this comment is about whole code below :) I\u0027ve extended it to be more specific.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2821,"context_line":"                \u0027user_id\u0027: self.user_id,"},{"line_number":2822,"context_line":"                \u0027role_id\u0027: role[\u0027id\u0027]})"},{"line_number":2823,"context_line":""},{"line_number":2824,"context_line":"        self.put(grant_url)"},{"line_number":2825,"context_line":""},{"line_number":2826,"context_line":"        # Try to chain a trust with the role not from parent trust"},{"line_number":2827,"context_line":"        ref \u003d dict(self.chained_trust_ref, roles\u003d[{\u0027id\u0027: role[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_937aec75","line":2824,"updated":"2014-12-26 17:03:11.000000000","message":"call the assignment_api to create the grant rather than put, so it\u0027s the same as how the role is created.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2821,"context_line":"                \u0027user_id\u0027: self.user_id,"},{"line_number":2822,"context_line":"                \u0027role_id\u0027: role[\u0027id\u0027]})"},{"line_number":2823,"context_line":""},{"line_number":2824,"context_line":"        self.put(grant_url)"},{"line_number":2825,"context_line":""},{"line_number":2826,"context_line":"        # Try to chain a trust with the role not from parent trust"},{"line_number":2827,"context_line":"        ref \u003d dict(self.chained_trust_ref, roles\u003d[{\u0027id\u0027: role[\u0027id\u0027]}])"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_018771d8","line":2824,"in_reply_to":"3a961159_937aec75","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2831,"context_line":"                  expected_status\u003d403)"},{"line_number":2832,"context_line":""},{"line_number":2833,"context_line":"    def test_redelegation_terminator(self):"},{"line_number":2834,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2835,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2836,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2837,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_f3909098","line":2834,"updated":"2014-12-26 17:03:11.000000000","message":"There\u0027s no need to create a copy.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2831,"context_line":"                  expected_status\u003d403)"},{"line_number":2832,"context_line":""},{"line_number":2833,"context_line":"    def test_redelegation_terminator(self):"},{"line_number":2834,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2835,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2836,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2837,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_216b8d20","line":2834,"in_reply_to":"3a961159_f3909098","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2847,"context_line":"        ref \u003d dict(self.chained_trust_ref,"},{"line_number":2848,"context_line":"                   redelegation_count\u003d1,"},{"line_number":2849,"context_line":"                   allow_redelegation\u003dFalse)"},{"line_number":2850,"context_line":"        ref.pop(\u0027expires_at\u0027)"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2853,"context_line":"                      body\u003d{\u0027trust\u0027: ref},"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_93f10c04","line":2850,"updated":"2014-12-26 17:03:11.000000000","message":"use del or pop consistently... del was used earlier and I think it makes more sense.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2847,"context_line":"        ref \u003d dict(self.chained_trust_ref,"},{"line_number":2848,"context_line":"                   redelegation_count\u003d1,"},{"line_number":2849,"context_line":"                   allow_redelegation\u003dFalse)"},{"line_number":2850,"context_line":"        ref.pop(\u0027expires_at\u0027)"},{"line_number":2851,"context_line":""},{"line_number":2852,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2853,"context_line":"                      body\u003d{\u0027trust\u0027: ref},"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_8149a1b9","line":2850,"in_reply_to":"3a961159_93f10c04","updated":"2014-12-29 19:10:56.000000000","message":"removed expires_at in setUp() for chained trust - I delete it every time anyway. Thanks for pointing this out!","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2871,"context_line":"        ref \u003d dict(self.chained_trust_ref,"},{"line_number":2872,"context_line":"                   redelegation_count\u003d1,"},{"line_number":2873,"context_line":"                   allow_redelegation\u003dFalse)"},{"line_number":2874,"context_line":"        ref.pop(\u0027expires_at\u0027)"},{"line_number":2875,"context_line":""},{"line_number":2876,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2877,"context_line":"                  body\u003d{\u0027trust\u0027: ref},"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_b3f608f8","line":2874,"updated":"2014-12-26 17:03:11.000000000","message":"use del or pop consistently... del was used earlier and I think it makes more sense.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2871,"context_line":"        ref \u003d dict(self.chained_trust_ref,"},{"line_number":2872,"context_line":"                   redelegation_count\u003d1,"},{"line_number":2873,"context_line":"                   allow_redelegation\u003dFalse)"},{"line_number":2874,"context_line":"        ref.pop(\u0027expires_at\u0027)"},{"line_number":2875,"context_line":""},{"line_number":2876,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2877,"context_line":"                  body\u003d{\u0027trust\u0027: ref},"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_c1cac919","line":2874,"in_reply_to":"3a961159_b3f608f8","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2879,"context_line":"                  expected_status\u003d403)"},{"line_number":2880,"context_line":""},{"line_number":2881,"context_line":""},{"line_number":2882,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":2883,"context_line":"class TestTrustChain(test_v3.RestfulTestCase):"},{"line_number":2884,"context_line":""},{"line_number":2885,"context_line":"    EXTENSION_NAME \u003d \u0027revoke\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_d86f3392","line":2882,"updated":"2014-12-26 17:03:11.000000000","message":"revoke_api isn\u0027t used by this test so remove this line.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2879,"context_line":"                  expected_status\u003d403)"},{"line_number":2880,"context_line":""},{"line_number":2881,"context_line":""},{"line_number":2882,"context_line":"@dependency.requires(\u0027revoke_api\u0027)"},{"line_number":2883,"context_line":"class TestTrustChain(test_v3.RestfulTestCase):"},{"line_number":2884,"context_line":""},{"line_number":2885,"context_line":"    EXTENSION_NAME \u003d \u0027revoke\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_e1cfc527","line":2882,"in_reply_to":"3a961159_d86f3392","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2883,"context_line":"class TestTrustChain(test_v3.RestfulTestCase):"},{"line_number":2884,"context_line":""},{"line_number":2885,"context_line":"    EXTENSION_NAME \u003d \u0027revoke\u0027"},{"line_number":2886,"context_line":"    EXTENSION_TO_ADD \u003d \u0027revoke_extension\u0027"},{"line_number":2887,"context_line":""},{"line_number":2888,"context_line":"    def config_overrides(self):"},{"line_number":2889,"context_line":"        super(TestTrustChain, self).config_overrides()"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_53cec4b8","line":2886,"updated":"2014-12-26 17:03:11.000000000","message":"I tried removing these and the test still passed. Do these need to be here? If not remove them. If so, add a comment.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2883,"context_line":"class TestTrustChain(test_v3.RestfulTestCase):"},{"line_number":2884,"context_line":""},{"line_number":2885,"context_line":"    EXTENSION_NAME \u003d \u0027revoke\u0027"},{"line_number":2886,"context_line":"    EXTENSION_TO_ADD \u003d \u0027revoke_extension\u0027"},{"line_number":2887,"context_line":""},{"line_number":2888,"context_line":"    def config_overrides(self):"},{"line_number":2889,"context_line":"        super(TestTrustChain, self).config_overrides()"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_01d5b1b8","line":2886,"in_reply_to":"3a961159_53cec4b8","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2889,"context_line":"        super(TestTrustChain, self).config_overrides()"},{"line_number":2890,"context_line":"        self.config_fixture.config("},{"line_number":2891,"context_line":"            group\u003d\u0027revoke\u0027,"},{"line_number":2892,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":2893,"context_line":"        self.config_fixture.config("},{"line_number":2894,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":2895,"context_line":"            provider\u003d\u0027keystone.token.providers.pki.Provider\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_933f4c87","line":2892,"updated":"2014-12-26 17:03:11.000000000","message":"Is this setting required? I tried removing it and the tests still passed.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2889,"context_line":"        super(TestTrustChain, self).config_overrides()"},{"line_number":2890,"context_line":"        self.config_fixture.config("},{"line_number":2891,"context_line":"            group\u003d\u0027revoke\u0027,"},{"line_number":2892,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":2893,"context_line":"        self.config_fixture.config("},{"line_number":2894,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":2895,"context_line":"            provider\u003d\u0027keystone.token.providers.pki.Provider\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_e1e6e5af","line":2892,"in_reply_to":"3a961159_933f4c87","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":2892,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":2893,"context_line":"        self.config_fixture.config("},{"line_number":2894,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":2895,"context_line":"            provider\u003d\u0027keystone.token.providers.pki.Provider\u0027,"},{"line_number":2896,"context_line":"            revoke_by_id\u003dFalse)"},{"line_number":2897,"context_line":"        self.config_fixture.config("},{"line_number":2898,"context_line":"            group\u003d\u0027trust\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_f3bed0ff","line":2895,"updated":"2014-12-26 17:03:11.000000000","message":"Is PKI required for this? If so, add a comment. I tried removing this setting and the tests all passed.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":2892,"context_line":"            driver\u003d\u0027keystone.contrib.revoke.backends.kvs.Revoke\u0027)"},{"line_number":2893,"context_line":"        self.config_fixture.config("},{"line_number":2894,"context_line":"            group\u003d\u0027token\u0027,"},{"line_number":2895,"context_line":"            provider\u003d\u0027keystone.token.providers.pki.Provider\u0027,"},{"line_number":2896,"context_line":"            revoke_by_id\u003dFalse)"},{"line_number":2897,"context_line":"        self.config_fixture.config("},{"line_number":2898,"context_line":"            group\u003d\u0027trust\u0027,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_01ecd18e","line":2895,"in_reply_to":"3a961159_f3bed0ff","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cdaefc190e5613f7fca681867b38da2a62725552","unresolved":false,"context_lines":[{"line_number":2767,"context_line":"                  expected_status\u003d403)"},{"line_number":2768,"context_line":""},{"line_number":2769,"context_line":"    def test_redelegation_terminator(self):"},{"line_number":2770,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2771,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2772,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2773,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a961159_45afc27d","line":2770,"updated":"2014-12-29 21:02:57.000000000","message":"There\u0027s no need to create a copy.","commit_id":"c70bef4bc8abea9e504e772a399ad95d3bc19935"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"2703e95ad6973f3f0d44ef4ad108093253555bab","unresolved":false,"context_lines":[{"line_number":2767,"context_line":"                  expected_status\u003d403)"},{"line_number":2768,"context_line":""},{"line_number":2769,"context_line":"    def test_redelegation_terminator(self):"},{"line_number":2770,"context_line":"        ref \u003d dict(self.redelegated_trust_ref)"},{"line_number":2771,"context_line":"        r \u003d self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2772,"context_line":"                      body\u003d{\u0027trust\u0027: ref})"},{"line_number":2773,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a961159_42a32d4f","line":2770,"in_reply_to":"3a961159_45afc27d","updated":"2014-12-30 14:01:59.000000000","message":"Done","commit_id":"c70bef4bc8abea9e504e772a399ad95d3bc19935"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2615,"context_line":"    def setUp(self):"},{"line_number":2616,"context_line":"        super(TestTrustRedelegation, self).setUp()"},{"line_number":2617,"context_line":"        # Create a trustee to delegate stuff to"},{"line_number":2618,"context_line":"        self.trustee_user \u003d self.new_user_ref(domain_id\u003dself.domain_id)"},{"line_number":2619,"context_line":"        password \u003d self.trustee_user[\u0027password\u0027]"},{"line_number":2620,"context_line":"        self.trustee_user \u003d self.identity_api.create_user(self.trustee_user)"},{"line_number":2621,"context_line":"        self.trustee_user[\u0027password\u0027] \u003d password"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_46f48c86","line":2618,"updated":"2015-01-07 23:44:18.000000000","message":"this code is confusing because it overwrites self.trustee_user in a couple lines, so readers can\u0027t tell easily that this is a created user and not just a ref. The ref should be created in a local variable so that it\u0027s more obvious.\n\n trustee_user_ref \u003d self.new_user_ref(domain_id\u003dself.domain_id)","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2615,"context_line":"    def setUp(self):"},{"line_number":2616,"context_line":"        super(TestTrustRedelegation, self).setUp()"},{"line_number":2617,"context_line":"        # Create a trustee to delegate stuff to"},{"line_number":2618,"context_line":"        self.trustee_user \u003d self.new_user_ref(domain_id\u003dself.domain_id)"},{"line_number":2619,"context_line":"        password \u003d self.trustee_user[\u0027password\u0027]"},{"line_number":2620,"context_line":"        self.trustee_user \u003d self.identity_api.create_user(self.trustee_user)"},{"line_number":2621,"context_line":"        self.trustee_user[\u0027password\u0027] \u003d password"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_25472079","line":2618,"in_reply_to":"3a961159_46f48c86","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2655,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"},{"line_number":2656,"context_line":"        trust_token \u003d self._get_trust_token(trust)"},{"line_number":2657,"context_line":""},{"line_number":2658,"context_line":"        # Build second trust"},{"line_number":2659,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2660,"context_line":"                  body\u003d{\u0027trust\u0027: self.chained_trust_ref},"},{"line_number":2661,"context_line":"                  token\u003dtrust_token,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_e6573858","line":2658,"updated":"2015-01-07 23:44:18.000000000","message":"This doesn\u0027t build a trust because it fails. This should be like \"Attempt to create a redelegated trust.\" This applies throughout these tests.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2655,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"},{"line_number":2656,"context_line":"        trust_token \u003d self._get_trust_token(trust)"},{"line_number":2657,"context_line":""},{"line_number":2658,"context_line":"        # Build second trust"},{"line_number":2659,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2660,"context_line":"                  body\u003d{\u0027trust\u0027: self.chained_trust_ref},"},{"line_number":2661,"context_line":"                  token\u003dtrust_token,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_77df1bd7","line":2658,"in_reply_to":"3a961159_e6573858","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2667,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"},{"line_number":2668,"context_line":"        trust_token \u003d self._get_trust_token(trust)"},{"line_number":2669,"context_line":""},{"line_number":2670,"context_line":"        # Build second trust"},{"line_number":2671,"context_line":"        self.chained_trust_ref[\u0027redelegation_count\u0027] \u003d 5"},{"line_number":2672,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2673,"context_line":"                  body\u003d{\u0027trust\u0027: self.chained_trust_ref},"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_2655c04f","line":2670,"updated":"2015-01-07 23:44:18.000000000","message":"This doesn\u0027t build a trust because it fails.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2667,"context_line":"        trust \u003d self.assertValidTrustResponse(r)"},{"line_number":2668,"context_line":"        trust_token \u003d self._get_trust_token(trust)"},{"line_number":2669,"context_line":""},{"line_number":2670,"context_line":"        # Build second trust"},{"line_number":2671,"context_line":"        self.chained_trust_ref[\u0027redelegation_count\u0027] \u003d 5"},{"line_number":2672,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2673,"context_line":"                  body\u003d{\u0027trust\u0027: self.chained_trust_ref},"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_b784235e","line":2670,"in_reply_to":"3a961159_2655c04f","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2668,"context_line":"        trust_token \u003d self._get_trust_token(trust)"},{"line_number":2669,"context_line":""},{"line_number":2670,"context_line":"        # Build second trust"},{"line_number":2671,"context_line":"        self.chained_trust_ref[\u0027redelegation_count\u0027] \u003d 5"},{"line_number":2672,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2673,"context_line":"                  body\u003d{\u0027trust\u0027: self.chained_trust_ref},"},{"line_number":2674,"context_line":"                  token\u003dtrust_token,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_c664fc4a","line":2671,"updated":"2015-01-07 23:44:18.000000000","message":"why 5? add a comment.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2668,"context_line":"        trust_token \u003d self._get_trust_token(trust)"},{"line_number":2669,"context_line":""},{"line_number":2670,"context_line":"        # Build second trust"},{"line_number":2671,"context_line":"        self.chained_trust_ref[\u0027redelegation_count\u0027] \u003d 5"},{"line_number":2672,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2673,"context_line":"                  body\u003d{\u0027trust\u0027: self.chained_trust_ref},"},{"line_number":2674,"context_line":"                  token\u003dtrust_token,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_d779af83","line":2671,"in_reply_to":"3a961159_c664fc4a","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2676,"context_line":""},{"line_number":2677,"context_line":"    def test_max_redelegation_count_constraint(self):"},{"line_number":2678,"context_line":"        # maximum is 10, \"max_redelegation_count\" configuration parameter"},{"line_number":2679,"context_line":"        self.redelegated_trust_ref[\u0027redelegation_count\u0027] \u003d 11"},{"line_number":2680,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2681,"context_line":"                  body\u003d{\u0027trust\u0027: self.redelegated_trust_ref},"},{"line_number":2682,"context_line":"                  expected_status\u003d403)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_864674a5","line":2679,"updated":"2015-01-07 23:44:18.000000000","message":"use CONF.trust.max_redelegation_count + 1 then no comment is necessary.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2676,"context_line":""},{"line_number":2677,"context_line":"    def test_max_redelegation_count_constraint(self):"},{"line_number":2678,"context_line":"        # maximum is 10, \"max_redelegation_count\" configuration parameter"},{"line_number":2679,"context_line":"        self.redelegated_trust_ref[\u0027redelegation_count\u0027] \u003d 11"},{"line_number":2680,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2681,"context_line":"                  body\u003d{\u0027trust\u0027: self.redelegated_trust_ref},"},{"line_number":2682,"context_line":"                  expected_status\u003d403)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_f77eab69","line":2679,"in_reply_to":"3a961159_864674a5","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2693,"context_line":"            trustee_user_id\u003dself.trustee_user[\u0027id\u0027],"},{"line_number":2694,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2695,"context_line":"            impersonation\u003dTrue,"},{"line_number":2696,"context_line":"            expires\u003ddict(minutes\u003d10),"},{"line_number":2697,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2698,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2699,"context_line":"                  body\u003d{\u0027trust\u0027: too_long_live_chained_trust_ref},"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_c6995c20","line":2696,"updated":"2015-01-07 23:44:18.000000000","message":"where does 10 come from? Add a comment.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2693,"context_line":"            trustee_user_id\u003dself.trustee_user[\u0027id\u0027],"},{"line_number":2694,"context_line":"            project_id\u003dself.project_id,"},{"line_number":2695,"context_line":"            impersonation\u003dTrue,"},{"line_number":2696,"context_line":"            expires\u003ddict(minutes\u003d10),"},{"line_number":2697,"context_line":"            role_ids\u003d[self.role_id])"},{"line_number":2698,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2699,"context_line":"                  body\u003d{\u0027trust\u0027: too_long_live_chained_trust_ref},"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_b7a343b0","line":2696,"in_reply_to":"3a961159_c6995c20","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2707,"context_line":"        trust_token \u003d self._get_trust_token(trust)"},{"line_number":2708,"context_line":""},{"line_number":2709,"context_line":"        # Build second trust"},{"line_number":2710,"context_line":"        self.chained_trust_ref[\u0027remaining_uses\u0027] \u003d 5"},{"line_number":2711,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2712,"context_line":"                  body\u003d{\u0027trust\u0027: self.chained_trust_ref},"},{"line_number":2713,"context_line":"                  token\u003dtrust_token,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_6690a8ed","line":2710,"updated":"2015-01-07 23:44:18.000000000","message":"Where does 5 come from? Add a comment.\n\nAlso, there should be an explanation why this test is expected to fail.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2707,"context_line":"        trust_token \u003d self._get_trust_token(trust)"},{"line_number":2708,"context_line":""},{"line_number":2709,"context_line":"        # Build second trust"},{"line_number":2710,"context_line":"        self.chained_trust_ref[\u0027remaining_uses\u0027] \u003d 5"},{"line_number":2711,"context_line":"        self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2712,"context_line":"                  body\u003d{\u0027trust\u0027: self.chained_trust_ref},"},{"line_number":2713,"context_line":"                  token\u003dtrust_token,"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_17517763","line":2710,"in_reply_to":"3a961159_6690a8ed","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2764,"context_line":"        self.chained_trust_ref[\u0027roles\u0027] \u003d [{\u0027id\u0027: role[\u0027id\u0027]}]"},{"line_number":2765,"context_line":""},{"line_number":2766,"context_line":"        # Bypass policy enforcement"},{"line_number":2767,"context_line":"        self.addCleanup(setattr, rules, \u0027enforce\u0027, rules.enforce)"},{"line_number":2768,"context_line":"        rules.enforce \u003d mock.MagicMock()"},{"line_number":2769,"context_line":"        rules.enforce.return_value \u003d True"},{"line_number":2770,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_46ac8c35","line":2767,"updated":"2015-01-07 23:44:18.000000000","message":"use mock.patch.object decorator or context instead -- http://www.voidspace.org.uk/python/mock/patch.html#patch-object","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2764,"context_line":"        self.chained_trust_ref[\u0027roles\u0027] \u003d [{\u0027id\u0027: role[\u0027id\u0027]}]"},{"line_number":2765,"context_line":""},{"line_number":2766,"context_line":"        # Bypass policy enforcement"},{"line_number":2767,"context_line":"        self.addCleanup(setattr, rules, \u0027enforce\u0027, rules.enforce)"},{"line_number":2768,"context_line":"        rules.enforce \u003d mock.MagicMock()"},{"line_number":2769,"context_line":"        rules.enforce.return_value \u003d True"},{"line_number":2770,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_fa005268","line":2767,"in_reply_to":"3a961159_46ac8c35","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2895,"context_line":"        self.assertValidTokenResponse(r)"},{"line_number":2896,"context_line":""},{"line_number":2897,"context_line":"        revocation_response \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":2898,"context_line":"                                       expected_status\u003d200)"},{"line_number":2899,"context_line":"        revocation_events \u003d revocation_response.json_body[\u0027events\u0027]"},{"line_number":2900,"context_line":"        found \u003d False"},{"line_number":2901,"context_line":"        for event in revocation_events:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_267860c3","line":2898,"updated":"2015-01-07 23:44:18.000000000","message":"isn\u0027t 200 the default?","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2895,"context_line":"        self.assertValidTokenResponse(r)"},{"line_number":2896,"context_line":""},{"line_number":2897,"context_line":"        revocation_response \u003d self.get(\u0027/OS-REVOKE/events\u0027,"},{"line_number":2898,"context_line":"                                       expected_status\u003d200)"},{"line_number":2899,"context_line":"        revocation_events \u003d revocation_response.json_body[\u0027events\u0027]"},{"line_number":2900,"context_line":"        found \u003d False"},{"line_number":2901,"context_line":"        for event in revocation_events:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_3af2da9b","line":2898,"in_reply_to":"3a961159_267860c3","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2944,"context_line":"        self.identity_api.update_user(disabled[\u0027id\u0027], disabled)"},{"line_number":2945,"context_line":""},{"line_number":2946,"context_line":"        # Bypass policy enforcement"},{"line_number":2947,"context_line":"        self.addCleanup(setattr, rules, \u0027enforce\u0027, rules.enforce)"},{"line_number":2948,"context_line":"        rules.enforce \u003d mock.MagicMock()"},{"line_number":2949,"context_line":"        rules.enforce.return_value \u003d True"},{"line_number":2950,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_c64ebc95","line":2947,"updated":"2015-01-07 23:44:18.000000000","message":"use mock.patch.object instead.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2944,"context_line":"        self.identity_api.update_user(disabled[\u0027id\u0027], disabled)"},{"line_number":2945,"context_line":""},{"line_number":2946,"context_line":"        # Bypass policy enforcement"},{"line_number":2947,"context_line":"        self.addCleanup(setattr, rules, \u0027enforce\u0027, rules.enforce)"},{"line_number":2948,"context_line":"        rules.enforce \u003d mock.MagicMock()"},{"line_number":2949,"context_line":"        rules.enforce.return_value \u003d True"},{"line_number":2950,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_7aec62bc","line":2947,"in_reply_to":"3a961159_c64ebc95","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":2957,"context_line":"        self.identity_api.delete_user(self.user_chain[0][\u0027id\u0027])"},{"line_number":2958,"context_line":""},{"line_number":2959,"context_line":"        # Bypass policy enforcement"},{"line_number":2960,"context_line":"        self.addCleanup(setattr, rules, \u0027enforce\u0027, rules.enforce)"},{"line_number":2961,"context_line":"        rules.enforce \u003d mock.MagicMock()"},{"line_number":2962,"context_line":"        rules.enforce.return_value \u003d True"},{"line_number":2963,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_0645246e","line":2960,"updated":"2015-01-07 23:44:18.000000000","message":"use mock.patch.object instead.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":2957,"context_line":"        self.identity_api.delete_user(self.user_chain[0][\u0027id\u0027])"},{"line_number":2958,"context_line":""},{"line_number":2959,"context_line":"        # Bypass policy enforcement"},{"line_number":2960,"context_line":"        self.addCleanup(setattr, rules, \u0027enforce\u0027, rules.enforce)"},{"line_number":2961,"context_line":"        rules.enforce \u003d mock.MagicMock()"},{"line_number":2962,"context_line":"        rules.enforce.return_value \u003d True"},{"line_number":2963,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_9a282ef0","line":2960,"in_reply_to":"3a961159_0645246e","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cc7310bf07ab1ea516a05fac9092c1a904ecdc4","unresolved":false,"context_lines":[{"line_number":2771,"context_line":""},{"line_number":2772,"context_line":"        # Bypass policy enforcement"},{"line_number":2773,"context_line":"        with mock.patch.object(rules, \u0027enforce\u0027):"},{"line_number":2774,"context_line":"            rules.enforce.return_value \u003d True"},{"line_number":2775,"context_line":"            self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2776,"context_line":"                      body\u003d{\u0027trust\u0027: self.chained_trust_ref},"},{"line_number":2777,"context_line":"                      token\u003dtrust_token,"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_5d6f8e93","line":2774,"updated":"2015-01-12 21:20:32.000000000","message":"Put this on the mock.patch.object call -- \n\n with mock.patch.object(rules, \u0027enforce\u0027, return_value\u003dTrue):\n\nIt\u0027s dangerous and confusing to use rules.enforce here since readers aren\u0027t going to expect it... if this needs to be on a separate line then give a name to the mock in the context:\n\n with mock.patch.object(rules, \u0027enforce\u0027) as mock_rules:\n     mock_rules.return_value \u003d True","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e9e439be9485b2e90f6b51a3fcdfc5f70be6ed7d","unresolved":false,"context_lines":[{"line_number":2771,"context_line":""},{"line_number":2772,"context_line":"        # Bypass policy enforcement"},{"line_number":2773,"context_line":"        with mock.patch.object(rules, \u0027enforce\u0027):"},{"line_number":2774,"context_line":"            rules.enforce.return_value \u003d True"},{"line_number":2775,"context_line":"            self.post(\u0027/OS-TRUST/trusts\u0027,"},{"line_number":2776,"context_line":"                      body\u003d{\u0027trust\u0027: self.chained_trust_ref},"},{"line_number":2777,"context_line":"                      token\u003dtrust_token,"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_7077fd08","line":2774,"in_reply_to":"3a961159_5d6f8e93","updated":"2015-01-13 11:11:55.000000000","message":"Done","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cc7310bf07ab1ea516a05fac9092c1a904ecdc4","unresolved":false,"context_lines":[{"line_number":2948,"context_line":""},{"line_number":2949,"context_line":"        # Bypass policy enforcement"},{"line_number":2950,"context_line":"        with mock.patch.object(rules, \u0027enforce\u0027):"},{"line_number":2951,"context_line":"            rules.enforce.return_value \u003d True"},{"line_number":2952,"context_line":"            headers \u003d {\u0027X-Subject-Token\u0027: self.last_token}"},{"line_number":2953,"context_line":"            self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d403)"},{"line_number":2954,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_5df6aed9","line":2951,"updated":"2015-01-12 21:20:32.000000000","message":"put this on the call -- \n\n with mock.patch.object(rules, \u0027enforce\u0027, return_value\u003dTrue):","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e9e439be9485b2e90f6b51a3fcdfc5f70be6ed7d","unresolved":false,"context_lines":[{"line_number":2948,"context_line":""},{"line_number":2949,"context_line":"        # Bypass policy enforcement"},{"line_number":2950,"context_line":"        with mock.patch.object(rules, \u0027enforce\u0027):"},{"line_number":2951,"context_line":"            rules.enforce.return_value \u003d True"},{"line_number":2952,"context_line":"            headers \u003d {\u0027X-Subject-Token\u0027: self.last_token}"},{"line_number":2953,"context_line":"            self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d403)"},{"line_number":2954,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_f023ed03","line":2951,"in_reply_to":"3a961159_5df6aed9","updated":"2015-01-13 11:11:55.000000000","message":"Done","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cc7310bf07ab1ea516a05fac9092c1a904ecdc4","unresolved":false,"context_lines":[{"line_number":2959,"context_line":""},{"line_number":2960,"context_line":"        # Bypass policy enforcement"},{"line_number":2961,"context_line":"        with mock.patch.object(rules, \u0027enforce\u0027):"},{"line_number":2962,"context_line":"            rules.enforce.return_value \u003d True"},{"line_number":2963,"context_line":"            headers \u003d {\u0027X-Subject-Token\u0027: self.last_token}"},{"line_number":2964,"context_line":"            self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d403)"},{"line_number":2965,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_9d0016ad","line":2962,"updated":"2015-01-12 21:20:32.000000000","message":"put this on the call:\n\n with mock.patch.object(rules, \u0027enforce\u0027, return_value\u003dTrue):","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e9e439be9485b2e90f6b51a3fcdfc5f70be6ed7d","unresolved":false,"context_lines":[{"line_number":2959,"context_line":""},{"line_number":2960,"context_line":"        # Bypass policy enforcement"},{"line_number":2961,"context_line":"        with mock.patch.object(rules, \u0027enforce\u0027):"},{"line_number":2962,"context_line":"            rules.enforce.return_value \u003d True"},{"line_number":2963,"context_line":"            headers \u003d {\u0027X-Subject-Token\u0027: self.last_token}"},{"line_number":2964,"context_line":"            self.head(\u0027/auth/tokens\u0027, headers\u003dheaders, expected_status\u003d403)"},{"line_number":2965,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_101f99b9","line":2962,"in_reply_to":"3a961159_9d0016ad","updated":"2015-01-13 11:11:55.000000000","message":"Done","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"}],"keystone/token/providers/common.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                raise exception.Forbidden(_(\u0027User is not a trustee.\u0027))"},{"line_number":366,"context_line":"            if trust.get(\u0027redelegated_trust_id\u0027):"},{"line_number":367,"context_line":"                trust_chain \u003d self.trust_api.get_trust_pedigree(trust[\u0027id\u0027])"},{"line_number":368,"context_line":"                for t in trust_chain:"},{"line_number":369,"context_line":"                    try:"},{"line_number":370,"context_line":"                        self.identity_api.assert_user_enabled("},{"line_number":371,"context_line":"                            t[\u0027trustee_user_id\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_037fcc66","line":368,"updated":"2014-10-27 17:53:08.000000000","message":"(NIT): These two lines could be merged together:\n\n  for t in self.trust_api.get_trust_pedigree(trust[\u0027id\u0027]):","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"15aaf8a38ef05bc9610fbd393d88db01d00546e1","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                raise exception.Forbidden(_(\u0027User is not a trustee.\u0027))"},{"line_number":366,"context_line":"            if trust.get(\u0027redelegated_trust_id\u0027):"},{"line_number":367,"context_line":"                trust_chain \u003d self.trust_api.get_trust_pedigree(trust[\u0027id\u0027])"},{"line_number":368,"context_line":"                for t in trust_chain:"},{"line_number":369,"context_line":"                    try:"},{"line_number":370,"context_line":"                        self.identity_api.assert_user_enabled("},{"line_number":371,"context_line":"                            t[\u0027trustee_user_id\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_5d0976dc","line":368,"in_reply_to":"9aa7fdbe_037fcc66","updated":"2014-10-29 13:15:54.000000000","message":"Done","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                        self.identity_api.assert_user_enabled("},{"line_number":370,"context_line":"                            t[\u0027trustee_user_id\u0027])"},{"line_number":371,"context_line":"                    except AssertionError:"},{"line_number":372,"context_line":"                        raise exception.Forbidden("},{"line_number":373,"context_line":"                            _(\u0027One of the trust agents is disabled.\u0027))"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if bind:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_389af76e","line":372,"updated":"2014-12-26 17:03:11.000000000","message":"There\u0027s no test that covers this code. Add a test for it.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                        self.identity_api.assert_user_enabled("},{"line_number":370,"context_line":"                            t[\u0027trustee_user_id\u0027])"},{"line_number":371,"context_line":"                    except AssertionError:"},{"line_number":372,"context_line":"                        raise exception.Forbidden("},{"line_number":373,"context_line":"                            _(\u0027One of the trust agents is disabled.\u0027))"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if bind:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_dc3f0e86","line":372,"in_reply_to":"3a961159_389af76e","updated":"2014-12-29 19:10:56.000000000","message":"There is a test: tests.test_v3_auth.TestTrustChain.test_intermediate_user_disabled","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cdaefc190e5613f7fca681867b38da2a62725552","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                        self.identity_api.assert_user_enabled("},{"line_number":370,"context_line":"                            t[\u0027trustee_user_id\u0027])"},{"line_number":371,"context_line":"                    except AssertionError:"},{"line_number":372,"context_line":"                        raise exception.Forbidden("},{"line_number":373,"context_line":"                            _(\u0027One of the trust agents is disabled.\u0027))"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if bind:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a961159_05dcda17","line":372,"updated":"2014-12-29 21:02:57.000000000","message":"I changed the code to not raise an exception and  tests.test_v3_auth.TestTrustChain.test_intermediate_user_disabled still passed, so I don\u0027t think that test is verifying this code.","commit_id":"c70bef4bc8abea9e504e772a399ad95d3bc19935"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"2703e95ad6973f3f0d44ef4ad108093253555bab","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                        self.identity_api.assert_user_enabled("},{"line_number":370,"context_line":"                            t[\u0027trustee_user_id\u0027])"},{"line_number":371,"context_line":"                    except AssertionError:"},{"line_number":372,"context_line":"                        raise exception.Forbidden("},{"line_number":373,"context_line":"                            _(\u0027One of the trust agents is disabled.\u0027))"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if bind:"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a961159_ce72e6af","line":372,"in_reply_to":"3a961159_05dcda17","updated":"2014-12-30 14:01:59.000000000","message":"This is checked on policy enforcement. I\u0027m not sure about removing this check.","commit_id":"c70bef4bc8abea9e504e772a399ad95d3bc19935"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"00da203bedd1da104f6a8a9c170fc59e73c0c5cf","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                        self.identity_api.assert_user_enabled("},{"line_number":370,"context_line":"                            t[\u0027trustee_user_id\u0027])"},{"line_number":371,"context_line":"                    except AssertionError:"},{"line_number":372,"context_line":"                        raise exception.Forbidden("},{"line_number":373,"context_line":"                            _(\u0027One of the trust agents is disabled.\u0027))"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if bind:"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a961159_c449e633","line":372,"updated":"2014-12-30 14:57:31.000000000","message":"The test can modify the policy (just like a deployer might) so that this code can be tested. This is why I think the tests should be done directly through the controller rather than the HTTP call.","commit_id":"9dc7ba1034f67b2d983709f6cd58803290e1cac6"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"7e993e9891d92052dfc516af3914bb72aef007c7","unresolved":false,"context_lines":[{"line_number":369,"context_line":"                        self.identity_api.assert_user_enabled("},{"line_number":370,"context_line":"                            t[\u0027trustee_user_id\u0027])"},{"line_number":371,"context_line":"                    except AssertionError:"},{"line_number":372,"context_line":"                        raise exception.Forbidden("},{"line_number":373,"context_line":"                            _(\u0027One of the trust agents is disabled.\u0027))"},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        if bind:"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a961159_3cd2af5b","line":372,"in_reply_to":"3a961159_c449e633","updated":"2014-12-31 14:03:57.000000000","message":"It is a wrong place for the check: moved to trust manager\u0027s get_trust so trust pedigree is now checked every time a trust is used.","commit_id":"9dc7ba1034f67b2d983709f6cd58803290e1cac6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"        if token_ref.get(\u0027trust_id\u0027):"},{"line_number":600,"context_line":"            # token trust validation"},{"line_number":601,"context_line":"            self.trust_api.get_trust(token_ref.get(\u0027trust_id\u0027))"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        token_data \u003d token_ref.get(\u0027token_data\u0027)"},{"line_number":604,"context_line":"        if not token_data or \u0027token\u0027 not in token_data:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_c9032f0b","line":601,"updated":"2015-01-07 23:44:18.000000000","message":"use token_ref[\u0027trust_id\u0027] since it\u0027s already known to be in the token_ref.\n\nAlso, it would be better to do \n\n trust_id \u003d token_ref.get(\u0027trust_id\u0027)\n if trust_id:\n    self.trust_api.get_trust(trust_id)\n\nbecause then there wouldn\u0027t be 2 fetches of the \u0027trust_id\u0027 item and less code duplication.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"        if token_ref.get(\u0027trust_id\u0027):"},{"line_number":600,"context_line":"            # token trust validation"},{"line_number":601,"context_line":"            self.trust_api.get_trust(token_ref.get(\u0027trust_id\u0027))"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        token_data \u003d token_ref.get(\u0027token_data\u0027)"},{"line_number":604,"context_line":"        if not token_data or \u0027token\u0027 not in token_data:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_7a29c29a","line":601,"in_reply_to":"3a961159_c9032f0b","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"}],"keystone/trust/controllers.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a61bf83a62776241f050123459068385af5b0743","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            # Validate against:"},{"line_number":152,"context_line":"            # * allow_redelegation"},{"line_number":153,"context_line":"            valid \u003d bool(redelegated_trust.get(\u0027allow_redelegation\u0027))"},{"line_number":154,"context_line":"            # * 0 \u003c redelegation_count \u003c max_redelegation_count"},{"line_number":155,"context_line":"            max_redelegation_count \u003d CONF.trust.max_redelegation_count"},{"line_number":156,"context_line":"            redelegation_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_11ca0d4f","line":153,"updated":"2014-10-15 13:19:50.000000000","message":"Seem strange to maintain the valid stat through all of these calls when you could just as easily short circuit and exit after each failed check.","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"ee488320d871c470fd95b603c5e95489d6936143","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            # Validate against:"},{"line_number":152,"context_line":"            # * allow_redelegation"},{"line_number":153,"context_line":"            valid \u003d bool(redelegated_trust.get(\u0027allow_redelegation\u0027))"},{"line_number":154,"context_line":"            # * 0 \u003c redelegation_count \u003c max_redelegation_count"},{"line_number":155,"context_line":"            max_redelegation_count \u003d CONF.trust.max_redelegation_count"},{"line_number":156,"context_line":"            redelegation_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027, 0)"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_c2c7a096","line":153,"in_reply_to":"baa201ad_11ca0d4f","updated":"2014-10-16 10:15:25.000000000","message":"Agree, seems like this should be something like:\n\n  if not redelegated_trust.get(\u0027allow_redelegation\u0027):\n    raise exception.Forbidden   ...\n\nIt\u0027d also be nice to avoid the cast to bool, if possible.","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a61bf83a62776241f050123459068385af5b0743","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            # * allow_redelegation"},{"line_number":153,"context_line":"            valid \u003d bool(redelegated_trust.get(\u0027allow_redelegation\u0027))"},{"line_number":154,"context_line":"            # * 0 \u003c redelegation_count \u003c max_redelegation_count"},{"line_number":155,"context_line":"            max_redelegation_count \u003d CONF.trust.max_redelegation_count"},{"line_number":156,"context_line":"            redelegation_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027, 0)"},{"line_number":157,"context_line":"            valid \u0026\u003d 0 \u003c redelegation_count \u003c max_redelegation_count"},{"line_number":158,"context_line":"            # * remaining_uses is None"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_512015f7","line":155,"updated":"2014-10-15 13:19:50.000000000","message":"The majority of this logic probably should be in the manager.  THe controller should only hold code that is specific to an HTTP of the function.  If you can imagein a case where some other work flow could execute the code that by passed this controller, then you should move code to the Manager.","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"8c6da45681ed4a3e32546eb8f07d6a8546b0f84e","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            # * allow_redelegation"},{"line_number":153,"context_line":"            valid \u003d bool(redelegated_trust.get(\u0027allow_redelegation\u0027))"},{"line_number":154,"context_line":"            # * 0 \u003c redelegation_count \u003c max_redelegation_count"},{"line_number":155,"context_line":"            max_redelegation_count \u003d CONF.trust.max_redelegation_count"},{"line_number":156,"context_line":"            redelegation_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027, 0)"},{"line_number":157,"context_line":"            valid \u0026\u003d 0 \u003c redelegation_count \u003c max_redelegation_count"},{"line_number":158,"context_line":"            # * remaining_uses is None"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_a147ecba","line":155,"in_reply_to":"baa201ad_512015f7","updated":"2014-10-16 18:20:20.000000000","message":"Thanks for clarification, didn\u0027t pay attention to this concept.","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"ee488320d871c470fd95b603c5e95489d6936143","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            # * role subset"},{"line_number":166,"context_line":"            parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":167,"context_line":"                               for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":168,"context_line":"            valid \u0026\u003d all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027])"},{"line_number":169,"context_line":"            if not valid:"},{"line_number":170,"context_line":"                raise exception.Forbidden("},{"line_number":171,"context_line":"                    _(\"Redelegation prerequisites are not meet\"))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_a20b7cd4","line":168,"updated":"2014-10-16 10:15:25.000000000","message":"Again, just returning instead of all the \u0026\u003d would be clearer IMO.\n\nAlso all of these cases need tests.","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"8c6da45681ed4a3e32546eb8f07d6a8546b0f84e","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            # * role subset"},{"line_number":166,"context_line":"            parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":167,"context_line":"                               for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":168,"context_line":"            valid \u0026\u003d all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027])"},{"line_number":169,"context_line":"            if not valid:"},{"line_number":170,"context_line":"                raise exception.Forbidden("},{"line_number":171,"context_line":"                    _(\"Redelegation prerequisites are not meet\"))"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_8123c803","line":168,"in_reply_to":"baa201ad_a20b7cd4","updated":"2014-10-16 18:20:20.000000000","message":"++ For now it\u0027s a draft :)","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a61bf83a62776241f050123459068385af5b0743","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        _admin_trustor_only(context, trust, user_id)"},{"line_number":272,"context_line":"        trusts \u003d self.trust_api.list_trusts_for_trustor("},{"line_number":273,"context_line":"            trust[\u0027trustor_user_id\u0027])"},{"line_number":274,"context_line":"        victims \u003d [trust_id]"},{"line_number":275,"context_line":"        while victims:"},{"line_number":276,"context_line":"            victim_id \u003d victims.pop()"},{"line_number":277,"context_line":"            victims.extend(t[\u0027id\u0027] for t in trusts"}],"source_content_type":"text/x-python","patch_set":5,"id":"baa201ad_912c3d4c","line":274,"updated":"2014-10-15 13:19:50.000000000","message":"use a better name than victims.  It is not immediately clear who is a \"victim.\"  And it sounds morbid.\n\nGood approach deleting from the top down.  That should avoid race conditions.","commit_id":"21704de751e4bbd1af1ee06d89a0b03ef0fff228"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"99cf9eb2a2697174b619fb1125657695c9866e87","unresolved":false,"context_lines":[{"line_number":246,"context_line":""},{"line_number":247,"context_line":"        user_id \u003d self._get_user_id(context)"},{"line_number":248,"context_line":"        _admin_trustor_only(context, trust, user_id)"},{"line_number":249,"context_line":"        trusts \u003d self.trust_api.list_trusts_for_trustor("},{"line_number":250,"context_line":"            trust[\u0027trustor_user_id\u0027])"},{"line_number":251,"context_line":"        to_free \u003d [trust_id]"},{"line_number":252,"context_line":"        while to_free:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9aa7fdbe_8b03890e","line":249,"updated":"2014-10-20 16:05:46.000000000","message":"Note that this is not sufficient to test against an invalid trust setup, as the user could be deactivated, or had a role removed.  Much safer to confirm the trust preconditions upon execution of the trust.","commit_id":"7e57fcea735e842968eb1dc826faeac698044efc"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        clean_roles \u003d self._clean_role_list(context, trust, all_roles)"},{"line_number":147,"context_line":"        self._require_trustor_has_role_in_project(trust, clean_roles)"},{"line_number":148,"context_line":"        trust[\u0027expires_at\u0027] \u003d self._parse_expiration_date("},{"line_number":149,"context_line":"            trust.get(\u0027expires_at\u0027))"},{"line_number":150,"context_line":"        trust_id \u003d uuid.uuid4().hex"},{"line_number":151,"context_line":"        new_trust \u003d self.trust_api.create_trust(trust_id, trust, clean_roles)"},{"line_number":152,"context_line":"        self._fill_in_roles(context, new_trust, all_roles)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_e35728c8","side":"PARENT","line":149,"updated":"2014-10-27 17:53:08.000000000","message":"Why was this removed?","commit_id":"4ac7ba4b3b31a8096fec67ef4ebcf19eaea2f061"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"15aaf8a38ef05bc9610fbd393d88db01d00546e1","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        clean_roles \u003d self._clean_role_list(context, trust, all_roles)"},{"line_number":147,"context_line":"        self._require_trustor_has_role_in_project(trust, clean_roles)"},{"line_number":148,"context_line":"        trust[\u0027expires_at\u0027] \u003d self._parse_expiration_date("},{"line_number":149,"context_line":"            trust.get(\u0027expires_at\u0027))"},{"line_number":150,"context_line":"        trust_id \u003d uuid.uuid4().hex"},{"line_number":151,"context_line":"        new_trust \u003d self.trust_api.create_trust(trust_id, trust, clean_roles)"},{"line_number":152,"context_line":"        self._fill_in_roles(context, new_trust, all_roles)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_3db592d0","side":"PARENT","line":149,"in_reply_to":"9aa7fdbe_1e99dfc3","updated":"2014-10-29 13:15:54.000000000","message":"trust[\u0027expires_at\u0027] must be handled anyway, so it has not to be under this \u0027if\u0027","commit_id":"4ac7ba4b3b31a8096fec67ef4ebcf19eaea2f061"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85db1fb30081c7663a31061da28c24e935e0f5f5","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        clean_roles \u003d self._clean_role_list(context, trust, all_roles)"},{"line_number":147,"context_line":"        self._require_trustor_has_role_in_project(trust, clean_roles)"},{"line_number":148,"context_line":"        trust[\u0027expires_at\u0027] \u003d self._parse_expiration_date("},{"line_number":149,"context_line":"            trust.get(\u0027expires_at\u0027))"},{"line_number":150,"context_line":"        trust_id \u003d uuid.uuid4().hex"},{"line_number":151,"context_line":"        new_trust \u003d self.trust_api.create_trust(trust_id, trust, clean_roles)"},{"line_number":152,"context_line":"        self._fill_in_roles(context, new_trust, all_roles)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_1e99dfc3","side":"PARENT","line":149,"in_reply_to":"9aa7fdbe_e35728c8","updated":"2014-10-27 18:02:53.000000000","message":"Ah it was moved? Why?  Suggest moving it back.","commit_id":"4ac7ba4b3b31a8096fec67ef4ebcf19eaea2f061"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        trust \u003d self.trust_api.get_trust(trust_id)"},{"line_number":229,"context_line":"        if not trust:"},{"line_number":230,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        user_id \u003d self._get_user_id(context)"},{"line_number":233,"context_line":"        _admin_trustor_only(context, trust, user_id)"},{"line_number":234,"context_line":"        self.trust_api.delete_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_035b4cf6","side":"PARENT","line":231,"updated":"2014-10-27 17:53:08.000000000","message":"Revert unrelated whitespace change.","commit_id":"4ac7ba4b3b31a8096fec67ef4ebcf19eaea2f061"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"15aaf8a38ef05bc9610fbd393d88db01d00546e1","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        trust \u003d self.trust_api.get_trust(trust_id)"},{"line_number":229,"context_line":"        if not trust:"},{"line_number":230,"context_line":"            raise exception.TrustNotFound(trust_id\u003dtrust_id)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        user_id \u003d self._get_user_id(context)"},{"line_number":233,"context_line":"        _admin_trustor_only(context, trust, user_id)"},{"line_number":234,"context_line":"        self.trust_api.delete_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_dd3ac633","side":"PARENT","line":231,"in_reply_to":"9aa7fdbe_035b4cf6","updated":"2014-10-29 13:15:54.000000000","message":"Done","commit_id":"4ac7ba4b3b31a8096fec67ef4ebcf19eaea2f061"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        if auth_context.get(\u0027is_delegated_auth\u0027):"},{"line_number":145,"context_line":"            # Redelegation case"},{"line_number":146,"context_line":"            if not CONF.trust.enabled:"},{"line_number":147,"context_line":"                raise exception.Forbidden(\u0027Trusts are disabled.\u0027)"},{"line_number":148,"context_line":"            src_trust_id \u003d auth_context[\u0027trust_id\u0027]"},{"line_number":149,"context_line":"            if not src_trust_id:"},{"line_number":150,"context_line":"                raise exception.Forbidden("}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_83b81c12","line":147,"updated":"2014-10-27 17:53:08.000000000","message":"This needs translation:\n\n  _(\u0027Trusts are disabled.\u0027)","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            src_trust_id \u003d auth_context[\u0027trust_id\u0027]"},{"line_number":149,"context_line":"            if not src_trust_id:"},{"line_number":150,"context_line":"                raise exception.Forbidden("},{"line_number":151,"context_line":"                    _(\"Redelegation allowed for delegated by trust only\"))"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"            redelegated_trust \u003d self.trust_api.get_trust(src_trust_id)"},{"line_number":154,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_234e903b","line":151,"updated":"2014-10-27 17:53:08.000000000","message":"(NIT, fix in next patch): use \u0027 instead of \"","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        if not CONF.trust.enabled:"},{"line_number":134,"context_line":"            raise exception.Forbidden(_(\u0027Trusts are disabled.\u0027))"},{"line_number":135,"context_line":"        if not trust:"},{"line_number":136,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027trust\u0027,"},{"line_number":137,"context_line":"                                            target\u003d\u0027request\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_98804bf9","line":134,"updated":"2014-12-26 17:03:11.000000000","message":"The coverage report shows that this isn\u0027t tested. Add a test.\n\nAlso, this looks like it\u0027s fixing a bug since the original code didn\u0027t do this. So this should be in a separate commit.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":"        if not CONF.trust.enabled:"},{"line_number":134,"context_line":"            raise exception.Forbidden(_(\u0027Trusts are disabled.\u0027))"},{"line_number":135,"context_line":"        if not trust:"},{"line_number":136,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027trust\u0027,"},{"line_number":137,"context_line":"                                            target\u003d\u0027request\u0027)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_3c91f29a","line":134,"in_reply_to":"3a961159_98804bf9","updated":"2014-12-29 19:10:56.000000000","message":"It is not a bug as if trusts are disabled in config 404 response are returned before even getting here.\nRemoved.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        else:"},{"line_number":152,"context_line":"            redelegated_trust \u003d None"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        trust[\u0027expires_at\u0027] \u003d self._parse_expiration_date("},{"line_number":155,"context_line":"            trust.get(\u0027expires_at\u0027))"},{"line_number":156,"context_line":"        if trust.get(\u0027project_id\u0027):"},{"line_number":157,"context_line":"            self._require_role(trust)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_13efdcea","line":154,"updated":"2014-12-26 17:03:11.000000000","message":"why was this moved? I tried running the tests with this in its old spot and they all passed, so this seems unnecessary.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        else:"},{"line_number":152,"context_line":"            redelegated_trust \u003d None"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        trust[\u0027expires_at\u0027] \u003d self._parse_expiration_date("},{"line_number":155,"context_line":"            trust.get(\u0027expires_at\u0027))"},{"line_number":156,"context_line":"        if trust.get(\u0027project_id\u0027):"},{"line_number":157,"context_line":"            self._require_role(trust)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_a1613d13","line":154,"in_reply_to":"3a961159_13efdcea","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        \"\"\"Create a new trust."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        The user creating the trust must be the trustor."},{"line_number":131,"context_line":"        \"\"\""},{"line_number":132,"context_line":"        if not trust:"},{"line_number":133,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027trust\u0027,"},{"line_number":134,"context_line":"                                            target\u003d\u0027request\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_2914b342","line":131,"updated":"2015-01-07 23:44:18.000000000","message":"Revert the whitespace change on the previous line.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":128,"context_line":"        \"\"\"Create a new trust."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        The user creating the trust must be the trustor."},{"line_number":131,"context_line":"        \"\"\""},{"line_number":132,"context_line":"        if not trust:"},{"line_number":133,"context_line":"            raise exception.ValidationError(attribute\u003d\u0027trust\u0027,"},{"line_number":134,"context_line":"                                            target\u003d\u0027request\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_5a032610","line":131,"in_reply_to":"3a961159_2914b342","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"}],"keystone/trust/core.py":[{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"061f3dcfe6dd64d5b14633d5faf203fe380e97b3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        if redelegated_trust:"},{"line_number":55,"context_line":"            # Validate against:"},{"line_number":56,"context_line":"            # * allow_redelegation"},{"line_number":57,"context_line":"            if not redelegated_trust.get(\u0027allow_redelegation\u0027) \\"},{"line_number":58,"context_line":"                    or not CONF.trust.allow_redelegation:"},{"line_number":59,"context_line":"                raise exception.Forbidden("},{"line_number":60,"context_line":"                    _(\"Redelegation is not allowed\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"baa201ad_176a9a19","line":57,"updated":"2014-10-17 19:00:00.000000000","message":"Please add a check that the initial trust is not disabled.  It can\u0027t be implicit from the token.","commit_id":"5f2346f4a7b0292828f6380cd060ce0c9322c75a"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"31bc918191ecd42d11ef965ca6a14b812cdb85f7","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        if redelegated_trust:"},{"line_number":55,"context_line":"            # Validate against:"},{"line_number":56,"context_line":"            # * allow_redelegation"},{"line_number":57,"context_line":"            if not redelegated_trust.get(\u0027allow_redelegation\u0027) \\"},{"line_number":58,"context_line":"                    or not CONF.trust.allow_redelegation:"},{"line_number":59,"context_line":"                raise exception.Forbidden("},{"line_number":60,"context_line":"                    _(\"Redelegation is not allowed\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"9aa7fdbe_5bddf913","line":57,"in_reply_to":"baa201ad_176a9a19","updated":"2014-10-20 11:12:31.000000000","message":"Added validation of entire trust pedigree, but I can\u0027t invent appropriate test case. It would be nice to have one as I don\u0027t know how to reproduce such inconsistency in current implementation.","commit_id":"5f2346f4a7b0292828f6380cd060ce0c9322c75a"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"99cf9eb2a2697174b619fb1125657695c9866e87","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def __init__(self):"},{"line_number":46,"context_line":"        super(Manager, self).__init__(CONF.trust.driver)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def _validate_redelegation(self, redelegated_trust, trust):"},{"line_number":49,"context_line":"        # Validate against:"},{"line_number":50,"context_line":"        # * allow_redelegation"},{"line_number":51,"context_line":"        if not redelegated_trust.get(\u0027allow_redelegation\u0027) \\"}],"source_content_type":"text/x-python","patch_set":7,"id":"9aa7fdbe_eea50305","line":48,"updated":"2014-10-20 16:05:46.000000000","message":"You could make a comparable call upon \"get_trust\" and deny any get for an invalid trust.  Probably need an override param for \"I know this trust is invalid, but I need to see it anyway\" that should not be used as part of the auth pipeline","commit_id":"7e57fcea735e842968eb1dc826faeac698044efc"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"5f2ec65e4cc7d654de0499a2801dd529f0bef708","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        # * role subset"},{"line_number":81,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":82,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":83,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":84,"context_line":"            raise exception.Forbidden("},{"line_number":85,"context_line":"                _(\"Some of requested roles cannot be granted \""},{"line_number":86,"context_line":"                  \"using this redelegated trust\"))"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aa7fdbe_ea6bab1b","line":83,"updated":"2014-10-24 13:27:36.000000000","message":"Would this be clearer if you used issubset?\n\ne.g\n  parent_roles \u003d set(role[\u0027id\u0027] for role in redelegated_trust[\u0027roles\u0027])\t\n  trust_roles \u003d set(role[\u0027id\u0027] for role in trust[\u0027roles\u0027])\n  if not trust_roles.issubset(parent_roles):\n    ...","commit_id":"310ec5315089c8efd6b9abbf80eee4852aa0e7d2"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"5f2ec65e4cc7d654de0499a2801dd529f0bef708","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                _(\"Some of requested roles cannot be granted \""},{"line_number":86,"context_line":"                  \"using this redelegated trust\"))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def get_trust_pedigree(self, trust_id):"},{"line_number":89,"context_line":"        trust \u003d self.driver.get_trust(trust_id)"},{"line_number":90,"context_line":"        trust_chain \u003d [trust]"},{"line_number":91,"context_line":"        if trust and trust.get(\u0027redelegated_trust_id\u0027):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aa7fdbe_6acedb2f","line":88,"updated":"2014-10-24 13:27:36.000000000","message":"\u0027pedigree\u0027 is a bit of a vague term IMO - I\u0027d either find another word which makes the function self-documenting, or add a docstring/comment explaining exactly what it does.","commit_id":"310ec5315089c8efd6b9abbf80eee4852aa0e7d2"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        if not redelegated_trust.get(\u0027allow_redelegation\u0027) \\"},{"line_number":52,"context_line":"                or not CONF.trust.allow_redelegation:"},{"line_number":53,"context_line":"            raise exception.Forbidden("},{"line_number":54,"context_line":"                _(\"Redelegation is not allowed\"))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        # * 0 \u003c redelegation_count \u003c max_redelegation_count"},{"line_number":57,"context_line":"        max_redelegation_count \u003d CONF.trust.max_redelegation_count"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_03298c36","line":54,"updated":"2014-10-27 17:53:08.000000000","message":"Use \u0027 not \" this applies to everything","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"15aaf8a38ef05bc9610fbd393d88db01d00546e1","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        if not redelegated_trust.get(\u0027allow_redelegation\u0027) \\"},{"line_number":52,"context_line":"                or not CONF.trust.allow_redelegation:"},{"line_number":53,"context_line":"            raise exception.Forbidden("},{"line_number":54,"context_line":"                _(\"Redelegation is not allowed\"))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        # * 0 \u003c redelegation_count \u003c max_redelegation_count"},{"line_number":57,"context_line":"        max_redelegation_count \u003d CONF.trust.max_redelegation_count"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_3d5f5277","line":54,"in_reply_to":"9aa7fdbe_03298c36","updated":"2014-10-29 13:15:54.000000000","message":"Done","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        if not (0 \u003c redelegation_count \u003c max_redelegation_count):"},{"line_number":60,"context_line":"            raise exception.Forbidden("},{"line_number":61,"context_line":"                _(\"redelegation_count out of bounds \""},{"line_number":62,"context_line":"                  \"0..max_redelegation_count\"))"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # * remaining_uses is None"},{"line_number":65,"context_line":"        if trust.get(\u0027remaining_uses\u0027) is not None:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_03b7ccf5","line":62,"updated":"2014-10-27 17:53:08.000000000","message":"This message should be more clear, what is \"max_redelegation_count\" this is a string in this case not the value ?\n\nSuggest: \"Maximum redelegation depth of %s exceeded\" % max_redelegation_count","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        # * remaining_uses is None"},{"line_number":65,"context_line":"        if trust.get(\u0027remaining_uses\u0027) is not None:"},{"line_number":66,"context_line":"            raise exception.Forbidden("},{"line_number":67,"context_line":"                _(\"remaining_uses MUST NOT be set to allow redelegation\"))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        # * expiry times"},{"line_number":70,"context_line":"        trust_expiry \u003d trust.get(\u0027expires_at\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_63c7b864","line":67,"updated":"2014-10-27 17:53:08.000000000","message":"This is not a clear error message/case. What are you trying to communicate?","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            if redelegated_expiry \u003c trust_expiry.replace(tzinfo\u003dNone):"},{"line_number":74,"context_line":"                raise exception.Forbidden("},{"line_number":75,"context_line":"                    _(\"Requested expiration time is more \""},{"line_number":76,"context_line":"                      \"than redelegated trust can provide\"))"},{"line_number":77,"context_line":"        else:"},{"line_number":78,"context_line":"            trust[\u0027expires_at\u0027] \u003d redelegated_expiry"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_a3a440ba","line":76,"updated":"2014-10-27 17:53:08.000000000","message":"This is a good example/much clearer than the other messages.","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"85bc6daa9fa8b3351f1479877b5bf85d9218f2b4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":84,"context_line":"            raise exception.Forbidden("},{"line_number":85,"context_line":"                _(\"Some of requested roles cannot be granted \""},{"line_number":86,"context_line":"                  \"using this redelegated trust\"))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def get_trust_pedigree(self, trust_id):"},{"line_number":89,"context_line":"        trust \u003d self.driver.get_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_a3b9a0cd","line":86,"updated":"2014-10-27 17:53:08.000000000","message":"(NIT): missing a period at the end of the string.\n\nWhat roles? Is this a 403 or a \"400\" in this case? We need a change to the docs for the v3 spec.","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"15aaf8a38ef05bc9610fbd393d88db01d00546e1","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":84,"context_line":"            raise exception.Forbidden("},{"line_number":85,"context_line":"                _(\"Some of requested roles cannot be granted \""},{"line_number":86,"context_line":"                  \"using this redelegated trust\"))"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def get_trust_pedigree(self, trust_id):"},{"line_number":89,"context_line":"        trust \u003d self.driver.get_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9aa7fdbe_e16608ee","line":86,"in_reply_to":"9aa7fdbe_a3b9a0cd","updated":"2014-10-29 13:15:54.000000000","message":"This is the case of role superset request","commit_id":"b8c2d4f09fae4522b5bc06b09d997a1168222d8b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    @staticmethod"},{"line_number":49,"context_line":"    def _validate_redelegation(redelegated_trust, trust):"},{"line_number":50,"context_line":"        # Validate against:"},{"line_number":51,"context_line":"        # * f0 \u003c redelegation_count \u003c\u003d max_redelegation_count"},{"line_number":52,"context_line":"        max_redelegation_count \u003d CONF.trust.max_redelegation_count"},{"line_number":53,"context_line":"        redelegation_depth \u003d redelegated_trust.get(\u0027redelegation_count\u0027, 0)"},{"line_number":54,"context_line":"        if not (0 \u003c redelegation_depth \u003c\u003d max_redelegation_count):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_73bd80d7","line":51,"updated":"2014-12-26 17:03:11.000000000","message":"change \"f0\" to \"0\". remove *.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":48,"context_line":"    @staticmethod"},{"line_number":49,"context_line":"    def _validate_redelegation(redelegated_trust, trust):"},{"line_number":50,"context_line":"        # Validate against:"},{"line_number":51,"context_line":"        # * f0 \u003c redelegation_count \u003c\u003d max_redelegation_count"},{"line_number":52,"context_line":"        max_redelegation_count \u003d CONF.trust.max_redelegation_count"},{"line_number":53,"context_line":"        redelegation_depth \u003d redelegated_trust.get(\u0027redelegation_count\u0027, 0)"},{"line_number":54,"context_line":"        if not (0 \u003c redelegation_depth \u003c\u003d max_redelegation_count):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_1ce5160a","line":51,"in_reply_to":"3a961159_73bd80d7","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                redelegation_depth\u003dredelegation_depth,"},{"line_number":59,"context_line":"                max_count\u003dmax_redelegation_count)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # * remaining_uses is None"},{"line_number":62,"context_line":"        if trust.get(\u0027remaining_uses\u0027) is not None:"},{"line_number":63,"context_line":"            raise exception.Forbidden("},{"line_number":64,"context_line":"                _(\u0027Field \"remaining_uses\" is set to %(value)s\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_d3cb9471","line":61,"updated":"2014-12-26 17:03:11.000000000","message":"remove *. Also, I don\u0027t know what this comment means so it should be removed.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                redelegation_depth\u003dredelegation_depth,"},{"line_number":59,"context_line":"                max_count\u003dmax_redelegation_count)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        # * remaining_uses is None"},{"line_number":62,"context_line":"        if trust.get(\u0027remaining_uses\u0027) is not None:"},{"line_number":63,"context_line":"            raise exception.Forbidden("},{"line_number":64,"context_line":"                _(\u0027Field \"remaining_uses\" is set to %(value)s\u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_3ce2d201","line":61,"in_reply_to":"3a961159_d3cb9471","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                  \u0027 while it must not be set in order to redelegate a trust\u0027),"},{"line_number":66,"context_line":"                value\u003dtrust.get(\u0027remaining_uses\u0027))"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # * expiry times"},{"line_number":69,"context_line":"        trust_expiry \u003d trust.get(\u0027expires_at\u0027)"},{"line_number":70,"context_line":"        redelegated_expiry \u003d redelegated_trust[\u0027expires_at\u0027]"},{"line_number":71,"context_line":"        if trust_expiry:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_f3c89077","line":68,"updated":"2014-12-26 17:03:11.000000000","message":"remove *. Also, I don\u0027t know what this comment means so it should be removed.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"                  \u0027 while it must not be set in order to redelegate a trust\u0027),"},{"line_number":66,"context_line":"                value\u003dtrust.get(\u0027remaining_uses\u0027))"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # * expiry times"},{"line_number":69,"context_line":"        trust_expiry \u003d trust.get(\u0027expires_at\u0027)"},{"line_number":70,"context_line":"        redelegated_expiry \u003d redelegated_trust[\u0027expires_at\u0027]"},{"line_number":71,"context_line":"        if trust_expiry:"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_5cef9ee9","line":68,"in_reply_to":"3a961159_f3c89077","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        trust_expiry \u003d trust.get(\u0027expires_at\u0027)"},{"line_number":70,"context_line":"        redelegated_expiry \u003d redelegated_trust[\u0027expires_at\u0027]"},{"line_number":71,"context_line":"        if trust_expiry:"},{"line_number":72,"context_line":"            if redelegated_expiry \u003c trust_expiry.replace(tzinfo\u003dNone):"},{"line_number":73,"context_line":"                raise exception.Forbidden("},{"line_number":74,"context_line":"                    _(\u0027Requested expiration time is more \u0027"},{"line_number":75,"context_line":"                      \u0027than redelegated trust can provide\u0027))"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_93a90c93","line":72,"updated":"2014-12-26 17:03:11.000000000","message":"why replace tzinfo? Add a comment.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        trust_expiry \u003d trust.get(\u0027expires_at\u0027)"},{"line_number":70,"context_line":"        redelegated_expiry \u003d redelegated_trust[\u0027expires_at\u0027]"},{"line_number":71,"context_line":"        if trust_expiry:"},{"line_number":72,"context_line":"            if redelegated_expiry \u003c trust_expiry.replace(tzinfo\u003dNone):"},{"line_number":73,"context_line":"                raise exception.Forbidden("},{"line_number":74,"context_line":"                    _(\u0027Requested expiration time is more \u0027"},{"line_number":75,"context_line":"                      \u0027than redelegated trust can provide\u0027))"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_5c4cfec8","line":72,"in_reply_to":"3a961159_93a90c93","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        else:"},{"line_number":77,"context_line":"            trust[\u0027expires_at\u0027] \u003d redelegated_expiry"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        # * role subset"},{"line_number":80,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":81,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":82,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_13c6fc68","line":79,"updated":"2014-12-26 17:03:11.000000000","message":"remove *. Also, I don\u0027t know what this comment means so it should be removed.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        else:"},{"line_number":77,"context_line":"            trust[\u0027expires_at\u0027] \u003d redelegated_expiry"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        # * role subset"},{"line_number":80,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":81,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":82,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_7cec5af4","line":79,"in_reply_to":"3a961159_13c6fc68","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":81,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":82,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":83,"context_line":"            raise exception.Forbidden("},{"line_number":84,"context_line":"                _(\u0027Some of requested roles are not in redelegated trust\u0027))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def get_trust_pedigree(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_98fccb74","line":83,"updated":"2014-12-26 17:03:11.000000000","message":"The coverage report shows that this isn\u0027t tested. Add a test.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":81,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":82,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":83,"context_line":"            raise exception.Forbidden("},{"line_number":84,"context_line":"                _(\u0027Some of requested roles are not in redelegated trust\u0027))"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def get_trust_pedigree(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_7c9a9a6f","line":83,"in_reply_to":"3a961159_98fccb74","updated":"2014-12-29 19:10:56.000000000","message":"The test for this is: \ntests.test_v3_auth.TestTrustRedelegation.test_roles_subset","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        if redelegated_trust:"},{"line_number":145,"context_line":"            # Populate trust with:"},{"line_number":146,"context_line":"            # * redelegated_trust_id"},{"line_number":147,"context_line":"            trust[\u0027redelegated_trust_id\u0027] \u003d redelegated_trust[\u0027id\u0027]"},{"line_number":148,"context_line":"            # * redelegation_count - 1"},{"line_number":149,"context_line":"            remaining_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027) - 1"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_93974c3a","line":146,"updated":"2014-12-26 17:03:11.000000000","message":"This comment is just restating what the next line does and the next line is obvious enough, so remove the comment.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"        if redelegated_trust:"},{"line_number":145,"context_line":"            # Populate trust with:"},{"line_number":146,"context_line":"            # * redelegated_trust_id"},{"line_number":147,"context_line":"            trust[\u0027redelegated_trust_id\u0027] \u003d redelegated_trust[\u0027id\u0027]"},{"line_number":148,"context_line":"            # * redelegation_count - 1"},{"line_number":149,"context_line":"            remaining_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027) - 1"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_5c74fe35","line":146,"in_reply_to":"3a961159_93974c3a","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            # Populate trust with:"},{"line_number":146,"context_line":"            # * redelegated_trust_id"},{"line_number":147,"context_line":"            trust[\u0027redelegated_trust_id\u0027] \u003d redelegated_trust[\u0027id\u0027]"},{"line_number":148,"context_line":"            # * redelegation_count - 1"},{"line_number":149,"context_line":"            remaining_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027) - 1"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            # Validate depth consistency"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_b39c485f","line":148,"updated":"2014-12-26 17:03:11.000000000","message":"The next line doesn\u0027t do what this comment says it does since it\u0027s not populating the trust. Remove the comment since it\u0027s out of date.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":145,"context_line":"            # Populate trust with:"},{"line_number":146,"context_line":"            # * redelegated_trust_id"},{"line_number":147,"context_line":"            trust[\u0027redelegated_trust_id\u0027] \u003d redelegated_trust[\u0027id\u0027]"},{"line_number":148,"context_line":"            # * redelegation_count - 1"},{"line_number":149,"context_line":"            remaining_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027) - 1"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            # Validate depth consistency"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_1c7a7625","line":148,"in_reply_to":"3a961159_b39c485f","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            # * redelegated_trust_id"},{"line_number":147,"context_line":"            trust[\u0027redelegated_trust_id\u0027] \u003d redelegated_trust[\u0027id\u0027]"},{"line_number":148,"context_line":"            # * redelegation_count - 1"},{"line_number":149,"context_line":"            remaining_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027) - 1"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            # Validate depth consistency"},{"line_number":152,"context_line":"            if (redelegatable and requested_count and"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_d3a0f493","line":149,"updated":"2014-12-26 17:03:11.000000000","message":".get() could return None and then this would raise an exception. [] should be used.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            # * redelegated_trust_id"},{"line_number":147,"context_line":"            trust[\u0027redelegated_trust_id\u0027] \u003d redelegated_trust[\u0027id\u0027]"},{"line_number":148,"context_line":"            # * redelegation_count - 1"},{"line_number":149,"context_line":"            remaining_count \u003d redelegated_trust.get(\u0027redelegation_count\u0027) - 1"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"            # Validate depth consistency"},{"line_number":152,"context_line":"            if (redelegatable and requested_count and"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_3c77323d","line":149,"in_reply_to":"3a961159_d3a0f493","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            # Validate depth consistency"},{"line_number":152,"context_line":"            if (redelegatable and requested_count and"},{"line_number":153,"context_line":"                    requested_count !\u003d remaining_count):"},{"line_number":154,"context_line":"                msg \u003d _(\u0027Modifying \"redelegation_count\" upon redelegation is\u0027"},{"line_number":155,"context_line":"                        \u0027 forbidden. Omitting this parameter is advised.\u0027)"},{"line_number":156,"context_line":"                raise exception.Forbidden(msg)"},{"line_number":157,"context_line":"            trust.setdefault(\u0027redelegation_count\u0027, remaining_count)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_b801876c","line":154,"updated":"2014-12-26 17:03:11.000000000","message":"The coverage report shows that this isn\u0027t tested. Add a test.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            # Validate depth consistency"},{"line_number":152,"context_line":"            if (redelegatable and requested_count and"},{"line_number":153,"context_line":"                    requested_count !\u003d remaining_count):"},{"line_number":154,"context_line":"                msg \u003d _(\u0027Modifying \"redelegation_count\" upon redelegation is\u0027"},{"line_number":155,"context_line":"                        \u0027 forbidden. Omitting this parameter is advised.\u0027)"},{"line_number":156,"context_line":"                raise exception.Forbidden(msg)"},{"line_number":157,"context_line":"            trust.setdefault(\u0027redelegation_count\u0027, remaining_count)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_3cc5723d","line":154,"in_reply_to":"3a961159_b801876c","updated":"2014-12-29 19:10:56.000000000","message":"The test: tests.test_v3_auth.TestTrustRedelegation.test_modified_redelegation_count_error","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"101ae09ba87b2a4ef5d95c1dc83475dda7b2f3e4","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                except exception.TrustNotFound:"},{"line_number":186,"context_line":"                    # if trust was deleted by concurrent process"},{"line_number":187,"context_line":"                    # consistency must not suffer"},{"line_number":188,"context_line":"                    pass"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        # end recursion"},{"line_number":191,"context_line":"        self.driver.delete_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_d8f57385","line":188,"updated":"2014-12-26 17:03:11.000000000","message":"The coverage report shows that this isn\u0027t tested. Add a test.","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"b201911e3cfbceb0818e46efa9e696afd96fbc8d","unresolved":false,"context_lines":[{"line_number":185,"context_line":"                except exception.TrustNotFound:"},{"line_number":186,"context_line":"                    # if trust was deleted by concurrent process"},{"line_number":187,"context_line":"                    # consistency must not suffer"},{"line_number":188,"context_line":"                    pass"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"        # end recursion"},{"line_number":191,"context_line":"        self.driver.delete_trust(trust_id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3a961159_fc012a6b","line":188,"in_reply_to":"3a961159_d8f57385","updated":"2014-12-29 19:10:56.000000000","message":"Done","commit_id":"2e8593cb80a5e74108bfddd93830aaa345b32d0f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cdaefc190e5613f7fca681867b38da2a62725552","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":82,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":83,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":84,"context_line":"            raise exception.Forbidden("},{"line_number":85,"context_line":"                _(\u0027Some of requested roles are not in redelegated trust\u0027))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def get_trust_pedigree(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a961159_a5cce662","line":84,"updated":"2014-12-29 21:02:57.000000000","message":"I changed the code to not raise an exception and  tests.test_v3_auth.TestTrustRedelegation.test_roles_subset still passed, so it\u0027s not verifying that an exception is raised as expected.","commit_id":"c70bef4bc8abea9e504e772a399ad95d3bc19935"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"2703e95ad6973f3f0d44ef4ad108093253555bab","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":82,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":83,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":84,"context_line":"            raise exception.Forbidden("},{"line_number":85,"context_line":"                _(\u0027Some of requested roles are not in redelegated trust\u0027))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def get_trust_pedigree(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a961159_ce4bc65d","line":84,"in_reply_to":"3a961159_a5cce662","updated":"2014-12-30 14:01:59.000000000","message":"It appears to be filtered by policy enforcement, but I doubt we can rely on it.","commit_id":"c70bef4bc8abea9e504e772a399ad95d3bc19935"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"00da203bedd1da104f6a8a9c170fc59e73c0c5cf","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":82,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":83,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":84,"context_line":"            raise exception.Forbidden("},{"line_number":85,"context_line":"                _(\u0027Some of requested roles are not in redelegated trust\u0027))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def get_trust_pedigree(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a961159_0454cec8","line":84,"updated":"2014-12-30 14:57:31.000000000","message":"Modify the policy for the test so that this code can be tested.","commit_id":"9dc7ba1034f67b2d983709f6cd58803290e1cac6"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"7e993e9891d92052dfc516af3914bb72aef007c7","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        parent_roles \u003d set(role[\u0027id\u0027]"},{"line_number":82,"context_line":"                           for role in redelegated_trust[\u0027roles\u0027])"},{"line_number":83,"context_line":"        if not all(role[\u0027id\u0027] in parent_roles for role in trust[\u0027roles\u0027]):"},{"line_number":84,"context_line":"            raise exception.Forbidden("},{"line_number":85,"context_line":"                _(\u0027Some of requested roles are not in redelegated trust\u0027))"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def get_trust_pedigree(self, trust_id):"}],"source_content_type":"text/x-python","patch_set":26,"id":"3a961159_fc890770","line":84,"in_reply_to":"3a961159_0454cec8","updated":"2014-12-31 14:03:57.000000000","message":"Done","commit_id":"9dc7ba1034f67b2d983709f6cd58803290e1cac6"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            raise exception.Forbidden("},{"line_number":65,"context_line":"                _(\u0027Field \"remaining_uses\" is set to %(value)s\u0027"},{"line_number":66,"context_line":"                  \u0027 while it must not be set in order to redelegate a trust\u0027),"},{"line_number":67,"context_line":"                value\u003dtrust.get(\u0027remaining_uses\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        # expiry times"},{"line_number":70,"context_line":"        trust_expiry \u003d trust.get(\u0027expires_at\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_c9edef26","line":67,"updated":"2015-01-07 23:44:18.000000000","message":"use trust[\u0027remaining_uses\u0027] since there was already a check already that the item is in the dict.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            raise exception.Forbidden("},{"line_number":65,"context_line":"                _(\u0027Field \"remaining_uses\" is set to %(value)s\u0027"},{"line_number":66,"context_line":"                  \u0027 while it must not be set in order to redelegate a trust\u0027),"},{"line_number":67,"context_line":"                value\u003dtrust.get(\u0027remaining_uses\u0027))"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"        # expiry times"},{"line_number":70,"context_line":"        trust_expiry \u003d trust.get(\u0027expires_at\u0027)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_0d37aae5","line":67,"in_reply_to":"3a961159_c9edef26","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            # Validate remaining_uses"},{"line_number":133,"context_line":"            remaining_uses \u003d trust.get(\u0027remaining_uses\u0027)"},{"line_number":134,"context_line":"            if remaining_uses is not None and not ("},{"line_number":135,"context_line":"                    isinstance(remaining_uses, int) and remaining_uses \u003e 0):"},{"line_number":136,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":137,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":138,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_a906e3cb","line":135,"updated":"2015-01-07 23:44:18.000000000","message":"This should have been validated with JSON Schema already.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            # Validate remaining_uses"},{"line_number":133,"context_line":"            remaining_uses \u003d trust.get(\u0027remaining_uses\u0027)"},{"line_number":134,"context_line":"            if remaining_uses is not None and not ("},{"line_number":135,"context_line":"                    isinstance(remaining_uses, int) and remaining_uses \u003e 0):"},{"line_number":136,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":137,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":138,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_cda202fc","line":135,"in_reply_to":"3a961159_a906e3cb","updated":"2015-01-12 13:24:07.000000000","message":"Done","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"63990e611682baeddbb9c923cf2dadbd92da6231","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        trusts \u003d self.driver.list_trusts_for_trustor("},{"line_number":183,"context_line":"            trust[\u0027trustor_user_id\u0027])"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        for t in trusts:"},{"line_number":186,"context_line":"            if t.get(\u0027redelegated_trust_id\u0027) \u003d\u003d trust_id:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_89976744","line":183,"updated":"2015-01-07 23:44:18.000000000","message":"add a comment why all the trusts for the trustor user need to be deleted.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"740b00eb6a7c1ddff2e0e7e7ec5f3749ee208061","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            raise exception.TrustNotFound(trust_id)"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"        trusts \u003d self.driver.list_trusts_for_trustor("},{"line_number":183,"context_line":"            trust[\u0027trustor_user_id\u0027])"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"        for t in trusts:"},{"line_number":186,"context_line":"            if t.get(\u0027redelegated_trust_id\u0027) \u003d\u003d trust_id:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3a961159_6debcedc","line":183,"in_reply_to":"3a961159_89976744","updated":"2015-01-12 13:24:07.000000000","message":"Actually they are not: cycle below deletes redelegated trusts only, filtered out of full set of siblings.\nI\u0027ve added it to the docstring.","commit_id":"5ccafe56d04f7547577a2e91a98e68000f3c9aa9"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cc7310bf07ab1ea516a05fac9092c1a904ecdc4","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            trust[\u0027redelegation_count\u0027] \u003d requested_count \u003d 0"},{"line_number":133,"context_line":"            # Validate remaining_uses"},{"line_number":134,"context_line":"            remaining_uses \u003d trust.get(\u0027remaining_uses\u0027)"},{"line_number":135,"context_line":"            if remaining_uses is not None and remaining_uses \u003c\u003d 0:"},{"line_number":136,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":137,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":138,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_9d1736ee","line":135,"updated":"2015-01-12 21:20:32.000000000","message":"This should have been validated with JSON Schema already.","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"1eda019d5c02280e423d89d675380fc43cf0ebed","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            trust[\u0027redelegation_count\u0027] \u003d requested_count \u003d 0"},{"line_number":133,"context_line":"            # Validate remaining_uses"},{"line_number":134,"context_line":"            remaining_uses \u003d trust.get(\u0027remaining_uses\u0027)"},{"line_number":135,"context_line":"            if remaining_uses is not None and remaining_uses \u003c\u003d 0:"},{"line_number":136,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":137,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":138,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_8a1d1513","line":135,"in_reply_to":"3a961159_56e59ada","updated":"2015-01-13 13:01:56.000000000","message":"But the code is still needed for backend test:\nhttps://github.com/openstack/keystone/blob/master/keystone/tests/test_backend.py#L4329-L4340","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"e9e439be9485b2e90f6b51a3fcdfc5f70be6ed7d","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            trust[\u0027redelegation_count\u0027] \u003d requested_count \u003d 0"},{"line_number":133,"context_line":"            # Validate remaining_uses"},{"line_number":134,"context_line":"            remaining_uses \u003d trust.get(\u0027remaining_uses\u0027)"},{"line_number":135,"context_line":"            if remaining_uses is not None and remaining_uses \u003c\u003d 0:"},{"line_number":136,"context_line":"                msg \u003d _(\u0027remaining_uses must be a positive integer or null.\u0027)"},{"line_number":137,"context_line":"                raise exception.ValidationError(msg)"},{"line_number":138,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3a961159_56e59ada","line":135,"in_reply_to":"3a961159_9d1736ee","updated":"2015-01-13 11:11:55.000000000","message":"Improved validation schema.","commit_id":"1abb615a4f1e8c8aabea2049589c655980861a48"}]}
