)]}'
{"keystone/common/sql/migrate_repo/versions/103_add_nonlocal_user_table.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"921d1cdc24cc947ca5468349a879d54375d2b1b8","unresolved":false,"context_lines":[{"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),"},{"line_number":29,"context_line":"                   nullable\u003dFalse))"},{"line_number":30,"context_line":"    nonlocal_user_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9abb7d3a_1e080891","line":29,"updated":"2016-06-02 20:38:38.000000000","message":"I assume we still have to explicitly set the engine and charset for platforms with defaults that are not openstack-friendly?\n\n  mysql_engine\u003d\u0027InnoDB\u0027,                                                                                             \n  mysql_charset\u003d\u0027utf8\u0027,","commit_id":"295d6b961a7e287f1c6f7138648ce64a4630cfcc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9ba04ff8d093e83d9db538b9bd5ffc9e19fb8294","unresolved":false,"context_lines":[{"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),"},{"line_number":29,"context_line":"                   nullable\u003dFalse))"},{"line_number":30,"context_line":"    nonlocal_user_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9abb7d3a_7d4e7997","line":29,"in_reply_to":"9abb7d3a_1e080891","updated":"2016-06-02 21:16:49.000000000","message":"Done","commit_id":"295d6b961a7e287f1c6f7138648ce64a4630cfcc"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"93c39573499cbf56d8440f7a258a9f25581103cb","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":7,"id":"7aa08908_fd25da08","line":25,"range":{"start_line":25,"start_character":20,"end_line":25,"end_character":29},"updated":"2016-06-08 01:22:42.000000000","message":"wouldn\u0027t this be a foreign key to the domain table?","commit_id":"5e34a983b1557e655a13d2d09009c67a2ca31567"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d292e0bc9f52a32ed426998169fbe1e44e29e3d2","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":7,"id":"7aa08908_906a9fb1","line":25,"range":{"start_line":25,"start_character":20,"end_line":25,"end_character":29},"in_reply_to":"7aa08908_fd25da08","updated":"2016-06-08 10:31:46.000000000","message":"What domain table?","commit_id":"5e34a983b1557e655a13d2d09009c67a2ca31567"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"93c39573499cbf56d8440f7a258a9f25581103cb","unresolved":false,"context_lines":[{"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),"},{"line_number":29,"context_line":"                   nullable\u003dFalse),"},{"line_number":30,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":31,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":32,"context_line":"    nonlocal_user_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_7d80cac0","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":29},"updated":"2016-06-08 01:22:42.000000000","message":"Just out of curiosity, why hardcoding \u0027InnoDB\u0027 here?","commit_id":"5e34a983b1557e655a13d2d09009c67a2ca31567"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d292e0bc9f52a32ed426998169fbe1e44e29e3d2","unresolved":false,"context_lines":[{"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),"},{"line_number":29,"context_line":"                   nullable\u003dFalse),"},{"line_number":30,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":31,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":32,"context_line":"    nonlocal_user_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_d0d9c723","line":30,"range":{"start_line":30,"start_character":8,"end_line":30,"end_character":29},"in_reply_to":"7aa08908_7d80cac0","updated":"2016-06-08 10:31:46.000000000","message":"Was just following example from previous upgrades and to be honest, I\u0027m not sure what this does.  Suggestion?","commit_id":"5e34a983b1557e655a13d2d09009c67a2ca31567"}],"keystone/identity/backends/shadow.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"93c39573499cbf56d8440f7a258a9f25581103cb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#      http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_bd15124a","line":3,"range":{"start_line":3,"start_character":0,"end_line":3,"end_character":1},"updated":"2016-06-08 01:22:42.000000000","message":"Why do we need a separate file shadow.py? Why can\u0027t we stash the code in sql.py?","commit_id":"5e34a983b1557e655a13d2d09009c67a2ca31567"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"d292e0bc9f52a32ed426998169fbe1e44e29e3d2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#      http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":6,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":7,"id":"7aa08908_1097cfec","line":3,"range":{"start_line":3,"start_character":0,"end_line":3,"end_character":1},"in_reply_to":"7aa08908_bd15124a","updated":"2016-06-08 10:31:46.000000000","message":"Because it is used to shadow LDAP and federated users; not used by the sql driver.","commit_id":"5e34a983b1557e655a13d2d09009c67a2ca31567"}],"keystone/identity/shadow_backends/base.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"44251b772dc8f96a1b3b20baee5b290a7c52a686","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    versionutils.deprecated.NEWTON,"},{"line_number":66,"context_line":"    what\u003d\u0027keystone.identity.shadow_backends.base.ShadowUsersDriverV9\u0027,"},{"line_number":67,"context_line":"    in_favor_of\u003d\u0027keystone.identity.shadow_backends.base.ShadowUsersDriverV10\u0027,"},{"line_number":68,"context_line":"    remove_in\u003d+2)"},{"line_number":69,"context_line":"class ShadowUsersDriverV9(ShadowUsersDriverBase):"},{"line_number":70,"context_line":"    pass"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_63dc2f47","line":68,"updated":"2016-06-09 16:18:21.000000000","message":"remove_in\u003d+1?","commit_id":"1c1d60028cca664652f924bf3c77a08a961dc839"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"d45e4d2ea7cbab6a396deb75059cb64cbb8eb250","unresolved":false,"context_lines":[{"line_number":96,"context_line":""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"class V10ShadowUsersWrapperForV9Driver(ShadowUsersDriverV10):"},{"line_number":99,"context_line":"    def __init__(self, wrapped_driver):"},{"line_number":100,"context_line":"        self.driver \u003d wrapped_driver"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def get_user(self, user_id):"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_46b4a1d0","line":99,"updated":"2016-06-09 16:28:23.000000000","message":"I don\u0027t think this is needed.","commit_id":"1c1d60028cca664652f924bf3c77a08a961dc839"}],"keystone/tests/unit/identity/test_backends.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fb2751d4170245c37f024f1a2f781ab86a82fb55","unresolved":false,"context_lines":[{"line_number":1363,"context_line":"class ShadowUsersTests(object):"},{"line_number":1364,"context_line":"    def test_create_nonlocal_user_unique_constraint(self):"},{"line_number":1365,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":1366,"context_line":"        user_created \u003d shadow.ShadowUsers().create_nonlocal_user(user)"},{"line_number":1367,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1368,"context_line":"        self.assertEqual(user_created[\u0027domain_id\u0027], user[\u0027domain_id\u0027])"},{"line_number":1369,"context_line":"        self.assertEqual(user_created[\u0027name\u0027], user[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_eb87885e","line":1366,"updated":"2016-06-01 21:20:53.000000000","message":"Does it make sense to assert that user_created doesn\u0027t have a password or email attribute? Even though those attribute may exist on the user reference, they shouldn\u0027t be persisted in the nonlocal user backend.","commit_id":"e195ff6ba855a036c90b912844450751183d1728"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"74e4b26fee45ade923e580bfdf2ea0ae9a0dbaf0","unresolved":false,"context_lines":[{"line_number":1363,"context_line":"class ShadowUsersTests(object):"},{"line_number":1364,"context_line":"    def test_create_nonlocal_user_unique_constraint(self):"},{"line_number":1365,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":1366,"context_line":"        user_created \u003d shadow.ShadowUsers().create_nonlocal_user(user)"},{"line_number":1367,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1368,"context_line":"        self.assertEqual(user_created[\u0027domain_id\u0027], user[\u0027domain_id\u0027])"},{"line_number":1369,"context_line":"        self.assertEqual(user_created[\u0027name\u0027], user[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_f9b119e1","line":1366,"in_reply_to":"9abb7d3a_eb87885e","updated":"2016-06-02 01:09:02.000000000","message":"Agree with asserting that user_created does not have password. But it will have the email attribute, as this gets put into extra and passed back to the dictionary here:\nhttps://github.com/openstack/keystone/blob/master/keystone/common/sql/core.py#L132","commit_id":"e195ff6ba855a036c90b912844450751183d1728"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fb2751d4170245c37f024f1a2f781ab86a82fb55","unresolved":false,"context_lines":[{"line_number":1378,"context_line":"        user.pop(\u0027email\u0027)"},{"line_number":1379,"context_line":"        user.pop(\u0027password\u0027)"},{"line_number":1380,"context_line":"        user_created \u003d shadow.ShadowUsers().create_nonlocal_user(user)"},{"line_number":1381,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1382,"context_line":"        user_found \u003d shadow.ShadowUsers().get_user(user_created[\u0027id\u0027])"},{"line_number":1383,"context_line":"        self.assertItemsEqual(user_created, user_found)"},{"line_number":1384,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_6bdb987c","line":1381,"updated":"2016-06-01 21:20:53.000000000","message":"nonlocal users can specify their own IDs? This isn\u0027t something that is going to be exposed thought the API is it (keystone should populate the user reference with a uuid before handing the reference to the ShadowUsers API)?","commit_id":"e195ff6ba855a036c90b912844450751183d1728"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"778578f373a9b475410e0253b935d536e4929b58","unresolved":false,"context_lines":[{"line_number":1378,"context_line":"        user.pop(\u0027email\u0027)"},{"line_number":1379,"context_line":"        user.pop(\u0027password\u0027)"},{"line_number":1380,"context_line":"        user_created \u003d shadow.ShadowUsers().create_nonlocal_user(user)"},{"line_number":1381,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1382,"context_line":"        user_found \u003d shadow.ShadowUsers().get_user(user_created[\u0027id\u0027])"},{"line_number":1383,"context_line":"        self.assertItemsEqual(user_created, user_found)"},{"line_number":1384,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_be510edb","line":1381,"in_reply_to":"9abb7d3a_4e87bdb4","updated":"2016-06-02 15:11:23.000000000","message":"So ShadowUsers will support persisting whatever you pass it as the user ID. For users coming from LDAP - the ID that is persisted is the ID that coming from LDAP as well? For some reason I was thinking that the ID of the shadow user would just be some uuid.uuid4().hex string.","commit_id":"e195ff6ba855a036c90b912844450751183d1728"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"4c363ad959b395f04afc4be24767f46630ef0eeb","unresolved":false,"context_lines":[{"line_number":1378,"context_line":"        user.pop(\u0027email\u0027)"},{"line_number":1379,"context_line":"        user.pop(\u0027password\u0027)"},{"line_number":1380,"context_line":"        user_created \u003d shadow.ShadowUsers().create_nonlocal_user(user)"},{"line_number":1381,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1382,"context_line":"        user_found \u003d shadow.ShadowUsers().get_user(user_created[\u0027id\u0027])"},{"line_number":1383,"context_line":"        self.assertItemsEqual(user_created, user_found)"},{"line_number":1384,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_4e87bdb4","line":1381,"in_reply_to":"9abb7d3a_6bdb987c","updated":"2016-06-02 00:37:00.000000000","message":"So we shadow users during authentication, when the user ID has already been defined.  LDAP identities do specify their own user IDs.  And it actually gets a little more complicated as we over-write the IDs for domain specific deployments:\nhttps://github.com/openstack/keystone/blob/master/keystone/identity/core.py#L899 \n\nPlease let me know if that answers your question/concern.","commit_id":"e195ff6ba855a036c90b912844450751183d1728"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"37b89ca7c5a4ed8df6b553ad44c6c6b03f844269","unresolved":false,"context_lines":[{"line_number":1378,"context_line":"        user.pop(\u0027email\u0027)"},{"line_number":1379,"context_line":"        user.pop(\u0027password\u0027)"},{"line_number":1380,"context_line":"        user_created \u003d shadow.ShadowUsers().create_nonlocal_user(user)"},{"line_number":1381,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1382,"context_line":"        user_found \u003d shadow.ShadowUsers().get_user(user_created[\u0027id\u0027])"},{"line_number":1383,"context_line":"        self.assertItemsEqual(user_created, user_found)"},{"line_number":1384,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_b93008ea","line":1381,"in_reply_to":"9abb7d3a_be510edb","updated":"2016-06-02 15:22:13.000000000","message":"Correct, for LDAP drivers, the user_id would come from LDAP.  Ideally, we did want to standardize the user_id, but it would require a data migration and quite a bit of refactoring.  And again, for domain specific deployments, we are overriding the user_id.","commit_id":"e195ff6ba855a036c90b912844450751183d1728"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8e8f27cfe0789b773236121c54afbc2e65b69812","unresolved":false,"context_lines":[{"line_number":1364,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":1365,"context_line":"        user_created \u003d self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1366,"context_line":"        self.assertNotIn(\u0027password\u0027, user_created)"},{"line_number":1367,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1368,"context_line":"        self.assertEqual(user_created[\u0027domain_id\u0027], user[\u0027domain_id\u0027])"},{"line_number":1369,"context_line":"        self.assertEqual(user_created[\u0027name\u0027], user[\u0027name\u0027])"},{"line_number":1370,"context_line":"        new_user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_c3ed23f1","line":1367,"updated":"2016-06-09 16:08:01.000000000","message":"Would we be able to document this in the dev docs for Keystone (which could totally be done with this commit)? Just explaining why users shadowed from LDAP they get to keep their ID from LDAP versus federated users who get an arbitrary ID generated from Keystone for their shadow user ID.","commit_id":"1c1d60028cca664652f924bf3c77a08a961dc839"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"cf6a25f805d51280ccaf58f21cebd2c499808040","unresolved":false,"context_lines":[{"line_number":1364,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":1365,"context_line":"        user_created \u003d self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1366,"context_line":"        self.assertNotIn(\u0027password\u0027, user_created)"},{"line_number":1367,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1368,"context_line":"        self.assertEqual(user_created[\u0027domain_id\u0027], user[\u0027domain_id\u0027])"},{"line_number":1369,"context_line":"        self.assertEqual(user_created[\u0027name\u0027], user[\u0027name\u0027])"},{"line_number":1370,"context_line":"        new_user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_c602510b","line":1367,"in_reply_to":"7aa08908_c3ed23f1","updated":"2016-06-09 16:35:18.000000000","message":"Yeah, makes sense. If you agree, I\u0027ll add this in a subsequent patch.","commit_id":"1c1d60028cca664652f924bf3c77a08a961dc839"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8e5b58dadc80640cc701ab879323cb9fbec28bb0","unresolved":false,"context_lines":[{"line_number":1364,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"},{"line_number":1365,"context_line":"        user_created \u003d self.shadow_users_api.create_nonlocal_user(user)"},{"line_number":1366,"context_line":"        self.assertNotIn(\u0027password\u0027, user_created)"},{"line_number":1367,"context_line":"        self.assertEqual(user_created[\u0027id\u0027], user[\u0027id\u0027])"},{"line_number":1368,"context_line":"        self.assertEqual(user_created[\u0027domain_id\u0027], user[\u0027domain_id\u0027])"},{"line_number":1369,"context_line":"        self.assertEqual(user_created[\u0027name\u0027], user[\u0027name\u0027])"},{"line_number":1370,"context_line":"        new_user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aa08908_b9c48a5f","line":1367,"in_reply_to":"7aa08908_c602510b","updated":"2016-06-09 16:40:49.000000000","message":"Works for me.","commit_id":"1c1d60028cca664652f924bf3c77a08a961dc839"}]}
