)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0d67c8d0f7e7399db9d82474f848310cfba33425","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch creates a new shadow table for mapping non-local"},{"line_number":10,"context_line":"users to local identities. By non-local, I mean non-sql and"},{"line_number":11,"context_line":"non-federated, so essnetially, LDAP and custom driver identities."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"user -\u003e local_user (sql driver)"},{"line_number":14,"context_line":"     -\u003e nonlocal_user (ldap, custom driver)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"bab6814e_d0cf467d","line":11,"updated":"2016-05-19 19:30:53.000000000","message":"*essentially*","commit_id":"a5a30c09d7aed80230c81d9f911a557e44dbdcd2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0d67c8d0f7e7399db9d82474f848310cfba33425","unresolved":false,"context_lines":[{"line_number":14,"context_line":"     -\u003e nonlocal_user (ldap, custom driver)"},{"line_number":15,"context_line":"     -\u003e federated_user"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"One user to rule them all\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"bp shadow-users-newton"},{"line_number":20,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"bab6814e_10ca6e6d","line":17,"updated":"2016-05-19 19:30:53.000000000","message":"this should have been the name of the blueprint :-)","commit_id":"a5a30c09d7aed80230c81d9f911a557e44dbdcd2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cee467f9bf8707e8e99708c97de2b290202ce82c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch creates a new shadow table for mapping non-local"},{"line_number":10,"context_line":"users to local identities. By non-local, I mean non-sql and"},{"line_number":11,"context_line":"non-federated, so essnetially, LDAP and custom driver identities."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"user -\u003e local_user (sql driver)"},{"line_number":14,"context_line":"     -\u003e nonlocal_user (ldap, custom driver)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"bab6814e_66039677","line":11,"updated":"2016-05-24 12:46:51.000000000","message":"essentially*","commit_id":"cdcbef6fa3338d0e786e1546e9aea22300260393"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"1a9c5c12558d54cc70386f3e34e69f8af72d29fd","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch creates a new shadow table for mapping non-local"},{"line_number":10,"context_line":"users to local identities. By non-local, I mean non-sql and"},{"line_number":11,"context_line":"non-federated, so essnetially, LDAP and custom driver identities."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"user -\u003e local_user (sql driver)"},{"line_number":14,"context_line":"     -\u003e nonlocal_user (ldap, custom driver)"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":27,"id":"bab6814e_5bd45646","line":11,"in_reply_to":"bab6814e_66039677","updated":"2016-05-24 17:07:36.000000000","message":"Done","commit_id":"cdcbef6fa3338d0e786e1546e9aea22300260393"}],"keystone/common/sql/migrate_repo/versions/102_add_alt_user_table.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2ec47a9fabd6425fe9880a4b47410f0a5c399977","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    alt_user_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027alt_user\u0027,"},{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), primary_key\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_4b38a93d","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":18},"updated":"2016-04-14 02:53:15.000000000","message":"alt? why not just call it ldap_user_table?","commit_id":"94e53c51c1e6f2562ee6d27dad035ee64b366741"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3b2b464610cc7b8e638b500738907f165529e1b8","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    user_table \u003d sql.Table(\u0027user\u0027, meta, autoload\u003dTrue)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"    alt_user_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027alt_user\u0027,"},{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), primary_key\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_b8a7f1bb","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":18},"in_reply_to":"5a18252c_4b38a93d","updated":"2016-04-14 14:11:10.000000000","message":"The reason why not just ldap_user_table because I\u0027m trying to include ldap and custom drivers, so really any non-sql driver.  Alternatives seemed like an appropriate name.","commit_id":"94e53c51c1e6f2562ee6d27dad035ee64b366741"}],"keystone/common/sql/migrate_repo/versions/103_add_nonlocal_user_table.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"612ada3efe0119f054f32bcfef5583418c5369fd","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    nonlocal_user_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027nonlocal_user\u0027,"},{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":26,"context_line":"        sql.Column(\u0027name\u0027, sql.String(255), primary_key\u003dTrue),"},{"line_number":27,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64),"},{"line_number":28,"context_line":"                   sql.ForeignKey(user_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_0edd0c6f","line":25,"updated":"2016-05-31 16:20:37.000000000","message":"Should this also be an FK?","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"539b97008fcad5cecf5af8966bf3676bc03e8dda","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    nonlocal_user_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027nonlocal_user\u0027,"},{"line_number":24,"context_line":"        meta,"},{"line_number":25,"context_line":"        sql.Column(\u0027domain_id\u0027, sql.String(64), primary_key\u003dTrue),"},{"line_number":26,"context_line":"        sql.Column(\u0027name\u0027, sql.String(255), primary_key\u003dTrue),"},{"line_number":27,"context_line":"        sql.Column(\u0027user_id\u0027, sql.String(64),"},{"line_number":28,"context_line":"                   sql.ForeignKey(user_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_6f93c4fa","line":25,"in_reply_to":"9abb7d3a_0edd0c6f","updated":"2016-06-01 13:14:41.000000000","message":"FK to which table?  I\u0027ve looked and don\u0027t see a table for this.","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"}],"keystone/identity/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2ec47a9fabd6425fe9880a4b47410f0a5c399977","unresolved":false,"context_lines":[{"line_number":821,"context_line":"    @notifications.emit_event(\u0027authenticate\u0027)"},{"line_number":822,"context_line":"    @domains_configured"},{"line_number":823,"context_line":"    @exception_translated(\u0027assertion\u0027)"},{"line_number":824,"context_line":"    def authenticate(self, context, user_id, password):"},{"line_number":825,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":826,"context_line":"            self._get_domain_driver_and_entity_id(user_id))"},{"line_number":827,"context_line":"        ref \u003d driver.authenticate(entity_id, password)"},{"line_number":828,"context_line":"        ref \u003d self._set_domain_id_and_mapping("},{"line_number":829,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":830,"context_line":"        return self._shadow_user(ref)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    @domains_configured"},{"line_number":833,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_0bf51156","line":830,"range":{"start_line":824,"start_character":4,"end_line":830,"end_character":37},"updated":"2016-04-14 02:53:15.000000000","message":"this is used by ldap and sql users, so won\u0027t this shadow the sql users as well?","commit_id":"94e53c51c1e6f2562ee6d27dad035ee64b366741"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3b2b464610cc7b8e638b500738907f165529e1b8","unresolved":false,"context_lines":[{"line_number":821,"context_line":"    @notifications.emit_event(\u0027authenticate\u0027)"},{"line_number":822,"context_line":"    @domains_configured"},{"line_number":823,"context_line":"    @exception_translated(\u0027assertion\u0027)"},{"line_number":824,"context_line":"    def authenticate(self, context, user_id, password):"},{"line_number":825,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":826,"context_line":"            self._get_domain_driver_and_entity_id(user_id))"},{"line_number":827,"context_line":"        ref \u003d driver.authenticate(entity_id, password)"},{"line_number":828,"context_line":"        ref \u003d self._set_domain_id_and_mapping("},{"line_number":829,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":830,"context_line":"        return self._shadow_user(ref)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    @domains_configured"},{"line_number":833,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_d85f4de3","line":830,"range":{"start_line":824,"start_character":4,"end_line":830,"end_character":37},"in_reply_to":"5a18252c_0bf51156","updated":"2016-04-14 14:11:10.000000000","message":"This will shadow all users (ldap, custom drivers...).  Regarding sql users, shadow users first checks if the user exists in the user table; if not, maps them to the appropriate tables.  sql users will already be mapped, so will not be added; thus, not shadowed.","commit_id":"94e53c51c1e6f2562ee6d27dad035ee64b366741"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"08af7f12daa7f4e8e95049d7ec13dd2afcd338d5","unresolved":false,"context_lines":[{"line_number":821,"context_line":"    @notifications.emit_event(\u0027authenticate\u0027)"},{"line_number":822,"context_line":"    @domains_configured"},{"line_number":823,"context_line":"    @exception_translated(\u0027assertion\u0027)"},{"line_number":824,"context_line":"    def authenticate(self, context, user_id, password):"},{"line_number":825,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":826,"context_line":"            self._get_domain_driver_and_entity_id(user_id))"},{"line_number":827,"context_line":"        ref \u003d driver.authenticate(entity_id, password)"},{"line_number":828,"context_line":"        ref \u003d self._set_domain_id_and_mapping("},{"line_number":829,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":830,"context_line":"        return self._shadow_user(ref)"},{"line_number":831,"context_line":""},{"line_number":832,"context_line":"    @domains_configured"},{"line_number":833,"context_line":"    @exception_translated(\u0027user\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_835d6617","line":830,"range":{"start_line":824,"start_character":4,"end_line":830,"end_character":37},"in_reply_to":"5a18252c_d85f4de3","updated":"2016-04-14 14:19:28.000000000","message":"And by shadowing users here in the manager table, I don\u0027t need to know which driver is being used. So I don\u0027t need do:\n\nif is_ldap_driver: do this else: do something else...  \n\nEssentially, the sql driver is ignored (already mapped), so then I just map all other non-local users.","commit_id":"94e53c51c1e6f2562ee6d27dad035ee64b366741"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"86d5c7a4bac9af8d343b66aae8d87398da82acdb","unresolved":false,"context_lines":[{"line_number":1206,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":"    @MEMOIZE"},{"line_number":1209,"context_line":"    def _shadow_user(self, user):"},{"line_number":1210,"context_line":"        try:"},{"line_number":1211,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1212,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":26,"id":"bab6814e_8c73e6e6","line":1209,"range":{"start_line":1209,"start_character":8,"end_line":1209,"end_character":20},"updated":"2016-05-19 21:46:31.000000000","message":"_shadow_non_local_user?","commit_id":"a5a30c09d7aed80230c81d9f911a557e44dbdcd2"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"43281125004c29251ee7ff6040523799a880972f","unresolved":false,"context_lines":[{"line_number":1206,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":"    @MEMOIZE"},{"line_number":1209,"context_line":"    def _shadow_user(self, user):"},{"line_number":1210,"context_line":"        try:"},{"line_number":1211,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1212,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":26,"id":"bab6814e_d08ef82c","line":1209,"range":{"start_line":1209,"start_character":8,"end_line":1209,"end_character":20},"in_reply_to":"bab6814e_8c73e6e6","updated":"2016-05-20 14:32:54.000000000","message":"++","commit_id":"a5a30c09d7aed80230c81d9f911a557e44dbdcd2"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"c101baae7e46cf31ec681cc7bd0ec2446d17a174","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_f54b6329","line":1230,"range":{"start_line":1230,"start_character":8,"end_line":1230,"end_character":20},"updated":"2016-05-25 14:15:59.000000000","message":"suggest renaming to _shadow_nonlocal_user()","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e5aaab3e62cb32e1a3de701c2b44b911b9e64c2e","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_17950832","line":1230,"range":{"start_line":1230,"start_character":8,"end_line":1230,"end_character":20},"in_reply_to":"bab6814e_07022f09","updated":"2016-05-26 16:15:36.000000000","message":"Done","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6b07b5eced4d0085694a4c60b9db8caf03330a1b","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_07022f09","line":1230,"range":{"start_line":1230,"start_character":8,"end_line":1230,"end_character":20},"in_reply_to":"bab6814e_f54b6329","updated":"2016-05-25 18:22:07.000000000","message":"++ This was confusing to me too...","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e5aaab3e62cb32e1a3de701c2b44b911b9e64c2e","unresolved":false,"context_lines":[{"line_number":1227,"context_line":"        self.update_user(user_id, update_dict)"},{"line_number":1228,"context_line":""},{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_d770a042","line":1230,"range":{"start_line":1230,"start_character":8,"end_line":1230,"end_character":20},"in_reply_to":"bab6814e_f54b6329","updated":"2016-05-26 16:15:36.000000000","message":"Done","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"43ebfa23306251c2db3b280392166c1b7786c370","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"},{"line_number":1234,"context_line":"            self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1235,"context_line":"        return user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_b55a7b81","line":1232,"range":{"start_line":1232,"start_character":41,"end_line":1232,"end_character":61},"updated":"2016-05-25 16:18:03.000000000","message":"is it possible that if this uses already authenticated via federation, that the user record is found, hence we don\u0027t create a non-local entry? Is that the desired functionality?","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d60e242cc28aa60929a6165664d2d51c6d81fefb","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"},{"line_number":1234,"context_line":"            self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1235,"context_line":"        return user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_ec90b297","line":1232,"range":{"start_line":1232,"start_character":41,"end_line":1232,"end_character":61},"in_reply_to":"bab6814e_36dde714","updated":"2016-05-25 17:59:04.000000000","message":"In the current implementation, the accounts would not be linked.  However, the data model does support account linking, so we could add this in the future.  And while the accounts are not linked, the benefit for Federated users is, that they get a normal user ID; can receive concrete role assignments and are no longer ephemeral.","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e79d7fcfe54be58d9bf0633f9952deca03e84c26","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"},{"line_number":1234,"context_line":"            self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1235,"context_line":"        return user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_36dde714","line":1232,"range":{"start_line":1232,"start_character":41,"end_line":1232,"end_character":61},"in_reply_to":"bab6814e_a0fd113d","updated":"2016-05-25 17:23:08.000000000","message":"so the accounts would be (kindof) linked?","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7c5639254db43bb70ab27b7f87f8d164e2bf806a","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"},{"line_number":1234,"context_line":"            self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1235,"context_line":"        return user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_e0727910","line":1232,"range":{"start_line":1232,"start_character":41,"end_line":1232,"end_character":61},"in_reply_to":"bab6814e_b55a7b81","updated":"2016-05-25 16:43:57.000000000","message":"Currently, a Federated identity and an LDAP identity would have too separate user accounts, as we have not implemented any sort of account linking.  However, the data model does support this (LDAP and Federated identities having the same user account).","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"8e12e4ffd6b41ff516e470d1b541ee7fce2e6095","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"},{"line_number":1234,"context_line":"            self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1235,"context_line":"        return user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_a0fd113d","line":1232,"range":{"start_line":1232,"start_character":41,"end_line":1232,"end_character":61},"in_reply_to":"bab6814e_e0727910","updated":"2016-05-25 16:46:10.000000000","message":"That being said, this code is checking if the user already exists; if so, no need to shadow the user.","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6b07b5eced4d0085694a4c60b9db8caf03330a1b","unresolved":false,"context_lines":[{"line_number":1229,"context_line":"    @MEMOIZE"},{"line_number":1230,"context_line":"    def _shadow_user(self, user):"},{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"},{"line_number":1234,"context_line":"            self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1235,"context_line":"        return user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_c75dc716","line":1232,"range":{"start_line":1232,"start_character":41,"end_line":1232,"end_character":61},"in_reply_to":"bab6814e_ec90b297","updated":"2016-05-25 18:22:07.000000000","message":"Ah, I guess my error in thinking was not realising that the user[\u0027id\u0027] here CANNOT be the same as the userID given to a federated user, since the (nonlocal) userId being returned here is not the ID from, say, LDAP, but the keystone generated one?","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"612ada3efe0119f054f32bcfef5583418c5369fd","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"},{"line_number":1234,"context_line":"            self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1235,"context_line":"        return user"},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":"    @MEMOIZE"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_ee8088f9","line":1234,"updated":"2016-05-31 16:20:37.000000000","message":"Why is this not returning the return value here?","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"539b97008fcad5cecf5af8966bf3676bc03e8dda","unresolved":false,"context_lines":[{"line_number":1231,"context_line":"        try:"},{"line_number":1232,"context_line":"            return self.shadow_users_api.get_user(user[\u0027id\u0027])"},{"line_number":1233,"context_line":"        except exception.UserNotFound:"},{"line_number":1234,"context_line":"            self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1235,"context_line":"        return user"},{"line_number":1236,"context_line":""},{"line_number":1237,"context_line":"    @MEMOIZE"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_ca0bbe22","line":1234,"in_reply_to":"9abb7d3a_ee8088f9","updated":"2016-06-01 13:14:41.000000000","message":"Was returning the original object in order to support the legacy driver.  However, in the latest patch, I\u0027ve decided to deprecate the backend driver for shadow users.  Therefore, I\u0027ll change this to return the value.","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"}],"keystone/identity/shadow_backends/base.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2ec47a9fabd6425fe9880a4b47410f0a5c399977","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        \"\"\"Create a new user with the federated identity"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param dict federated_dict: Reference to the federated user"},{"line_number":31,"context_line":"        :param user_id: user ID for linking to the federated identity"},{"line_number":32,"context_line":"        :returns dict: Containing the user reference"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_8b8801c7","side":"PARENT","line":31,"range":{"start_line":31,"start_character":8,"end_line":31,"end_character":69},"updated":"2016-04-14 02:53:15.000000000","message":"put this in another commit","commit_id":"86415f09acb88088a10c2b57866aa84f09007047"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"2ec47a9fabd6425fe9880a4b47410f0a5c399977","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":23,"context_line":"class ShadowUsersDriverV9(object):"},{"line_number":24,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_6b9da509","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":25},"updated":"2016-04-14 02:53:15.000000000","message":"i think we\u0027ll need a V10 driver...","commit_id":"94e53c51c1e6f2562ee6d27dad035ee64b366741"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"cda3800cd8ba320ca8ff0589f4e017b8e1d9f179","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":23,"context_line":"class ShadowUsersDriverV9(object):"},{"line_number":24,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_f5c7af95","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":25},"in_reply_to":"5a18252c_6b9da509","updated":"2016-04-14 15:01:16.000000000","message":"Do I need a version 10 if I\u0027m not breaking the old interface?  I\u0027m just adding new methods here.","commit_id":"94e53c51c1e6f2562ee6d27dad035ee64b366741"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"43ebfa23306251c2db3b280392166c1b7786c370","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"},{"line_number":27,"context_line":"    def get_user(self, user_id):"},{"line_number":28,"context_line":"        \"\"\"Return the found user."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param user_id: Identity of the user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_4b128bb5","line":27,"updated":"2016-05-25 16:18:03.000000000","message":"I think we do need a V10 shadow driver interface - since we need to support running the new manager against an existing custom shadow user driver. The wrapper for this would decide what to do with the get_user and create_nonlocal_user calls.","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e5aaab3e62cb32e1a3de701c2b44b911b9e64c2e","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"},{"line_number":27,"context_line":"    def get_user(self, user_id):"},{"line_number":28,"context_line":"        \"\"\"Return the found user."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param user_id: Identity of the user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_97a1f896","line":27,"in_reply_to":"bab6814e_4b128bb5","updated":"2016-05-26 16:15:36.000000000","message":"Done","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"a41e7d43715a3e8bcd5989a16f92a4ab21e5a0d7","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"},{"line_number":27,"context_line":"    def get_user(self, user_id):"},{"line_number":28,"context_line":"        \"\"\"Return the found user."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param user_id: Identity of the user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_736e61ca","line":27,"in_reply_to":"bab6814e_4b128bb5","updated":"2016-05-25 16:50:01.000000000","message":"Why, the existing methods haven\u0027t changed.  What is your concern here?  Thanks.","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"e79d7fcfe54be58d9bf0633f9952deca03e84c26","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"},{"line_number":27,"context_line":"    def get_user(self, user_id):"},{"line_number":28,"context_line":"        \"\"\"Return the found user."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param user_id: Identity of the user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_760c8f94","line":27,"in_reply_to":"bab6814e_736e61ca","updated":"2016-05-25 17:23:08.000000000","message":"So the concern is:\n- some has created a customer shadow user driver based on the Mitaka code\n- we have committee that they can continue to use this driver for 2 cycles\n- they upgrade to Newton...and use their driver...\n- won\u0027t the manager now go bang!\n- If so, then that\u0027s what the wrapper is for - to fake up any new methods so that they either are silent, or fake the new functionality in a non-perfmant way...etc....basically so the new manager doesn\u0027t have to have knowledge of older drivers....","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"68ba4b58d603ac2fa1fe5dc4c70ca82c828145be","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @abc.abstractmethod"},{"line_number":27,"context_line":"    def get_user(self, user_id):"},{"line_number":28,"context_line":"        \"\"\"Return the found user."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param user_id: Identity of the user"}],"source_content_type":"text/x-python","patch_set":29,"id":"bab6814e_111b8d81","line":27,"in_reply_to":"bab6814e_760c8f94","updated":"2016-05-25 17:54:50.000000000","message":"Ah, that makes sense.  In hindsight, I should have never made ShadowUsers a driver to be customized.  Just one of those things that would only exist in the database.  Anyway...  Good catch, I\u0027ll make the change.  Thanks.","commit_id":"ad568868d0d9178ade1a8b319960d424ab5d5697"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"9a6dfb5104d6207dedc734af0ee6487570e29363","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                                                              unique_id,"},{"line_number":120,"context_line":"                                                              display_name)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_user(self, user_id):"},{"line_number":123,"context_line":"        raise exception.NotImplemented()"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def create_nonlocal_user(self, user_dict):"},{"line_number":126,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":31,"id":"bab6814e_a94f7c32","line":126,"range":{"start_line":122,"start_character":8,"end_line":126,"end_character":40},"updated":"2016-05-26 19:01:26.000000000","message":"won\u0027t issuing NotImplemented cause authenticate to fail? To really support a driver version change, you need to add to the tox legacy_driver target, copy the old sql driver to tests/unit/backend/legacy_drivers/identity or and add a test case which runs the the tests with the old legacy driver plugged in...","commit_id":"0d711219f02edddd2accb0a0fe24f2a71912102c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"abedad849911cf56abd2eefafc3f5c80b5394f69","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                                                              unique_id,"},{"line_number":120,"context_line":"                                                              display_name)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def get_user(self, user_id):"},{"line_number":123,"context_line":"        raise exception.NotImplemented()"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def create_nonlocal_user(self, user_dict):"},{"line_number":126,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":31,"id":"bab6814e_5f231ebd","line":126,"range":{"start_line":122,"start_character":8,"end_line":126,"end_character":40},"in_reply_to":"bab6814e_a94f7c32","updated":"2016-05-26 20:11:37.000000000","message":"Okay, I\u0027ve modified the methods so that authentication won\u0027t fail.  Regarding running the tests with the old driver, unfortunately new shadow users tests would still fail; I\u0027d have to separate them out. And to be honest, I\u0027m not so happy with this approach. I\u0027m hoping this will be good enough for now for shadow users.","commit_id":"0d711219f02edddd2accb0a0fe24f2a71912102c"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"612ada3efe0119f054f32bcfef5583418c5369fd","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class V10ShadowUsersWrapperForV9Driver(ShadowUsersDriverV10):"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @versionutils.deprecated("},{"line_number":100,"context_line":"        versionutils.deprecated.NEWTON,"},{"line_number":101,"context_line":"        what\u003d\u0027keystone.identity.shadow_backends.base.ShadowUsersDriverV9\u0027,"},{"line_number":102,"context_line":"        in_favor_of\u003d("}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_ee0a4878","line":99,"updated":"2016-05-31 16:20:37.000000000","message":"Do we need to do this here and on the V9 class? Seems redundant.","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"539b97008fcad5cecf5af8966bf3676bc03e8dda","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":"class V10ShadowUsersWrapperForV9Driver(ShadowUsersDriverV10):"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    @versionutils.deprecated("},{"line_number":100,"context_line":"        versionutils.deprecated.NEWTON,"},{"line_number":101,"context_line":"        what\u003d\u0027keystone.identity.shadow_backends.base.ShadowUsersDriverV9\u0027,"},{"line_number":102,"context_line":"        in_favor_of\u003d("}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_2afd2ab4","line":99,"in_reply_to":"9abb7d3a_ee0a4878","updated":"2016-06-01 13:14:41.000000000","message":"Rather than continuing down this path of creating a legacy driver, I\u0027ve decided to deprecate the backend driver instead. I think it was a mistake (my mistake) to add a backend driver for shadow users. There is minimal benefit, if any, for operators to create a custom shadow users driver.","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"612ada3efe0119f054f32bcfef5583418c5369fd","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    def __init__(self, wrapped_driver):"},{"line_number":106,"context_line":"        self.driver \u003d wrapped_driver"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"    def create_federated_user(self, federated_dict):"},{"line_number":109,"context_line":"        return self.driver.create_federated_user(federated_dict)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def get_federated_user(self, idp_id, protocol_id, unique_id):"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_6e4db8c3","line":108,"updated":"2016-05-31 16:20:37.000000000","message":"wasn\u0027t this already part of V9?","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"612ada3efe0119f054f32bcfef5583418c5369fd","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    def create_federated_user(self, federated_dict):"},{"line_number":109,"context_line":"        return self.driver.create_federated_user(federated_dict)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"    def get_federated_user(self, idp_id, protocol_id, unique_id):"},{"line_number":112,"context_line":"        return self.driver.get_federated_user(idp_id, protocol_id,"},{"line_number":113,"context_line":"                                              unique_id)"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_eee6c8ae","line":111,"updated":"2016-05-31 16:20:37.000000000","message":"...and this?","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"612ada3efe0119f054f32bcfef5583418c5369fd","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        return self.driver.get_federated_user(idp_id, protocol_id,"},{"line_number":113,"context_line":"                                              unique_id)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"    def update_federated_user_display_name(self, idp_id, protocol_id,"},{"line_number":116,"context_line":"                                           unique_id, display_name):"},{"line_number":117,"context_line":"        return self.driver.update_federated_user_display_name(idp_id,"},{"line_number":118,"context_line":"                                                              protocol_id,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_c9b3fee7","line":115,"updated":"2016-05-31 16:20:37.000000000","message":"...and this?","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"612ada3efe0119f054f32bcfef5583418c5369fd","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        raise exception.UserNotFound(user_id\u003duser_id)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def create_nonlocal_user(self, user_dict):"},{"line_number":126,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_c9013e6c","line":126,"updated":"2016-05-31 16:20:37.000000000","message":"I\u0027m not sure about these last two implementations. Won\u0027t V9 drivers fail to authenticate correctly since create_nonlocal_user doesn\u0027t return anything and the user ref is expected to be returned?","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"539b97008fcad5cecf5af8966bf3676bc03e8dda","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        raise exception.UserNotFound(user_id\u003duser_id)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    def create_nonlocal_user(self, user_dict):"},{"line_number":126,"context_line":"        return"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_3f2bd895","line":126,"in_reply_to":"9abb7d3a_c9013e6c","updated":"2016-06-01 13:14:41.000000000","message":"No, shadow user returns the original authenticated user, so that I can \"fake\" this out.  That being said, I\u0027m not happy about this whole approach of how we handle driver versions and will probably do something different here.","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"}],"keystone/identity/shadow_backends/sql.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"0d67c8d0f7e7399db9d82474f848310cfba33425","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            user_ref \u003d self._get_user(session, user_id)"},{"line_number":48,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _get_user(self, session, user_id):"},{"line_number":51,"context_line":"        user_ref \u003d session.query(model.User).get(user_id)"},{"line_number":52,"context_line":"        if not user_ref:"},{"line_number":53,"context_line":"            raise exception.UserNotFound(user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":26,"id":"bab6814e_501356b8","line":50,"updated":"2016-05-19 19:30:53.000000000","message":"Is the plan to reuse this?","commit_id":"a5a30c09d7aed80230c81d9f911a557e44dbdcd2"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4ce2a92471ec69ae73774979aef5c49d09fc55ee","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            user_ref \u003d self._get_user(session, user_id)"},{"line_number":48,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def _get_user(self, session, user_id):"},{"line_number":51,"context_line":"        user_ref \u003d session.query(model.User).get(user_id)"},{"line_number":52,"context_line":"        if not user_ref:"},{"line_number":53,"context_line":"            raise exception.UserNotFound(user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":26,"id":"bab6814e_e9feddac","line":50,"in_reply_to":"bab6814e_501356b8","updated":"2016-05-20 00:19:30.000000000","message":"Yeah, I often find that I need the User object; not the dictionary for testing.","commit_id":"a5a30c09d7aed80230c81d9f911a557e44dbdcd2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"cee467f9bf8707e8e99708c97de2b290202ce82c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def create_nonlocal_user(self, user_dict):"},{"line_number":25,"context_line":"        new_user_dict \u003d {}"},{"line_number":26,"context_line":"        new_user_dict[\u0027id\u0027] \u003d user_dict[\u0027id\u0027]"},{"line_number":27,"context_line":"        new_user_dict[\u0027enabled\u0027] \u003d user_dict[\u0027enabled\u0027]"},{"line_number":28,"context_line":"        if \u0027extra\u0027 in user_dict:"},{"line_number":29,"context_line":"            new_user_dict[\u0027extra\u0027] \u003d user_dict[\u0027extra\u0027]"},{"line_number":30,"context_line":"        if \u0027default_project_id\u0027 in user_dict:"}],"source_content_type":"text/x-python","patch_set":27,"id":"bab6814e_81ce64b2","line":27,"updated":"2016-05-24 12:46:51.000000000","message":"It looks like new_user_dict uses pretty much the same keys that user_dict does. Would it make sense to just have it be a copy? \n\n    import copy\n    ... \n\n    def create_nonlocal_user(self, user_dict):\n        new_user_dict \u003d copy.copy(user_dict)\n        new_nonlocal_user_dict \u003d {\n            \u0027domain_id\u0027: user_dict[\u0027domain_id\u0027],\n            \u0027name\u0027: user_dict[\u0027name\u0027]\n        }\n        with sql.session_for_write() as session:\n            ...","commit_id":"cdcbef6fa3338d0e786e1546e9aea22300260393"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"21b697bb5e49722b0a6cc067a79e716b7d00c7c9","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def create_nonlocal_user(self, user_dict):"},{"line_number":25,"context_line":"        new_user_dict \u003d {}"},{"line_number":26,"context_line":"        new_user_dict[\u0027id\u0027] \u003d user_dict[\u0027id\u0027]"},{"line_number":27,"context_line":"        new_user_dict[\u0027enabled\u0027] \u003d user_dict[\u0027enabled\u0027]"},{"line_number":28,"context_line":"        if \u0027extra\u0027 in user_dict:"},{"line_number":29,"context_line":"            new_user_dict[\u0027extra\u0027] \u003d user_dict[\u0027extra\u0027]"},{"line_number":30,"context_line":"        if \u0027default_project_id\u0027 in user_dict:"}],"source_content_type":"text/x-python","patch_set":27,"id":"bab6814e_7b367ab5","line":27,"in_reply_to":"bab6814e_81ce64b2","updated":"2016-05-24 17:07:46.000000000","message":"Done","commit_id":"cdcbef6fa3338d0e786e1546e9aea22300260393"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"1a9c5c12558d54cc70386f3e34e69f8af72d29fd","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def create_nonlocal_user(self, user_dict):"},{"line_number":25,"context_line":"        new_user_dict \u003d {}"},{"line_number":26,"context_line":"        new_user_dict[\u0027id\u0027] \u003d user_dict[\u0027id\u0027]"},{"line_number":27,"context_line":"        new_user_dict[\u0027enabled\u0027] \u003d user_dict[\u0027enabled\u0027]"},{"line_number":28,"context_line":"        if \u0027extra\u0027 in user_dict:"},{"line_number":29,"context_line":"            new_user_dict[\u0027extra\u0027] \u003d user_dict[\u0027extra\u0027]"},{"line_number":30,"context_line":"        if \u0027default_project_id\u0027 in user_dict:"}],"source_content_type":"text/x-python","patch_set":27,"id":"bab6814e_3bbeb2ff","line":27,"in_reply_to":"bab6814e_81ce64b2","updated":"2016-05-24 17:07:36.000000000","message":"Good suggestion, thanks.","commit_id":"cdcbef6fa3338d0e786e1546e9aea22300260393"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"612ada3efe0119f054f32bcfef5583418c5369fd","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            user_ref \u003d self._get_user(session, user_id)"},{"line_number":42,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _get_user(self, session, user_id):"},{"line_number":45,"context_line":"        user_ref \u003d session.query(model.User).get(user_id)"},{"line_number":46,"context_line":"        if not user_ref:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_896a96ec","line":44,"updated":"2016-05-31 16:20:37.000000000","message":"Is there any reason why this is broken out?","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"539b97008fcad5cecf5af8966bf3676bc03e8dda","unresolved":false,"context_lines":[{"line_number":41,"context_line":"            user_ref \u003d self._get_user(session, user_id)"},{"line_number":42,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _get_user(self, session, user_id):"},{"line_number":45,"context_line":"        user_ref \u003d session.query(model.User).get(user_id)"},{"line_number":46,"context_line":"        if not user_ref:"},{"line_number":47,"context_line":"            raise exception.UserNotFound(user_id\u003duser_id)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9abb7d3a_45c34157","line":44,"in_reply_to":"9abb7d3a_896a96ec","updated":"2016-06-01 13:14:41.000000000","message":"In other backends, I\u0027ve found that it can be useful to get the object back, especially for unit tests, so I think I just automatically broke this out in case I needed it.","commit_id":"5d3c18f3dd6b6f3f3a1b37d4cf854b7e4f57c9b7"}]}
