)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9434a1427fb8c6b27a1e91f5a1c0feb7d27399f1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implement Trust Flush via keystone-manage."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Creates a cli entry \u0027trust_flush\u0027 which removes"},{"line_number":10,"context_line":"all expired tokens."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I1c85b67d24e05db86c85e722fbd773a411c24ac4"},{"line_number":13,"context_line":"Closes-Bug: #1473292"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3f79a3b5_f80c49a6","line":10,"range":{"start_line":10,"start_character":12,"end_line":10,"end_character":18},"updated":"2018-08-10 09:20:01.000000000","message":"Typo? You mean expired trusts?","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"184b554db53767b0ff996d24c3129dfbab13a128","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Implement Trust Flush via keystone-manage."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Creates a cli entry \u0027trust_flush\u0027 which removes"},{"line_number":10,"context_line":"all expired tokens."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I1c85b67d24e05db86c85e722fbd773a411c24ac4"},{"line_number":13,"context_line":"Closes-Bug: #1473292"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3f79a3b5_2b6e1896","line":10,"range":{"start_line":10,"start_character":12,"end_line":10,"end_character":18},"in_reply_to":"3f79a3b5_f80c49a6","updated":"2018-08-21 10:54:44.000000000","message":"Done","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"}],"doc/source/configuration.rst":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9434a1427fb8c6b27a1e91f5a1c0feb7d27399f1","unresolved":false,"context_lines":[{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    $ keystone-manage trust_flush"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"The memcache backend automatically discards expired trusts and so flushing"},{"line_number":534,"context_line":"is unnecessary and if attempted will fail with a NotImplemented error."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_786b591d","line":534,"range":{"start_line":533,"start_character":0,"end_line":534,"end_character":70},"updated":"2018-08-10 09:20:01.000000000","message":"I don\u0027t understand this comment - we don\u0027t support a memcache backend for trusts","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"184b554db53767b0ff996d24c3129dfbab13a128","unresolved":false,"context_lines":[{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    $ keystone-manage trust_flush"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"The memcache backend automatically discards expired trusts and so flushing"},{"line_number":534,"context_line":"is unnecessary and if attempted will fail with a NotImplemented error."}],"source_content_type":"text/x-rst","patch_set":5,"id":"3f79a3b5_cb6c449e","line":534,"range":{"start_line":533,"start_character":0,"end_line":534,"end_character":70},"in_reply_to":"3f79a3b5_786b591d","updated":"2018-08-21 10:54:44.000000000","message":"Done","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1021e7202fe9c18310164897a2e3115e7186746f","unresolved":false,"context_lines":[{"line_number":529,"context_line":"removed. These trusts can be removed with::"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    $ keystone-manage trust_flush"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"3f79a3b5_f27a5dee","line":532,"updated":"2018-08-31 08:13:05.000000000","message":"how about move them to admin/identity-performance.rst?","commit_id":"ccb5b3bc7fe5cab5f1af6ef923b2510bc4e930d7"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1fa27ef5391d56d60e86434bb086b946453ed166","unresolved":false,"context_lines":[{"line_number":529,"context_line":"removed. These trusts can be removed with::"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    $ keystone-manage trust_flush"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3f79a3b5_7e94a18b","line":532,"updated":"2018-09-04 08:49:03.000000000","message":"I still think this should be moved to admin doc folder.","commit_id":"74dff3974e38db30dd8a1b08369cd2ce73aaf87a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"319d576e5b7b78e29f5dbd65347eb03e70799ed7","unresolved":false,"context_lines":[{"line_number":529,"context_line":"removed. These trusts can be removed with::"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    $ keystone-manage trust_flush"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"3f79a3b5_f33178a3","line":532,"in_reply_to":"3f79a3b5_7e94a18b","updated":"2018-09-07 06:47:30.000000000","message":"I still have a doubt for which folder you are talking about to move this in to ??","commit_id":"74dff3974e38db30dd8a1b08369cd2ce73aaf87a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2b121e691cc443055fcf8c97133541cd01703bba","unresolved":false,"context_lines":[{"line_number":529,"context_line":"removed. These trusts can be removed with::"},{"line_number":530,"context_line":""},{"line_number":531,"context_line":"    $ keystone-manage trust_flush"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":""}],"source_content_type":"text/x-rst","patch_set":10,"id":"3f79a3b5_a81da3bf","line":532,"updated":"2018-09-10 11:22:11.000000000","message":"let\u0027s move it to docs/source/admin/identity-use-trusts.rst","commit_id":"35b71894bb12c071196d3389087faeac92bc8bd5"}],"keystone/cmd/cli.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"32ef997551179625a60098817e5e08e36cd481da","unresolved":false,"context_lines":[{"line_number":680,"context_line":"    \"\"\"Flush expired trusts from the backend.\"\"\""},{"line_number":681,"context_line":""},{"line_number":682,"context_line":"    name \u003d \u0027trust_flush\u0027"},{"line_number":683,"context_line":""},{"line_number":684,"context_line":"    @classmethod"},{"line_number":685,"context_line":"    def main(cls):"},{"line_number":686,"context_line":"        trust_manager \u003d trust.Manager()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_0517a0ef","line":683,"updated":"2018-08-08 02:13:39.000000000","message":"I\u0027d like to see more input parameters for this command. Such as \"keystone trus_flush --project xxxx\" to purge the specified project\u0027s trust.","commit_id":"db02412dc9a254b2c18b302411586fcbad9140fc"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"32ef997551179625a60098817e5e08e36cd481da","unresolved":false,"context_lines":[{"line_number":683,"context_line":""},{"line_number":684,"context_line":"    @classmethod"},{"line_number":685,"context_line":"    def main(cls):"},{"line_number":686,"context_line":"        trust_manager \u003d trust.Manager()"},{"line_number":687,"context_line":"        trust_manager.driver.flush_expired_trusts()"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"class MappingPurge(BaseApp):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_50bc86db","line":687,"range":{"start_line":686,"start_character":0,"end_line":687,"end_character":51},"updated":"2018-08-08 02:13:39.000000000","message":"usually we use load_backends() to init the Manager.","commit_id":"db02412dc9a254b2c18b302411586fcbad9140fc"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9434a1427fb8c6b27a1e91f5a1c0feb7d27399f1","unresolved":false,"context_lines":[{"line_number":684,"context_line":"    def add_argument_parser(cls, subparsers):"},{"line_number":685,"context_line":"        parser \u003d super(TrustFlush, cls).add_argument_parser(subparsers)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        parser.add_argument(\u0027--project-id\u0027, default\u003dNone, required\u003dTrue,"},{"line_number":688,"context_line":"                            help\u003d(\u0027The id of the project of which the expired \u0027"},{"line_number":689,"context_line":"                                  \u0027trusts is to be purged\u0027))"},{"line_number":690,"context_line":"        parser.add_argument(\u0027--trustor-user-id\u0027, default\u003dNone, required\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_58b3fd98","line":687,"range":{"start_line":687,"start_character":58,"end_line":687,"end_character":71},"updated":"2018-08-10 09:20:01.000000000","message":"required\u003dTrue doesn\u0027t make sense when there\u0027s a default provided","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"184b554db53767b0ff996d24c3129dfbab13a128","unresolved":false,"context_lines":[{"line_number":684,"context_line":"    def add_argument_parser(cls, subparsers):"},{"line_number":685,"context_line":"        parser \u003d super(TrustFlush, cls).add_argument_parser(subparsers)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        parser.add_argument(\u0027--project-id\u0027, default\u003dNone, required\u003dTrue,"},{"line_number":688,"context_line":"                            help\u003d(\u0027The id of the project of which the expired \u0027"},{"line_number":689,"context_line":"                                  \u0027trusts is to be purged\u0027))"},{"line_number":690,"context_line":"        parser.add_argument(\u0027--trustor-user-id\u0027, default\u003dNone, required\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_eb67c0b6","line":687,"range":{"start_line":687,"start_character":58,"end_line":687,"end_character":71},"in_reply_to":"3f79a3b5_58b3fd98","updated":"2018-08-21 10:54:44.000000000","message":"Done","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9434a1427fb8c6b27a1e91f5a1c0feb7d27399f1","unresolved":false,"context_lines":[{"line_number":701,"context_line":"        trust_manager \u003d drivers[\u0027trust.Manager\u0027]"},{"line_number":702,"context_line":"        if CONF.command.project_id or CONF.command.trustor_user_id or \\"},{"line_number":703,"context_line":"                CONF.command.trustee_user_id:"},{"line_number":704,"context_line":"            trust_manager.flush_expired_trusts_for_id("},{"line_number":705,"context_line":"                project_id\u003dCONF.command.project_id,"},{"line_number":706,"context_line":"                trustor_user_id\u003dCONF.command.trustor_user_id,"},{"line_number":707,"context_line":"                trustee_user_id\u003dCONF.command.trustee_user_id)"},{"line_number":708,"context_line":"        else:"},{"line_number":709,"context_line":"            trust_manager.flush_expired_trusts()"},{"line_number":710,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_f8c449f7","line":707,"range":{"start_line":704,"start_character":12,"end_line":707,"end_character":61},"updated":"2018-08-10 09:20:01.000000000","message":"See my comment on the manager change, I think you could skip the if/else and just call one method.","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"184b554db53767b0ff996d24c3129dfbab13a128","unresolved":false,"context_lines":[{"line_number":701,"context_line":"        trust_manager \u003d drivers[\u0027trust.Manager\u0027]"},{"line_number":702,"context_line":"        if CONF.command.project_id or CONF.command.trustor_user_id or \\"},{"line_number":703,"context_line":"                CONF.command.trustee_user_id:"},{"line_number":704,"context_line":"            trust_manager.flush_expired_trusts_for_id("},{"line_number":705,"context_line":"                project_id\u003dCONF.command.project_id,"},{"line_number":706,"context_line":"                trustor_user_id\u003dCONF.command.trustor_user_id,"},{"line_number":707,"context_line":"                trustee_user_id\u003dCONF.command.trustee_user_id)"},{"line_number":708,"context_line":"        else:"},{"line_number":709,"context_line":"            trust_manager.flush_expired_trusts()"},{"line_number":710,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_ab0788c9","line":707,"range":{"start_line":704,"start_character":12,"end_line":707,"end_character":61},"in_reply_to":"3f79a3b5_f8c449f7","updated":"2018-08-21 10:54:44.000000000","message":"Done","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1021e7202fe9c18310164897a2e3115e7186746f","unresolved":false,"context_lines":[{"line_number":698,"context_line":"    @classmethod"},{"line_number":699,"context_line":"    def main(cls):"},{"line_number":700,"context_line":"        drivers \u003d backends.load_backends()"},{"line_number":701,"context_line":"        trust_manager \u003d drivers[\u0027trust.Manager\u0027]"},{"line_number":702,"context_line":"        trust_manager.flush_expired_trusts("},{"line_number":703,"context_line":"            project_id\u003dCONF.command.project_id,"},{"line_number":704,"context_line":"            trustor_user_id\u003dCONF.command.trustor_user_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_0defbee9","line":701,"range":{"start_line":701,"start_character":32,"end_line":701,"end_character":47},"updated":"2018-08-31 08:13:05.000000000","message":"this should be drivers[\u0027trust_api\u0027],otherwise it\u0027ll riase KeyError","commit_id":"ccb5b3bc7fe5cab5f1af6ef923b2510bc4e930d7"}],"keystone/tests/unit/test_cli.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2b121e691cc443055fcf8c97133541cd01703bba","unresolved":false,"context_lines":[{"line_number":1642,"context_line":"        # Set up preset cli options and a parser"},{"line_number":1643,"context_line":"        super(TestTrustFlush, self).setUp()"},{"line_number":1644,"context_line":"        self.config_fixture \u003d self.useFixture(oslo_config.fixture.Config(CONF))"},{"line_number":1645,"context_line":"        self.config_fixture.register_cli_opt(cli.command_opt)"},{"line_number":1646,"context_line":"        # For unit tests that should not throw any erorrs,"},{"line_number":1647,"context_line":"        # Use the argument parser to test that the combinations work"},{"line_number":1648,"context_line":"        parser_test \u003d argparse.ArgumentParser()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_c841ffa8","line":1645,"range":{"start_line":1645,"start_character":0,"end_line":1645,"end_character":61},"updated":"2018-09-10 11:22:11.000000000","message":"http://logs.openstack.org/78/589378/10/check/openstack-tox-py27/bb72e4c/testr_results.html.gz","commit_id":"35b71894bb12c071196d3389087faeac92bc8bd5"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        self.command_trustee_user_id \u003d None"},{"line_number":1662,"context_line":"        self.useFixture(fixtures.MockPatchObject("},{"line_number":1663,"context_line":"            CONF, \u0027command\u0027, self.FakeConfCommand(self)))"},{"line_number":1664,"context_line":"        trust \u003d cli.TrustFlush()"},{"line_number":1665,"context_line":"        trust.main()"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_174d8bc3","line":1664,"updated":"2018-09-13 07:07:16.000000000","message":"mock load_backends like other does:\nhttps://github.com/openstack/keystone/blob/master/keystone/tests/unit/test_cli.py#L1433-L1440\nto just init trust_api Manager.","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        self.command_trustee_user_id \u003d None"},{"line_number":1662,"context_line":"        self.useFixture(fixtures.MockPatchObject("},{"line_number":1663,"context_line":"            CONF, \u0027command\u0027, self.FakeConfCommand(self)))"},{"line_number":1664,"context_line":"        trust \u003d cli.TrustFlush()"},{"line_number":1665,"context_line":"        trust.main()"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_0cb212e6","line":1664,"in_reply_to":"3f79a3b5_174d8bc3","updated":"2018-09-18 03:07:45.000000000","message":"Done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a1e596c84e052a637a4c6c615a5bcf2614d523cb","unresolved":false,"context_lines":[{"line_number":1629,"context_line":"        self.assertThat(logging.output, matchers.Contains(expected_msg))"},{"line_number":1630,"context_line":""},{"line_number":1631,"context_line":""},{"line_number":1632,"context_line":"@mock.patch.object(keystone.trust.Manager, \u0027__init__\u0027)"},{"line_number":1633,"context_line":"class TestTrustFlush(unit.SQLDriverOverrides, unit.BaseTestCase):"},{"line_number":1634,"context_line":""},{"line_number":1635,"context_line":"    class FakeConfCommand(object):"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_4b6f8dc3","line":1632,"range":{"start_line":1632,"start_character":0,"end_line":1632,"end_character":54},"updated":"2018-09-18 07:56:39.000000000","message":"no need","commit_id":"2e4dafb2b88e24f1e7b734c8e60e1e340e9a0bf7"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a1e596c84e052a637a4c6c615a5bcf2614d523cb","unresolved":false,"context_lines":[{"line_number":1665,"context_line":""},{"line_number":1666,"context_line":"        def fake_load_backends():"},{"line_number":1667,"context_line":"            return dict("},{"line_number":1668,"context_line":"                id_mapping_api\u003dkeystone.trust.core.MappingManager,"},{"line_number":1669,"context_line":"                resource_api\u003dNone)"},{"line_number":1670,"context_line":""},{"line_number":1671,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":1672,"context_line":"            \u0027keystone.server.backends.load_backends\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_ccff3a32","line":1669,"range":{"start_line":1668,"start_character":16,"end_line":1669,"end_character":33},"updated":"2018-09-18 07:56:39.000000000","message":"def fake_load_backends():\n    return dict(\n        trust_api\u003dkeystone.trust.core.Manager())","commit_id":"2e4dafb2b88e24f1e7b734c8e60e1e340e9a0bf7"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5a70d85ba4eca8f36e81f91c0531204b52422f57","unresolved":false,"context_lines":[{"line_number":1665,"context_line":""},{"line_number":1666,"context_line":"        def fake_load_backends():"},{"line_number":1667,"context_line":"            return dict("},{"line_number":1668,"context_line":"                id_mapping_api\u003dkeystone.trust.core.MappingManager,"},{"line_number":1669,"context_line":"                resource_api\u003dNone)"},{"line_number":1670,"context_line":""},{"line_number":1671,"context_line":"        self.useFixture(fixtures.MockPatch("},{"line_number":1672,"context_line":"            \u0027keystone.server.backends.load_backends\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_eb6a1919","line":1669,"range":{"start_line":1668,"start_character":16,"end_line":1669,"end_character":33},"in_reply_to":"3f79a3b5_ccff3a32","updated":"2018-09-18 08:23:45.000000000","message":"done","commit_id":"2e4dafb2b88e24f1e7b734c8e60e1e340e9a0bf7"}],"keystone/tests/unit/trust/test_backends.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1021e7202fe9c18310164897a2e3115e7186746f","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        self.assertIsNotNone(trust_data)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts()"},{"line_number":224,"context_line":"        self.trust_api.list_trusts()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_2dc39a59","line":224,"range":{"start_line":224,"start_character":8,"end_line":224,"end_character":36},"updated":"2018-08-31 08:13:05.000000000","message":"so what\u0027s the result? it should be empty.","commit_id":"ccb5b3bc7fe5cab5f1af6ef923b2510bc4e930d7"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1fa27ef5391d56d60e86434bb086b946453ed166","unresolved":false,"context_lines":[{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts()"},{"line_number":224,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":225,"context_line":"        self.assertEqual(len(trusts), 1)"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_fe88b171","line":225,"updated":"2018-09-04 08:49:03.000000000","message":"This test looks good. Please add more abort project_id, trustor_user_id and trustee_user_id filters to make sure they work well too.\n\nAnd a test in test_cli.py as well to make sure the cli command works. Thanks.","commit_id":"74dff3974e38db30dd8a1b08369cd2ce73aaf87a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2b121e691cc443055fcf8c97133541cd01703bba","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        new_id \u003d uuid.uuid4().hex"},{"line_number":191,"context_line":"        trust_data \u003d (PROVIDERS.trust_api.create_trust"},{"line_number":192,"context_line":"                      (new_id,"},{"line_number":193,"context_line":"                       {\u0027trustor_user_id\u0027: self.trustor[\u0027id\u0027],"},{"line_number":194,"context_line":"                        \u0027trustee_user_id\u0027: self.user_two[\u0027id\u0027],"},{"line_number":195,"context_line":"                        \u0027project_id\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":196,"context_line":"                        \u0027expires_at\u0027:"},{"line_number":197,"context_line":"                            timeutils.utcnow() - datetime.timedelta(minutes\u003d1),"},{"line_number":198,"context_line":"                        \u0027impersonation\u0027: True,"},{"line_number":199,"context_line":"                        \u0027remaining_uses\u0027: remaining_uses},"},{"line_number":200,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":201,"context_line":"                              {\"id\": \"other\"},"},{"line_number":202,"context_line":"                              {\"id\": \"browser\"}]))"},{"line_number":203,"context_line":"        self.assertIsNotNone(trust_data)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        self.trustor \u003d self.user_foo"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_a8efe3af","line":202,"range":{"start_line":193,"start_character":23,"end_line":202,"end_character":48},"updated":"2018-09-10 11:22:11.000000000","message":"use \"tests.unit.core.new_trust_ref\" to generate trust dict so that the trust property can be defined easily.","commit_id":"35b71894bb12c071196d3389087faeac92bc8bd5"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2b121e691cc443055fcf8c97133541cd01703bba","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        new_id \u003d uuid.uuid4().hex"},{"line_number":209,"context_line":"        trust_data \u003d (PROVIDERS.trust_api.create_trust"},{"line_number":210,"context_line":"                      (new_id,"},{"line_number":211,"context_line":"                       {\u0027trustor_user_id\u0027: self.trustor[\u0027id\u0027],"},{"line_number":212,"context_line":"                        \u0027trustee_user_id\u0027: self.user_two[\u0027id\u0027],"},{"line_number":213,"context_line":"                        \u0027project_id\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":214,"context_line":"                        \u0027expires_at\u0027:"},{"line_number":215,"context_line":"                            timeutils.utcnow() + datetime.timedelta(minutes\u003d1),"},{"line_number":216,"context_line":"                        \u0027impersonation\u0027: True,"},{"line_number":217,"context_line":"                        \u0027remaining_uses\u0027: remaining_uses},"},{"line_number":218,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":219,"context_line":"                              {\"id\": \"other\"},"},{"line_number":220,"context_line":"                              {\"id\": \"browser\"}]))"},{"line_number":221,"context_line":"        self.assertIsNotNone(trust_data)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts()"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_c8ec9fbd","line":220,"range":{"start_line":211,"start_character":1,"end_line":220,"end_character":49},"updated":"2018-09-10 11:22:11.000000000","message":"ditto","commit_id":"35b71894bb12c071196d3389087faeac92bc8bd5"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2b121e691cc443055fcf8c97133541cd01703bba","unresolved":false,"context_lines":[{"line_number":379,"context_line":"        new_id \u003d uuid.uuid4().hex"},{"line_number":380,"context_line":"        trust_data \u003d (PROVIDERS.trust_api.create_trust"},{"line_number":381,"context_line":"                      (new_id,"},{"line_number":382,"context_line":"                       {\u0027trustor_user_id\u0027: self.trustor[\u0027id\u0027],"},{"line_number":383,"context_line":"                        \u0027trustee_user_id\u0027: self.user_two[\u0027id\u0027],"},{"line_number":384,"context_line":"                        \u0027project_id\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":385,"context_line":"                        \u0027expires_at\u0027:"},{"line_number":386,"context_line":"                            timeutils.utcnow() + datetime.timedelta(minutes\u003d1),"},{"line_number":387,"context_line":"                        \u0027impersonation\u0027: True,"},{"line_number":388,"context_line":"                        \u0027remaining_uses\u0027: remaining_uses},"},{"line_number":389,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":390,"context_line":"                              {\"id\": \"other\"},"},{"line_number":391,"context_line":"                              {\"id\": \"browser\"}]))"},{"line_number":392,"context_line":"        self.assertIsNotNone(trust_data)"},{"line_number":393,"context_line":""},{"line_number":394,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts("}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_68278b20","line":391,"range":{"start_line":382,"start_character":0,"end_line":391,"end_character":48},"updated":"2018-09-10 11:22:11.000000000","message":"see above, all these ref should be updated.","commit_id":"35b71894bb12c071196d3389087faeac92bc8bd5"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2b121e691cc443055fcf8c97133541cd01703bba","unresolved":false,"context_lines":[{"line_number":395,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":396,"context_line":"            trustor_user_id\u003dself.trustor[\u0027id\u0027])"},{"line_number":397,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":398,"context_line":"        self.assertEqual(len(trusts), 1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_489acf62","line":398,"updated":"2018-09-10 11:22:11.000000000","message":"all these trust objs in these tests have the same trustor, trustee and project_id, and only one is expired  so it\u0027s hard to distinguish the filter works or not. I\u0027d like to see some tests like:\n\ndef test_flush_expired_trusts_with_project_id:\n    expired_trust1(project_id\u003dxxx)\n    expired_trust2(project_id\u003dyyy)\n\n    flush_expired_trusts(project_id\u003dxxx)\n\nThen in this test expired_trust1 will be deleted but expired_trust2 still exist.","commit_id":"35b71894bb12c071196d3389087faeac92bc8bd5"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4dc3b72adcb786b073c6d915011c2de06cb74db0","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                          trust_data,"},{"line_number":184,"context_line":"                          roles)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def test_flush_expired_trusts(self):"},{"line_number":187,"context_line":"        self.trustor \u003d self.user_foo"},{"line_number":188,"context_line":"        self.trustee \u003d self.user_two"},{"line_number":189,"context_line":"        remaining_uses \u003d None"},{"line_number":190,"context_line":"        new_id \u003d uuid.uuid4().hex"},{"line_number":191,"context_line":"        trust_data \u003d (PROVIDERS.trust_api.create_trust"},{"line_number":192,"context_line":"                      (new_id,"},{"line_number":193,"context_line":"                       {\u0027trustor_user_id\u0027: self.trustor[\u0027id\u0027],"},{"line_number":194,"context_line":"                        \u0027trustee_user_id\u0027: self.user_two[\u0027id\u0027],"},{"line_number":195,"context_line":"                        \u0027project_id\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":196,"context_line":"                        \u0027expires_at\u0027:"},{"line_number":197,"context_line":"                            timeutils.utcnow() - datetime.timedelta(minutes\u003d1),"},{"line_number":198,"context_line":"                        \u0027impersonation\u0027: True,"},{"line_number":199,"context_line":"                        \u0027remaining_uses\u0027: remaining_uses},"},{"line_number":200,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":201,"context_line":"                              {\"id\": \"other\"},"},{"line_number":202,"context_line":"                              {\"id\": \"browser\"}]))"},{"line_number":203,"context_line":"        self.assertIsNotNone(trust_data)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        self.trustor \u003d self.user_foo"},{"line_number":206,"context_line":"        self.trustee \u003d self.user_two"},{"line_number":207,"context_line":"        remaining_uses \u003d None"},{"line_number":208,"context_line":"        new_id \u003d uuid.uuid4().hex"},{"line_number":209,"context_line":"        trust_data \u003d (PROVIDERS.trust_api.create_trust"},{"line_number":210,"context_line":"                      (new_id,"},{"line_number":211,"context_line":"                       {\u0027trustor_user_id\u0027: self.trustor[\u0027id\u0027],"},{"line_number":212,"context_line":"                        \u0027trustee_user_id\u0027: self.user_two[\u0027id\u0027],"},{"line_number":213,"context_line":"                        \u0027project_id\u0027: self.tenant_bar[\u0027id\u0027],"},{"line_number":214,"context_line":"                        \u0027expires_at\u0027:"},{"line_number":215,"context_line":"                            timeutils.utcnow() + datetime.timedelta(minutes\u003d1),"},{"line_number":216,"context_line":"                        \u0027impersonation\u0027: True,"},{"line_number":217,"context_line":"                        \u0027remaining_uses\u0027: remaining_uses},"},{"line_number":218,"context_line":"                       roles\u003d[{\"id\": \"member\"},"},{"line_number":219,"context_line":"                              {\"id\": \"other\"},"},{"line_number":220,"context_line":"                              {\"id\": \"browser\"}]))"},{"line_number":221,"context_line":"        self.assertIsNotNone(trust_data)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts()"},{"line_number":224,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":225,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def test_flush_expired_trusts_with_all_id(self):"},{"line_number":228,"context_line":"        self.trustor \u003d self.user_foo"}],"source_content_type":"text/x-python","patch_set":11,"id":"3f79a3b5_61f22fe6","line":225,"range":{"start_line":186,"start_character":0,"end_line":225,"end_character":40},"updated":"2018-09-11 10:49:13.000000000","message":"I wrote an example for this test:\nhttp://paste.openstack.org/show/729871/\n\nSo here I just want to show that the trust_dict can be move to an common func to avoid code duplication. And the key-value can be changed easily as well.","commit_id":"11a7268aaf2f375f2b1b9ed05d66a316cd42e0b4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            self.user_foo[\u0027id\u0027], self.user_two[\u0027id\u0027],"},{"line_number":224,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027])"},{"line_number":225,"context_line":"        trust_ref2[\u0027expires_at\u0027] \u003d \\"},{"line_number":226,"context_line":"            timeutils.utcnow() + datetime.timedelta(minutes\u003d1)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        trust_data \u003d PROVIDERS.trust_api.create_trust(trust_ref1[\u0027id\u0027],"},{"line_number":229,"context_line":"                                                      trust_ref1, roles)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_37a4474b","line":226,"range":{"start_line":226,"start_character":0,"end_line":226,"end_character":62},"updated":"2018-09-13 07:07:16.000000000","message":"both trusts should be expired to test filter.","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":223,"context_line":"            self.user_foo[\u0027id\u0027], self.user_two[\u0027id\u0027],"},{"line_number":224,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027])"},{"line_number":225,"context_line":"        trust_ref2[\u0027expires_at\u0027] \u003d \\"},{"line_number":226,"context_line":"            timeutils.utcnow() + datetime.timedelta(minutes\u003d1)"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"        trust_data \u003d PROVIDERS.trust_api.create_trust(trust_ref1[\u0027id\u0027],"},{"line_number":229,"context_line":"                                                      trust_ref1, roles)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_6cc0662c","line":226,"range":{"start_line":226,"start_character":0,"end_line":226,"end_character":62},"in_reply_to":"3f79a3b5_37a4474b","updated":"2018-09-18 03:07:45.000000000","message":"done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":238,"context_line":"            trustee_user_id\u003dself.user_two[\u0027id\u0027])"},{"line_number":239,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":240,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def test_flush_expired_trusts_with_no_project_id(self):"},{"line_number":243,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_f7f00f69","line":240,"range":{"start_line":240,"start_character":0,"end_line":240,"end_character":40},"updated":"2018-09-13 07:07:16.000000000","message":"should assert the trust is the expect one.\nlike:\nassertEqual(trust_ref2[\u0027id\u0027], trusts[0][\u0027id\u0027])","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":237,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":238,"context_line":"            trustee_user_id\u003dself.user_two[\u0027id\u0027])"},{"line_number":239,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":240,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def test_flush_expired_trusts_with_no_project_id(self):"},{"line_number":243,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_ece1d6d0","line":240,"range":{"start_line":240,"start_character":0,"end_line":240,"end_character":40},"in_reply_to":"3f79a3b5_f7f00f69","updated":"2018-09-18 03:07:45.000000000","message":"Done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":265,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":266,"context_line":"            trustee_user_id\u003dself.user_two[\u0027id\u0027])"},{"line_number":267,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":268,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def test_flush_expired_trusts_with_no_trustor_id(self):"},{"line_number":271,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_5701c338","line":268,"updated":"2018-09-13 07:07:16.000000000","message":"ditto","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":265,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027],"},{"line_number":266,"context_line":"            trustee_user_id\u003dself.user_two[\u0027id\u0027])"},{"line_number":267,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":268,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"    def test_flush_expired_trusts_with_no_trustor_id(self):"},{"line_number":271,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_ccc73a45","line":268,"in_reply_to":"3f79a3b5_5701c338","updated":"2018-09-18 03:07:45.000000000","message":"Done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":293,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":294,"context_line":"            trustee_user_id\u003dself.user_two[\u0027id\u0027])"},{"line_number":295,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":296,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def test_flush_expired_trusts_with_no_trustee_id(self):"},{"line_number":299,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_77fcff3e","line":296,"updated":"2018-09-13 07:07:16.000000000","message":"ditto","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":293,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":294,"context_line":"            trustee_user_id\u003dself.user_two[\u0027id\u0027])"},{"line_number":295,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":296,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def test_flush_expired_trusts_with_no_trustee_id(self):"},{"line_number":299,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_0ce772e5","line":296,"in_reply_to":"3f79a3b5_77fcff3e","updated":"2018-09-18 03:07:45.000000000","message":"done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":322,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027])"},{"line_number":323,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":324,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def test_flush_expired_trusts_with_project_id(self):"},{"line_number":327,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_f7956fe4","line":324,"updated":"2018-09-13 07:07:16.000000000","message":"ditto","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027],"},{"line_number":322,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027])"},{"line_number":323,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":324,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def test_flush_expired_trusts_with_project_id(self):"},{"line_number":327,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_6cd5c6e5","line":324,"in_reply_to":"3f79a3b5_f7956fe4","updated":"2018-09-18 03:07:45.000000000","message":"done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts("},{"line_number":349,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027])"},{"line_number":350,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":351,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def test_flush_expired_trusts_with_trustee_id(self):"},{"line_number":354,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_d792b3fc","line":351,"updated":"2018-09-13 07:07:16.000000000","message":"ditto","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":348,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts("},{"line_number":349,"context_line":"            project_id\u003dself.tenant_bar[\u0027id\u0027])"},{"line_number":350,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":351,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"    def test_flush_expired_trusts_with_trustee_id(self):"},{"line_number":354,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_2c058e7a","line":351,"in_reply_to":"3f79a3b5_d792b3fc","updated":"2018-09-18 03:07:45.000000000","message":"done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts("},{"line_number":375,"context_line":"            trustee_user_id\u003dself.user_two[\u0027id\u0027])"},{"line_number":376,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":377,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def test_flush_expired_trusts_with_trustor_id(self):"},{"line_number":380,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_17fb4b47","line":377,"updated":"2018-09-13 07:07:16.000000000","message":"ditto","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":374,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts("},{"line_number":375,"context_line":"            trustee_user_id\u003dself.user_two[\u0027id\u0027])"},{"line_number":376,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":377,"context_line":"        self.assertEqual(len(trusts), 1)"},{"line_number":378,"context_line":""},{"line_number":379,"context_line":"    def test_flush_expired_trusts_with_trustor_id(self):"},{"line_number":380,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_ecfa3675","line":377,"in_reply_to":"3f79a3b5_17fb4b47","updated":"2018-09-18 03:07:45.000000000","message":"done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"7912692dd982c0761aa98e863fbca2a93b820ee9","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts("},{"line_number":402,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027])"},{"line_number":403,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        self.assertEqual(len(trusts), 1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_37f6875f","line":403,"updated":"2018-09-13 07:07:16.000000000","message":"ditto","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"9b6ed15fa586b76da734acba1576557311ed4084","unresolved":false,"context_lines":[{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts("},{"line_number":402,"context_line":"            trustor_user_id\u003dself.user_foo[\u0027id\u0027])"},{"line_number":403,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":404,"context_line":""},{"line_number":405,"context_line":"        self.assertEqual(len(trusts), 1)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_acf8be7b","line":403,"in_reply_to":"3f79a3b5_37f6875f","updated":"2018-09-18 03:07:45.000000000","message":"done","commit_id":"d4f3c9921f0845a2e753dccd53637cc0b92dbca4"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"a1e596c84e052a637a4c6c615a5bcf2614d523cb","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts()"},{"line_number":210,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":211,"context_line":"        self.assertEqual(trust_ref2[\u0027id\u0027], trusts[0][\u0027id\u0027])"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_flush_expired_trusts_with_all_id(self):"},{"line_number":214,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_0b93d5a4","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":59},"updated":"2018-09-18 07:56:39.000000000","message":"looks good. But please add assertEqual back before this line.\nself.assertEqual(len(trusts), 1)\n\nOthers tests should be updated as well.","commit_id":"2e4dafb2b88e24f1e7b734c8e60e1e340e9a0bf7"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"5a70d85ba4eca8f36e81f91c0531204b52422f57","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        PROVIDERS.trust_api.flush_expired_trusts()"},{"line_number":210,"context_line":"        trusts \u003d self.trust_api.list_trusts()"},{"line_number":211,"context_line":"        self.assertEqual(trust_ref2[\u0027id\u0027], trusts[0][\u0027id\u0027])"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def test_flush_expired_trusts_with_all_id(self):"},{"line_number":214,"context_line":"        roles \u003d [{\"id\": \"member\"},"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_cb6ddd2f","line":211,"range":{"start_line":211,"start_character":0,"end_line":211,"end_character":59},"in_reply_to":"3f79a3b5_0b93d5a4","updated":"2018-09-18 08:23:45.000000000","message":"Done","commit_id":"2e4dafb2b88e24f1e7b734c8e60e1e340e9a0bf7"}],"keystone/trust/backends/sql.py":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9434a1427fb8c6b27a1e91f5a1c0feb7d27399f1","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def flush_expired_trusts(self):"},{"line_number":193,"context_line":"        with sql.session_for_write() as session:"},{"line_number":194,"context_line":"            query \u003d session.query(TrustModel)"},{"line_number":195,"context_line":"            query \u003d query.filter_by(deleted_at\u003dNone)"},{"line_number":196,"context_line":"            query \u003d query.filter_by(TrustModel.expires_at \u003c timeutils.utcnow())"},{"line_number":197,"context_line":"            query.delete(synchronize_session\u003dFalse)"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_53dc3ee3","line":195,"range":{"start_line":195,"start_character":36,"end_line":195,"end_character":46},"updated":"2018-08-10 09:20:01.000000000","message":"Hmm I suspect having soft-deletes stick around also clutters up the database, maybe it makes sense to have this method also flush out everything that is marked as deleted. It certainly doesn\u0027t make sense to have unexpired but deleted trusts stick around but to hard delete expired trusts.","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"8d9446d83950637052e755273ae9461dd33e545c","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def flush_expired_trusts(self):"},{"line_number":193,"context_line":"        with sql.session_for_write() as session:"},{"line_number":194,"context_line":"            query \u003d session.query(TrustModel)"},{"line_number":195,"context_line":"            query \u003d query.filter_by(deleted_at\u003dNone)"},{"line_number":196,"context_line":"            query \u003d query.filter_by(TrustModel.expires_at \u003c timeutils.utcnow())"},{"line_number":197,"context_line":"            query.delete(synchronize_session\u003dFalse)"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_7a465f7e","line":195,"range":{"start_line":195,"start_character":36,"end_line":195,"end_character":46},"in_reply_to":"3f79a3b5_4b0ef4e5","updated":"2018-09-24 12:28:45.000000000","message":"I think I didn\u0027t completely get my point across, I meant to say that I think running `keystone-manage trust_flush` should purge both expired trusts as well as non-expired soft-deleted trusts, since those soft-deleted trusts are as likely to bloat the database as expired trusts. So that would be the union of two filters, one getting everything where deleted_at !\u003d None and another that checks the expires_at column (and then of course the project_id and trust{or,ee}_user_id filters).","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"184b554db53767b0ff996d24c3129dfbab13a128","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def flush_expired_trusts(self):"},{"line_number":193,"context_line":"        with sql.session_for_write() as session:"},{"line_number":194,"context_line":"            query \u003d session.query(TrustModel)"},{"line_number":195,"context_line":"            query \u003d query.filter_by(deleted_at\u003dNone)"},{"line_number":196,"context_line":"            query \u003d query.filter_by(TrustModel.expires_at \u003c timeutils.utcnow())"},{"line_number":197,"context_line":"            query.delete(synchronize_session\u003dFalse)"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_4b0ef4e5","line":195,"range":{"start_line":195,"start_character":36,"end_line":195,"end_character":46},"in_reply_to":"3f79a3b5_53dc3ee3","updated":"2018-08-21 10:54:44.000000000","message":"Done","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9434a1427fb8c6b27a1e91f5a1c0feb7d27399f1","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        with sql.session_for_write() as session:"},{"line_number":194,"context_line":"            query \u003d session.query(TrustModel)"},{"line_number":195,"context_line":"            query \u003d query.filter_by(deleted_at\u003dNone)"},{"line_number":196,"context_line":"            query \u003d query.filter_by(TrustModel.expires_at \u003c timeutils.utcnow())"},{"line_number":197,"context_line":"            query.delete(synchronize_session\u003dFalse)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def flush_expired_trusts_for_id(self, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_d3c84e23","line":196,"range":{"start_line":196,"start_character":47,"end_line":196,"end_character":57},"updated":"2018-08-10 09:20:01.000000000","message":"Does this work if expires_at is None?","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"184b554db53767b0ff996d24c3129dfbab13a128","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        with sql.session_for_write() as session:"},{"line_number":194,"context_line":"            query \u003d session.query(TrustModel)"},{"line_number":195,"context_line":"            query \u003d query.filter_by(deleted_at\u003dNone)"},{"line_number":196,"context_line":"            query \u003d query.filter_by(TrustModel.expires_at \u003c timeutils.utcnow())"},{"line_number":197,"context_line":"            query.delete(synchronize_session\u003dFalse)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def flush_expired_trusts_for_id(self, project_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_6b117004","line":196,"range":{"start_line":196,"start_character":47,"end_line":196,"end_character":57},"in_reply_to":"3f79a3b5_d3c84e23","updated":"2018-08-21 10:54:44.000000000","message":"Done","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9434a1427fb8c6b27a1e91f5a1c0feb7d27399f1","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                          filter_by(trustee_user_id\u003dtrustee_user_id))"},{"line_number":226,"context_line":"            else:"},{"line_number":227,"context_line":"                trusts \u003d (session.query(TrustModel)."},{"line_number":228,"context_line":"                          filter_by(trustor_user_id\u003dtrustor_user_id))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"            for ref in trusts:"},{"line_number":231,"context_line":"                if ref.expires_at is not None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_d3636e41","line":228,"updated":"2018-08-10 09:20:01.000000000","message":"Instead of having two different methods and having this complicated conditional, you could just add the filter to the query one at a time.","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":27621,"name":"Vishakha Agarwal","email":"agarwalvishakha18@gmail.com","username":"Vishakha"},"change_message_id":"184b554db53767b0ff996d24c3129dfbab13a128","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                          filter_by(trustee_user_id\u003dtrustee_user_id))"},{"line_number":226,"context_line":"            else:"},{"line_number":227,"context_line":"                trusts \u003d (session.query(TrustModel)."},{"line_number":228,"context_line":"                          filter_by(trustor_user_id\u003dtrustor_user_id))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"            for ref in trusts:"},{"line_number":231,"context_line":"                if ref.expires_at is not None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_0bf8fcc1","line":228,"in_reply_to":"3f79a3b5_d3636e41","updated":"2018-08-21 10:54:44.000000000","message":"Done","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"1021e7202fe9c18310164897a2e3115e7186746f","unresolved":false,"context_lines":[{"line_number":193,"context_line":"                             trustee_user_id\u003dNone):"},{"line_number":194,"context_line":"        with sql.session_for_write() as session:"},{"line_number":195,"context_line":"            query \u003d session.query(TrustModel)"},{"line_number":196,"context_line":"            query \u003d query.filter_by(project_id\u003dproject_id)"},{"line_number":197,"context_line":"            query \u003d query.filter_by(trustor_user_id\u003dtrustor_user_id)"},{"line_number":198,"context_line":"            query \u003d query.filter_by(trustee_user_id\u003dtrustee_user_id)"},{"line_number":199,"context_line":"            for ref in query:"},{"line_number":200,"context_line":"                if ref.expires_at is not None:"},{"line_number":201,"context_line":"                    if ref.expires_at \u003c timeutils.utcnow():"}],"source_content_type":"text/x-python","patch_set":6,"id":"3f79a3b5_ad856a09","line":198,"range":{"start_line":196,"start_character":0,"end_line":198,"end_character":68},"updated":"2018-08-31 08:13:05.000000000","message":"this is not correct. if project_id\u003dNone, we should not filter_by it, otherwise you\u0027ll always get empty response.\nit should be something like:\n\nif project_id:\n    query \u003d query \u003d query.filter_by(project_id\u003dproject_id)\n\nthe same as trustor_user_id and trustee_user_id","commit_id":"ccb5b3bc7fe5cab5f1af6ef923b2510bc4e930d7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fe96c6fc771b171b93087c13dc3fd4a9d2bcafad","unresolved":false,"context_lines":[{"line_number":189,"context_line":"            for trust_ref in trusts:"},{"line_number":190,"context_line":"                trust_ref.deleted_at \u003d timeutils.utcnow()"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def flush_expired_trusts(self, project_id\u003dNone, trustor_user_id\u003dNone,"},{"line_number":193,"context_line":"                             trustee_user_id\u003dNone):"},{"line_number":194,"context_line":"        with sql.session_for_write() as session:"},{"line_number":195,"context_line":"            query \u003d session.query(TrustModel)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_5db60f8f","line":192,"range":{"start_line":192,"start_character":8,"end_line":192,"end_character":28},"updated":"2018-10-30 13:51:27.000000000","message":"This should have an abstractmethod defined in the TrustDriverBase interface. Otherwise people supplying their own backends will be broken by this.","commit_id":"8232dabcf9cf182c4dc34eafecbe5b60b2438ed1"}],"keystone/trust/core.py":[{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"32ef997551179625a60098817e5e08e36cd481da","unresolved":false,"context_lines":[{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        notifications.Audit.deleted(self._TRUST, trust_id, initiator)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    def flush_expired_trusts(self):"},{"line_number":217,"context_line":"        \"\"\"Archive or delete trusts that have expired.\"\"\""},{"line_number":218,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f79a3b5_d0cf367d","line":218,"range":{"start_line":216,"start_character":0,"end_line":218,"end_character":40},"updated":"2018-08-08 02:13:39.000000000","message":"remove this. Manager.flush_expired_trusts() can link to driver directly.","commit_id":"db02412dc9a254b2c18b302411586fcbad9140fc"}],"releasenotes/notes/bug-1473292-c21481e6aec29ec2.yaml":[{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"9434a1427fb8c6b27a1e91f5a1c0feb7d27399f1","unresolved":false,"context_lines":[{"line_number":15,"context_line":"        project-id \u003cstring\u003e: To purge expired trusts of given project-id."},{"line_number":16,"context_line":"        trustor-user-id \u003cstring\u003e: To purge expired trusts of given trustor-id."},{"line_number":17,"context_line":"        trustee-user-id \u003cstring\u003e: To purge expired trusts of given trustee-id."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":5,"id":"3f79a3b5_d81b8d7e","line":18,"updated":"2018-08-10 09:20:01.000000000","message":"Since this is also closing a bug you could add a fixes: section with a condensed description of the bugfix.","commit_id":"41f1800f6348f1ea2ba2306bec4fa16b1b83236a"}]}
