)]}'
{"keystone/identity/core.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0028784ae39e193ebcad8582b8d256fe741c50a9","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"            self.shadow_federated_user.invalidate("},{"line_number":1162,"context_line":"                self, fed_user[\u0027idp_id\u0027], fed_user[\u0027protocol_id\u0027],"},{"line_number":1163,"context_line":"                fed_user[\u0027unique_id\u0027], fed_user[\u0027display_name\u0027],"},{"line_number":1164,"context_line":"                user_old.get(\u0027extra\u0027, {}).get(\u0027email\u0027))"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"        PROVIDERS.credential_api.delete_credentials_for_user(user_id)"},{"line_number":1167,"context_line":"        PROVIDERS.id_mapping_api.delete_id_mapping(user_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_df3bbd35","line":1164,"updated":"2018-04-17 15:30:31.000000000","message":"Since these two new additions are specific to invalidating the shadow user cache, I would be opposed to just putting them into their own private method and then just calling that with `user_id` at line 1160.\n\n  def _remove_user_from_shadow_user_cache(self, user_id):\n\nor \n\n  def _invalidate_cache_for_shadow_user(self, user_id):","commit_id":"dd0fb07d23d765632664e1b2ab8a4ccf7a7770c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"42fe94c7e17a1c0c5958fa223eea44071defa926","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"            self.shadow_federated_user.invalidate("},{"line_number":1162,"context_line":"                self, fed_user[\u0027idp_id\u0027], fed_user[\u0027protocol_id\u0027],"},{"line_number":1163,"context_line":"                fed_user[\u0027unique_id\u0027], fed_user[\u0027display_name\u0027],"},{"line_number":1164,"context_line":"                user_old.get(\u0027extra\u0027, {}).get(\u0027email\u0027))"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"        PROVIDERS.credential_api.delete_credentials_for_user(user_id)"},{"line_number":1167,"context_line":"        PROVIDERS.id_mapping_api.delete_id_mapping(user_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_a1e8987b","line":1164,"in_reply_to":"9f6a8fd7_543a2234","updated":"2018-04-24 14:27:44.000000000","message":"Oh - sure. I see what you mean. This is probably fine for now then. I was trying to think of a way to group that code such that it was clearer to see what the code at line 1150 - 1153 was doing/used for and associate it closer to where it was used (for cache invalidation).","commit_id":"dd0fb07d23d765632664e1b2ab8a4ccf7a7770c8"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"8128b5da64d1bf13b7136e0aacfb73766a203029","unresolved":false,"context_lines":[{"line_number":1161,"context_line":"            self.shadow_federated_user.invalidate("},{"line_number":1162,"context_line":"                self, fed_user[\u0027idp_id\u0027], fed_user[\u0027protocol_id\u0027],"},{"line_number":1163,"context_line":"                fed_user[\u0027unique_id\u0027], fed_user[\u0027display_name\u0027],"},{"line_number":1164,"context_line":"                user_old.get(\u0027extra\u0027, {}).get(\u0027email\u0027))"},{"line_number":1165,"context_line":""},{"line_number":1166,"context_line":"        PROVIDERS.credential_api.delete_credentials_for_user(user_id)"},{"line_number":1167,"context_line":"        PROVIDERS.id_mapping_api.delete_id_mapping(user_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_543a2234","line":1164,"in_reply_to":"9f6a8fd7_df3bbd35","updated":"2018-04-18 06:29:20.000000000","message":"it\u0027s a little hard. L1150-L1153(get fed users) should be done before L1155(delete user), but L1160-L1164(invalidate the fed user cache) should be done after L1155. Any suggestion to do it?","commit_id":"dd0fb07d23d765632664e1b2ab8a4ccf7a7770c8"}],"keystone/identity/shadow_backends/base.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d0de4d65b44697ddfdc7831c12c10e1e163e7ad","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        :param hints: contains the list of filters yet to be satisfied."},{"line_number":97,"context_line":"                      Any filters satisfied here will be removed so that"},{"line_number":98,"context_line":"                      the caller will know if any filters remain."},{"line_number":99,"context_line":"        :returns dict: Containing the shadow users reference."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        \"\"\""},{"line_number":102,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_41a5fc45","line":99,"range":{"start_line":99,"start_character":17,"end_line":99,"end_character":21},"updated":"2018-04-24 14:34:13.000000000","message":"According to the implementation, this actually returns a list of dictionaries. We should update this to match since external developers will be relying on this interface.","commit_id":"1b38cc42663cbdec0c82083839854e3ac5914a89"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"e790a3ed3b355c6e517ecfcc19f0f8726dff7570","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        :param hints: contains the list of filters yet to be satisfied."},{"line_number":97,"context_line":"                      Any filters satisfied here will be removed so that"},{"line_number":98,"context_line":"                      the caller will know if any filters remain."},{"line_number":99,"context_line":"        :returns dict: Containing the shadow users reference."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        \"\"\""},{"line_number":102,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_34efd7e9","line":99,"range":{"start_line":99,"start_character":17,"end_line":99,"end_character":21},"in_reply_to":"9f6a8fd7_41a5fc45","updated":"2018-04-25 03:39:44.000000000","message":"Done","commit_id":"1b38cc42663cbdec0c82083839854e3ac5914a89"}],"keystone/tests/unit/test_v3_federation.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d0de4d65b44697ddfdc7831c12c10e1e163e7ad","unresolved":false,"context_lines":[{"line_number":1910,"context_line":"        PROVIDERS.identity_api.delete_user(user_id1)"},{"line_number":1911,"context_line":""},{"line_number":1912,"context_line":"        r \u003d self._issue_unscoped_token()"},{"line_number":1913,"context_line":"        user_id2 \u003d r.json[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"        self.assertIsNot(user_id2, user_id1)"},{"line_number":1916,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_e401be06","line":1913,"updated":"2018-04-24 14:34:13.000000000","message":"There should be some attribute that are the same though, right? The user name for example?\n\nWe could split up the assertIsNot assertion to be a bit more granular so that it\u0027s clearer to see what is the same and what is different when the user re-authenticates.","commit_id":"1b38cc42663cbdec0c82083839854e3ac5914a89"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"e790a3ed3b355c6e517ecfcc19f0f8726dff7570","unresolved":false,"context_lines":[{"line_number":1910,"context_line":"        PROVIDERS.identity_api.delete_user(user_id1)"},{"line_number":1911,"context_line":""},{"line_number":1912,"context_line":"        r \u003d self._issue_unscoped_token()"},{"line_number":1913,"context_line":"        user_id2 \u003d r.json[\u0027token\u0027][\u0027user\u0027][\u0027id\u0027]"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"        self.assertIsNot(user_id2, user_id1)"},{"line_number":1916,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9f6a8fd7_74978f49","line":1913,"in_reply_to":"9f6a8fd7_e401be06","updated":"2018-04-25 03:39:44.000000000","message":"sure.","commit_id":"1b38cc42663cbdec0c82083839854e3ac5914a89"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"59b0b258b3c96a0fb9ce740aea47ef417ba60847","unresolved":false,"context_lines":[{"line_number":1917,"context_line":"        user_id2 \u003d user2.pop(\u0027id\u0027)"},{"line_number":1918,"context_line":""},{"line_number":1919,"context_line":"        # Only the user_id is different. Other properties include"},{"line_number":1920,"context_line":"        # identity_provider, protocol, groups and domain are the same."},{"line_number":1921,"context_line":"        self.assertIsNot(user_id2, user_id1)"},{"line_number":1922,"context_line":"        self.assertEqual(user1, user2)"},{"line_number":1923,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_f214f845","line":1920,"updated":"2018-04-25 22:50:39.000000000","message":"Nice, thanks","commit_id":"3b701cdf70d7331c781a6b1a46dd8247906b9b63"}],"releasenotes/notes/bug-1760205-87dedd6d8812db3f.yaml":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"0028784ae39e193ebcad8582b8d256fe741c50a9","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    that Keystone will raise 404 UserNotFound error when authenticating with"},{"line_number":7,"context_line":"    the previous federation info. This bug has been fixed now."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    A new interface called `list_federated_users_info` has been added to"},{"line_number":10,"context_line":"    shadow backend. It\u0027s used to get the shadow user information internally. If"},{"line_number":11,"context_line":"    you maintain a out-tree shadow backend, please realize this function as"},{"line_number":12,"context_line":"    well."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"9f6a8fd7_5f67ad4e","line":12,"range":{"start_line":9,"start_character":4,"end_line":12,"end_character":9},"updated":"2018-04-17 15:30:31.000000000","message":"This might be better put in the \u0027other\u0027 section of the release notes.","commit_id":"dd0fb07d23d765632664e1b2ab8a4ccf7a7770c8"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"8128b5da64d1bf13b7136e0aacfb73766a203029","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    that Keystone will raise 404 UserNotFound error when authenticating with"},{"line_number":7,"context_line":"    the previous federation info. This bug has been fixed now."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    A new interface called `list_federated_users_info` has been added to"},{"line_number":10,"context_line":"    shadow backend. It\u0027s used to get the shadow user information internally. If"},{"line_number":11,"context_line":"    you maintain a out-tree shadow backend, please realize this function as"},{"line_number":12,"context_line":"    well."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"9f6a8fd7_f44fb6ba","line":12,"range":{"start_line":9,"start_character":4,"end_line":12,"end_character":9},"in_reply_to":"9f6a8fd7_5f67ad4e","updated":"2018-04-18 06:29:20.000000000","message":"Done","commit_id":"dd0fb07d23d765632664e1b2ab8a4ccf7a7770c8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3d0de4d65b44697ddfdc7831c12c10e1e163e7ad","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    A new interface called `list_federated_users_info` is added to shadow"},{"line_number":12,"context_line":"    backend. It\u0027s used to get the shadow user information internally. If you"},{"line_number":13,"context_line":"    are maintaining  any out-tree shadow backends, please realize this function"},{"line_number":14,"context_line":"    for them as well."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"9f6a8fd7_01c4e4f3","line":13,"range":{"start_line":13,"start_character":58,"end_line":13,"end_character":65},"updated":"2018-04-24 14:34:13.000000000","message":"implement*","commit_id":"1b38cc42663cbdec0c82083839854e3ac5914a89"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"e790a3ed3b355c6e517ecfcc19f0f8726dff7570","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    A new interface called `list_federated_users_info` is added to shadow"},{"line_number":12,"context_line":"    backend. It\u0027s used to get the shadow user information internally. If you"},{"line_number":13,"context_line":"    are maintaining  any out-tree shadow backends, please realize this function"},{"line_number":14,"context_line":"    for them as well."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"9f6a8fd7_f4a39fb0","line":13,"range":{"start_line":13,"start_character":58,"end_line":13,"end_character":65},"in_reply_to":"9f6a8fd7_01c4e4f3","updated":"2018-04-25 03:39:44.000000000","message":"Done","commit_id":"1b38cc42663cbdec0c82083839854e3ac5914a89"}]}
