)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2fa90e1d271b1c72b7e1e6e3ccecc0ce09f6e97f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"Shadow users: unified identity\" implementation:"},{"line_number":10,"context_line":"Federated users have a idp_id, protocol_id, display name, and a unique ID asserted"},{"line_number":11,"context_line":"by the identity provider. These are the minimal pieces of data required to identify"},{"line_number":12,"context_line":"returning users and provide them with a consistent identity."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Note: Shadowing LDAP users will be completed in a different patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"dae33548_2c05e8c1","line":11,"range":{"start_line":11,"start_character":24,"end_line":11,"end_character":25},"updated":"2016-02-15 10:20:30.000000000","message":"so i assume that one of the attributes, probably unique_id will be simply a 1:1 mapping from one attribute from IdP\u0027s assertion/claim?","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"281368c1c494c2fb733c56e339794f3257bba938","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"Shadow users: unified identity\" implementation:"},{"line_number":10,"context_line":"Federated users have a idp_id, protocol_id, display name, and a unique ID asserted"},{"line_number":11,"context_line":"by the identity provider. These are the minimal pieces of data required to identify"},{"line_number":12,"context_line":"returning users and provide them with a consistent identity."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Note: Shadowing LDAP users will be completed in a different patch"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"9aed3d3a_93f26c99","line":11,"range":{"start_line":11,"start_character":24,"end_line":11,"end_character":25},"in_reply_to":"dae33548_2c05e8c1","updated":"2016-02-25 18:00:57.000000000","message":"Not following.  But see the foreign key relationships and let me know if it doesn\u0027t make sense:\nhttps://review.openstack.org/#/c/279162/54/keystone/common/sql/migrate_repo/versions/093_add_federated_user_table.py","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Shadow users - Shadow federated users"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"Shadow users: unified identity\" implementation:"},{"line_number":10,"context_line":"Federated users have a idp_id, protocol_id, display name, and a unique ID asserted"},{"line_number":11,"context_line":"by the identity provider. These are the minimal pieces of data required to identify"},{"line_number":12,"context_line":"returning users and provide them with a consistent identity."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":62,"id":"9aed3d3a_cd9b0c65","line":10,"updated":"2016-02-29 17:59:06.000000000","message":"I think theses lines are too long","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Shadow users - Shadow federated users"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"\"Shadow users: unified identity\" implementation:"},{"line_number":10,"context_line":"Federated users have a idp_id, protocol_id, display name, and a unique ID asserted"},{"line_number":11,"context_line":"by the identity provider. These are the minimal pieces of data required to identify"},{"line_number":12,"context_line":"returning users and provide them with a consistent identity."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":62,"id":"9aed3d3a_7df7098b","line":10,"in_reply_to":"9aed3d3a_cd9b0c65","updated":"2016-02-29 19:05:37.000000000","message":"Done","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"}],"keystone/auth/plugins/mapped.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"08cedc37725688bd514f16adef0ebeb4ed9f52c1","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                \u0027idp_id\u0027: identity_provider,"},{"line_number":146,"context_line":"                \u0027protocol_id\u0027: protocol,"},{"line_number":147,"context_line":"                \u0027unique_id\u0027: temp_user[\u0027id\u0027],"},{"line_number":148,"context_line":"                \u0027display_name\u0027: temp_user[\u0027name\u0027]"},{"line_number":149,"context_line":"            }"},{"line_number":150,"context_line":"            user \u003d identity_api.shadow_federated_user(federated_dict)"},{"line_number":151,"context_line":"            user_id \u003d user[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_13e5c507","line":148,"updated":"2016-02-24 16:27:26.000000000","message":"i don\u0027t understand why there is display_name here. Why not use user.name ?","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"56f3c5b45c549b1f2475e8e65936157ce57619bb","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                \u0027idp_id\u0027: identity_provider,"},{"line_number":146,"context_line":"                \u0027protocol_id\u0027: protocol,"},{"line_number":147,"context_line":"                \u0027unique_id\u0027: temp_user[\u0027id\u0027],"},{"line_number":148,"context_line":"                \u0027display_name\u0027: temp_user[\u0027name\u0027]"},{"line_number":149,"context_line":"            }"},{"line_number":150,"context_line":"            user \u003d identity_api.shadow_federated_user(federated_dict)"},{"line_number":151,"context_line":"            user_id \u003d user[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_42993578","line":148,"in_reply_to":"bae84128_13e5c507","updated":"2016-02-24 17:25:38.000000000","message":"marek: let me get back to you on this","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"599d0e0e4f678495b5dbbefebe653415910f4285","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                \u0027idp_id\u0027: identity_provider,"},{"line_number":146,"context_line":"                \u0027protocol_id\u0027: protocol,"},{"line_number":147,"context_line":"                \u0027unique_id\u0027: temp_user[\u0027id\u0027],"},{"line_number":148,"context_line":"                \u0027display_name\u0027: temp_user[\u0027name\u0027]"},{"line_number":149,"context_line":"            }"},{"line_number":150,"context_line":"            user \u003d identity_api.shadow_federated_user(federated_dict)"},{"line_number":151,"context_line":"            user_id \u003d user[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_786dc931","line":148,"in_reply_to":"bae84128_42993578","updated":"2016-02-25 19:33:14.000000000","message":"display_name and user.name are not the same things.  display_name would be more like a first name and last name.","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"622132aeadf26951d71cc22e360c97787ea27e69","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            federation_api, identity_api)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        if is_ephemeral_user(mapped_properties):"},{"line_number":143,"context_line":"            temp_user \u003d setup_username(context, mapped_properties)"},{"line_number":144,"context_line":"            federated_dict \u003d {"},{"line_number":145,"context_line":"                \u0027idp_id\u0027: identity_provider,"},{"line_number":146,"context_line":"                \u0027protocol_id\u0027: protocol,"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_67d0c1f8","line":143,"updated":"2016-02-24 19:53:54.000000000","message":"there shouldn\u0027t be anything \"temp\" about this anymore... we might need to more deeply integrate into the setup_username() method, or simply refactor it so it\u0027s just outputting the unique_id and display_name and not doing any \"setup\" (which it\u0027s really not doing anyway)","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"89af9b29b2544d11015268edb3b1f6d8d20031a2","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            federation_api, identity_api)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        if is_ephemeral_user(mapped_properties):"},{"line_number":143,"context_line":"            temp_user \u003d setup_username(context, mapped_properties)"},{"line_number":144,"context_line":"            federated_dict \u003d {"},{"line_number":145,"context_line":"                \u0027idp_id\u0027: identity_provider,"},{"line_number":146,"context_line":"                \u0027protocol_id\u0027: protocol,"}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_3f89a7cb","line":143,"in_reply_to":"bae84128_67d0c1f8","updated":"2016-02-25 17:27:45.000000000","message":"Done","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"622132aeadf26951d71cc22e360c97787ea27e69","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                \u0027unique_id\u0027: temp_user[\u0027id\u0027],"},{"line_number":148,"context_line":"                \u0027display_name\u0027: temp_user[\u0027name\u0027]"},{"line_number":149,"context_line":"            }"},{"line_number":150,"context_line":"            user \u003d identity_api.shadow_federated_user(federated_dict)"},{"line_number":151,"context_line":"            user_id \u003d user[\u0027id\u0027]"},{"line_number":152,"context_line":"            group_ids \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":153,"context_line":"            utils.validate_groups_cardinality(group_ids, mapping_id)"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_87a9857e","line":150,"updated":"2016-02-24 19:53:54.000000000","message":"if this is all the \"federated_dict\" is being used for, then it\u0027d make more sense to make those 4 values explicit arguments of the shadow_fedearted_user() method","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"89af9b29b2544d11015268edb3b1f6d8d20031a2","unresolved":false,"context_lines":[{"line_number":147,"context_line":"                \u0027unique_id\u0027: temp_user[\u0027id\u0027],"},{"line_number":148,"context_line":"                \u0027display_name\u0027: temp_user[\u0027name\u0027]"},{"line_number":149,"context_line":"            }"},{"line_number":150,"context_line":"            user \u003d identity_api.shadow_federated_user(federated_dict)"},{"line_number":151,"context_line":"            user_id \u003d user[\u0027id\u0027]"},{"line_number":152,"context_line":"            group_ids \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":153,"context_line":"            utils.validate_groups_cardinality(group_ids, mapping_id)"}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_5f90ebec","line":150,"in_reply_to":"bae84128_87a9857e","updated":"2016-02-25 17:27:45.000000000","message":"Done","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6cd4b6f799c570f17ba801baaefc913f179f31a0","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \u0027idp_id\u0027: identity_provider,"},{"line_number":147,"context_line":"                \u0027protocol_id\u0027: protocol,"},{"line_number":148,"context_line":"                \u0027unique_id\u0027: unique_id,"},{"line_number":149,"context_line":"                \u0027display_name\u0027: user_name"},{"line_number":150,"context_line":"            }"},{"line_number":151,"context_line":"            user \u003d identity_api.shadow_federated_user(federated_dict)"},{"line_number":152,"context_line":"            user_id \u003d user[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_c11a2017","line":149,"updated":"2016-02-25 16:19:25.000000000","message":"i think you meant \u0027display_name\u0027 or actually thought about user_name in line 143.","commit_id":"a16e9b622af106a326991054616af7bb6156eb48"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9610b56d670a807a427e0e402873bc04c99b589a","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                \u0027idp_id\u0027: identity_provider,"},{"line_number":147,"context_line":"                \u0027protocol_id\u0027: protocol,"},{"line_number":148,"context_line":"                \u0027unique_id\u0027: unique_id,"},{"line_number":149,"context_line":"                \u0027display_name\u0027: user_name"},{"line_number":150,"context_line":"            }"},{"line_number":151,"context_line":"            user \u003d identity_api.shadow_federated_user(federated_dict)"},{"line_number":152,"context_line":"            user_id \u003d user[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":52,"id":"9aed3d3a_de035475","line":149,"in_reply_to":"bae84128_c11a2017","updated":"2016-02-25 19:35:17.000000000","message":"Done","commit_id":"a16e9b622af106a326991054616af7bb6156eb48"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"6cd4b6f799c570f17ba801baaefc913f179f31a0","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    return mapped_properties, mapping_id"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"def _get_user_unique_id_and_display_name(context, mapped_properties):"},{"line_number":213,"context_line":"    \"\"\"Setup federated username."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    Function covers all the cases for properly setting user id, a primary"}],"source_content_type":"text/x-python","patch_set":52,"id":"bae84128_219cac5c","line":212,"updated":"2016-02-25 16:19:25.000000000","message":"i am actually unsure you can change public function to a private one. \n\nIn general same applies for arguments passed to the function and return values (which you are changing here).","commit_id":"a16e9b622af106a326991054616af7bb6156eb48"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9610b56d670a807a427e0e402873bc04c99b589a","unresolved":false,"context_lines":[{"line_number":209,"context_line":"    return mapped_properties, mapping_id"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"def _get_user_unique_id_and_display_name(context, mapped_properties):"},{"line_number":213,"context_line":"    \"\"\"Setup federated username."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    Function covers all the cases for properly setting user id, a primary"}],"source_content_type":"text/x-python","patch_set":52,"id":"9aed3d3a_fe39f842","line":212,"in_reply_to":"bae84128_219cac5c","updated":"2016-02-25 19:35:17.000000000","message":"I fixed this, thanks","commit_id":"a16e9b622af106a326991054616af7bb6156eb48"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ab50371b3a084e896ef2f3bde0b05fcab521a266","unresolved":false,"context_lines":[{"line_number":229,"context_line":"    \"\"\""},{"line_number":230,"context_line":"    user \u003d mapped_properties[\u0027user\u0027]"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    user_id \u003d user.get(\u0027id\u0027)"},{"line_number":233,"context_line":"    user_name \u003d user.get(\u0027name\u0027) or context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    if not any([user_id, user_name]):"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_acf8af4a","side":"PARENT","line":232,"updated":"2016-02-26 16:19:01.000000000","message":"Can anyone (Steve? Marek?) explain why this won\u0027t work?\n\n  unique_id \u003d mapped_properties[\u0027user\u0027][\u0027id\u0027]\n  display_name \u003d mapped_properties[\u0027user\u0027][\u0027name\u0027]\n\nThe fallback on the context if mapping failed to produce the one thing it\u0027s required to produce (a uniquely identifying attribute of the user) makes no sense to me.","commit_id":"2707f8ffb008478ce6d12ab638497c18db3b5cdd"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9aba5d439a9ee9e5497ffc764a574bc3b36ccdbe","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    return mapped_properties, mapping_id"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"def get_user_unique_id_and_display_name(context, mapped_properties):"},{"line_number":210,"context_line":"    \"\"\"Gets federated user unique id and display name."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    The id and name are mapped to unique_id and display_name. This method"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_ddc5fa5b","line":209,"range":{"start_line":209,"start_character":4,"end_line":209,"end_character":39},"updated":"2016-02-26 09:18:11.000000000","message":"undo this rename, it was not necessary","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ab50371b3a084e896ef2f3bde0b05fcab521a266","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    return mapped_properties, mapping_id"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"def get_user_unique_id_and_display_name(context, mapped_properties):"},{"line_number":210,"context_line":"    \"\"\"Gets federated user unique id and display name."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    The id and name are mapped to unique_id and display_name. This method"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_ec07577f","line":209,"in_reply_to":"9aed3d3a_ddc5fa5b","updated":"2016-02-26 16:19:01.000000000","message":"... are you suggesting that setup_username() was a more appropriate name for a method that returns a user ID and name and does no actual \"setup\"?","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ab96076aa5eed9a10a948338fd80a37ed0700ddc","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    return mapped_properties, mapping_id"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"def get_user_unique_id_and_display_name(context, mapped_properties):"},{"line_number":210,"context_line":"    \"\"\"Gets federated user unique id and display name."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    The id and name are mapped to unique_id and display_name. This method"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_e6e9211c","line":209,"in_reply_to":"9aed3d3a_ec07577f","updated":"2016-02-26 22:51:39.000000000","message":"With the changes that I\u0027ve made to this class and method, I think the name is a better fit.","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9aba5d439a9ee9e5497ffc764a574bc3b36ccdbe","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    :rtype: tuple"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    user \u003d mapped_properties[\u0027user\u0027]"},{"line_number":226,"context_line":"    unique_id \u003d user.get(\u0027id\u0027)"},{"line_number":227,"context_line":"    display_name \u003d ("},{"line_number":228,"context_line":"        user.get(\u0027name\u0027) or context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)"},{"line_number":229,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_bda3d69d","line":226,"range":{"start_line":225,"start_character":4,"end_line":226,"end_character":30},"updated":"2016-02-26 09:18:11.000000000","message":"so in a lot of cases, only the name is grabbed from the mapping engine, and the ID is a URL safe representation of the name.\n\n so stevemar@ca.ibm.com would turn into stevemar%40ca.ibm.com\n\nso it\u0027s not really unique in the sense of a UUID","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"ab50371b3a084e896ef2f3bde0b05fcab521a266","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    user \u003d mapped_properties[\u0027user\u0027]"},{"line_number":226,"context_line":"    unique_id \u003d user.get(\u0027id\u0027)"},{"line_number":227,"context_line":"    display_name \u003d ("},{"line_number":228,"context_line":"        user.get(\u0027name\u0027) or context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)"},{"line_number":229,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_cc21b3fd","line":226,"in_reply_to":"9aed3d3a_bda3d69d","updated":"2016-02-26 16:19:01.000000000","message":"Are you asking for a change here? Yes, the unique_id is only supposed to be unique within the scope of the IdP.","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"166da29b06b6c6ad1f6425201f11d85da5684d06","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    :rtype: tuple"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    user \u003d mapped_properties[\u0027user\u0027]"},{"line_number":226,"context_line":"    unique_id \u003d user.get(\u0027id\u0027)"},{"line_number":227,"context_line":"    display_name \u003d ("},{"line_number":228,"context_line":"        user.get(\u0027name\u0027) or context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)"},{"line_number":229,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_a6c9d97a","line":226,"range":{"start_line":225,"start_character":4,"end_line":226,"end_character":30},"in_reply_to":"9aed3d3a_bda3d69d","updated":"2016-02-26 22:54:56.000000000","message":"Per our IRC conversation, I\u0027ve mapped \"id\" and \"name\" from the mapped properties to \"unique_id\" and \"display_name\".  Also keeping the following logic in place:\n* if \"name\" is not supplied, set it to \"context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)\" or \"id\"\n* if \"id\" is not supplied, then set it to the \"name\"","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"232b76f1392d8055ef4f54c6d057aaafcefc455f","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            unique_id, display_name \u003d ("},{"line_number":144,"context_line":"                get_user_unique_id_and_display_name(context, mapped_properties)"},{"line_number":145,"context_line":"            )"},{"line_number":146,"context_line":"            user \u003d identity_api.shadow_federated_user(identity_provider,"},{"line_number":147,"context_line":"                                                      protocol, unique_id,"},{"line_number":148,"context_line":"                                                      display_name)"},{"line_number":149,"context_line":"            user_id \u003d user[\u0027id\u0027]"},{"line_number":150,"context_line":"            group_ids \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":151,"context_line":"            utils.validate_groups_cardinality(group_ids, mapping_id)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_416ef796","line":148,"range":{"start_line":146,"start_character":12,"end_line":148,"end_character":67},"updated":"2016-02-26 23:27:45.000000000","message":"the only change to this file should have been:\n\nuser_ref \u003d identity_api.shadow_federated_user(identity_provider,\n                                                      protocol, user[\u0027id\u0027],\n                                                      user[\u0027name\u0027])","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"974b540ec5de10cd7871a1178934e9feec679566","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            unique_id, display_name \u003d ("},{"line_number":144,"context_line":"                get_user_unique_id_and_display_name(context, mapped_properties)"},{"line_number":145,"context_line":"            )"},{"line_number":146,"context_line":"            user \u003d identity_api.shadow_federated_user(identity_provider,"},{"line_number":147,"context_line":"                                                      protocol, unique_id,"},{"line_number":148,"context_line":"                                                      display_name)"},{"line_number":149,"context_line":"            user_id \u003d user[\u0027id\u0027]"},{"line_number":150,"context_line":"            group_ids \u003d mapped_properties[\u0027group_ids\u0027]"},{"line_number":151,"context_line":"            utils.validate_groups_cardinality(group_ids, mapping_id)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_df6492e6","line":148,"range":{"start_line":146,"start_character":12,"end_line":148,"end_character":67},"in_reply_to":"9aed3d3a_416ef796","updated":"2016-02-27 09:58:21.000000000","message":"Agree, was originally thinking that the business rules around setup_username() needed to change.  But as it turns out, it didn\u0027t.  So I changed the guts of this method back; only changed the method name and return type.","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"232b76f1392d8055ef4f54c6d057aaafcefc455f","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    :rtype: tuple"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    user \u003d mapped_properties[\u0027user\u0027]"},{"line_number":226,"context_line":"    unique_id \u003d user.get(\u0027id\u0027)"},{"line_number":227,"context_line":"    display_name \u003d ("},{"line_number":228,"context_line":"        user.get(\u0027name\u0027) or context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)"},{"line_number":229,"context_line":"    )"},{"line_number":230,"context_line":"    if not any([unique_id, display_name]):"},{"line_number":231,"context_line":"        msg \u003d _(\"Could not map user while setting federated user identity. \""},{"line_number":232,"context_line":"                \"Either mapping rules must specify user id/name or \""},{"line_number":233,"context_line":"                \"REMOTE_USER environment variable must be set.\")"},{"line_number":234,"context_line":"        raise exception.Unauthorized(msg)"},{"line_number":235,"context_line":"    elif not display_name:"},{"line_number":236,"context_line":"        display_name \u003d unique_id"},{"line_number":237,"context_line":"    elif not unique_id:"},{"line_number":238,"context_line":"        unique_id \u003d display_name"},{"line_number":239,"context_line":"    unique_id \u003d parse.quote(unique_id)"},{"line_number":240,"context_line":"    return (unique_id, display_name)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_a1bf03fa","line":240,"range":{"start_line":225,"start_character":4,"end_line":240,"end_character":36},"updated":"2016-02-26 23:27:45.000000000","message":"i find this refactoring unnecessary, the \u0027user\u0027 dictionary that was previously there had both the unique_id and display_name in the form of user[\u0027id\u0027] and user[\u0027name\u0027]. i\u0027m not saying this is wrong, just makes the review that much harder.","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"974b540ec5de10cd7871a1178934e9feec679566","unresolved":false,"context_lines":[{"line_number":222,"context_line":"    :rtype: tuple"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    \"\"\""},{"line_number":225,"context_line":"    user \u003d mapped_properties[\u0027user\u0027]"},{"line_number":226,"context_line":"    unique_id \u003d user.get(\u0027id\u0027)"},{"line_number":227,"context_line":"    display_name \u003d ("},{"line_number":228,"context_line":"        user.get(\u0027name\u0027) or context[\u0027environment\u0027].get(\u0027REMOTE_USER\u0027)"},{"line_number":229,"context_line":"    )"},{"line_number":230,"context_line":"    if not any([unique_id, display_name]):"},{"line_number":231,"context_line":"        msg \u003d _(\"Could not map user while setting federated user identity. \""},{"line_number":232,"context_line":"                \"Either mapping rules must specify user id/name or \""},{"line_number":233,"context_line":"                \"REMOTE_USER environment variable must be set.\")"},{"line_number":234,"context_line":"        raise exception.Unauthorized(msg)"},{"line_number":235,"context_line":"    elif not display_name:"},{"line_number":236,"context_line":"        display_name \u003d unique_id"},{"line_number":237,"context_line":"    elif not unique_id:"},{"line_number":238,"context_line":"        unique_id \u003d display_name"},{"line_number":239,"context_line":"    unique_id \u003d parse.quote(unique_id)"},{"line_number":240,"context_line":"    return (unique_id, display_name)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_1f5f1a0f","line":240,"range":{"start_line":225,"start_character":4,"end_line":240,"end_character":36},"in_reply_to":"9aed3d3a_a1bf03fa","updated":"2016-02-27 09:58:21.000000000","message":"Agree, changed the guts of this method back to make it easier for reviewers.","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        user_id \u003d user_name"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    user[\u0027id\u0027] \u003d parse.quote(user_id)"},{"line_number":253,"context_line":"    return (user[\u0027id\u0027], user[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_c8d49a21","line":253,"updated":"2016-02-29 17:59:06.000000000","message":"Out of curiosity, why was this changed?","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        user_id \u003d user_name"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    user[\u0027id\u0027] \u003d parse.quote(user_id)"},{"line_number":253,"context_line":"    return (user[\u0027id\u0027], user[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_1dbebd64","line":253,"in_reply_to":"9aed3d3a_c8d49a21","updated":"2016-02-29 19:05:37.000000000","message":"Previously this was creating a user dict. Now, I\u0027m only using this method to set the unique_id and display_name; the user dict is being created from the shadow users create method.","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"}],"keystone/common/config.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"232b76f1392d8055ef4f54c6d057aaafcefc455f","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                         \u0027value to False is when configuring a fresh \u0027"},{"line_number":235,"context_line":"                         \u0027installation.\u0027),"},{"line_number":236,"context_line":"    ],"},{"line_number":237,"context_line":"    \u0027shadow_users\u0027: ["},{"line_number":238,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":239,"context_line":"                   default\u003d\u0027sql\u0027,"},{"line_number":240,"context_line":"                   help\u003d\u0027Entrypoint for the shadow users backend driver \u0027"},{"line_number":241,"context_line":"                        \u0027in the keystone.identity.shadow_users namespace.\u0027),"},{"line_number":242,"context_line":"    ],"},{"line_number":243,"context_line":"    \u0027trust\u0027: ["},{"line_number":244,"context_line":"        cfg.BoolOpt(\u0027enabled\u0027, default\u003dTrue,"},{"line_number":245,"context_line":"                    help\u003d\u0027Delegation and impersonation features can be \u0027"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_8168ff88","line":242,"range":{"start_line":237,"start_character":4,"end_line":242,"end_character":6},"updated":"2016-02-26 23:27:45.000000000","message":"thanks for including this!","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"974b540ec5de10cd7871a1178934e9feec679566","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                         \u0027value to False is when configuring a fresh \u0027"},{"line_number":235,"context_line":"                         \u0027installation.\u0027),"},{"line_number":236,"context_line":"    ],"},{"line_number":237,"context_line":"    \u0027shadow_users\u0027: ["},{"line_number":238,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":239,"context_line":"                   default\u003d\u0027sql\u0027,"},{"line_number":240,"context_line":"                   help\u003d\u0027Entrypoint for the shadow users backend driver \u0027"},{"line_number":241,"context_line":"                        \u0027in the keystone.identity.shadow_users namespace.\u0027),"},{"line_number":242,"context_line":"    ],"},{"line_number":243,"context_line":"    \u0027trust\u0027: ["},{"line_number":244,"context_line":"        cfg.BoolOpt(\u0027enabled\u0027, default\u003dTrue,"},{"line_number":245,"context_line":"                    help\u003d\u0027Delegation and impersonation features can be \u0027"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_5f9fe2b3","line":242,"range":{"start_line":237,"start_character":4,"end_line":242,"end_character":6},"in_reply_to":"9aed3d3a_8168ff88","updated":"2016-02-27 09:58:21.000000000","message":":)","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"}],"keystone/common/sql/core.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    attributes \u003d []"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @classmethod"},{"line_number":125,"context_line":"    def from_dict(cls, d, include_extra\u003dTrue):"},{"line_number":126,"context_line":"        new_d \u003d d.copy()"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        if include_extra:"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_28c9c659","line":125,"updated":"2016-02-29 17:59:06.000000000","message":"Why do you need this? Can\u0027t you just use the ModelDictMixin instead?","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":122,"context_line":"    attributes \u003d []"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    @classmethod"},{"line_number":125,"context_line":"    def from_dict(cls, d, include_extra\u003dTrue):"},{"line_number":126,"context_line":"        new_d \u003d d.copy()"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"        if include_extra:"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_5d6b25f1","line":125,"in_reply_to":"9aed3d3a_28c9c659","updated":"2016-02-29 19:05:37.000000000","message":"Done","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"}],"keystone/common/sql/migrate_repo/versions/092_add_federated_identity_table.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2fa90e1d271b1c72b7e1e6e3ccecc0ce09f6e97f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                   sql.ForeignKey(identity_table.c.id, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        sql.Column(\u0027idp_id\u0027, sql.String(64),"},{"line_number":32,"context_line":"                   sql.ForeignKey(identity_provider_table.c.id,"},{"line_number":33,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":34,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_ac261814","line":33,"updated":"2016-02-15 10:20:30.000000000","message":"upon deleting identity provider we will loose information about all their users. What if some audit info should be preserved due to some legal requirements?\nI think we could break this FK constraint here and implement deleting users belonging to a idp/proto pair from cli (keystone_manage)","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"281368c1c494c2fb733c56e339794f3257bba938","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                   sql.ForeignKey(identity_table.c.id, ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        sql.Column(\u0027idp_id\u0027, sql.String(64),"},{"line_number":32,"context_line":"                   sql.ForeignKey(identity_provider_table.c.id,"},{"line_number":33,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":34,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_93e54caa","line":33,"in_reply_to":"dae33548_ac261814","updated":"2016-02-25 18:00:57.000000000","message":"Yes, deleting the idp, would delete the federated user. There isn\u0027t audit requirement in scope for this.","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2fa90e1d271b1c72b7e1e6e3ccecc0ce09f6e97f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        sql.Column(\u0027idp_id\u0027, sql.String(64),"},{"line_number":32,"context_line":"                   sql.ForeignKey(identity_provider_table.c.id,"},{"line_number":33,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":34,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":37,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_2c604835","line":34,"updated":"2016-02-15 10:20:30.000000000","message":"Regardless what we do with constraints between idp_id and user you should keep same constraints for protocol_id. \nSo either both idp_id will have ondelete\u003d\u0027CASCADE\u0027 constraint or neither.","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"281368c1c494c2fb733c56e339794f3257bba938","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        sql.Column(\u0027idp_id\u0027, sql.String(64),"},{"line_number":32,"context_line":"                   sql.ForeignKey(identity_provider_table.c.id,"},{"line_number":33,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":34,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":37,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_136dbc04","line":34,"in_reply_to":"dae33548_2c604835","updated":"2016-02-25 18:00:57.000000000","message":"Done","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2fa90e1d271b1c72b7e1e6e3ccecc0ce09f6e97f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                   sql.ForeignKey(identity_provider_table.c.id,"},{"line_number":33,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":34,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":37,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_0cf3c474","line":35,"updated":"2016-02-15 10:20:30.000000000","message":"unique_id suggest that will be deployment unique id. I would be more happy to have some support from the DB layer. Some \u0027unique\u0027 constraint on DB or something.\nHope is not strategy :-)","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ddc7ee8e0fc209f5e1e7db61cdaf1d174c53a60e","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                   sql.ForeignKey(identity_provider_table.c.id,"},{"line_number":33,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":34,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":37,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_fef738f3","line":35,"in_reply_to":"dae33548_0cf3c474","updated":"2016-02-25 19:28:49.000000000","message":"see the latest table definition and let me know if you still have questions/concerns","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"4f26abc321d50622b37ea422b91b393f96f3d65c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":34,"context_line":"        sql.Column(\u0027protocol_id\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027unique_id\u0027, sql.String(255), nullable\u003dFalse),"},{"line_number":36,"context_line":"        sql.Column(\u0027display_name\u0027, sql.String(255), nullable\u003dTrue))"},{"line_number":37,"context_line":"    federated_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dae33548_01b02f89","line":36,"range":{"start_line":36,"start_character":8,"end_line":36,"end_character":67},"updated":"2016-02-17 13:09:03.000000000","message":"What are the consequences of having nullable display_name?","commit_id":"4f8b44ea35911241b59cc58144ca358cf5a58b92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bda8c3361eecc9a385d373d770e8652062ebcab","unresolved":false,"context_lines":[{"line_number":22,"context_line":"                                        autoload\u003dTrue)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    federated_table \u003d sql.Table("},{"line_number":25,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":26,"context_line":"        meta,"},{"line_number":27,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":28,"context_line":"                   nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_166aa880","line":25,"updated":"2016-02-19 19:50:28.000000000","message":"federated_user ?","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"17813b541887ec16e0d22b5aa8b507484852aa42","unresolved":false,"context_lines":[{"line_number":22,"context_line":"                                        autoload\u003dTrue)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    federated_table \u003d sql.Table("},{"line_number":25,"context_line":"        \u0027federated_identity\u0027,"},{"line_number":26,"context_line":"        meta,"},{"line_number":27,"context_line":"        sql.Column(\u0027id\u0027, sql.String(64), primary_key\u003dTrue,"},{"line_number":28,"context_line":"                   nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_ae49d28d","line":25,"in_reply_to":"bae84128_166aa880","updated":"2016-02-20 12:30:31.000000000","message":"Done","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"}],"keystone/common/sql/migrate_repo/versions/092_add_federated_user_table.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ad5675dca828a59e728d2a7ade0201784e7acbf6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":44,"id":"bae84128_6edc5146","updated":"2016-02-24 06:13:38.000000000","message":"this will have to be renamed to 093","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a318b913ff30c70aa11328cb7451e00d306d536f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":44,"id":"bae84128_45578a57","in_reply_to":"bae84128_6edc5146","updated":"2016-02-24 15:34:53.000000000","message":"Done","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ad5675dca828a59e728d2a7ade0201784e7acbf6","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    migrate.ForeignKeyConstraint("},{"line_number":43,"context_line":"        columns\u003d[federated_table.c.protocol_id, federated_table.c.idp_id],"},{"line_number":44,"context_line":"        refcolumns\u003d[protocol_table.c.id, protocol_table.c.idp_id]).create()"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_ae75b964","line":44,"range":{"start_line":44,"start_character":41,"end_line":44,"end_character":55},"updated":"2016-02-24 06:13:38.000000000","message":"shouldn\u0027t this be \"idp_table.c.id\"?","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a318b913ff30c70aa11328cb7451e00d306d536f","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    migrate.ForeignKeyConstraint("},{"line_number":43,"context_line":"        columns\u003d[federated_table.c.protocol_id, federated_table.c.idp_id],"},{"line_number":44,"context_line":"        refcolumns\u003d[protocol_table.c.id, protocol_table.c.idp_id]).create()"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_450f8a36","line":44,"range":{"start_line":44,"start_character":41,"end_line":44,"end_character":55},"in_reply_to":"bae84128_ae75b964","updated":"2016-02-24 15:34:53.000000000","message":"The federated_user table has 2 foreign key relationships:\n* federated_user.idp_id -\u003e identity_provider\n* federated_user.protocol_id, idp_id -\u003e federation_protocol\n\nThe federation_protocol table\u0027s primary key is a composite key of: id and protocol_id.  Which is why the federated_user has a composite foreign key relationship to this table.","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"}],"keystone/common/sql/migrate_repo/versions/093_add_federated_user_table.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import migrate"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import sqlalchemy as sql"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_c8de5a10","line":14,"updated":"2016-02-29 17:59:06.000000000","message":"no newline needed","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import migrate"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import sqlalchemy as sql"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_7d76e9d7","line":14,"in_reply_to":"9aed3d3a_c8de5a10","updated":"2016-02-29 19:05:37.000000000","message":"Done","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    federated_table \u003d sql.Table("},{"line_number":27,"context_line":"        \u0027federated_user\u0027,"},{"line_number":28,"context_line":"        meta,"},{"line_number":29,"context_line":"        sql.Column(\u0027id\u0027, sql.Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":30,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64),"},{"line_number":31,"context_line":"                   sql.ForeignKey(user_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":32,"context_line":"                   nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_086b22f2","line":29,"updated":"2016-02-29 17:59:06.000000000","message":"I know this is be auto increment for mysql. IIRC you had to do something else for postgres. Is that true and if so do we care?","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    federated_table \u003d sql.Table("},{"line_number":27,"context_line":"        \u0027federated_user\u0027,"},{"line_number":28,"context_line":"        meta,"},{"line_number":29,"context_line":"        sql.Column(\u0027id\u0027, sql.Integer, primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":30,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64),"},{"line_number":31,"context_line":"                   sql.ForeignKey(user_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":32,"context_line":"                   nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_00d7764b","line":29,"in_reply_to":"9aed3d3a_086b22f2","updated":"2016-02-29 19:05:37.000000000","message":"Not 100% sure, was trusting SQLAlchemy to automatically set AUTO_INCREMENT by default.","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"}],"keystone/identity/backends/sql.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"7397f996ee5927e1cfefef0cba9b0fb931cf6031","unresolved":false,"context_lines":[{"line_number":131,"context_line":"class FederatedIdentity(sql.ModelBase, sql.DictBase):"},{"line_number":132,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":133,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":134,"context_line":"                  \u0027display_name\u0027]"},{"line_number":135,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":136,"context_line":"    identity_id \u003d sql.Column(sql.String(64),"},{"line_number":137,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a57f1b5_3412600a","line":134,"updated":"2016-02-11 16:32:59.000000000","message":"why display_name not \u0027name\u0027?","commit_id":"bcfd953c40ea97a7cbe5b6a1aa51b6ffe4414fec"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2fa90e1d271b1c72b7e1e6e3ccecc0ce09f6e97f","unresolved":false,"context_lines":[{"line_number":135,"context_line":"class FederatedIdentity(sql.ModelBase, sql.DictBase):"},{"line_number":136,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":137,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":138,"context_line":"                  \u0027display_name\u0027]"},{"line_number":139,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":140,"context_line":"    identity_id \u003d sql.Column(sql.String(64),"},{"line_number":141,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_cca71c4e","line":138,"updated":"2016-02-15 10:20:30.000000000","message":"why \u0027display_name\u0027 not \u0027name\u0027?","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"281368c1c494c2fb733c56e339794f3257bba938","unresolved":false,"context_lines":[{"line_number":135,"context_line":"class FederatedIdentity(sql.ModelBase, sql.DictBase):"},{"line_number":136,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":137,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":138,"context_line":"                  \u0027display_name\u0027]"},{"line_number":139,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":140,"context_line":"    identity_id \u003d sql.Column(sql.String(64),"},{"line_number":141,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_d3499490","line":138,"in_reply_to":"dae33548_cca71c4e","updated":"2016-02-25 18:00:57.000000000","message":"display_name is not the same thing as user.name","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a7c4c9e47e93048fb5e01f25d608083d76c9f150","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    expires_at \u003d sql.Column(sql.DateTime())"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"class FederatedIdentity(sql.ModelBase, sql.DictBase):"},{"line_number":129,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":130,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":131,"context_line":"                  \u0027display_name\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_dc03500e","line":128,"updated":"2016-02-19 15:54:40.000000000","message":"what attribute will be used here as a id in \u0027user_id\u0027 attribute in for instance a token?","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bda8c3361eecc9a385d373d770e8652062ebcab","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    expires_at \u003d sql.Column(sql.DateTime())"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"class FederatedIdentity(sql.ModelBase, sql.DictBase):"},{"line_number":129,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":130,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":131,"context_line":"                  \u0027display_name\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_76d33439","line":128,"in_reply_to":"bae84128_dc03500e","updated":"2016-02-19 19:50:28.000000000","message":"The same as for SQL users.","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a7c4c9e47e93048fb5e01f25d608083d76c9f150","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":130,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":131,"context_line":"                  \u0027display_name\u0027]"},{"line_number":132,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":133,"context_line":"    identity_id \u003d sql.Column(sql.String(64),"},{"line_number":134,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_9cd8a8f1","line":132,"updated":"2016-02-19 15:54:40.000000000","message":"I am assuming this is the instance of the federated user.\nSo, here he has id type of String, whereas LocalUser\u0027s id is Integer. why?","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"17813b541887ec16e0d22b5aa8b507484852aa42","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":130,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":131,"context_line":"                  \u0027display_name\u0027]"},{"line_number":132,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":133,"context_line":"    identity_id \u003d sql.Column(sql.String(64),"},{"line_number":134,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_4e59265a","line":132,"in_reply_to":"bae84128_16ef48e9","updated":"2016-02-20 12:30:31.000000000","message":"Done","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bda8c3361eecc9a385d373d770e8652062ebcab","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":130,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":131,"context_line":"                  \u0027display_name\u0027]"},{"line_number":132,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":133,"context_line":"    identity_id \u003d sql.Column(sql.String(64),"},{"line_number":134,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_16ef48e9","line":132,"in_reply_to":"bae84128_9cd8a8f1","updated":"2016-02-19 19:50:28.000000000","message":"++ This patch needs to be updated to match changes in the underlying patch.","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"17813b541887ec16e0d22b5aa8b507484852aa42","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    __tablename__ \u003d \u0027federated_identity\u0027"},{"line_number":130,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027identity_id\u0027, \u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027,"},{"line_number":131,"context_line":"                  \u0027display_name\u0027]"},{"line_number":132,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":133,"context_line":"    identity_id \u003d sql.Column(sql.String(64),"},{"line_number":134,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_8e316e0e","line":132,"in_reply_to":"bae84128_9cd8a8f1","updated":"2016-02-20 12:30:31.000000000","message":"Done","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a7c4c9e47e93048fb5e01f25d608083d76c9f150","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"},{"line_number":136,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027))"},{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_1cc138e5","line":137,"updated":"2016-02-19 15:54:40.000000000","message":"add foreign key to Protocol table.","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bda8c3361eecc9a385d373d770e8652062ebcab","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"},{"line_number":136,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027))"},{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_b6b49cf2","line":137,"in_reply_to":"bae84128_1cc138e5","updated":"2016-02-19 19:50:28.000000000","message":"++","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"13d01027d3bfad89adc1e789f7e6335b86131f26","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"},{"line_number":136,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027))"},{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_75ec7c8f","line":137,"in_reply_to":"bae84128_6c895d26","updated":"2016-02-22 16:03:34.000000000","message":"actually, Protocol_id has a complex PK, so it would be hard to create a straighforward FK. I\u0027d say I am okay with a \u0027dangling\u0027 protocol_id without any references, but add a doc WHY we cannot do anything better AND change the code (as a part of this patch or bp) that would delete FederatedUser object upon Protocol deletion.","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b49e58e23757fe9bf780cf273b1c41cbffe429e8","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                             sql.ForeignKey(\u0027identity.id\u0027))"},{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"},{"line_number":136,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027))"},{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_6c895d26","line":137,"in_reply_to":"bae84128_b6b49cf2","updated":"2016-02-22 14:57:37.000000000","message":"Not clear about this, the federation_protocol table has an id, idp_id, and mapping_id.  Will research further...","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a7c4c9e47e93048fb5e01f25d608083d76c9f150","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"},{"line_number":136,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027))"},{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_3c319c0c","line":138,"updated":"2016-02-19 15:54:40.000000000","message":"unique_id across all user ids (including LocalUser\u0027s) ?","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"13d01027d3bfad89adc1e789f7e6335b86131f26","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"},{"line_number":136,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027))"},{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_f5eeccb2","line":138,"in_reply_to":"bae84128_16c62867","updated":"2016-02-22 16:03:34.000000000","message":"++","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bda8c3361eecc9a385d373d770e8652062ebcab","unresolved":false,"context_lines":[{"line_number":135,"context_line":"    idp_id \u003d sql.Column(sql.String(64),"},{"line_number":136,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027))"},{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"},{"line_number":141,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_16c62867","line":138,"in_reply_to":"bae84128_3c319c0c","updated":"2016-02-19 19:50:28.000000000","message":"No, just as claimed by the mapping engine for this IdP + Protocol pair.","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a7c4c9e47e93048fb5e01f25d608083d76c9f150","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class Group(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_8f37cce2","line":140,"updated":"2016-02-19 15:54:40.000000000","message":"makes sense, but keep in mind that unique_id will not be usable in user_id in token for instance. You would loose information then.","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"b49e58e23757fe9bf780cf273b1c41cbffe429e8","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class Group(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_2cf3d5d7","line":140,"in_reply_to":"bae84128_16746833","updated":"2016-02-22 14:57:37.000000000","message":"Why should it result in 2 users, it\u0027s the same user.  I wondering now if we even need the protocol_id?","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"13d01027d3bfad89adc1e789f7e6335b86131f26","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class Group(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_15225000","line":140,"in_reply_to":"bae84128_2cf3d5d7","updated":"2016-02-22 16:03:34.000000000","message":"Dolph: idp_id + protocol+id + protocol_id ++\nRon: If you are using same e-mail address in two trusted IdPs you may end up with unique_id equal to same email address. But coming from more than one IdP means there are two users.","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bda8c3361eecc9a385d373d770e8652062ebcab","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    protocol_id \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":138,"context_line":"    unique_id \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":139,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":140,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027idp_id\u0027, \u0027unique_id\u0027), {})"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"class Group(sql.ModelBase, sql.DictBase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_16746833","line":140,"in_reply_to":"bae84128_8f37cce2","updated":"2016-02-19 19:50:28.000000000","message":"Marek: correct.\n\nI also think this needs to be expanded to idp_id + protocol_id + unique_id, as the same IdP might return the same unique ID via two different protocols, and that should result in two different users (prior to account linking in Newton).","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ad5675dca828a59e728d2a7ade0201784e7acbf6","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from sqlalchemy import and_"},{"line_number":16,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":17,"context_line":"from sqlalchemy import ForeignKeyConstraint"},{"line_number":18,"context_line":"from sqlalchemy import orm"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.common import driver_hints"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_0ed94557","line":17,"range":{"start_line":17,"start_character":23,"end_line":17,"end_character":43},"updated":"2016-02-24 06:13:38.000000000","message":"nit: hacking rules say don\u0027t import classes","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a318b913ff30c70aa11328cb7451e00d306d536f","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from sqlalchemy import and_"},{"line_number":16,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":17,"context_line":"from sqlalchemy import ForeignKeyConstraint"},{"line_number":18,"context_line":"from sqlalchemy import orm"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.common import driver_hints"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_10081e27","line":17,"range":{"start_line":17,"start_character":23,"end_line":17,"end_character":43},"in_reply_to":"bae84128_0ed94557","updated":"2016-02-24 15:34:53.000000000","message":"Oops, missed this. Thanks. Done.","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"8a83fed1b14cda3c3fc3274787225fb14cc87eca","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from sqlalchemy import and_"},{"line_number":16,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":17,"context_line":"from sqlalchemy import ForeignKeyConstraint"},{"line_number":18,"context_line":"from sqlalchemy import orm"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.common import driver_hints"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_79fd1db0","line":17,"in_reply_to":"bae84128_0ed94557","updated":"2016-02-24 14:46:29.000000000","message":"specifically, it\u0027s \"import only modules\"","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a318b913ff30c70aa11328cb7451e00d306d536f","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from sqlalchemy import and_"},{"line_number":16,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":17,"context_line":"from sqlalchemy import ForeignKeyConstraint"},{"line_number":18,"context_line":"from sqlalchemy import orm"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystone.common import driver_hints"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_f00ada1e","line":17,"in_reply_to":"bae84128_79fd1db0","updated":"2016-02-24 15:34:53.000000000","message":"Done","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ad5675dca828a59e728d2a7ade0201784e7acbf6","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":141,"context_line":"    __table_args__ \u003d ("},{"line_number":142,"context_line":"        sql.UniqueConstraint(\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027),"},{"line_number":143,"context_line":"        ForeignKeyConstraint([\u0027protocol_id\u0027, \u0027idp_id\u0027],"},{"line_number":144,"context_line":"                             [\u0027federation_protocol.id\u0027,"},{"line_number":145,"context_line":"                              \u0027federation_protocol.idp_id\u0027])"},{"line_number":146,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_ee198123","line":143,"range":{"start_line":143,"start_character":8,"end_line":143,"end_character":28},"updated":"2016-02-24 06:13:38.000000000","message":"use sqlalchemy.ForeignKeyConstraint instead of importing the class","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a318b913ff30c70aa11328cb7451e00d306d536f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":141,"context_line":"    __table_args__ \u003d ("},{"line_number":142,"context_line":"        sql.UniqueConstraint(\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027),"},{"line_number":143,"context_line":"        ForeignKeyConstraint([\u0027protocol_id\u0027, \u0027idp_id\u0027],"},{"line_number":144,"context_line":"                             [\u0027federation_protocol.id\u0027,"},{"line_number":145,"context_line":"                              \u0027federation_protocol.idp_id\u0027])"},{"line_number":146,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_3038c2d2","line":143,"range":{"start_line":143,"start_character":8,"end_line":143,"end_character":28},"in_reply_to":"bae84128_ee198123","updated":"2016-02-24 15:34:53.000000000","message":"Done","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ad5675dca828a59e728d2a7ade0201784e7acbf6","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        sql.UniqueConstraint(\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027),"},{"line_number":143,"context_line":"        ForeignKeyConstraint([\u0027protocol_id\u0027, \u0027idp_id\u0027],"},{"line_number":144,"context_line":"                             [\u0027federation_protocol.id\u0027,"},{"line_number":145,"context_line":"                              \u0027federation_protocol.idp_id\u0027])"},{"line_number":146,"context_line":"    )"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_8e93955a","line":145,"range":{"start_line":145,"start_character":31,"end_line":145,"end_character":57},"updated":"2016-02-24 06:13:38.000000000","message":"again, i am wondering why we are using federated_protocol.idp_id instead of identity_provider.id","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a318b913ff30c70aa11328cb7451e00d306d536f","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        sql.UniqueConstraint(\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027),"},{"line_number":143,"context_line":"        ForeignKeyConstraint([\u0027protocol_id\u0027, \u0027idp_id\u0027],"},{"line_number":144,"context_line":"                             [\u0027federation_protocol.id\u0027,"},{"line_number":145,"context_line":"                              \u0027federation_protocol.idp_id\u0027])"},{"line_number":146,"context_line":"    )"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_b00a12d0","line":145,"range":{"start_line":145,"start_character":31,"end_line":145,"end_character":57},"in_reply_to":"bae84128_8e93955a","updated":"2016-02-24 15:34:53.000000000","message":"This table also defines a FK relationship to the identity_provider table (ln 136).  See my previous comments regarding this: 092_add_federated_user_table.py","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"94c63adc897d80ae0d6f8dbdb8e1c8f3ddc48ca3","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    display_name \u003d sql.Column(sql.String(255), nullable\u003dTrue)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sql.UniqueConstraint(\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027),"},{"line_number":147,"context_line":"        sqlalchemy.ForeignKeyConstraint([\u0027protocol_id\u0027, \u0027idp_id\u0027],"},{"line_number":148,"context_line":"                                        [\u0027federation_protocol.id\u0027,"},{"line_number":149,"context_line":"                                         \u0027federation_protocol.idp_id\u0027])"},{"line_number":150,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":45,"id":"9aed3d3a_201a7a7d","line":147,"range":{"start_line":147,"start_character":8,"end_line":147,"end_character":39},"updated":"2016-02-29 19:10:03.000000000","message":"i think we\u0027ve been using the \u0027sql.ForeignKey\u0027 pattern, like on line 174..., but this should work too","commit_id":"6b0e780f0e1db1a8cfdca5b6b496aa05ca40f390"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"08cedc37725688bd514f16adef0ebeb4ed9f52c1","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if self.local_user:"},{"line_number":47,"context_line":"            return self.local_user.name"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            return None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @name.setter"},{"line_number":52,"context_line":"    def name(self, value):"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_13f6658e","line":49,"updated":"2016-02-24 16:27:26.000000000","message":"what if the user is federated and I\u0027d like to get his name? I should call .display_name I think?\nBTW - still don\u0027t get why it\u0027s display_name for federated users.","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"95f387d6402ab8417c8739f2bf22e9f0c51c3a3f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if self.local_user:"},{"line_number":47,"context_line":"            return self.local_user.name"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            return None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @name.setter"},{"line_number":52,"context_line":"    def name(self, value):"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_16adb3e8","line":49,"in_reply_to":"bae84128_13f6658e","updated":"2016-02-24 17:12:11.000000000","message":"Yes, you would use display_name","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"622132aeadf26951d71cc22e360c97787ea27e69","unresolved":false,"context_lines":[{"line_number":243,"context_line":"    def get_user_by_name(self, user_name, domain_id):"},{"line_number":244,"context_line":"        session \u003d sql.get_session()"},{"line_number":245,"context_line":"        query \u003d session.query(User).join(LocalUser)"},{"line_number":246,"context_line":"        query \u003d query.filter(sqlalchemy.and_(LocalUser.name \u003d\u003d user_name,"},{"line_number":247,"context_line":"                                             LocalUser.domain_id \u003d\u003d domain_id))"},{"line_number":248,"context_line":"        try:"},{"line_number":249,"context_line":"            user_ref \u003d query.one()"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_67f8c1c5","line":246,"updated":"2016-02-24 19:53:54.000000000","message":"+1","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f602d0677f53d939151aa2ac357534d2b6560fcf","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if self.local_user:"},{"line_number":47,"context_line":"            return self.local_user.name"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            return None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @name.setter"},{"line_number":52,"context_line":"    def name(self, value):"}],"source_content_type":"text/x-python","patch_set":50,"id":"bae84128_d1220a01","line":49,"updated":"2016-02-25 09:17:08.000000000","message":"In patch 47 you agreed that for federated users one would use display_name attribute yet I don\u0027t see it changed here. Could you explain (in the comment) where display_name should be called? If I don\u0027t know this now people who will code on top of those properties will probably not know either.....","commit_id":"5fed576da8ef834ab4f6695447fe42bf32bf759f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"67a598c574a228b50c0da3b85285dbeb965e6f2f","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        if self.local_user:"},{"line_number":47,"context_line":"            return self.local_user.name"},{"line_number":48,"context_line":"        else:"},{"line_number":49,"context_line":"            return None"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @name.setter"},{"line_number":52,"context_line":"    def name(self, value):"}],"source_content_type":"text/x-python","patch_set":50,"id":"bae84128_9f451619","line":49,"in_reply_to":"bae84128_d1220a01","updated":"2016-02-25 17:55:08.000000000","message":"The display name would not replace, nor is the same thing, as the user.name.  The display_name would only be for a FederatedUser.","commit_id":"5fed576da8ef834ab4f6695447fe42bf32bf759f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import sqlalchemy"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":18,"context_line":"from sqlalchemy import orm"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_08420268","line":16,"updated":"2016-02-29 17:59:06.000000000","message":"no newline needed","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import sqlalchemy"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from sqlalchemy.ext.hybrid import hybrid_property"},{"line_number":18,"context_line":"from sqlalchemy import orm"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_a0c68a97","line":16,"in_reply_to":"9aed3d3a_08420268","updated":"2016-02-29 19:05:37.000000000","message":"Done","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"}],"keystone/identity/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"68730b027b19473dea6643391bb691c81d625ec4","unresolved":false,"context_lines":[{"line_number":1481,"context_line":"        super(ShadowUsers, self).__init__(\u0027sql\u0027)"},{"line_number":1482,"context_line":""},{"line_number":1483,"context_line":""},{"line_number":1484,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1485,"context_line":"class ShadowUsersDriverV8(object):"},{"line_number":1486,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":1487,"context_line":""},{"line_number":1488,"context_line":"    @abc.abstractmethod"},{"line_number":1489,"context_line":"    def get_federated_user(self, idp_id, unique_id):"},{"line_number":1490,"context_line":"        \"\"\"Returns the local user"},{"line_number":1491,"context_line":""},{"line_number":1492,"context_line":"        :param idp_id: The identity provider ID"},{"line_number":1493,"context_line":"        :param unique_id: The unique ID for..."},{"line_number":1494,"context_line":"        :returns dict: Containing the user reference if found..."},{"line_number":1495,"context_line":""},{"line_number":1496,"context_line":"        \"\"\""},{"line_number":1497,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1498,"context_line":""},{"line_number":1499,"context_line":"    @abc.abstractmethod"},{"line_number":1500,"context_line":"    def create_federated_user(self, federated_dict, user_id\u003dNone):"},{"line_number":1501,"context_line":"        \"\"\"Create a new local user with the federated identity"},{"line_number":1502,"context_line":""},{"line_number":1503,"context_line":"        :param dict federated_dict: Reference to the federated identity"},{"line_number":1504,"context_line":"        :param user_id: ..."},{"line_number":1505,"context_line":"        :returns dict: Containing the user reference if found..."},{"line_number":1506,"context_line":""},{"line_number":1507,"context_line":"        \"\"\""},{"line_number":1508,"context_line":"        raise exception.NotImplemented()  # pragma: no cover"},{"line_number":1509,"context_line":""},{"line_number":1510,"context_line":""},{"line_number":1511,"context_line":"ShadowUsersDriver \u003d manager.create_legacy_driver(ShadowUsersDriverV8)"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_900382b8","line":1511,"range":{"start_line":1484,"start_character":0,"end_line":1511,"end_character":69},"updated":"2016-02-14 07:31:28.000000000","message":"we don\u0027t need to create a legacy driver, this is a new driver for v9, so creating a compatibility driver for v8 is not necessary.\n\nwe do however need to create the \"create_federated_user\u0027 and \"get_federated_user\" functions in the ShadowUsers class","commit_id":"0ba849ee940f305063365560b018c40de2505e47"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"9b674511a90b7a09bc70f315dec62138a0383dac","unresolved":false,"context_lines":[{"line_number":1160,"context_line":"        update_dict \u003d {\u0027password\u0027: new_password}"},{"line_number":1161,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1162,"context_line":""},{"line_number":1163,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1164,"context_line":"        user_dict \u003d {}"},{"line_number":1165,"context_line":"        try:"},{"line_number":1166,"context_line":"            user_dict \u003d self.shadow_users_api.get_federated_user("}],"source_content_type":"text/x-python","patch_set":17,"id":"dae33548_e6c58a8e","line":1163,"updated":"2016-02-16 19:19:02.000000000","message":"To make this call cacheable (and it should be @MEMOIZE\u0027d I think), the arguments need to be primitives (not a dict).","commit_id":"4f8b44ea35911241b59cc58144ca358cf5a58b92"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7bda8c3361eecc9a385d373d770e8652062ebcab","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"        update_dict \u003d {\u0027password\u0027: new_password}"},{"line_number":1175,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1178,"context_line":"        user_dict \u003d {}"},{"line_number":1179,"context_line":"        try:"},{"line_number":1180,"context_line":"            user_dict \u003d self.shadow_users_api.get_federated_user("}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_d6a04093","line":1177,"updated":"2016-02-19 19:50:28.000000000","message":"@MEMOIZE this, it\u0027s very cacheable and will get a lot of calls","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"17813b541887ec16e0d22b5aa8b507484852aa42","unresolved":false,"context_lines":[{"line_number":1174,"context_line":"        update_dict \u003d {\u0027password\u0027: new_password}"},{"line_number":1175,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1176,"context_line":""},{"line_number":1177,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1178,"context_line":"        user_dict \u003d {}"},{"line_number":1179,"context_line":"        try:"},{"line_number":1180,"context_line":"            user_dict \u003d self.shadow_users_api.get_federated_user("}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_69522415","line":1177,"in_reply_to":"bae84128_d6a04093","updated":"2016-02-20 12:30:31.000000000","message":"Done","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a7c4c9e47e93048fb5e01f25d608083d76c9f150","unresolved":false,"context_lines":[{"line_number":1515,"context_line":"        \"\"\"Create a new local user with the federated identity"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"        :param dict federated_dict: Reference to the federated identity"},{"line_number":1518,"context_line":"        :param user_id: ..."},{"line_number":1519,"context_line":"        :returns dict: Containing the user reference if found..."},{"line_number":1520,"context_line":""},{"line_number":1521,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"bae84128_8f650ce3","line":1518,"updated":"2016-02-19 15:54:40.000000000","message":"\u0027...\u0027  ?","commit_id":"ae5cd966532b39b000e4f4081cf71fdb35a061d7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ad5675dca828a59e728d2a7ade0201784e7acbf6","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":"    @MEMOIZE"},{"line_number":1213,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1214,"context_line":"        user_dict \u003d {}"},{"line_number":1215,"context_line":"        try:"},{"line_number":1216,"context_line":"            user_dict \u003d self.shadow_users_api.get_federated_user("}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_ce70fd42","line":1213,"range":{"start_line":1213,"start_character":4,"end_line":1213,"end_character":52},"updated":"2016-02-24 06:13:38.000000000","message":"add a docstring here, it\u0027s not clear to me what \"federated_dict\" should be or where it\u0027s coming from. or what the expected return dict should look like","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"050ece7a937141716859169681350b4410c09a26","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":"    @MEMOIZE"},{"line_number":1213,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1214,"context_line":"        user_dict \u003d {}"},{"line_number":1215,"context_line":"        try:"},{"line_number":1216,"context_line":"            user_dict \u003d self.shadow_users_api.get_federated_user("}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_e20de9e8","line":1213,"range":{"start_line":1213,"start_character":4,"end_line":1213,"end_character":52},"in_reply_to":"bae84128_50574657","updated":"2016-02-25 19:30:46.000000000","message":"yes :)","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a318b913ff30c70aa11328cb7451e00d306d536f","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":"    @MEMOIZE"},{"line_number":1213,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1214,"context_line":"        user_dict \u003d {}"},{"line_number":1215,"context_line":"        try:"},{"line_number":1216,"context_line":"            user_dict \u003d self.shadow_users_api.get_federated_user("}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_d04fd668","line":1213,"range":{"start_line":1213,"start_character":4,"end_line":1213,"end_character":52},"in_reply_to":"bae84128_ce70fd42","updated":"2016-02-24 15:34:53.000000000","message":"Done","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"806673d583114c3c98b661ac798c82a7d47611a1","unresolved":false,"context_lines":[{"line_number":1210,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":"    @MEMOIZE"},{"line_number":1213,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1214,"context_line":"        user_dict \u003d {}"},{"line_number":1215,"context_line":"        try:"},{"line_number":1216,"context_line":"            user_dict \u003d self.shadow_users_api.get_federated_user("}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_50574657","line":1213,"range":{"start_line":1213,"start_character":4,"end_line":1213,"end_character":52},"in_reply_to":"bae84128_ce70fd42","updated":"2016-02-24 15:39:42.000000000","message":"is \u0027shadow\u0027 here used as a verb? :-)","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"94c63adc897d80ae0d6f8dbdb8e1c8f3ddc48ca3","unresolved":false,"context_lines":[{"line_number":1540,"context_line":"    driver_namespace \u003d \u0027keystone.identity.shadow_users\u0027"},{"line_number":1541,"context_line":""},{"line_number":1542,"context_line":"    def __init__(self):"},{"line_number":1543,"context_line":"        super(ShadowUsersManager, self).__init__(\u0027sql\u0027)"},{"line_number":1544,"context_line":""},{"line_number":1545,"context_line":""},{"line_number":1546,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":45,"id":"9aed3d3a_c31598e5","line":1543,"range":{"start_line":1543,"start_character":49,"end_line":1543,"end_character":55},"updated":"2016-02-29 19:10:03.000000000","message":"we still need a config option here, it was in an earlier patch","commit_id":"6b0e780f0e1db1a8cfdca5b6b496aa05ca40f390"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"08cedc37725688bd514f16adef0ebeb4ed9f52c1","unresolved":false,"context_lines":[{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":"    @MEMOIZE"},{"line_number":1213,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1214,"context_line":"        \"\"\"Shadows a federatd user by mapping to a user."},{"line_number":1215,"context_line":""},{"line_number":1216,"context_line":"        :param federated_dict: dictionary of FederatedUser attributes"},{"line_number":1217,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_531aadc6","line":1214,"updated":"2016-02-24 16:27:26.000000000","message":"typo.","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"321e7ed540a06d1996cfead03e6caded8f0a4245","unresolved":false,"context_lines":[{"line_number":1211,"context_line":""},{"line_number":1212,"context_line":"    @MEMOIZE"},{"line_number":1213,"context_line":"    def shadow_federated_user(self, federated_dict):"},{"line_number":1214,"context_line":"        \"\"\"Shadows a federatd user by mapping to a user."},{"line_number":1215,"context_line":""},{"line_number":1216,"context_line":"        :param federated_dict: dictionary of FederatedUser attributes"},{"line_number":1217,"context_line":""}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_422e558c","line":1214,"in_reply_to":"bae84128_531aadc6","updated":"2016-02-24 17:21:59.000000000","message":"Done","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"bbce10009776dfdc139f0336df8fe23f44b48171","unresolved":false,"context_lines":[{"line_number":1548,"context_line":"    driver_namespace \u003d \u0027keystone.identity.shadow_users\u0027"},{"line_number":1549,"context_line":""},{"line_number":1550,"context_line":"    def __init__(self):"},{"line_number":1551,"context_line":"        super(ShadowUsersManager, self).__init__(\u0027sql\u0027)"},{"line_number":1552,"context_line":""},{"line_number":1553,"context_line":""},{"line_number":1554,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_61ba56e3","line":1551,"range":{"start_line":1551,"start_character":49,"end_line":1551,"end_character":54},"updated":"2016-02-26 05:50:22.000000000","message":"i think we still want to use a config option for this.. CONF.shadow_users.driver\n\nsimilar to the id_mapping\nhttps://github.com/openstack/keystone/blob/master/keystone/common/config.py#L202-L206","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ab96076aa5eed9a10a948338fd80a37ed0700ddc","unresolved":false,"context_lines":[{"line_number":1548,"context_line":"    driver_namespace \u003d \u0027keystone.identity.shadow_users\u0027"},{"line_number":1549,"context_line":""},{"line_number":1550,"context_line":"    def __init__(self):"},{"line_number":1551,"context_line":"        super(ShadowUsersManager, self).__init__(\u0027sql\u0027)"},{"line_number":1552,"context_line":""},{"line_number":1553,"context_line":""},{"line_number":1554,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_666991be","line":1551,"range":{"start_line":1551,"start_character":49,"end_line":1551,"end_character":54},"in_reply_to":"9aed3d3a_61ba56e3","updated":"2016-02-26 22:51:39.000000000","message":"Done","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"232b76f1392d8055ef4f54c6d057aaafcefc455f","unresolved":false,"context_lines":[{"line_number":1586,"context_line":"        raise exception.NotImplemented()"},{"line_number":1587,"context_line":""},{"line_number":1588,"context_line":"    @abc.abstractmethod"},{"line_number":1589,"context_line":"    def update_federated_user_display_name(self, idp_id, protocol_id,"},{"line_number":1590,"context_line":"                                           unique_id, display_name):"},{"line_number":1591,"context_line":"        \"\"\"Returns the found user for the federated identity"},{"line_number":1592,"context_line":""}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_c1a4c7ba","line":1589,"range":{"start_line":1589,"start_character":8,"end_line":1589,"end_character":42},"updated":"2016-02-26 23:27:45.000000000","message":"is there a reason we have an update now?","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"974b540ec5de10cd7871a1178934e9feec679566","unresolved":false,"context_lines":[{"line_number":1586,"context_line":"        raise exception.NotImplemented()"},{"line_number":1587,"context_line":""},{"line_number":1588,"context_line":"    @abc.abstractmethod"},{"line_number":1589,"context_line":"    def update_federated_user_display_name(self, idp_id, protocol_id,"},{"line_number":1590,"context_line":"                                           unique_id, display_name):"},{"line_number":1591,"context_line":"        \"\"\"Returns the found user for the federated identity"},{"line_number":1592,"context_line":""}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_3785f1ac","line":1589,"range":{"start_line":1589,"start_character":8,"end_line":1589,"end_character":42},"in_reply_to":"9aed3d3a_c1a4c7ba","updated":"2016-02-27 09:58:21.000000000","message":"Dolph suggested this in IRC, so that if the display name changes we are capturing it.","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"232b76f1392d8055ef4f54c6d057aaafcefc455f","unresolved":false,"context_lines":[{"line_number":1588,"context_line":"    @abc.abstractmethod"},{"line_number":1589,"context_line":"    def update_federated_user_display_name(self, idp_id, protocol_id,"},{"line_number":1590,"context_line":"                                           unique_id, display_name):"},{"line_number":1591,"context_line":"        \"\"\"Returns the found user for the federated identity"},{"line_number":1592,"context_line":""},{"line_number":1593,"context_line":"        :param idp_id: The identity provider ID"},{"line_number":1594,"context_line":"        :param protocol_id: The federation protocol ID"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_01b86fe4","line":1591,"range":{"start_line":1591,"start_character":11,"end_line":1591,"end_character":60},"updated":"2016-02-26 23:27:45.000000000","message":"copy pasta","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"974b540ec5de10cd7871a1178934e9feec679566","unresolved":false,"context_lines":[{"line_number":1588,"context_line":"    @abc.abstractmethod"},{"line_number":1589,"context_line":"    def update_federated_user_display_name(self, idp_id, protocol_id,"},{"line_number":1590,"context_line":"                                           unique_id, display_name):"},{"line_number":1591,"context_line":"        \"\"\"Returns the found user for the federated identity"},{"line_number":1592,"context_line":""},{"line_number":1593,"context_line":"        :param idp_id: The identity provider ID"},{"line_number":1594,"context_line":"        :param protocol_id: The federation protocol ID"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_9fa96ae2","line":1591,"range":{"start_line":1591,"start_character":11,"end_line":1591,"end_character":60},"in_reply_to":"9aed3d3a_01b86fe4","updated":"2016-02-27 09:58:21.000000000","message":"Done","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"232b76f1392d8055ef4f54c6d057aaafcefc455f","unresolved":false,"context_lines":[{"line_number":1593,"context_line":"        :param idp_id: The identity provider ID"},{"line_number":1594,"context_line":"        :param protocol_id: The federation protocol ID"},{"line_number":1595,"context_line":"        :param unique_id: The unique ID for the user"},{"line_number":1596,"context_line":"        :returns dict: Containing the user reference"},{"line_number":1597,"context_line":""},{"line_number":1598,"context_line":"        \"\"\""},{"line_number":1599,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_01afcf94","line":1596,"range":{"start_line":1596,"start_character":8,"end_line":1596,"end_character":52},"updated":"2016-02-26 23:27:45.000000000","message":"this doesn\u0027t return anything","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"974b540ec5de10cd7871a1178934e9feec679566","unresolved":false,"context_lines":[{"line_number":1593,"context_line":"        :param idp_id: The identity provider ID"},{"line_number":1594,"context_line":"        :param protocol_id: The federation protocol ID"},{"line_number":1595,"context_line":"        :param unique_id: The unique ID for the user"},{"line_number":1596,"context_line":"        :returns dict: Containing the user reference"},{"line_number":1597,"context_line":""},{"line_number":1598,"context_line":"        \"\"\""},{"line_number":1599,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_dfabf2d4","line":1596,"range":{"start_line":1596,"start_character":8,"end_line":1596,"end_character":52},"in_reply_to":"9aed3d3a_01afcf94","updated":"2016-02-27 09:58:21.000000000","message":"Done","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":1216,"context_line":""},{"line_number":1217,"context_line":"        :param idp_id: identity provider id"},{"line_number":1218,"context_line":"        :param protocol_id: protocol id"},{"line_number":1219,"context_line":"        :param unique_id: unique id for the specified IdP"},{"line_number":1220,"context_line":"        :param display_name: user\u0027s display name"},{"line_number":1221,"context_line":""},{"line_number":1222,"context_line":"        :returns: dictionary of the mapped User entity"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_a3885972","line":1219,"updated":"2016-02-29 17:59:06.000000000","message":"What is the difference between this an idp_id? Below the unique_id is said to be for the user...is this just a copy-pasta issue?","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":1216,"context_line":""},{"line_number":1217,"context_line":"        :param idp_id: identity provider id"},{"line_number":1218,"context_line":"        :param protocol_id: protocol id"},{"line_number":1219,"context_line":"        :param unique_id: unique id for the specified IdP"},{"line_number":1220,"context_line":"        :param display_name: user\u0027s display name"},{"line_number":1221,"context_line":""},{"line_number":1222,"context_line":"        :returns: dictionary of the mapped User entity"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_a0fb2ac0","line":1219,"in_reply_to":"9aed3d3a_a3885972","updated":"2016-02-29 19:05:37.000000000","message":"Essentially, \"idp_id\" is the id for the identity provider.  And \"unique_id\" is the user\u0027s id that is unique within the identity provider.\n\nEdited the doc string.","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":1559,"context_line":""},{"line_number":1560,"context_line":""},{"line_number":1561,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1562,"context_line":"class ShadowUsersDriver(object):"},{"line_number":1563,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":1564,"context_line":""},{"line_number":1565,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_03f14501","line":1562,"updated":"2016-02-29 17:59:06.000000000","message":"You should be versioning your driver. This would be V9. Right now just changing the class name would be enough. Example: http://git.openstack.org/cgit/openstack/keystone/tree/keystone/assignment/core.py#n1616","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e35c4dc4a8b7f44cbd1e9747131e93e409825771","unresolved":false,"context_lines":[{"line_number":1559,"context_line":""},{"line_number":1560,"context_line":""},{"line_number":1561,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1562,"context_line":"class ShadowUsersDriver(object):"},{"line_number":1563,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":1564,"context_line":""},{"line_number":1565,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":65,"id":"9aed3d3a_666c9ad0","line":1562,"updated":"2016-02-29 19:37:01.000000000","message":"Still not versioned","commit_id":"c84e8ba8c106a4e1e66fd574e7e94dc4b982cf3a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"301655c28f3638985f59a75d25a6c9c3f0cbc16d","unresolved":false,"context_lines":[{"line_number":1559,"context_line":""},{"line_number":1560,"context_line":""},{"line_number":1561,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":1562,"context_line":"class ShadowUsersDriver(object):"},{"line_number":1563,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":1564,"context_line":""},{"line_number":1565,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":65,"id":"9aed3d3a_6cdab9e9","line":1562,"in_reply_to":"9aed3d3a_666c9ad0","updated":"2016-02-29 20:16:27.000000000","message":"Done","commit_id":"c84e8ba8c106a4e1e66fd574e7e94dc4b982cf3a"}],"keystone/identity/shadow_backends/sql.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"68730b027b19473dea6643391bb691c81d625ec4","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.common import sql"},{"line_number":16,"context_line":"from keystone import exception"},{"line_number":17,"context_line":"from keystone import identity"},{"line_number":18,"context_line":"from keystone.identity.backends.sql import FederatedIdentity"},{"line_number":19,"context_line":"from keystone.identity.backends.sql import Password"},{"line_number":20,"context_line":"from keystone.identity.backends.sql import User"},{"line_number":21,"context_line":"from keystone.identity.backends.sql import UserIdentity"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ShadowUsers(identity.ShadowUsersDriverV8):"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_f02ace2b","line":21,"range":{"start_line":18,"start_character":43,"end_line":21,"end_character":55},"updated":"2016-02-14 07:31:28.000000000","message":"eek, don\u0027t import class names, just the modules #NoMoreJava","commit_id":"0ba849ee940f305063365560b018c40de2505e47"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"8935e18d4280b1047f77e40c1c77c6bdd48bc3bc","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.common import sql"},{"line_number":16,"context_line":"from keystone import exception"},{"line_number":17,"context_line":"from keystone import identity"},{"line_number":18,"context_line":"from keystone.identity.backends.sql import FederatedIdentity"},{"line_number":19,"context_line":"from keystone.identity.backends.sql import Password"},{"line_number":20,"context_line":"from keystone.identity.backends.sql import User"},{"line_number":21,"context_line":"from keystone.identity.backends.sql import UserIdentity"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ShadowUsers(identity.ShadowUsersDriverV8):"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_4f3b0bec","line":21,"range":{"start_line":18,"start_character":43,"end_line":21,"end_character":55},"in_reply_to":"dae33548_5910fe4e","updated":"2016-02-15 02:22:54.000000000","message":"Ah, I see.  Thanks Steve.","commit_id":"0ba849ee940f305063365560b018c40de2505e47"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"22edd2d369a3775c8ade4bcb8737668ea7b7b593","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.common import sql"},{"line_number":16,"context_line":"from keystone import exception"},{"line_number":17,"context_line":"from keystone import identity"},{"line_number":18,"context_line":"from keystone.identity.backends.sql import FederatedIdentity"},{"line_number":19,"context_line":"from keystone.identity.backends.sql import Password"},{"line_number":20,"context_line":"from keystone.identity.backends.sql import User"},{"line_number":21,"context_line":"from keystone.identity.backends.sql import UserIdentity"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ShadowUsers(identity.ShadowUsersDriverV8):"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_5910fe4e","line":21,"range":{"start_line":18,"start_character":43,"end_line":21,"end_character":55},"in_reply_to":"dae33548_dea514b6","updated":"2016-02-14 19:27:24.000000000","message":"not a dumb question, i should have been more clear with my reasoning. it\u0027s part of the \u0027hacking\u0027 guidelines, it is to create consistency with all openstack projects:\n\nhttp://docs.openstack.org/developer/hacking/#imports\n\"Do not import objects, only modules (*)\"\n\ni think the reasoning is more for consistency than anything else","commit_id":"0ba849ee940f305063365560b018c40de2505e47"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"697084645bedcff622f149f4fa18ccdb9e7ceba1","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from keystone.common import sql"},{"line_number":16,"context_line":"from keystone import exception"},{"line_number":17,"context_line":"from keystone import identity"},{"line_number":18,"context_line":"from keystone.identity.backends.sql import FederatedIdentity"},{"line_number":19,"context_line":"from keystone.identity.backends.sql import Password"},{"line_number":20,"context_line":"from keystone.identity.backends.sql import User"},{"line_number":21,"context_line":"from keystone.identity.backends.sql import UserIdentity"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class ShadowUsers(identity.ShadowUsersDriverV8):"}],"source_content_type":"text/x-python","patch_set":15,"id":"dae33548_dea514b6","line":21,"range":{"start_line":18,"start_character":43,"end_line":21,"end_character":55},"in_reply_to":"dae33548_f02ace2b","updated":"2016-02-14 17:52:25.000000000","message":"This may be a dumb question, but why not?  I don\u0027t need everything in that module, only these classes.  And didn\u0027t want to have to prefix when using the classes, e.g. sql_model.FederatedIdentity...  Is it just to reduce the number of imports from 4 lines to 1?","commit_id":"0ba849ee940f305063365560b018c40de2505e47"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"806673d583114c3c98b661ac798c82a7d47611a1","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class ShadowUsers(identity.ShadowUsersDriver):"},{"line_number":22,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027federated_user\u0027)"},{"line_number":23,"context_line":"    def create_federated_user(self, federated_dict, user_id\u003dNone):"},{"line_number":24,"context_line":"        user \u003d {"},{"line_number":25,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":26,"context_line":"            \u0027enabled\u0027: True"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_301e020c","line":23,"updated":"2016-02-24 15:39:42.000000000","message":"you are not even using user_id in the method body. I think you are even calling this method with federated_dict only?","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a5db99ab78f8e2ca0aa5732df9ebd188d13a7cc1","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class ShadowUsers(identity.ShadowUsersDriver):"},{"line_number":22,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027federated_user\u0027)"},{"line_number":23,"context_line":"    def create_federated_user(self, federated_dict, user_id\u003dNone):"},{"line_number":24,"context_line":"        user \u003d {"},{"line_number":25,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":26,"context_line":"            \u0027enabled\u0027: True"}],"source_content_type":"text/x-python","patch_set":44,"id":"9aed3d3a_fee1f8ff","line":23,"in_reply_to":"bae84128_301e020c","updated":"2016-02-25 19:32:43.000000000","message":"took user_id out","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"806673d583114c3c98b661ac798c82a7d47611a1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            user_ref \u003d query.one()"},{"line_number":46,"context_line":"        except sql.NotFound:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003dunique_id)"},{"line_number":48,"context_line":"        return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":44,"id":"bae84128_f09ada60","line":48,"updated":"2016-02-24 15:39:42.000000000","message":"I am just thinking - is there a way to create another exception like FederatedUserNotFound? My concern is that if you pass unique_id it doesn\u0027t tell you with what {idp,proto} the problem arose.","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a5db99ab78f8e2ca0aa5732df9ebd188d13a7cc1","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            user_ref \u003d query.one()"},{"line_number":46,"context_line":"        except sql.NotFound:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003dunique_id)"},{"line_number":48,"context_line":"        return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":44,"id":"9aed3d3a_be8c9036","line":48,"in_reply_to":"bae84128_f09ada60","updated":"2016-02-25 19:32:43.000000000","message":"I understand your point, but disagree that this needs to change.  Please let me know if you have a strong concern and why.","commit_id":"faf8eeb823eed68262e4e83cd2da60d83c762a8a"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"08cedc37725688bd514f16adef0ebeb4ed9f52c1","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class ShadowUsers(identity.ShadowUsersDriver):"},{"line_number":22,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027federated_user\u0027)"},{"line_number":23,"context_line":"    def create_federated_user(self, federated_dict, user_id\u003dNone):"},{"line_number":24,"context_line":"        user \u003d {"},{"line_number":25,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":26,"context_line":"            \u0027enabled\u0027: True"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_934f1591","line":23,"updated":"2016-02-24 16:27:26.000000000","message":"you are not even using user_id in the method body. I think you are even calling this method with federated_dict only?","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"321e7ed540a06d1996cfead03e6caded8f0a4245","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class ShadowUsers(identity.ShadowUsersDriver):"},{"line_number":22,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027federated_user\u0027)"},{"line_number":23,"context_line":"    def create_federated_user(self, federated_dict, user_id\u003dNone):"},{"line_number":24,"context_line":"        user \u003d {"},{"line_number":25,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":26,"context_line":"            \u0027enabled\u0027: True"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_82797d95","line":23,"in_reply_to":"bae84128_934f1591","updated":"2016-02-24 17:21:59.000000000","message":"yes, this was to allow account linking, out of scope here, so took it out.","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"08cedc37725688bd514f16adef0ebeb4ed9f52c1","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            user_ref \u003d query.one()"},{"line_number":46,"context_line":"        except sql.NotFound:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003dunique_id)"},{"line_number":48,"context_line":"        return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_b365f91e","line":47,"updated":"2016-02-24 16:27:26.000000000","message":"I am just thinking - is there a way to create another exception like FederatedUserNotFound? My concern is that if you pass unique_id it doesn\u0027t tell you with what {idp,proto} the problem arose.","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"321e7ed540a06d1996cfead03e6caded8f0a4245","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            user_ref \u003d query.one()"},{"line_number":46,"context_line":"        except sql.NotFound:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003dunique_id)"},{"line_number":48,"context_line":"        return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":47,"id":"bae84128_425c9518","line":47,"in_reply_to":"bae84128_b365f91e","updated":"2016-02-24 17:21:59.000000000","message":"maybe...","commit_id":"fef801e1a2bdf2ee7838bc5fcd24fdd964745719"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"f602d0677f53d939151aa2ac357534d2b6560fcf","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            user_ref \u003d query.one()"},{"line_number":46,"context_line":"        except sql.NotFound:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003dunique_id)"},{"line_number":48,"context_line":"        return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":50,"id":"bae84128_f153ce6a","line":47,"updated":"2016-02-25 09:17:08.000000000","message":"by passing user_id only you loose information about the user causing the problems.See my comment in 47.","commit_id":"5fed576da8ef834ab4f6695447fe42bf32bf759f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"67a598c574a228b50c0da3b85285dbeb965e6f2f","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            user_ref \u003d query.one()"},{"line_number":46,"context_line":"        except sql.NotFound:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003dunique_id)"},{"line_number":48,"context_line":"        return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":50,"id":"9aed3d3a_b38cd036","line":47,"in_reply_to":"bae84128_f153ce6a","updated":"2016-02-25 17:55:08.000000000","message":"What problems would it cause?  The get_user_name() method does something similar, not passing in the domain_id:\nraise exception.UserNotFound(user_id\u003duser_name)","commit_id":"5fed576da8ef834ab4f6695447fe42bf32bf759f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9aba5d439a9ee9e5497ffc764a574bc3b36ccdbe","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            user_ref \u003d query.one()"},{"line_number":46,"context_line":"        except sql.NotFound:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003dunique_id)"},{"line_number":48,"context_line":"        return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_9df53285","line":47,"range":{"start_line":47,"start_character":41,"end_line":47,"end_character":58},"updated":"2016-02-26 09:18:11.000000000","message":"marek mentioned this already, we probably want to raise the user_id here, since the \"unique_id\" is just a URL safe version of the username.","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ab96076aa5eed9a10a948338fd80a37ed0700ddc","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        try:"},{"line_number":45,"context_line":"            user_ref \u003d query.one()"},{"line_number":46,"context_line":"        except sql.NotFound:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003dunique_id)"},{"line_number":48,"context_line":"        return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":54,"id":"9aed3d3a_e6d00156","line":47,"range":{"start_line":47,"start_character":41,"end_line":47,"end_character":58},"in_reply_to":"9aed3d3a_9df53285","updated":"2016-02-26 22:51:39.000000000","message":"Per our IRC conversation, I\u0027m leaving this as is","commit_id":"5d93258131d5263fef321f95ccb957e80eed0d04"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        with sql.session_for_write() as session:"},{"line_number":29,"context_line":"            federated_ref \u003d model.FederatedUser.from_dict(federated_dict,"},{"line_number":30,"context_line":"                                                          False)"},{"line_number":31,"context_line":"            user_ref \u003d model.User.from_dict(user)"},{"line_number":32,"context_line":"            user_ref.federated_users.append(federated_ref)"},{"line_number":33,"context_line":"            session.add(user_ref)"},{"line_number":34,"context_line":"            return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_43a50da0","line":31,"updated":"2016-02-29 17:59:06.000000000","message":"This is a little odd to me that the federated user will have to create its own parent... not sure what to do about it other than to move the create of the parent up a level","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        with sql.session_for_write() as session:"},{"line_number":29,"context_line":"            federated_ref \u003d model.FederatedUser.from_dict(federated_dict,"},{"line_number":30,"context_line":"                                                          False)"},{"line_number":31,"context_line":"            user_ref \u003d model.User.from_dict(user)"},{"line_number":32,"context_line":"            user_ref.federated_users.append(federated_ref)"},{"line_number":33,"context_line":"            session.add(user_ref)"},{"line_number":34,"context_line":"            return identity.filter_user(user_ref.to_dict())"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_400fbe87","line":31,"in_reply_to":"9aed3d3a_43a50da0","updated":"2016-02-29 19:05:37.000000000","message":"I could change the name, but essentially this method creates a user and maps it to a federated user.","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        user_ref \u003d self._get_federated_user(idp_id, protocol_id, unique_id)"},{"line_number":38,"context_line":"        return identity.filter_user(user_ref.to_dict())"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _get_federated_user(self, idp_id, protocol_id, unique_id):"},{"line_number":41,"context_line":"        with sql.session_for_read() as session:"},{"line_number":42,"context_line":"            query \u003d session.query(model.User).outerjoin(model.LocalUser)"},{"line_number":43,"context_line":"            query \u003d query.join(model.FederatedUser)"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_43d34d04","line":40,"updated":"2016-02-29 17:59:06.000000000","message":"This needs a docstring. Why do you have to do all of the joining here?","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        user_ref \u003d self._get_federated_user(idp_id, protocol_id, unique_id)"},{"line_number":38,"context_line":"        return identity.filter_user(user_ref.to_dict())"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def _get_federated_user(self, idp_id, protocol_id, unique_id):"},{"line_number":41,"context_line":"        with sql.session_for_read() as session:"},{"line_number":42,"context_line":"            query \u003d session.query(model.User).outerjoin(model.LocalUser)"},{"line_number":43,"context_line":"            query \u003d query.join(model.FederatedUser)"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_2301e405","line":40,"in_reply_to":"9aed3d3a_43d34d04","updated":"2016-02-29 19:05:37.000000000","message":"The reason for the joins is that I am returning a \"User\" object which has a relationship to \"LocalUser\" and FederatedUser:\n\nUser -\u003e LocalUser\n     -\u003e FederatedUser","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"}],"keystone/tests/unit/contrib/federation/test_utils.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"232b76f1392d8055ef4f54c6d057aaafcefc455f","unresolved":false,"context_lines":[{"line_number":536,"context_line":"        self.assertEqual(\u0027jsmith\u0027, mapped_properties[\u0027user\u0027][\u0027name\u0027])"},{"line_number":537,"context_line":"        unique_id, display_name \u003d mapped.get_user_unique_id_and_display_name("},{"line_number":538,"context_line":"            {}, mapped_properties)"},{"line_number":539,"context_line":"        self.assertEqual(\u0027jsmith\u0027, unique_id)"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    def test_user_identifications_name_and_federated_domain(self):"},{"line_number":542,"context_line":"        \"\"\"Test varius mapping options and how users are identified."}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_01eb4fb1","line":539,"range":{"start_line":539,"start_character":8,"end_line":539,"end_character":45},"updated":"2016-02-26 23:27:45.000000000","message":"what about the display_name check","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"974b540ec5de10cd7871a1178934e9feec679566","unresolved":false,"context_lines":[{"line_number":536,"context_line":"        self.assertEqual(\u0027jsmith\u0027, mapped_properties[\u0027user\u0027][\u0027name\u0027])"},{"line_number":537,"context_line":"        unique_id, display_name \u003d mapped.get_user_unique_id_and_display_name("},{"line_number":538,"context_line":"            {}, mapped_properties)"},{"line_number":539,"context_line":"        self.assertEqual(\u0027jsmith\u0027, unique_id)"},{"line_number":540,"context_line":""},{"line_number":541,"context_line":"    def test_user_identifications_name_and_federated_domain(self):"},{"line_number":542,"context_line":"        \"\"\"Test varius mapping options and how users are identified."}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_1fb6fa3c","line":539,"range":{"start_line":539,"start_character":8,"end_line":539,"end_character":45},"in_reply_to":"9aed3d3a_01eb4fb1","updated":"2016-02-27 09:58:21.000000000","message":"Done","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"232b76f1392d8055ef4f54c6d057aaafcefc455f","unresolved":false,"context_lines":[{"line_number":581,"context_line":"        self.assertValidMappedUserObject(mapped_properties)"},{"line_number":582,"context_line":"        unique_id, display_name \u003d mapped.get_user_unique_id_and_display_name("},{"line_number":583,"context_line":"            context, mapped_properties)"},{"line_number":584,"context_line":"        self.assertEqual(\u0027bob\u0027, unique_id)"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"    def test_user_identification_id_and_name(self):"},{"line_number":587,"context_line":"        \"\"\"Test varius mapping options and how users are identified."}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_a1c5433d","line":584,"range":{"start_line":584,"start_character":8,"end_line":584,"end_character":42},"updated":"2016-02-26 23:27:45.000000000","message":"what about the display_name check","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"974b540ec5de10cd7871a1178934e9feec679566","unresolved":false,"context_lines":[{"line_number":581,"context_line":"        self.assertValidMappedUserObject(mapped_properties)"},{"line_number":582,"context_line":"        unique_id, display_name \u003d mapped.get_user_unique_id_and_display_name("},{"line_number":583,"context_line":"            context, mapped_properties)"},{"line_number":584,"context_line":"        self.assertEqual(\u0027bob\u0027, unique_id)"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"    def test_user_identification_id_and_name(self):"},{"line_number":587,"context_line":"        \"\"\"Test varius mapping options and how users are identified."}],"source_content_type":"text/x-python","patch_set":58,"id":"9aed3d3a_7f83c656","line":584,"range":{"start_line":584,"start_character":8,"end_line":584,"end_character":42},"in_reply_to":"9aed3d3a_a1c5433d","updated":"2016-02-27 09:58:21.000000000","message":"Done","commit_id":"70dae95dbeebd7627015ad97486e04fc47116bad"}],"keystone/tests/unit/core.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2fa90e1d271b1c72b7e1e6e3ccecc0ce09f6e97f","unresolved":false,"context_lines":[{"line_number":339,"context_line":"def new_federated_identity_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":340,"context_line":"    ref \u003d {"},{"line_number":341,"context_line":"        \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":342,"context_line":"        \u0027idp_id\u0027: uuid.uuid4().hex,"},{"line_number":343,"context_line":"        \u0027protocol_id\u0027: uuid.uuid4().hex,"},{"line_number":344,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":345,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_a713d35b","line":342,"updated":"2016-02-15 10:20:30.000000000","message":"could also be:\n\u0027idp_id\u0027: idp_id or uuid.uuid4().hex,\n[...]\n\u0027protocol_id\u0027: protocol_id or uuid.uuid4().hex","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"ddc7ee8e0fc209f5e1e7db61cdaf1d174c53a60e","unresolved":false,"context_lines":[{"line_number":339,"context_line":"def new_federated_identity_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":340,"context_line":"    ref \u003d {"},{"line_number":341,"context_line":"        \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":342,"context_line":"        \u0027idp_id\u0027: uuid.uuid4().hex,"},{"line_number":343,"context_line":"        \u0027protocol_id\u0027: uuid.uuid4().hex,"},{"line_number":344,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":345,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":16,"id":"9aed3d3a_1ecadca1","line":342,"in_reply_to":"dae33548_a713d35b","updated":"2016-02-25 19:28:49.000000000","message":"see the latest code, I\u0027ve changed this","commit_id":"c68b5ec6ee9f8936dc36eb5592aaba87b91df758"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"622132aeadf26951d71cc22e360c97787ea27e69","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"def new_federated_user_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":344,"context_line":"    ref \u003d {"},{"line_number":345,"context_line":"        \u0027idp_id\u0027: \u0027ORG_IDP\u0027,"},{"line_number":346,"context_line":"        \u0027protocol_id\u0027: \u0027saml2\u0027,"},{"line_number":347,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":348,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_fa474975","line":345,"updated":"2016-02-24 19:53:54.000000000","message":"I\u0027d recommend following the convention in this file like you\u0027re doing, but this could be more simply written as:\n\n  \u0027idp_id\u0027: idp_id or \u0027ORG_IDP\u0027,","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d2d3f8a65a3317d1120caa2ade62e68b26214a9b","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"def new_federated_user_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":344,"context_line":"    ref \u003d {"},{"line_number":345,"context_line":"        \u0027idp_id\u0027: \u0027ORG_IDP\u0027,"},{"line_number":346,"context_line":"        \u0027protocol_id\u0027: \u0027saml2\u0027,"},{"line_number":347,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":348,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_c5626e16","line":345,"in_reply_to":"bae84128_fa474975","updated":"2016-02-25 17:33:10.000000000","message":"Done","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"622132aeadf26951d71cc22e360c97787ea27e69","unresolved":false,"context_lines":[{"line_number":343,"context_line":"def new_federated_user_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":344,"context_line":"    ref \u003d {"},{"line_number":345,"context_line":"        \u0027idp_id\u0027: \u0027ORG_IDP\u0027,"},{"line_number":346,"context_line":"        \u0027protocol_id\u0027: \u0027saml2\u0027,"},{"line_number":347,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":348,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"},{"line_number":349,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_da2fe5a5","line":346,"updated":"2016-02-24 19:53:54.000000000","message":"and:\n\n  \u0027protocol_id\u0027: protocol_id or \u0027saml2\u0027,","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d2d3f8a65a3317d1120caa2ade62e68b26214a9b","unresolved":false,"context_lines":[{"line_number":343,"context_line":"def new_federated_user_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":344,"context_line":"    ref \u003d {"},{"line_number":345,"context_line":"        \u0027idp_id\u0027: \u0027ORG_IDP\u0027,"},{"line_number":346,"context_line":"        \u0027protocol_id\u0027: \u0027saml2\u0027,"},{"line_number":347,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":348,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"},{"line_number":349,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_a5676a24","line":346,"in_reply_to":"bae84128_da2fe5a5","updated":"2016-02-25 17:33:10.000000000","message":"Done","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"622132aeadf26951d71cc22e360c97787ea27e69","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    if idp_id:"},{"line_number":351,"context_line":"        ref[\u0027idp_id\u0027] \u003d idp_id"},{"line_number":352,"context_line":"    if protocol_id:"},{"line_number":353,"context_line":"        ref[\u0027protocol_id\u0027] \u003d protocol_id"},{"line_number":354,"context_line":"    ref.update(kwargs)"},{"line_number":355,"context_line":"    return ref"},{"line_number":356,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_1a3aede7","line":353,"updated":"2016-02-24 19:53:54.000000000","message":"And then skipping the if blocks.","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d2d3f8a65a3317d1120caa2ade62e68b26214a9b","unresolved":false,"context_lines":[{"line_number":350,"context_line":"    if idp_id:"},{"line_number":351,"context_line":"        ref[\u0027idp_id\u0027] \u003d idp_id"},{"line_number":352,"context_line":"    if protocol_id:"},{"line_number":353,"context_line":"        ref[\u0027protocol_id\u0027] \u003d protocol_id"},{"line_number":354,"context_line":"    ref.update(kwargs)"},{"line_number":355,"context_line":"    return ref"},{"line_number":356,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_e57172e2","line":353,"in_reply_to":"bae84128_1a3aede7","updated":"2016-02-25 17:33:10.000000000","message":"Done","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"def new_federated_user_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":344,"context_line":"    ref \u003d {"},{"line_number":345,"context_line":"        \u0027idp_id\u0027: idp_id or \u0027ORG_IDP\u0027,"},{"line_number":346,"context_line":"        \u0027protocol_id\u0027: protocol_id or \u0027saml2\u0027,"},{"line_number":347,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":348,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_6dbc8006","line":345,"updated":"2016-02-29 17:59:06.000000000","message":"Why isn\u0027t this the method default?","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":342,"context_line":""},{"line_number":343,"context_line":"def new_federated_user_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":344,"context_line":"    ref \u003d {"},{"line_number":345,"context_line":"        \u0027idp_id\u0027: idp_id or \u0027ORG_IDP\u0027,"},{"line_number":346,"context_line":"        \u0027protocol_id\u0027: protocol_id or \u0027saml2\u0027,"},{"line_number":347,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":348,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_0354a0fc","line":345,"in_reply_to":"9aed3d3a_6dbc8006","updated":"2016-02-29 19:05:37.000000000","message":"Not following?","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"067b6144bc7a64f1af9428373cdb008a4a90b009","unresolved":false,"context_lines":[{"line_number":343,"context_line":"def new_federated_user_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":344,"context_line":"    ref \u003d {"},{"line_number":345,"context_line":"        \u0027idp_id\u0027: idp_id or \u0027ORG_IDP\u0027,"},{"line_number":346,"context_line":"        \u0027protocol_id\u0027: protocol_id or \u0027saml2\u0027,"},{"line_number":347,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":348,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"},{"line_number":349,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_2d4d583e","line":346,"updated":"2016-02-29 17:59:06.000000000","message":"...or this","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0834851bf2a36e09ddaf7ec3a5e8dccd1ac6cdb9","unresolved":false,"context_lines":[{"line_number":343,"context_line":"def new_federated_user_ref(idp_id\u003dNone, protocol_id\u003dNone, **kwargs):"},{"line_number":344,"context_line":"    ref \u003d {"},{"line_number":345,"context_line":"        \u0027idp_id\u0027: idp_id or \u0027ORG_IDP\u0027,"},{"line_number":346,"context_line":"        \u0027protocol_id\u0027: protocol_id or \u0027saml2\u0027,"},{"line_number":347,"context_line":"        \u0027unique_id\u0027: uuid.uuid4().hex,"},{"line_number":348,"context_line":"        \u0027display_name\u0027: uuid.uuid4().hex,"},{"line_number":349,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":62,"id":"9aed3d3a_e349bc61","line":346,"in_reply_to":"9aed3d3a_2d4d583e","updated":"2016-02-29 19:05:37.000000000","message":"?","commit_id":"5d8c496165c1e89073167a97206c24ddf8a9e70c"}],"keystone/tests/unit/test_backend_sql.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"622132aeadf26951d71cc22e360c97787ea27e69","unresolved":false,"context_lines":[{"line_number":271,"context_line":"            federated_dict[\"idp_id\"],"},{"line_number":272,"context_line":"            federated_dict[\"protocol_id\"],"},{"line_number":273,"context_line":"            federated_dict[\"unique_id\"])"},{"line_number":274,"context_line":"        self.assertItemsEqual(user_dict_create, user_dict_get)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def test_create_project_case_sensitivity(self):"},{"line_number":277,"context_line":"        # project name case sensitivity is down to the fact that it is marked"}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_faebc976","line":274,"updated":"2016-02-24 19:53:54.000000000","message":"Make an assertion about the user ID as well. Perhaps that two get calls return the same ID consistently, and mutating any one of the inputs will return a different user ID.","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d0c478ab57ca27cd1836832791214b76c0c31411","unresolved":false,"context_lines":[{"line_number":271,"context_line":"            federated_dict[\"idp_id\"],"},{"line_number":272,"context_line":"            federated_dict[\"protocol_id\"],"},{"line_number":273,"context_line":"            federated_dict[\"unique_id\"])"},{"line_number":274,"context_line":"        self.assertItemsEqual(user_dict_create, user_dict_get)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def test_create_project_case_sensitivity(self):"},{"line_number":277,"context_line":"        # project name case sensitivity is down to the fact that it is marked"}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_4525bec0","line":274,"in_reply_to":"9aed3d3a_c2b9c4ee","updated":"2016-02-25 17:33:50.000000000","message":"And yeah, that makes sense.  Thanks.","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"89af9b29b2544d11015268edb3b1f6d8d20031a2","unresolved":false,"context_lines":[{"line_number":271,"context_line":"            federated_dict[\"idp_id\"],"},{"line_number":272,"context_line":"            federated_dict[\"protocol_id\"],"},{"line_number":273,"context_line":"            federated_dict[\"unique_id\"])"},{"line_number":274,"context_line":"        self.assertItemsEqual(user_dict_create, user_dict_get)"},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"    def test_create_project_case_sensitivity(self):"},{"line_number":277,"context_line":"        # project name case sensitivity is down to the fact that it is marked"}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_c2b9c4ee","line":274,"in_reply_to":"bae84128_faebc976","updated":"2016-02-25 17:27:45.000000000","message":"Done","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"}],"keystone/tests/unit/test_v3_identity.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"622132aeadf26951d71cc22e360c97787ea27e69","unresolved":false,"context_lines":[{"line_number":487,"context_line":"    def test_shadow_federated_user(self):"},{"line_number":488,"context_line":"        federated_dict \u003d unit.new_federated_user_ref()"},{"line_number":489,"context_line":"        user_dict \u003d self.identity_api.shadow_federated_user(federated_dict)"},{"line_number":490,"context_line":"        self.assertIsNotNone(user_dict[\"id\"])"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    # group crud tests"},{"line_number":493,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_5ac3d58a","line":490,"updated":"2016-02-24 19:53:54.000000000","message":"This is returning 3 other attributes you can test against as well: enabled, domain_id, and name. You should be able to make assertions about their values, and also test that there are no more surprises in the dict with\n\n  self.assertEqual(len(user_dict.keys()), 4)","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"89af9b29b2544d11015268edb3b1f6d8d20031a2","unresolved":false,"context_lines":[{"line_number":487,"context_line":"    def test_shadow_federated_user(self):"},{"line_number":488,"context_line":"        federated_dict \u003d unit.new_federated_user_ref()"},{"line_number":489,"context_line":"        user_dict \u003d self.identity_api.shadow_federated_user(federated_dict)"},{"line_number":490,"context_line":"        self.assertIsNotNone(user_dict[\"id\"])"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    # group crud tests"},{"line_number":493,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_854b4659","line":490,"in_reply_to":"bae84128_5ac3d58a","updated":"2016-02-25 17:27:45.000000000","message":"Done","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"19e7ec0736831a441f42191a79f3d0d7b63dda5c","unresolved":false,"context_lines":[{"line_number":487,"context_line":"    def test_shadow_federated_user(self):"},{"line_number":488,"context_line":"        federated_dict \u003d unit.new_federated_user_ref()"},{"line_number":489,"context_line":"        user_dict \u003d self.identity_api.shadow_federated_user(federated_dict)"},{"line_number":490,"context_line":"        self.assertIsNotNone(user_dict[\"id\"])"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    # group crud tests"},{"line_number":493,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"bae84128_c7342dfd","line":490,"in_reply_to":"bae84128_5ac3d58a","updated":"2016-02-24 19:54:56.000000000","message":"I find it odd that None is returned for name, but nonetheless, this would be an improvement: http://cdn.pasteraw.com/aw9d9gblpzww7qv9qa0vr94u8ufw8bj","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"89af9b29b2544d11015268edb3b1f6d8d20031a2","unresolved":false,"context_lines":[{"line_number":487,"context_line":"    def test_shadow_federated_user(self):"},{"line_number":488,"context_line":"        federated_dict \u003d unit.new_federated_user_ref()"},{"line_number":489,"context_line":"        user_dict \u003d self.identity_api.shadow_federated_user(federated_dict)"},{"line_number":490,"context_line":"        self.assertIsNotNone(user_dict[\"id\"])"},{"line_number":491,"context_line":""},{"line_number":492,"context_line":"    # group crud tests"},{"line_number":493,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"9aed3d3a_6548c25c","line":490,"in_reply_to":"bae84128_c7342dfd","updated":"2016-02-25 17:27:45.000000000","message":"Thanks Dolph!  Done.","commit_id":"9b50c3e99b9ade4c399c76936a1c5c143314cde8"}],"setup.cfg":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e35c4dc4a8b7f44cbd1e9747131e93e409825771","unresolved":false,"context_lines":[{"line_number":125,"context_line":"keystone.identity.id_mapping \u003d"},{"line_number":126,"context_line":"    sql \u003d keystone.identity.mapping_backends.sql:Mapping"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"keystone.identity.shadow_users \u003d"},{"line_number":129,"context_line":"    sql \u003d keystone.identity.shadow_backends.sql:ShadowUsers"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"keystone.policy \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":65,"id":"9aed3d3a_46851605","line":128,"updated":"2016-02-29 19:37:01.000000000","message":"Is there any reason we are not extending the existing driver interface for users?","commit_id":"c84e8ba8c106a4e1e66fd574e7e94dc4b982cf3a"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"301655c28f3638985f59a75d25a6c9c3f0cbc16d","unresolved":false,"context_lines":[{"line_number":125,"context_line":"keystone.identity.id_mapping \u003d"},{"line_number":126,"context_line":"    sql \u003d keystone.identity.mapping_backends.sql:Mapping"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"keystone.identity.shadow_users \u003d"},{"line_number":129,"context_line":"    sql \u003d keystone.identity.shadow_backends.sql:ShadowUsers"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"keystone.policy \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":65,"id":"9aed3d3a_ac72010f","line":128,"in_reply_to":"9aed3d3a_46851605","updated":"2016-02-29 20:16:27.000000000","message":"We discussed this in IRC, let me know if you still have questions.","commit_id":"c84e8ba8c106a4e1e66fd574e7e94dc4b982cf3a"}]}
