)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"529b7303d845f02a308df336611d09c8b2f23cb9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3a461143_755eda13","updated":"2017-02-01 13:50:39.000000000","message":"Didn\u0027t look deeply enough this review to figure out if it is possible to split this into smaller changes? Would ease a lot the review process. What do you think?","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"update_user."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"get_user:"},{"line_number":13,"context_line":"identity/core.py a key \u0027federated\u0027 gets added to ref and the value"},{"line_number":14,"context_line":"is what is returned by the shadowbackend sql method get_fed_objects."},{"line_number":15,"context_line":"This will either be an empty list [] or a list of federated objects."},{"line_number":16,"context_line":"get_fed_objects simply pulls all rows from federated_users that are"},{"line_number":17,"context_line":"associated with the user and then correctly formats them in base to"},{"line_number":18,"context_line":"send them back to core."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"create_user:"},{"line_number":21,"context_line":"identity/schema.py added the ability for users to send in federated"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"fa31d9ce_2126b9ba","line":18,"range":{"start_line":13,"start_character":0,"end_line":18,"end_character":23},"updated":"2017-02-10 16:52:14.000000000","message":"Rather than adding these comments here, I think it\u0027s more appropriate to add them in the code. Commit messages should just summarize the change.","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":51,"context_line":"valid idp and protocol ids, delete the old federated_users, create the"},{"line_number":52,"context_line":"new federated_users based on the list of federated objects the user"},{"line_number":53,"context_line":"has passed in user[\u0027federated\u0027]"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"Change-Id: If683aa01cdc41518dc25e10b3b32a1f899100be6"},{"line_number":56,"context_line":"Depends-On: Ibe5f1eb7e08b86409c482ab11bacaab5a722acfc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"fa31d9ce_a141c93b","line":54,"range":{"start_line":54,"start_character":0,"end_line":54,"end_character":0},"updated":"2017-02-10 16:52:14.000000000","message":"Add: Implements: bp support-federated-attr","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Extend User API to support federated attributes"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch involves three api methods: get_user, create_user, and"},{"line_number":10,"context_line":"update_user. Get_user pulls all associated federated objects and tacks"},{"line_number":11,"context_line":"it on before sending it back to be displayed to the user. create_user"},{"line_number":12,"context_line":"allows a user to add in a federated object to be created and"},{"line_number":13,"context_line":"associated with the user object. update_user allows a user to update"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"ba2be162_0288fee6","line":10,"range":{"start_line":10,"start_character":13,"end_line":10,"end_character":14},"updated":"2017-02-28 17:02:21.000000000","message":"nit: *get_user","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bd065dd1c192c4d36786ad8eaea999d33096877c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"associated with the user object. update_user allows a user to update"},{"line_number":14,"context_line":"currently associated federated objects to the passed in user."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Implements: support-federated-attr"},{"line_number":17,"context_line":"Change-Id: If683aa01cdc41518dc25e10b3b32a1f899100be6"},{"line_number":18,"context_line":"Depends-On: Ibe5f1eb7e08b86409c482ab11bacaab5a722acfc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"ba2be162_8454e954","line":16,"updated":"2017-03-01 00:10:42.000000000","message":"missing bp support-federated-attr","commit_id":"19b42b0e020d7019037e39b52c679a94f73e2b3e"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"344b0a85fa4664264224c3b8c48373faf2d46b51","unresolved":false,"context_lines":[{"line_number":13,"context_line":"associated with the user object. update_user allows a user to update"},{"line_number":14,"context_line":"currently associated federated objects to the passed in user."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Implements: https://specs.openstack.org/openstack/keystone-specs/specs/keystone/ocata/support-federated-attr.html"},{"line_number":17,"context_line":"Change-Id: If683aa01cdc41518dc25e10b3b32a1f899100be6"},{"line_number":18,"context_line":"Depends-On: Ibe5f1eb7e08b86409c482ab11bacaab5a722acfc"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"ba2be162_3dd97222","line":16,"range":{"start_line":16,"start_character":0,"end_line":16,"end_character":113},"updated":"2017-03-01 14:56:29.000000000","message":"This should be:\nImplements: bp support-federated-attr\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"e266df04b0c8fd7b9c502eff510c960ddfb089a8"}],"keystone/identity/core.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":909,"context_line":"                self.federation_api.get_protocol(fed_obj[\"idp_id\"],"},{"line_number":910,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"    def _create_federated_objects_with_user(self, user_ref, fed_dict):"},{"line_number":913,"context_line":"        for fed_obj in fed_dict:"},{"line_number":914,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":915,"context_line":"                federated_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_81b925ec","line":912,"range":{"start_line":912,"start_character":8,"end_line":912,"end_character":43},"updated":"2017-02-10 16:52:14.000000000","message":"nit: _create_federated_objects","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":909,"context_line":"                self.federation_api.get_protocol(fed_obj[\"idp_id\"],"},{"line_number":910,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"    def _create_federated_objects_with_user(self, user_ref, fed_dict):"},{"line_number":913,"context_line":"        for fed_obj in fed_dict:"},{"line_number":914,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":915,"context_line":"                federated_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_b12c3b03","line":912,"range":{"start_line":912,"start_character":8,"end_line":912,"end_character":43},"in_reply_to":"fa31d9ce_81b925ec","updated":"2017-02-14 20:23:59.000000000","message":"Done","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":922,"context_line":"                self.shadow_users_api.create_federated_object("},{"line_number":923,"context_line":"                    federated_dict)"},{"line_number":924,"context_line":""},{"line_number":925,"context_line":"    def _handle_create_user_federated_attributes(self, user, driver):"},{"line_number":926,"context_line":"        if \u0027federated\u0027 not in user:"},{"line_number":927,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":928,"context_line":"            user[\u0027federated\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_e1f101cf","line":925,"range":{"start_line":925,"start_character":8,"end_line":925,"end_character":48},"updated":"2017-02-10 16:52:14.000000000","message":"nit: how about: _create_user_with_federated_object","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":922,"context_line":"                self.shadow_users_api.create_federated_object("},{"line_number":923,"context_line":"                    federated_dict)"},{"line_number":924,"context_line":""},{"line_number":925,"context_line":"    def _handle_create_user_federated_attributes(self, user, driver):"},{"line_number":926,"context_line":"        if \u0027federated\u0027 not in user:"},{"line_number":927,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":928,"context_line":"            user[\u0027federated\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_91ed77b9","line":925,"range":{"start_line":925,"start_character":8,"end_line":925,"end_character":48},"in_reply_to":"fa31d9ce_e1f101cf","updated":"2017-02-14 20:23:59.000000000","message":"Done","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":933,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":934,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":935,"context_line":"            if user_ref[\u0027federated\u0027]:"},{"line_number":936,"context_line":"                self._validate_federated_objects(user_ref[\u0027federated\u0027])"},{"line_number":937,"context_line":"                self._create_federated_objects_with_user(user_ref,"},{"line_number":938,"context_line":"                                                         user_ref[\u0027federated\u0027])"},{"line_number":939,"context_line":"                user[\u0027federated\u0027] \u003d user_ref[\u0027federated\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_0101b5ae","line":936,"range":{"start_line":936,"start_character":16,"end_line":936,"end_character":71},"updated":"2017-02-10 16:52:14.000000000","message":"Shouldn\u0027t you validate before creating the user? Otherwise, you\u0027ll create the user, but then a exception is raised, such as IdentityProviderNotFound.","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":933,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":934,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":935,"context_line":"            if user_ref[\u0027federated\u0027]:"},{"line_number":936,"context_line":"                self._validate_federated_objects(user_ref[\u0027federated\u0027])"},{"line_number":937,"context_line":"                self._create_federated_objects_with_user(user_ref,"},{"line_number":938,"context_line":"                                                         user_ref[\u0027federated\u0027])"},{"line_number":939,"context_line":"                user[\u0027federated\u0027] \u003d user_ref[\u0027federated\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_71f00392","line":936,"range":{"start_line":936,"start_character":16,"end_line":936,"end_character":71},"in_reply_to":"fa31d9ce_0101b5ae","updated":"2017-02-14 20:23:59.000000000","message":"Done","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"            if new_ref[\u0027domain_id\u0027] !\u003d orig_ref[\u0027domain_id\u0027]:"},{"line_number":1080,"context_line":"                raise exception.ValidationError(_(\u0027Cannot change Domain ID\u0027))"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"    def _handle_federated_attribute_update(self, user, driver, entity_id):"},{"line_number":1083,"context_line":"        if \u0027federated\u0027 not in user:"},{"line_number":1084,"context_line":"            user \u003d driver.update_user(entity_id, user)"},{"line_number":1085,"context_line":"            user[\u0027federated\u0027] \u003d self.shadow_users_api.get_fed_objects("}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_61ab518a","line":1082,"range":{"start_line":1082,"start_character":8,"end_line":1082,"end_character":42},"updated":"2017-02-10 16:52:14.000000000","message":"nit: _update_user_with_federated_objects","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":1079,"context_line":"            if new_ref[\u0027domain_id\u0027] !\u003d orig_ref[\u0027domain_id\u0027]:"},{"line_number":1080,"context_line":"                raise exception.ValidationError(_(\u0027Cannot change Domain ID\u0027))"},{"line_number":1081,"context_line":""},{"line_number":1082,"context_line":"    def _handle_federated_attribute_update(self, user, driver, entity_id):"},{"line_number":1083,"context_line":"        if \u0027federated\u0027 not in user:"},{"line_number":1084,"context_line":"            user \u003d driver.update_user(entity_id, user)"},{"line_number":1085,"context_line":"            user[\u0027federated\u0027] \u003d self.shadow_users_api.get_fed_objects("}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_51f77f8a","line":1082,"range":{"start_line":1082,"start_character":8,"end_line":1082,"end_character":42},"in_reply_to":"fa31d9ce_61ab518a","updated":"2017-02-14 20:23:59.000000000","message":"Done","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"            del user[\u0027federated\u0027]"},{"line_number":1091,"context_line":"            user \u003d driver.update_user(entity_id, user)"},{"line_number":1092,"context_line":"            if user_ref[\u0027federated\u0027]:"},{"line_number":1093,"context_line":"                self._validate_federated_objects(user_ref[\u0027federated\u0027])"},{"line_number":1094,"context_line":"                self.shadow_users_api.delete_federated_users(entity_id)"},{"line_number":1095,"context_line":"                self._create_federated_objects_with_user(user,"},{"line_number":1096,"context_line":"                                                         user_ref[\u0027federated\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_c1923d57","line":1093,"range":{"start_line":1093,"start_character":16,"end_line":1093,"end_character":71},"updated":"2017-02-10 16:52:14.000000000","message":"again, I\u0027d suggest validating first","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":1090,"context_line":"            del user[\u0027federated\u0027]"},{"line_number":1091,"context_line":"            user \u003d driver.update_user(entity_id, user)"},{"line_number":1092,"context_line":"            if user_ref[\u0027federated\u0027]:"},{"line_number":1093,"context_line":"                self._validate_federated_objects(user_ref[\u0027federated\u0027])"},{"line_number":1094,"context_line":"                self.shadow_users_api.delete_federated_users(entity_id)"},{"line_number":1095,"context_line":"                self._create_federated_objects_with_user(user,"},{"line_number":1096,"context_line":"                                                         user_ref[\u0027federated\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_31fa0b76","line":1093,"range":{"start_line":1093,"start_character":16,"end_line":1093,"end_character":71},"in_reply_to":"fa31d9ce_c1923d57","updated":"2017-02-14 20:23:59.000000000","message":"Done","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":904,"context_line":"                pass"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_dict):"},{"line_number":907,"context_line":"        # Use existing methods in the federation backend to check for us if"},{"line_number":908,"context_line":"        # the idp and protocol is valid. If not, an exception Not Found error"},{"line_number":909,"context_line":"        # will be raised."},{"line_number":910,"context_line":"        for fed_obj in fed_dict:"},{"line_number":911,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"},{"line_number":912,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_d9a54d47","line":909,"range":{"start_line":907,"start_character":8,"end_line":909,"end_character":25},"updated":"2017-02-14 21:07:47.000000000","message":"++","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":904,"context_line":"                pass"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_dict):"},{"line_number":907,"context_line":"        # Use existing methods in the federation backend to check for us if"},{"line_number":908,"context_line":"        # the idp and protocol is valid. If not, an exception Not Found error"},{"line_number":909,"context_line":"        # will be raised."},{"line_number":910,"context_line":"        for fed_obj in fed_dict:"},{"line_number":911,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"},{"line_number":912,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_cea81e7a","line":909,"range":{"start_line":907,"start_character":8,"end_line":909,"end_character":25},"in_reply_to":"fa31d9ce_d9a54d47","updated":"2017-02-15 17:56:38.000000000","message":"++ to your ++","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":914,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"    def _create_federated_objects(self, user_ref, fed_dict):"},{"line_number":917,"context_line":"        # Create the federated objects from the passed in user and federated"},{"line_number":918,"context_line":"        # dictionary."},{"line_number":919,"context_line":"        for fed_obj in fed_dict:"},{"line_number":920,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":921,"context_line":"                federated_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_f94bf184","line":918,"range":{"start_line":917,"start_character":8,"end_line":918,"end_character":21},"updated":"2017-02-14 21:07:47.000000000","message":"nit: I don\u0027t think you need this comment","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":914,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"},{"line_number":915,"context_line":""},{"line_number":916,"context_line":"    def _create_federated_objects(self, user_ref, fed_dict):"},{"line_number":917,"context_line":"        # Create the federated objects from the passed in user and federated"},{"line_number":918,"context_line":"        # dictionary."},{"line_number":919,"context_line":"        for fed_obj in fed_dict:"},{"line_number":920,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":921,"context_line":"                federated_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_8ea2a697","line":918,"range":{"start_line":917,"start_character":8,"end_line":918,"end_character":21},"in_reply_to":"fa31d9ce_f94bf184","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":936,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":937,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":938,"context_line":"            return user"},{"line_number":939,"context_line":"        # Otherwise, we check that federated is not an empty list and validate"},{"line_number":940,"context_line":"        # that the idps and protocols are valid and already exist in the"},{"line_number":941,"context_line":"        # database before using them to create the federated objects and the"},{"line_number":942,"context_line":"        # associated user."},{"line_number":943,"context_line":"        else:"},{"line_number":944,"context_line":"            user_ref \u003d user.copy()"},{"line_number":945,"context_line":"            if user_ref[\u0027federated\u0027]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_ab32fcef","line":942,"range":{"start_line":939,"start_character":8,"end_line":942,"end_character":26},"updated":"2017-02-14 21:07:47.000000000","message":"nit: this could be shorten to \"otherwise, validate the federated object and create the user.\"","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":936,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":937,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":938,"context_line":"            return user"},{"line_number":939,"context_line":"        # Otherwise, we check that federated is not an empty list and validate"},{"line_number":940,"context_line":"        # that the idps and protocols are valid and already exist in the"},{"line_number":941,"context_line":"        # database before using them to create the federated objects and the"},{"line_number":942,"context_line":"        # associated user."},{"line_number":943,"context_line":"        else:"},{"line_number":944,"context_line":"            user_ref \u003d user.copy()"},{"line_number":945,"context_line":"            if user_ref[\u0027federated\u0027]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_6ea572a0","line":942,"range":{"start_line":939,"start_character":8,"end_line":942,"end_character":26},"in_reply_to":"fa31d9ce_ab32fcef","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":948,"context_line":"                user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":949,"context_line":"                self._create_federated_objects(user_ref, user_ref[\u0027federated\u0027])"},{"line_number":950,"context_line":"                user[\u0027federated\u0027] \u003d user_ref[\u0027federated\u0027]"},{"line_number":951,"context_line":"            else:"},{"line_number":952,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":953,"context_line":"                user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":954,"context_line":"                user[\u0027federated\u0027] \u003d []"},{"line_number":955,"context_line":"            return user"},{"line_number":956,"context_line":""},{"line_number":957,"context_line":"    @domains_configured"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_0b8f882a","line":954,"range":{"start_line":951,"start_character":12,"end_line":954,"end_character":38},"updated":"2017-02-14 21:07:47.000000000","message":"nit: This could have been handled in the first if statement, since they both result in an federated empty list e.g.:\nhttp://paste.openstack.org/show/598890/","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":948,"context_line":"                user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":949,"context_line":"                self._create_federated_objects(user_ref, user_ref[\u0027federated\u0027])"},{"line_number":950,"context_line":"                user[\u0027federated\u0027] \u003d user_ref[\u0027federated\u0027]"},{"line_number":951,"context_line":"            else:"},{"line_number":952,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":953,"context_line":"                user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":954,"context_line":"                user[\u0027federated\u0027] \u003d []"},{"line_number":955,"context_line":"            return user"},{"line_number":956,"context_line":""},{"line_number":957,"context_line":"    @domains_configured"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_44c946ab","line":954,"range":{"start_line":951,"start_character":12,"end_line":954,"end_character":38},"in_reply_to":"fa31d9ce_0b8f882a","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":990,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":991,"context_line":"            self._get_domain_driver_and_entity_id(user_id))"},{"line_number":992,"context_line":"        ref \u003d driver.get_user(entity_id)"},{"line_number":993,"context_line":"        # Get users associated federated objects and put them into the user"},{"line_number":994,"context_line":"        # dictionary. If there are no currently associated objects at the"},{"line_number":995,"context_line":"        # moment then it will return an empty list to be displayed to the user."},{"line_number":996,"context_line":"        ref[\u0027federated\u0027] \u003d self.shadow_users_api.get_federated_objects(user_id)"},{"line_number":997,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":998,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_2b7a8c77","line":995,"range":{"start_line":993,"start_character":8,"end_line":995,"end_character":79},"updated":"2017-02-14 21:07:47.000000000","message":"nit: I think this could be shorten to \"add user federated objects\"","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":990,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":991,"context_line":"            self._get_domain_driver_and_entity_id(user_id))"},{"line_number":992,"context_line":"        ref \u003d driver.get_user(entity_id)"},{"line_number":993,"context_line":"        # Get users associated federated objects and put them into the user"},{"line_number":994,"context_line":"        # dictionary. If there are no currently associated objects at the"},{"line_number":995,"context_line":"        # moment then it will return an empty list to be displayed to the user."},{"line_number":996,"context_line":"        ref[\u0027federated\u0027] \u003d self.shadow_users_api.get_federated_objects(user_id)"},{"line_number":997,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":998,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_e44f9a31","line":995,"range":{"start_line":993,"start_character":8,"end_line":995,"end_character":79},"in_reply_to":"fa31d9ce_2b7a8c77","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":993,"context_line":"        # Get users associated federated objects and put them into the user"},{"line_number":994,"context_line":"        # dictionary. If there are no currently associated objects at the"},{"line_number":995,"context_line":"        # moment then it will return an empty list to be displayed to the user."},{"line_number":996,"context_line":"        ref[\u0027federated\u0027] \u003d self.shadow_users_api.get_federated_objects(user_id)"},{"line_number":997,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":998,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":999,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_0b67884d","line":996,"range":{"start_line":996,"start_character":49,"end_line":996,"end_character":70},"updated":"2017-02-14 21:07:47.000000000","message":"You need to add this new method to the abstract base class:\nhttps://github.com/openstack/keystone/blob/master/keystone/identity/shadow_backends/base.py\n\nAnd also add release notes for this change.","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":993,"context_line":"        # Get users associated federated objects and put them into the user"},{"line_number":994,"context_line":"        # dictionary. If there are no currently associated objects at the"},{"line_number":995,"context_line":"        # moment then it will return an empty list to be displayed to the user."},{"line_number":996,"context_line":"        ref[\u0027federated\u0027] \u003d self.shadow_users_api.get_federated_objects(user_id)"},{"line_number":997,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":998,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"},{"line_number":999,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_44af867c","line":996,"range":{"start_line":996,"start_character":49,"end_line":996,"end_character":70},"in_reply_to":"fa31d9ce_0b67884d","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":1108,"context_line":"            user[\u0027federated\u0027] \u003d self.shadow_users_api.get_federated_objects("},{"line_number":1109,"context_line":"                user[\u0027id\u0027])"},{"line_number":1110,"context_line":"            return user"},{"line_number":1111,"context_line":"        # Otherwise, we check that federated is not an empty list and validate"},{"line_number":1112,"context_line":"        # that the idps and protocols are valid and already exist in the"},{"line_number":1113,"context_line":"        # database before using them. Once they are validated, we proceed with"},{"line_number":1114,"context_line":"        # deleting the current users federated objects to overwrite it with"},{"line_number":1115,"context_line":"        # what the federated object list the user has passed in."},{"line_number":1116,"context_line":"        else:"},{"line_number":1117,"context_line":"            user_ref \u003d user.copy()"},{"line_number":1118,"context_line":"            if user_ref[\u0027federated\u0027]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_cb49f0b8","line":1115,"range":{"start_line":1111,"start_character":8,"end_line":1115,"end_character":64},"updated":"2017-02-14 21:07:47.000000000","message":"nit: Too wordy in my opinion, but could just be my preference.","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":1108,"context_line":"            user[\u0027federated\u0027] \u003d self.shadow_users_api.get_federated_objects("},{"line_number":1109,"context_line":"                user[\u0027id\u0027])"},{"line_number":1110,"context_line":"            return user"},{"line_number":1111,"context_line":"        # Otherwise, we check that federated is not an empty list and validate"},{"line_number":1112,"context_line":"        # that the idps and protocols are valid and already exist in the"},{"line_number":1113,"context_line":"        # database before using them. Once they are validated, we proceed with"},{"line_number":1114,"context_line":"        # deleting the current users federated objects to overwrite it with"},{"line_number":1115,"context_line":"        # what the federated object list the user has passed in."},{"line_number":1116,"context_line":"        else:"},{"line_number":1117,"context_line":"            user_ref \u003d user.copy()"},{"line_number":1118,"context_line":"            if user_ref[\u0027federated\u0027]:"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_a4520265","line":1115,"range":{"start_line":1111,"start_character":8,"end_line":1115,"end_character":64},"in_reply_to":"fa31d9ce_cb49f0b8","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":1122,"context_line":"                user \u003d driver.update_user(entity_id, user)"},{"line_number":1123,"context_line":"                self._create_federated_objects(user, user_ref[\u0027federated\u0027])"},{"line_number":1124,"context_line":"                user[\u0027federated\u0027] \u003d user_ref[\u0027federated\u0027]"},{"line_number":1125,"context_line":"            else:"},{"line_number":1126,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":1127,"context_line":"                user \u003d driver.update_user(entity_id, user)"},{"line_number":1128,"context_line":"                user[\u0027federated\u0027] \u003d ("},{"line_number":1129,"context_line":"                    self.shadow_users_api.get_federated_objects(user[\u0027id\u0027]))"},{"line_number":1130,"context_line":"            return user"},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"    @domains_configured"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_2bae0c81","line":1129,"range":{"start_line":1125,"start_character":12,"end_line":1129,"end_character":76},"updated":"2017-02-14 21:07:47.000000000","message":"nit: Likewise, this could have been combined with the first if statement.","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":1122,"context_line":"                user \u003d driver.update_user(entity_id, user)"},{"line_number":1123,"context_line":"                self._create_federated_objects(user, user_ref[\u0027federated\u0027])"},{"line_number":1124,"context_line":"                user[\u0027federated\u0027] \u003d user_ref[\u0027federated\u0027]"},{"line_number":1125,"context_line":"            else:"},{"line_number":1126,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":1127,"context_line":"                user \u003d driver.update_user(entity_id, user)"},{"line_number":1128,"context_line":"                user[\u0027federated\u0027] \u003d ("},{"line_number":1129,"context_line":"                    self.shadow_users_api.get_federated_objects(user[\u0027id\u0027]))"},{"line_number":1130,"context_line":"            return user"},{"line_number":1131,"context_line":""},{"line_number":1132,"context_line":"    @domains_configured"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_8457be56","line":1129,"range":{"start_line":1125,"start_character":12,"end_line":1129,"end_character":76},"in_reply_to":"fa31d9ce_2bae0c81","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c6d3116148e5b8d20c4e866012fce049ede0c038","unresolved":false,"context_lines":[{"line_number":969,"context_line":"        # the underlying driver so that it could conform to rules set down by"},{"line_number":970,"context_line":"        # that particular driver type."},{"line_number":971,"context_line":"        user[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":972,"context_line":"        # Create federated objects that were passed with the user, if any."},{"line_number":973,"context_line":"        ref \u003d self._create_user_with_federated_object(user, driver)"},{"line_number":974,"context_line":"        notifications.Audit.created(self._USER, user[\u0027id\u0027], initiator)"},{"line_number":975,"context_line":"        return self._set_domain_id_and_mapping("}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_8587b5b3","line":972,"range":{"start_line":972,"start_character":8,"end_line":972,"end_character":74},"updated":"2017-02-15 19:11:01.000000000","message":"nit: you are creating the user and I think your method name is descriptive enough, so you don\u0027t need this comment.","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bfd31e751d736a03c177ed594aa1983ef7f0c4bf","unresolved":false,"context_lines":[{"line_number":969,"context_line":"        # the underlying driver so that it could conform to rules set down by"},{"line_number":970,"context_line":"        # that particular driver type."},{"line_number":971,"context_line":"        user[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":972,"context_line":"        # Create federated objects that were passed with the user, if any."},{"line_number":973,"context_line":"        ref \u003d self._create_user_with_federated_object(user, driver)"},{"line_number":974,"context_line":"        notifications.Audit.created(self._USER, user[\u0027id\u0027], initiator)"},{"line_number":975,"context_line":"        return self._set_domain_id_and_mapping("}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_79618c04","line":972,"range":{"start_line":972,"start_character":8,"end_line":972,"end_character":74},"in_reply_to":"fa31d9ce_8587b5b3","updated":"2017-02-15 20:59:58.000000000","message":"Done","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c6d3116148e5b8d20c4e866012fce049ede0c038","unresolved":false,"context_lines":[{"line_number":982,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":983,"context_line":"            self._get_domain_driver_and_entity_id(user_id))"},{"line_number":984,"context_line":"        ref \u003d driver.get_user(entity_id)"},{"line_number":985,"context_line":"        # Add user\u0027s federated objects"},{"line_number":986,"context_line":"        ref[\u0027federated\u0027] \u003d self.shadow_users_api.get_federated_objects(user_id)"},{"line_number":987,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":988,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_45b85d75","line":985,"range":{"start_line":985,"start_character":8,"end_line":985,"end_character":38},"updated":"2017-02-15 19:11:01.000000000","message":"++","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bfd31e751d736a03c177ed594aa1983ef7f0c4bf","unresolved":false,"context_lines":[{"line_number":982,"context_line":"        domain_id, driver, entity_id \u003d ("},{"line_number":983,"context_line":"            self._get_domain_driver_and_entity_id(user_id))"},{"line_number":984,"context_line":"        ref \u003d driver.get_user(entity_id)"},{"line_number":985,"context_line":"        # Add user\u0027s federated objects"},{"line_number":986,"context_line":"        ref[\u0027federated\u0027] \u003d self.shadow_users_api.get_federated_objects(user_id)"},{"line_number":987,"context_line":"        return self._set_domain_id_and_mapping("},{"line_number":988,"context_line":"            ref, domain_id, driver, mapping.EntityType.USER)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_d9527834","line":985,"range":{"start_line":985,"start_character":8,"end_line":985,"end_character":38},"in_reply_to":"fa31d9ce_45b85d75","updated":"2017-02-15 20:59:58.000000000","message":"Done","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9f836ced7ad597b720974e7d18e37b1221c8255c","unresolved":false,"context_lines":[{"line_number":926,"context_line":"                self.shadow_users_api.create_federated_object("},{"line_number":927,"context_line":"                    federated_dict)"},{"line_number":928,"context_line":""},{"line_number":929,"context_line":"    def _create_user_with_federated_object(self, user, driver):"},{"line_number":930,"context_line":"        # If the user did not pass a federated object along inside the user"},{"line_number":931,"context_line":"        # object then we simply create the user as normal and give it the empty"},{"line_number":932,"context_line":"        # federated object to display back to the user."}],"source_content_type":"text/x-python","patch_set":17,"id":"fa31d9ce_cf28e388","line":929,"range":{"start_line":929,"start_character":8,"end_line":929,"end_character":42},"updated":"2017-02-16 18:06:39.000000000","message":"nit: _create_user_with_federated_objects (plural)","commit_id":"7ed4db28481194429f1899021d6ecc290ec1dd5b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"2157724260293179921ccac8869b70a1143dea64","unresolved":false,"context_lines":[{"line_number":926,"context_line":"                self.shadow_users_api.create_federated_object("},{"line_number":927,"context_line":"                    federated_dict)"},{"line_number":928,"context_line":""},{"line_number":929,"context_line":"    def _create_user_with_federated_object(self, user, driver):"},{"line_number":930,"context_line":"        # If the user did not pass a federated object along inside the user"},{"line_number":931,"context_line":"        # object then we simply create the user as normal and give it the empty"},{"line_number":932,"context_line":"        # federated object to display back to the user."}],"source_content_type":"text/x-python","patch_set":17,"id":"da36d5c6_efd595b9","line":929,"range":{"start_line":929,"start_character":8,"end_line":929,"end_character":42},"in_reply_to":"fa31d9ce_cf28e388","updated":"2017-02-17 21:50:52.000000000","message":"Done","commit_id":"7ed4db28481194429f1899021d6ecc290ec1dd5b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5550aa51fe5d001e2a4ab78b9510267041fa80b0","unresolved":false,"context_lines":[{"line_number":903,"context_line":"                # backward compatible"},{"line_number":904,"context_line":"                pass"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_dict):"},{"line_number":907,"context_line":"        # Use existing methods in the federation backend to check for us if"},{"line_number":908,"context_line":"        # the idp and protocol is valid. If not, an exception Not Found error"},{"line_number":909,"context_line":"        # will be raised."}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_a8953741","line":906,"range":{"start_line":906,"start_character":42,"end_line":906,"end_character":50},"updated":"2017-02-20 12:04:10.000000000","message":"is it s list or a dict? In the JSON schema, the type is array (list).","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"155da695c789bc68772f4b6e2d3303a418d0d72d","unresolved":false,"context_lines":[{"line_number":903,"context_line":"                # backward compatible"},{"line_number":904,"context_line":"                pass"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_dict):"},{"line_number":907,"context_line":"        # Use existing methods in the federation backend to check for us if"},{"line_number":908,"context_line":"        # the idp and protocol is valid. If not, an exception Not Found error"},{"line_number":909,"context_line":"        # will be raised."}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_853f1586","line":906,"range":{"start_line":906,"start_character":42,"end_line":906,"end_character":50},"in_reply_to":"da36d5c6_a8953741","updated":"2017-02-23 20:19:52.000000000","message":"Done","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5550aa51fe5d001e2a4ab78b9510267041fa80b0","unresolved":false,"context_lines":[{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_dict):"},{"line_number":907,"context_line":"        # Use existing methods in the federation backend to check for us if"},{"line_number":908,"context_line":"        # the idp and protocol is valid. If not, an exception Not Found error"},{"line_number":909,"context_line":"        # will be raised."},{"line_number":910,"context_line":"        for fed_obj in fed_dict:"},{"line_number":911,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_c8cb4b71","line":908,"range":{"start_line":908,"start_character":31,"end_line":908,"end_character":33},"updated":"2017-02-20 12:04:10.000000000","message":"are","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"155da695c789bc68772f4b6e2d3303a418d0d72d","unresolved":false,"context_lines":[{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_dict):"},{"line_number":907,"context_line":"        # Use existing methods in the federation backend to check for us if"},{"line_number":908,"context_line":"        # the idp and protocol is valid. If not, an exception Not Found error"},{"line_number":909,"context_line":"        # will be raised."},{"line_number":910,"context_line":"        for fed_obj in fed_dict:"},{"line_number":911,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_a544191b","line":908,"range":{"start_line":908,"start_character":31,"end_line":908,"end_character":33},"in_reply_to":"da36d5c6_c8cb4b71","updated":"2017-02-23 20:19:52.000000000","message":"Done","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5550aa51fe5d001e2a4ab78b9510267041fa80b0","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        # object then we simply create the user as normal and give it the empty"},{"line_number":932,"context_line":"        # federated object to display back to the user."},{"line_number":933,"context_line":"        if not user.get(\u0027federated\u0027):"},{"line_number":934,"context_line":"            if \u0027federated\u0027 in user:"},{"line_number":935,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":936,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":937,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":938,"context_line":"            return user"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_a820d74a","line":935,"range":{"start_line":934,"start_character":0,"end_line":935,"end_character":37},"updated":"2017-02-20 12:04:10.000000000","message":"this is not possible if the condition above is true, right?","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"155da695c789bc68772f4b6e2d3303a418d0d72d","unresolved":false,"context_lines":[{"line_number":931,"context_line":"        # object then we simply create the user as normal and give it the empty"},{"line_number":932,"context_line":"        # federated object to display back to the user."},{"line_number":933,"context_line":"        if not user.get(\u0027federated\u0027):"},{"line_number":934,"context_line":"            if \u0027federated\u0027 in user:"},{"line_number":935,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":936,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":937,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":938,"context_line":"            return user"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_c57e6d18","line":935,"range":{"start_line":934,"start_character":0,"end_line":935,"end_character":37},"in_reply_to":"da36d5c6_a820d74a","updated":"2017-02-23 20:19:52.000000000","message":"If a user attempts to create a user without a federated object (i.e. they don\u0027t put a federated attribute in the POST user) or federated object is an empty list then line 933 if will pass. However, we still need to check 934 to see if 933 passed because of an empty list so we can remove it before creating user","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5550aa51fe5d001e2a4ab78b9510267041fa80b0","unresolved":false,"context_lines":[{"line_number":934,"context_line":"            if \u0027federated\u0027 in user:"},{"line_number":935,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":936,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":937,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":938,"context_line":"            return user"},{"line_number":939,"context_line":"        # Otherwise, validate the federated object and create the user.\""},{"line_number":940,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_28ddc714","line":937,"range":{"start_line":937,"start_character":18,"end_line":937,"end_character":27},"updated":"2017-02-20 12:04:10.000000000","message":"I know this was decided in the spec, but only \"federated\" can be confusing - if I\u0027m consuming the users API and see a \"federated: []\", the field won\u0027t be clear just by its name. Can we discuss a better name for the attribute? Maybe \"federated_attributes\".","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e48204b28640d482a8a37352a79e3695363ebc3f","unresolved":false,"context_lines":[{"line_number":934,"context_line":"            if \u0027federated\u0027 in user:"},{"line_number":935,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":936,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":937,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":938,"context_line":"            return user"},{"line_number":939,"context_line":"        # Otherwise, validate the federated object and create the user.\""},{"line_number":940,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_ed2621cd","line":937,"range":{"start_line":937,"start_character":18,"end_line":937,"end_character":27},"in_reply_to":"da36d5c6_28ddc714","updated":"2017-02-21 23:52:29.000000000","message":"I don\u0027t like federated_attributes, it would be like adding name_attribute or password_attribute. Attribute should be implied.","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":904,"context_line":"                pass"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_obj_list):"},{"line_number":907,"context_line":"        # Use existing methods in the federation backend to check for us if"},{"line_number":908,"context_line":"        # the idp and protocol are valid. If not, an exception Not Found error"},{"line_number":909,"context_line":"        # will be raised."},{"line_number":910,"context_line":"        for fed_obj in fed_obj_list:"},{"line_number":911,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"},{"line_number":912,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_02a47e55","line":909,"range":{"start_line":907,"start_character":8,"end_line":909,"end_character":25},"updated":"2017-02-28 17:02:21.000000000","message":"nit: this comment could be summarized into \"validate that the ipd and protocol exist\"","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":904,"context_line":"                pass"},{"line_number":905,"context_line":""},{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_obj_list):"},{"line_number":907,"context_line":"        # Use existing methods in the federation backend to check for us if"},{"line_number":908,"context_line":"        # the idp and protocol are valid. If not, an exception Not Found error"},{"line_number":909,"context_line":"        # will be raised."},{"line_number":910,"context_line":"        for fed_obj in fed_obj_list:"},{"line_number":911,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"},{"line_number":912,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_4302f53f","line":909,"range":{"start_line":907,"start_character":8,"end_line":909,"end_character":25},"in_reply_to":"ba2be162_02a47e55","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":1090,"context_line":""},{"line_number":1091,"context_line":"    def _update_user_with_federated_objects(self, user, driver, entity_id):"},{"line_number":1092,"context_line":"        # If the user did not pass a federated object along inside the user"},{"line_number":1093,"context_line":"        # object then we simply create the user as normal and add the"},{"line_number":1094,"context_line":"        # currently associated federated objects to user to be added to the"},{"line_number":1095,"context_line":"        # dictionary."},{"line_number":1096,"context_line":"        if not user.get(\u0027federated\u0027):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_7d1a3b70","line":1093,"range":{"start_line":1093,"start_character":32,"end_line":1093,"end_character":38},"updated":"2017-02-28 17:02:21.000000000","message":"nit: update","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":1090,"context_line":""},{"line_number":1091,"context_line":"    def _update_user_with_federated_objects(self, user, driver, entity_id):"},{"line_number":1092,"context_line":"        # If the user did not pass a federated object along inside the user"},{"line_number":1093,"context_line":"        # object then we simply create the user as normal and add the"},{"line_number":1094,"context_line":"        # currently associated federated objects to user to be added to the"},{"line_number":1095,"context_line":"        # dictionary."},{"line_number":1096,"context_line":"        if not user.get(\u0027federated\u0027):"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_638619bb","line":1093,"range":{"start_line":1093,"start_character":32,"end_line":1093,"end_character":38},"in_reply_to":"ba2be162_7d1a3b70","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"                self.shadow_users_api.get_user_federated_objects(user[\u0027id\u0027]))"},{"line_number":1102,"context_line":"            return user"},{"line_number":1103,"context_line":"        # Otherwise, we validate, remove the previous user\u0027s federated objects,"},{"line_number":1104,"context_line":"        # and create the user along with their updated federated objects."},{"line_number":1105,"context_line":"        else:"},{"line_number":1106,"context_line":"            user_ref \u003d user.copy()"},{"line_number":1107,"context_line":"            self._validate_federated_objects(user_ref[\u0027federated\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_3d37e3e4","line":1104,"range":{"start_line":1104,"start_character":14,"end_line":1104,"end_character":20},"updated":"2017-02-28 17:02:21.000000000","message":"nit: update","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"                self.shadow_users_api.get_user_federated_objects(user[\u0027id\u0027]))"},{"line_number":1102,"context_line":"            return user"},{"line_number":1103,"context_line":"        # Otherwise, we validate, remove the previous user\u0027s federated objects,"},{"line_number":1104,"context_line":"        # and create the user along with their updated federated objects."},{"line_number":1105,"context_line":"        else:"},{"line_number":1106,"context_line":"            user_ref \u003d user.copy()"},{"line_number":1107,"context_line":"            self._validate_federated_objects(user_ref[\u0027federated\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_83930dfa","line":1104,"range":{"start_line":1104,"start_character":14,"end_line":1104,"end_character":20},"in_reply_to":"ba2be162_3d37e3e4","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_obj_list):"},{"line_number":907,"context_line":"        # Validate that the ipd and protocols exist"},{"line_number":908,"context_line":"        for fed_obj in fed_obj_list:"},{"line_number":909,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"},{"line_number":910,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":911,"context_line":"                self.federation_api.get_protocol(fed_obj[\"idp_id\"],"},{"line_number":912,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_a530dc02","line":909,"updated":"2017-03-01 20:40:36.000000000","message":"I\u0027d recommend using either single quotes or double quotes consistently.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":906,"context_line":"    def _validate_federated_objects(self, fed_obj_list):"},{"line_number":907,"context_line":"        # Validate that the ipd and protocols exist"},{"line_number":908,"context_line":"        for fed_obj in fed_obj_list:"},{"line_number":909,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"},{"line_number":910,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":911,"context_line":"                self.federation_api.get_protocol(fed_obj[\"idp_id\"],"},{"line_number":912,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_223bf8d2","line":909,"in_reply_to":"ba2be162_a530dc02","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":908,"context_line":"        for fed_obj in fed_obj_list:"},{"line_number":909,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"},{"line_number":910,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":911,"context_line":"                self.federation_api.get_protocol(fed_obj[\"idp_id\"],"},{"line_number":912,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    def _create_federated_objects(self, user_ref, fed_obj_list):"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_c52b1093","line":911,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":908,"context_line":"        for fed_obj in fed_obj_list:"},{"line_number":909,"context_line":"            self.federation_api.get_idp(fed_obj[\"idp_id\"])"},{"line_number":910,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":911,"context_line":"                self.federation_api.get_protocol(fed_obj[\"idp_id\"],"},{"line_number":912,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    def _create_federated_objects(self, user_ref, fed_obj_list):"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_e220009e","line":911,"in_reply_to":"ba2be162_c52b1093","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":911,"context_line":"                self.federation_api.get_protocol(fed_obj[\"idp_id\"],"},{"line_number":912,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    def _create_federated_objects(self, user_ref, fed_obj_list):"},{"line_number":915,"context_line":"        for fed_obj in fed_obj_list:"},{"line_number":916,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":917,"context_line":"                federated_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_d75e6311","line":914,"updated":"2017-03-01 20:40:36.000000000","message":"This is creating a shadow user based on the federated attributes. The current name makes it seem like we\u0027re creating identity providers/protocols/mappings/etc...","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":911,"context_line":"                self.federation_api.get_protocol(fed_obj[\"idp_id\"],"},{"line_number":912,"context_line":"                                                 protocols[\u0027protocol_id\u0027])"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"    def _create_federated_objects(self, user_ref, fed_obj_list):"},{"line_number":915,"context_line":"        for fed_obj in fed_obj_list:"},{"line_number":916,"context_line":"            for protocols in fed_obj[\u0027protocols\u0027]:"},{"line_number":917,"context_line":"                federated_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_1c4e5a96","line":914,"in_reply_to":"ba2be162_d75e6311","updated":"2017-03-02 00:13:43.000000000","message":"providers, protocols, mappings, unique_id, etc are attributes that make up a federated object which is being done below, I could understand if it was saying create_federated_attributes?","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":929,"context_line":"        # object then we simply create the user as normal and give it the empty"},{"line_number":930,"context_line":"        # federated object to display back to the user."},{"line_number":931,"context_line":"        if not user.get(\u0027federated\u0027):"},{"line_number":932,"context_line":"            if \u0027federated\u0027 in user:"},{"line_number":933,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":934,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":935,"context_line":"            user[\u0027federated\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_a5829c92","line":932,"updated":"2017-03-01 20:40:36.000000000","message":"Hmm I wonder if we could loop this in to our jsonschema validation layer. If user[\u0027federated\u0027] is in the request, is must not be empty (or something like that). It should totally be optional, but it just should be empty if it is included.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":929,"context_line":"        # object then we simply create the user as normal and give it the empty"},{"line_number":930,"context_line":"        # federated object to display back to the user."},{"line_number":931,"context_line":"        if not user.get(\u0027federated\u0027):"},{"line_number":932,"context_line":"            if \u0027federated\u0027 in user:"},{"line_number":933,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":934,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":935,"context_line":"            user[\u0027federated\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_022434ad","line":932,"in_reply_to":"ba2be162_a5829c92","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":934,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":935,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":936,"context_line":"            return user"},{"line_number":937,"context_line":"        # Otherwise, validate the federated object and create the user.\""},{"line_number":938,"context_line":"        else:"},{"line_number":939,"context_line":"            user_ref \u003d user.copy()"},{"line_number":940,"context_line":"            self._validate_federated_objects(user_ref[\u0027federated\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_654c2443","line":937,"updated":"2017-03-01 20:40:36.000000000","message":"s/\"// ?","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":934,"context_line":"            user \u003d driver.create_user(user[\u0027id\u0027], user)"},{"line_number":935,"context_line":"            user[\u0027federated\u0027] \u003d []"},{"line_number":936,"context_line":"            return user"},{"line_number":937,"context_line":"        # Otherwise, validate the federated object and create the user.\""},{"line_number":938,"context_line":"        else:"},{"line_number":939,"context_line":"            user_ref \u003d user.copy()"},{"line_number":940,"context_line":"            self._validate_federated_objects(user_ref[\u0027federated\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_5c48d287","line":937,"in_reply_to":"ba2be162_654c2443","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"        # currently associated federated objects to user to be added to the"},{"line_number":1093,"context_line":"        # dictionary."},{"line_number":1094,"context_line":"        if not user.get(\u0027federated\u0027):"},{"line_number":1095,"context_line":"            if \u0027federated\u0027 in user:"},{"line_number":1096,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":1097,"context_line":"            user \u003d driver.update_user(entity_id, user)"},{"line_number":1098,"context_line":"            user[\u0027federated\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_b791ef9b","line":1095,"updated":"2017-03-01 20:40:36.000000000","message":"This is a duplicated check from above. If we somehow work this into the schema for users, we could reuse it for both create and update requests.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":1092,"context_line":"        # currently associated federated objects to user to be added to the"},{"line_number":1093,"context_line":"        # dictionary."},{"line_number":1094,"context_line":"        if not user.get(\u0027federated\u0027):"},{"line_number":1095,"context_line":"            if \u0027federated\u0027 in user:"},{"line_number":1096,"context_line":"                del user[\u0027federated\u0027]"},{"line_number":1097,"context_line":"            user \u003d driver.update_user(entity_id, user)"},{"line_number":1098,"context_line":"            user[\u0027federated\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_42362ce8","line":1095,"in_reply_to":"ba2be162_b791ef9b","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"}],"keystone/identity/schema.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":71,"context_line":"    \"federated\": {"},{"line_number":72,"context_line":"        \"type\": \"array\","},{"line_number":73,"context_line":"        \"items\":"},{"line_number":74,"context_line":"            {"},{"line_number":75,"context_line":"                \"type\": \"object\","},{"line_number":76,"context_line":"                \"properties\": {"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_17d47b45","line":73,"updated":"2017-03-01 20:40:36.000000000","message":"Is there a way to tell jsonschema that if this is in the request, it must be populated? Maybe something like this: http://json-schema.org/latest/json-schema-validation.html#rfc.section.5.14\n\nThat means we could remove that extra if statement from keystone/identity/core.py and leave more validation up to jsonschema.\n\n\n  \u0027federated\u0027: {\n      \u0027type\u0027: \u0027array\u0027,\n      \u0027minProperties\u0027: 1,\n      ...\n\nAlso, the convention in this file seems to be using single quotes.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    \u0027enabled\u0027: parameter_types.boolean,"},{"line_number":71,"context_line":"    \"federated\": {"},{"line_number":72,"context_line":"        \"type\": \"array\","},{"line_number":73,"context_line":"        \"items\":"},{"line_number":74,"context_line":"            {"},{"line_number":75,"context_line":"                \"type\": \"object\","},{"line_number":76,"context_line":"                \"properties\": {"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_c2293c8b","line":73,"in_reply_to":"ba2be162_17d47b45","updated":"2017-03-02 00:13:43.000000000","message":"Almost!","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"}],"keystone/identity/shadow_backends/base.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystone import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def filter_federated_objects(fed_ref):"},{"line_number":23,"context_line":"    \"\"\"Create a new reformatted federated dict using the one passed in."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    When returning federated objects with a user we only need the attributes"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_4109ed94","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":28},"updated":"2017-02-10 16:52:14.000000000","message":"this is not really filtering, right? how about: federated_object_to_dict(...)","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystone import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def filter_federated_objects(fed_ref):"},{"line_number":23,"context_line":"    \"\"\"Create a new reformatted federated dict using the one passed in."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    When returning federated objects with a user we only need the attributes"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_51013f37","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":28},"in_reply_to":"fa31d9ce_4109ed94","updated":"2017-02-14 20:23:59.000000000","message":"Done","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystone import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def federated_objects_to_dict(fed_ref):"},{"line_number":23,"context_line":"    \"\"\"Create a new reformatted federated dict using the one passed in."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    When returning federated objects with a user we only need the attributes"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_2bfc4c71","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":29},"updated":"2017-02-14 21:07:47.000000000","message":"++","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystone import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def federated_objects_to_dict(fed_ref):"},{"line_number":23,"context_line":"    \"\"\"Create a new reformatted federated dict using the one passed in."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    When returning federated objects with a user we only need the attributes"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_e4487ab5","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":29},"in_reply_to":"fa31d9ce_2bfc4c71","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fd23346032a8fa3884e70df5cef46d61a4b0f82c","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        raise exception.NotImplemented()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def delete_federated_user(self, user_id):"},{"line_number":87,"context_line":"        \"\"\"Delete a user\u0027s federated objects."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param user_id: Unique identifier of the user"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa31d9ce_cca391b0","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":29},"updated":"2017-02-15 22:28:22.000000000","message":"you need to change this to: delete_federated_objects","commit_id":"c51653a11a66c83c9f30f76d6bcd0befd2de8b4c"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6068cf43caf4644f72d0da54088b6f2a9161a0e4","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        \"\"\""},{"line_number":84,"context_line":"        raise exception.NotImplemented()"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def delete_federated_user(self, user_id):"},{"line_number":87,"context_line":"        \"\"\"Delete a user\u0027s federated objects."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        :param user_id: Unique identifier of the user"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa31d9ce_4c4241af","line":86,"range":{"start_line":86,"start_character":8,"end_line":86,"end_character":29},"in_reply_to":"fa31d9ce_cca391b0","updated":"2017-02-15 22:32:01.000000000","message":"Done","commit_id":"c51653a11a66c83c9f30f76d6bcd0befd2de8b4c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9f836ced7ad597b720974e7d18e37b1221c8255c","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \"\"\"Get all federated objects for a user."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        :param user_id: Unique identifier of the user"},{"line_number":98,"context_line":"        :returns dict: Containing the user\u0027s federated objects"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":17,"id":"fa31d9ce_2c6fcdfc","line":98,"range":{"start_line":98,"start_character":17,"end_line":98,"end_character":21},"updated":"2017-02-16 18:06:39.000000000","message":"nit: returns a list, right?","commit_id":"7ed4db28481194429f1899021d6ecc290ec1dd5b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"2157724260293179921ccac8869b70a1143dea64","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \"\"\"Get all federated objects for a user."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        :param user_id: Unique identifier of the user"},{"line_number":98,"context_line":"        :returns dict: Containing the user\u0027s federated objects"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        raise exception.NotImplemented()"}],"source_content_type":"text/x-python","patch_set":17,"id":"da36d5c6_4ffce13e","line":98,"range":{"start_line":98,"start_character":17,"end_line":98,"end_character":21},"in_reply_to":"fa31d9ce_2c6fcdfc","updated":"2017-02-17 21:50:52.000000000","message":"Done","commit_id":"7ed4db28481194429f1899021d6ecc290ec1dd5b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5550aa51fe5d001e2a4ab78b9510267041fa80b0","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystone import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def federated_objects_to_dict(fed_ref):"},{"line_number":23,"context_line":"    \"\"\"Create a new reformatted federated dict using the one passed in."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    When returning federated objects with a user we only need the attributes"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_883a3335","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":29},"updated":"2017-02-20 12:04:10.000000000","message":"this isn\u0027t creating a dict, but a list.","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"f55e941ce699a0e98e5f6523e709b3466a611fda","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from keystone import exception"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"def federated_objects_to_dict(fed_ref):"},{"line_number":23,"context_line":"    \"\"\"Create a new reformatted federated dict using the one passed in."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    When returning federated objects with a user we only need the attributes"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_46b41e81","line":22,"range":{"start_line":22,"start_character":4,"end_line":22,"end_character":29},"in_reply_to":"da36d5c6_883a3335","updated":"2017-02-23 20:21:44.000000000","message":"++","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5550aa51fe5d001e2a4ab78b9510267041fa80b0","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class ShadowUsersDriverBase(object):"},{"line_number":66,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def create_federated_object(self, fed_dict):"},{"line_number":69,"context_line":"        \"\"\"Create a new federated object."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        :param dict federated_dict: Reference to the federated user"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_a8261714","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":31},"updated":"2017-02-20 12:04:10.000000000","message":"I would suggest this and the others methods to be called: \"*_user_federated_attribute\". What do you think?","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"155da695c789bc68772f4b6e2d3303a418d0d72d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"class ShadowUsersDriverBase(object):"},{"line_number":66,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def create_federated_object(self, fed_dict):"},{"line_number":69,"context_line":"        \"\"\"Create a new federated object."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        :param dict federated_dict: Reference to the federated user"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_e5aff127","line":68,"range":{"start_line":68,"start_character":8,"end_line":68,"end_character":31},"in_reply_to":"da36d5c6_a8261714","updated":"2017-02-23 20:19:52.000000000","message":"Done","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @abc.abstractmethod"},{"line_number":69,"context_line":"    def create_user_federated_attribute(self, fed_dict):"},{"line_number":70,"context_line":"        \"\"\"Create a new federated object."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param dict federated_dict: Reference to the federated user"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_9d5fef74","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":39},"updated":"2017-02-28 17:02:21.000000000","message":"create_user_federated_attribute sounds strange to me because you are not creating a single attribute. I\u0027d suggest create_federated_object since you have used the name \"federated_objects\" in other parts of the code.","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @abc.abstractmethod"},{"line_number":69,"context_line":"    def create_user_federated_attribute(self, fed_dict):"},{"line_number":70,"context_line":"        \"\"\"Create a new federated object."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param dict federated_dict: Reference to the federated user"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_c3626516","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":39},"in_reply_to":"ba2be162_9d5fef74","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        raise exception.NotImplemented()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @abc.abstractmethod"},{"line_number":88,"context_line":"    def delete_user_federated_attribute(self, user_id):"},{"line_number":89,"context_line":"        \"\"\"Delete a user\u0027s federated objects."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        :param user_id: Unique identifier of the user"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_5d4e57c2","line":88,"range":{"start_line":88,"start_character":8,"end_line":88,"end_character":39},"updated":"2017-02-28 17:02:21.000000000","message":"likewise, delete_federated_object","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        raise exception.NotImplemented()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @abc.abstractmethod"},{"line_number":88,"context_line":"    def delete_user_federated_attribute(self, user_id):"},{"line_number":89,"context_line":"        \"\"\"Delete a user\u0027s federated objects."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        :param user_id: Unique identifier of the user"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_6ab6d78b","line":88,"range":{"start_line":88,"start_character":8,"end_line":88,"end_character":39},"in_reply_to":"ba2be162_5d4e57c2","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"344b0a85fa4664264224c3b8c48373faf2d46b51","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    \"\"\"Interface description for an Shadow Users driver.\"\"\""},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    @abc.abstractmethod"},{"line_number":69,"context_line":"    def create_federated_object(self, fed_dict):"},{"line_number":70,"context_line":"        \"\"\"Create a new federated object."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        :param dict federated_dict: Reference to the federated user"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba2be162_5d2b86eb","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":31},"updated":"2017-03-01 14:56:29.000000000","message":"++","commit_id":"e266df04b0c8fd7b9c502eff510c960ddfb089a8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"344b0a85fa4664264224c3b8c48373faf2d46b51","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        raise exception.NotImplemented()"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    @abc.abstractmethod"},{"line_number":88,"context_line":"    def delete_federated_object(self, user_id):"},{"line_number":89,"context_line":"        \"\"\"Delete a user\u0027s federated objects."},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        :param user_id: Unique identifier of the user"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba2be162_dd3f7623","line":88,"range":{"start_line":88,"start_character":8,"end_line":88,"end_character":31},"updated":"2017-03-01 14:56:29.000000000","message":"++","commit_id":"e266df04b0c8fd7b9c502eff510c960ddfb089a8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"344b0a85fa4664264224c3b8c48373faf2d46b51","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        raise exception.NotImplemented()"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @abc.abstractmethod"},{"line_number":96,"context_line":"    def get_user_federated_objects(self, user_id):"},{"line_number":97,"context_line":"        \"\"\"Get all federated objects for a user."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        :param user_id: Unique identifier of the user"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba2be162_3d4c12c7","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":34},"updated":"2017-03-01 14:56:29.000000000","message":"nit: This could be get_federated_objects to be consistent with the other methods, but I\u0027m okay with it as is.","commit_id":"e266df04b0c8fd7b9c502eff510c960ddfb089a8"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"35408676652fcfcdffa502d6ed78af2a22760892","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        raise exception.NotImplemented()"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @abc.abstractmethod"},{"line_number":96,"context_line":"    def get_user_federated_objects(self, user_id):"},{"line_number":97,"context_line":"        \"\"\"Get all federated objects for a user."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        :param user_id: Unique identifier of the user"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba2be162_d33f6523","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":34},"in_reply_to":"ba2be162_3d4c12c7","updated":"2017-03-01 15:19:43.000000000","message":"But this isn\u0027t getting only one right?","commit_id":"e266df04b0c8fd7b9c502eff510c960ddfb089a8"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"521b4b001897379b6c9b4d6b29aae1996f30b065","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        raise exception.NotImplemented()"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @abc.abstractmethod"},{"line_number":96,"context_line":"    def get_user_federated_objects(self, user_id):"},{"line_number":97,"context_line":"        \"\"\"Get all federated objects for a user."},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        :param user_id: Unique identifier of the user"}],"source_content_type":"text/x-python","patch_set":25,"id":"ba2be162_539535e2","line":96,"range":{"start_line":96,"start_character":8,"end_line":96,"end_character":34},"in_reply_to":"ba2be162_d33f6523","updated":"2017-03-01 15:22:12.000000000","message":"With the other methods you don\u0027t have \u0027user\u0027 in the method name.","commit_id":"e266df04b0c8fd7b9c502eff510c960ddfb089a8"}],"keystone/identity/shadow_backends/sql.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            session.add(user_ref)"},{"line_number":44,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def delete_federated_users(self, user_id):"},{"line_number":47,"context_line":"        with sql.session_for_write() as session:"},{"line_number":48,"context_line":"            q \u003d session.query(model.FederatedUser)"},{"line_number":49,"context_line":"            q \u003d q.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_41300d57","line":46,"range":{"start_line":46,"start_character":25,"end_line":46,"end_character":30},"updated":"2017-02-10 16:52:14.000000000","message":"nit: user","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            session.add(user_ref)"},{"line_number":44,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def delete_federated_users(self, user_id):"},{"line_number":47,"context_line":"        with sql.session_for_write() as session:"},{"line_number":48,"context_line":"            q \u003d session.query(model.FederatedUser)"},{"line_number":49,"context_line":"            q \u003d q.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_676a0183","line":46,"range":{"start_line":46,"start_character":25,"end_line":46,"end_character":30},"in_reply_to":"fa31d9ce_41300d57","updated":"2017-02-14 20:23:59.000000000","message":"Done","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            fed_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":56,"context_line":"            session.add(fed_ref)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_fed_objects(self, user_id):"},{"line_number":59,"context_line":"        with sql.session_for_read() as session:"},{"line_number":60,"context_line":"            query \u003d session.query(model.FederatedUser)"},{"line_number":61,"context_line":"            query \u003d query.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_e12021fa","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":23},"updated":"2017-02-10 16:52:14.000000000","message":"nit: get_federated_objects","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            fed_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":56,"context_line":"            session.add(fed_ref)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_fed_objects(self, user_id):"},{"line_number":59,"context_line":"        with sql.session_for_read() as session:"},{"line_number":60,"context_line":"            query \u003d session.query(model.FederatedUser)"},{"line_number":61,"context_line":"            query \u003d query.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_c70badd4","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":23},"in_reply_to":"fa31d9ce_e12021fa","updated":"2017-02-14 20:23:59.000000000","message":"Done","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            session.add(user_ref)"},{"line_number":44,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def delete_federated_user(self, user_id):"},{"line_number":47,"context_line":"        with sql.session_for_write() as session:"},{"line_number":48,"context_line":"            q \u003d session.query(model.FederatedUser)"},{"line_number":49,"context_line":"            q \u003d q.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_0b6a28ee","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":29},"updated":"2017-02-14 21:07:47.000000000","message":"Why is this needed?","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            session.add(user_ref)"},{"line_number":44,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def delete_federated_user(self, user_id):"},{"line_number":47,"context_line":"        with sql.session_for_write() as session:"},{"line_number":48,"context_line":"            q \u003d session.query(model.FederatedUser)"},{"line_number":49,"context_line":"            q \u003d q.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_044d8e99","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":29},"in_reply_to":"fa31d9ce_0b6a28ee","updated":"2017-02-15 17:56:38.000000000","message":"This is just removing all the previously associated federated objects to update the user\u0027s new passed in federated objects.","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            q.delete(False)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027federated_user\u0027)"},{"line_number":53,"context_line":"    def create_federated_object(self, fed_dict):"},{"line_number":54,"context_line":"        with sql.session_for_write() as session:"},{"line_number":55,"context_line":"            fed_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":56,"context_line":"            session.add(fed_ref)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_eb4b1485","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":31},"updated":"2017-02-14 21:07:47.000000000","message":"You need to add this to the abstract base class:\nhttps://github.com/openstack/keystone/blob/master/keystone/identity/shadow_backends/base.py","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            q.delete(False)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027federated_user\u0027)"},{"line_number":53,"context_line":"    def create_federated_object(self, fed_dict):"},{"line_number":54,"context_line":"        with sql.session_for_write() as session:"},{"line_number":55,"context_line":"            fed_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":56,"context_line":"            session.add(fed_ref)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_079e70b8","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":31},"in_reply_to":"fa31d9ce_eb4b1485","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            fed_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":56,"context_line":"            session.add(fed_ref)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_federated_objects(self, user_id):"},{"line_number":59,"context_line":"        with sql.session_for_read() as session:"},{"line_number":60,"context_line":"            query \u003d session.query(model.FederatedUser)"},{"line_number":61,"context_line":"            query \u003d query.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_0b514836","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":29},"updated":"2017-02-14 21:07:47.000000000","message":"Same:\nhttps://github.com/openstack/keystone/blob/master/keystone/identity/shadow_backends/base.py","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            fed_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":56,"context_line":"            session.add(fed_ref)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_federated_objects(self, user_id):"},{"line_number":59,"context_line":"        with sql.session_for_read() as session:"},{"line_number":60,"context_line":"            query \u003d session.query(model.FederatedUser)"},{"line_number":61,"context_line":"            query \u003d query.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_27a1b4f8","line":58,"range":{"start_line":58,"start_character":8,"end_line":58,"end_character":29},"in_reply_to":"fa31d9ce_0b514836","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c6d3116148e5b8d20c4e866012fce049ede0c038","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            session.add(user_ref)"},{"line_number":44,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def delete_federated_user(self, user_id):"},{"line_number":47,"context_line":"        with sql.session_for_write() as session:"},{"line_number":48,"context_line":"            q \u003d session.query(model.FederatedUser)"},{"line_number":49,"context_line":"            q \u003d q.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_650f2137","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":29},"updated":"2017-02-15 19:11:01.000000000","message":"this should be \u0027delete_federated_objects\u0027 as you are not deleting the user, only the federated attributes.","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bfd31e751d736a03c177ed594aa1983ef7f0c4bf","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            session.add(user_ref)"},{"line_number":44,"context_line":"            return identity_base.filter_user(user_ref.to_dict())"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def delete_federated_user(self, user_id):"},{"line_number":47,"context_line":"        with sql.session_for_write() as session:"},{"line_number":48,"context_line":"            q \u003d session.query(model.FederatedUser)"},{"line_number":49,"context_line":"            q \u003d q.filter(model.FederatedUser.user_id \u003d\u003d user_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_d929989c","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":29},"in_reply_to":"fa31d9ce_650f2137","updated":"2017-02-15 20:59:58.000000000","message":"Done","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"}],"keystone/tests/unit/core.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5550aa51fe5d001e2a4ab78b9510267041fa80b0","unresolved":false,"context_lines":[{"line_number":866,"context_line":"        Instead of making strict assumptions that all APIs return users with"},{"line_number":867,"context_line":"        the same number of keys and that those keys must all match up we"},{"line_number":868,"context_line":"        simply test that all keys that both user1 and user2 contain have"},{"line_number":869,"context_line":"        equivalent values. This is useful when grabbing a user from get_user"},{"line_number":870,"context_line":"        which will have more information about the specific user than a user"},{"line_number":871,"context_line":"        from list_users."},{"line_number":872,"context_line":"        \"\"\""},{"line_number":873,"context_line":"        self.assertTrue(all("},{"line_number":874,"context_line":"            user1[key] \u003d\u003d user2[key] for key in user1 if key in user2))"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_c86a6b1a","line":871,"range":{"start_line":869,"start_character":27,"end_line":871,"end_character":23},"updated":"2017-02-20 12:04:10.000000000","message":"ok... this isn\u0027t looking good. A \"GET /users\" returns different objects than a \"GET /users/\u003cuser_id\u003e\"? Please don\u0027t do that.","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"0fa9686b7295b823fc497211c852be67fe0ad2eb","unresolved":false,"context_lines":[{"line_number":866,"context_line":"        Instead of making strict assumptions that all APIs return users with"},{"line_number":867,"context_line":"        the same number of keys and that those keys must all match up we"},{"line_number":868,"context_line":"        simply test that all keys that both user1 and user2 contain have"},{"line_number":869,"context_line":"        equivalent values. This is useful when grabbing a user from get_user"},{"line_number":870,"context_line":"        which will have more information about the specific user than a user"},{"line_number":871,"context_line":"        from list_users."},{"line_number":872,"context_line":"        \"\"\""},{"line_number":873,"context_line":"        self.assertTrue(all("},{"line_number":874,"context_line":"            user1[key] \u003d\u003d user2[key] for key in user1 if key in user2))"}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_4d556d1b","line":871,"range":{"start_line":869,"start_character":27,"end_line":871,"end_character":23},"in_reply_to":"da36d5c6_c86a6b1a","updated":"2017-02-21 23:49:59.000000000","message":"I\u0027m okay with this as it\u0027s not uncommon for a list method to only return a subset of attributes. Whereas a get method will return more detail.","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        self.assertDictEqual(expected, observed, message)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    def assertUserDictsEqual(self, user1, user2):"},{"line_number":864,"context_line":"        \"\"\"Assert that a user dict is equal to another user dict."},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        Instead of making strict assumptions that all APIs return users with"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_ddd087cc","line":863,"range":{"start_line":863,"start_character":8,"end_line":863,"end_character":28},"updated":"2017-02-28 17:02:21.000000000","message":"++","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":860,"context_line":""},{"line_number":861,"context_line":"        self.assertDictEqual(expected, observed, message)"},{"line_number":862,"context_line":""},{"line_number":863,"context_line":"    def assertUserDictsEqual(self, user1, user2):"},{"line_number":864,"context_line":"        \"\"\"Assert that a user dict is equal to another user dict."},{"line_number":865,"context_line":""},{"line_number":866,"context_line":"        Instead of making strict assumptions that all APIs return users with"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_2340a156","line":863,"range":{"start_line":863,"start_character":8,"end_line":863,"end_character":28},"in_reply_to":"ba2be162_ddd087cc","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"}],"keystone/tests/unit/identity/test_backends.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.user_sna.pop(\u0027password\u0027)"},{"line_number":66,"context_line":"        self.user_sna[\u0027enabled\u0027] \u003d True"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.assertUserDictsEqual(self.user_sna, user_ref)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_authenticate_and_get_roles_no_metadata(self):"},{"line_number":71,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_2f416a3a","line":68,"range":{"start_line":68,"start_character":13,"end_line":68,"end_character":33},"updated":"2017-02-28 17:02:21.000000000","message":"It\u0027s not clear to me what the difference is between assertUserDictEqual and assertUsersDictEqual by the name. Why not just fix assertUserDictEqual instead of creating a new method?","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        self.user_sna.pop(\u0027password\u0027)"},{"line_number":66,"context_line":"        self.user_sna[\u0027enabled\u0027] \u003d True"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.assertUserDictsEqual(self.user_sna, user_ref)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_authenticate_and_get_roles_no_metadata(self):"},{"line_number":71,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dCONF.identity.default_domain_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_832f8da0","line":68,"range":{"start_line":68,"start_character":13,"end_line":68,"end_character":33},"in_reply_to":"ba2be162_2f416a3a","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        #               not be returned by the api"},{"line_number":65,"context_line":"        self.user_sna.pop(\u0027password\u0027)"},{"line_number":66,"context_line":"        self.user_sna[\u0027enabled\u0027] \u003d True"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.assertUserDictEqual(self.user_sna, user_ref)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_authenticate_and_get_roles_no_metadata(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_d79bc370","line":67,"updated":"2017-03-01 20:40:36.000000000","message":"Unrelated whitespace change?","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        #               not be returned by the api"},{"line_number":65,"context_line":"        self.user_sna.pop(\u0027password\u0027)"},{"line_number":66,"context_line":"        self.user_sna[\u0027enabled\u0027] \u003d True"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        self.assertUserDictEqual(self.user_sna, user_ref)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def test_authenticate_and_get_roles_no_metadata(self):"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_8247444a","line":67,"in_reply_to":"ba2be162_d79bc370","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        driver.delete_user(entity_id)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        user \u003d self.identity_api.get_user(ref[\u0027id\u0027])"},{"line_number":142,"context_line":"        self.assertUserDictEqual(ref, user)"},{"line_number":143,"context_line":"        self.identity_api.get_user.invalidate(self.identity_api, ref[\u0027id\u0027])"},{"line_number":144,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":145,"context_line":"                          self.identity_api.get_user, ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_979f8b4f","line":142,"updated":"2017-03-01 20:40:36.000000000","message":"Is there a specific reason to pull the user reference out into it\u0027s own variable? \n\n  self.assertUserDictEqual(\n      ref,\n      self.identity_api.get_user(ref[\u0027id\u0027])\n  )","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":139,"context_line":"        driver.delete_user(entity_id)"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        user \u003d self.identity_api.get_user(ref[\u0027id\u0027])"},{"line_number":142,"context_line":"        self.assertUserDictEqual(ref, user)"},{"line_number":143,"context_line":"        self.identity_api.get_user.invalidate(self.identity_api, ref[\u0027id\u0027])"},{"line_number":144,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":145,"context_line":"                          self.identity_api.get_user, ref[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_624c1071","line":142,"in_reply_to":"ba2be162_979f8b4f","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"}],"keystone/tests/unit/identity/test_core.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fd23346032a8fa3884e70df5cef46d61a4b0f82c","unresolved":false,"context_lines":[{"line_number":318,"context_line":"            \u0027ravelar\u0027)"},{"line_number":319,"context_line":"        self.assertIsNotNone(fed_user)"},{"line_number":320,"context_line":""},{"line_number":321,"context_line":"    def test_update_user_with_invalid_idp_and_protocol_fails(self):"},{"line_number":322,"context_line":"        baduser \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":323,"context_line":"        baduser[\u0027federated\u0027] \u003d ["},{"line_number":324,"context_line":"            {"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa31d9ce_6c93855b","line":321,"range":{"start_line":321,"start_character":8,"end_line":321,"end_character":60},"updated":"2017-02-15 22:28:22.000000000","message":"++","commit_id":"c51653a11a66c83c9f30f76d6bcd0befd2de8b4c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                            protocol)"},{"line_number":206,"context_line":"        return idp, protocol"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _create_federated_user(self, fed_dict):"},{"line_number":209,"context_line":"        with sql.session_for_write() as session:"},{"line_number":210,"context_line":"            federated_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":211,"context_line":"            session.add(federated_ref)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def setUp(self):"},{"line_number":214,"context_line":"        super(TestUserWithFederatedUser, self).setUp()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_c52fcdf4","line":211,"range":{"start_line":208,"start_character":4,"end_line":211,"end_character":38},"updated":"2017-02-28 17:02:21.000000000","message":"why now user shadows users to create the federated user:\nself.shadow_users_api.create_federated_user(...)","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                            protocol)"},{"line_number":206,"context_line":"        return idp, protocol"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _create_federated_user(self, fed_dict):"},{"line_number":209,"context_line":"        with sql.session_for_write() as session:"},{"line_number":210,"context_line":"            federated_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":211,"context_line":"            session.add(federated_ref)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def setUp(self):"},{"line_number":214,"context_line":"        super(TestUserWithFederatedUser, self).setUp()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_1eb932ea","line":211,"range":{"start_line":208,"start_character":4,"end_line":211,"end_character":38},"in_reply_to":"ba2be162_88908cee","updated":"2017-03-01 07:09:42.000000000","message":"used the backend method I had already created ``create_fedeated_object`` in shadow backend. The reason I originally did not use the create_federated_user was because it creates its own user with a federated user and I hadnt yet created the backend method that created a federated user that was associated with a valid user_id at the time.","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9a112d2a621a0d9d40773aa441b3c469d884335c","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                            protocol)"},{"line_number":206,"context_line":"        return idp, protocol"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _create_federated_user(self, fed_dict):"},{"line_number":209,"context_line":"        with sql.session_for_write() as session:"},{"line_number":210,"context_line":"            federated_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":211,"context_line":"            session.add(federated_ref)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def setUp(self):"},{"line_number":214,"context_line":"        super(TestUserWithFederatedUser, self).setUp()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_88908cee","line":211,"range":{"start_line":208,"start_character":4,"end_line":211,"end_character":38},"in_reply_to":"ba2be162_c52fcdf4","updated":"2017-02-28 17:03:48.000000000","message":"*why not use","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                                            protocol)"},{"line_number":206,"context_line":"        return idp, protocol"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"    def _create_federated_user(self, fed_dict):"},{"line_number":209,"context_line":"        with sql.session_for_write() as session:"},{"line_number":210,"context_line":"            federated_ref \u003d model.FederatedUser.from_dict(fed_dict)"},{"line_number":211,"context_line":"            session.add(federated_ref)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def setUp(self):"},{"line_number":214,"context_line":"        super(TestUserWithFederatedUser, self).setUp()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_5e92ca58","line":211,"range":{"start_line":208,"start_character":4,"end_line":211,"end_character":38},"in_reply_to":"ba2be162_c52fcdf4","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":237,"context_line":"        self.assertEqual(1, len(user_ref[\u0027federated\u0027]))"},{"line_number":238,"context_line":"        # Verify that all federated attributes are present"},{"line_number":239,"context_line":"        for fed_obj in user_ref[\u0027federated\u0027]:"},{"line_number":240,"context_line":"            self.assertTrue(\u0027idp_id\u0027 in fed_obj)"},{"line_number":241,"context_line":"            self.assertEqual(self.fed_dict[\u0027idp_id\u0027], fed_obj[\u0027idp_id\u0027])"},{"line_number":242,"context_line":"            self.assertTrue(\u0027protocols\u0027 in fed_obj)"},{"line_number":243,"context_line":"            self.assertTrue(\u0027protocol_id\u0027 in fed_obj[\u0027protocols\u0027][0])"},{"line_number":244,"context_line":"            self.assertEqual(self.fed_dict[\u0027protocol_id\u0027],"},{"line_number":245,"context_line":"                             fed_obj[\u0027protocols\u0027][0][\u0027protocol_id\u0027])"},{"line_number":246,"context_line":"            self.assertTrue(\u0027unique_id\u0027 in fed_obj[\u0027protocols\u0027][0])"},{"line_number":247,"context_line":"            self.assertEqual(self.fed_dict[\u0027unique_id\u0027],"},{"line_number":248,"context_line":"                             fed_obj[\u0027protocols\u0027][0][\u0027unique_id\u0027])"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        # use the same user to add another associated federated object and test"},{"line_number":251,"context_line":"        # the backend method directly. It should now contain two federated"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_05ed658b","line":248,"range":{"start_line":240,"start_character":12,"end_line":248,"end_character":66},"updated":"2017-02-28 17:02:21.000000000","message":"Perhaps a new assert method assertFederatedUserDict(...). You could then reuse below.","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            self.assertEqual(self.fed_dict[\u0027unique_id\u0027],"},{"line_number":248,"context_line":"                             fed_obj[\u0027protocols\u0027][0][\u0027unique_id\u0027])"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        # use the same user to add another associated federated object and test"},{"line_number":251,"context_line":"        # the backend method directly. It should now contain two federated"},{"line_number":252,"context_line":"        # objects instead of one."},{"line_number":253,"context_line":"        federated_dict \u003d unit.new_federated_user_ref()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_650381b9","line":250,"range":{"start_line":250,"start_character":10,"end_line":250,"end_character":11},"updated":"2017-02-28 17:02:21.000000000","message":"nit: upper case U to be consistent with your other comments","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            self.assertEqual(self.fed_dict[\u0027unique_id\u0027],"},{"line_number":248,"context_line":"                             fed_obj[\u0027protocols\u0027][0][\u0027unique_id\u0027])"},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"        # use the same user to add another associated federated object and test"},{"line_number":251,"context_line":"        # the backend method directly. It should now contain two federated"},{"line_number":252,"context_line":"        # objects instead of one."},{"line_number":253,"context_line":"        federated_dict \u003d unit.new_federated_user_ref()"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_3ea356a0","line":250,"range":{"start_line":250,"start_character":10,"end_line":250,"end_character":11},"in_reply_to":"ba2be162_650381b9","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        # objects instead of one."},{"line_number":253,"context_line":"        federated_dict \u003d unit.new_federated_user_ref()"},{"line_number":254,"context_line":"        federated_dict[\u0027user_id\u0027] \u003d self.user[\u0027id\u0027]"},{"line_number":255,"context_line":"        self._create_federated_user(federated_dict)"},{"line_number":256,"context_line":"        user_ref \u003d self.shadow_users_api.get_user_federated_objects("},{"line_number":257,"context_line":"            self.user[\u0027id\u0027])"},{"line_number":258,"context_line":"        self.assertEqual(2, len(user_ref))"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_a562d914","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":51},"updated":"2017-02-28 17:02:21.000000000","message":"Why not use your new shadow methods to create the federated object:\nself.shadow_users_api.create_user_federated_attribute(...)","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        # objects instead of one."},{"line_number":253,"context_line":"        federated_dict \u003d unit.new_federated_user_ref()"},{"line_number":254,"context_line":"        federated_dict[\u0027user_id\u0027] \u003d self.user[\u0027id\u0027]"},{"line_number":255,"context_line":"        self._create_federated_user(federated_dict)"},{"line_number":256,"context_line":"        user_ref \u003d self.shadow_users_api.get_user_federated_objects("},{"line_number":257,"context_line":"            self.user[\u0027id\u0027])"},{"line_number":258,"context_line":"        self.assertEqual(2, len(user_ref))"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_1e9e9256","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":51},"in_reply_to":"ba2be162_a562d914","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        self._create_federated_user(federated_dict)"},{"line_number":256,"context_line":"        user_ref \u003d self.shadow_users_api.get_user_federated_objects("},{"line_number":257,"context_line":"            self.user[\u0027id\u0027])"},{"line_number":258,"context_line":"        self.assertEqual(2, len(user_ref))"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        # Create a new user without federated object and verify that federated"},{"line_number":261,"context_line":"        # object is still returned but that it is an empty list"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_a59499e8","line":258,"range":{"start_line":258,"start_character":8,"end_line":258,"end_character":42},"updated":"2017-02-28 17:02:21.000000000","message":"you could also validate the attributes for the second federated object","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":255,"context_line":"        self._create_federated_user(federated_dict)"},{"line_number":256,"context_line":"        user_ref \u003d self.shadow_users_api.get_user_federated_objects("},{"line_number":257,"context_line":"            self.user[\u0027id\u0027])"},{"line_number":258,"context_line":"        self.assertEqual(2, len(user_ref))"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"        # Create a new user without federated object and verify that federated"},{"line_number":261,"context_line":"        # object is still returned but that it is an empty list"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_eddbc119","line":258,"range":{"start_line":258,"start_character":8,"end_line":258,"end_character":42},"in_reply_to":"ba2be162_a59499e8","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                          self.shadow_users_api.get_federated_user,"},{"line_number":309,"context_line":"                          self.idp[\u0027id\u0027],"},{"line_number":310,"context_line":"                          self.protocol[\u0027id\u0027],"},{"line_number":311,"context_line":"                          \u0027ravelar\u0027)"},{"line_number":312,"context_line":"        ref \u003d self.identity_api.create_user(user)"},{"line_number":313,"context_line":"        # Test that the user and federated object now exists"},{"line_number":314,"context_line":"        self.assertEqual(user[\u0027name\u0027], ref[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_e81f4859","line":311,"range":{"start_line":311,"start_character":26,"end_line":311,"end_character":35},"updated":"2017-02-28 17:02:21.000000000","message":"assign to a variable","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                          self.shadow_users_api.get_federated_user,"},{"line_number":309,"context_line":"                          self.idp[\u0027id\u0027],"},{"line_number":310,"context_line":"                          self.protocol[\u0027id\u0027],"},{"line_number":311,"context_line":"                          \u0027ravelar\u0027)"},{"line_number":312,"context_line":"        ref \u003d self.identity_api.create_user(user)"},{"line_number":313,"context_line":"        # Test that the user and federated object now exists"},{"line_number":314,"context_line":"        self.assertEqual(user[\u0027name\u0027], ref[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_be490691","line":311,"range":{"start_line":311,"start_character":26,"end_line":311,"end_character":35},"in_reply_to":"ba2be162_e81f4859","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        user2[\u0027name\u0027] \u003d \"James Smith\""},{"line_number":360,"context_line":"        del user2[\u0027federated\u0027]"},{"line_number":361,"context_line":"        user2 \u003d self.identity_api.update_user(user2[\u0027id\u0027], user2)"},{"line_number":362,"context_line":"        self.assertTrue(\u0027federated\u0027 in user2)"},{"line_number":363,"context_line":"        self.assertEqual(user2[\u0027federated\u0027][0][\u0027idp_id\u0027],"},{"line_number":364,"context_line":"                         self.fed_dict[\u0027idp_id\u0027])"},{"line_number":365,"context_line":"        self.assertEqual(user2[\u0027federated\u0027][0][\u0027protocols\u0027][0][\u0027protocol_id\u0027],"},{"line_number":366,"context_line":"                         self.fed_dict[\u0027protocol_id\u0027])"},{"line_number":367,"context_line":"        self.assertEqual(user2[\u0027federated\u0027][0][\u0027protocols\u0027][0][\u0027unique_id\u0027],"},{"line_number":368,"context_line":"                         self.fed_dict[\u0027unique_id\u0027])"},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"        # Test that update user can replace a users federated objects if added"},{"line_number":371,"context_line":"        # in the request and that its response is that new federated objects"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_4893f4a3","line":368,"range":{"start_line":362,"start_character":8,"end_line":368,"end_character":52},"updated":"2017-02-28 17:02:21.000000000","message":"assertFederatedUserDict(...)","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":382,"context_line":"        ]"},{"line_number":383,"context_line":"        user2[\u0027federated\u0027] \u003d new_fed"},{"line_number":384,"context_line":"        user2 \u003d self.identity_api.update_user(user2[\u0027id\u0027], user2)"},{"line_number":385,"context_line":"        self.assertTrue(\u0027federated\u0027 in user2)"},{"line_number":386,"context_line":"        self.assertEqual(user2[\u0027federated\u0027][0][\u0027idp_id\u0027],"},{"line_number":387,"context_line":"                         new_fed[0][\u0027idp_id\u0027])"},{"line_number":388,"context_line":"        self.assertEqual(user2[\u0027federated\u0027][0][\u0027protocols\u0027][0][\u0027protocol_id\u0027],"},{"line_number":389,"context_line":"                         new_fed[0][\u0027protocols\u0027][0][\u0027protocol_id\u0027])"},{"line_number":390,"context_line":"        self.assertEqual(user2[\u0027federated\u0027][0][\u0027protocols\u0027][0][\u0027unique_id\u0027],"},{"line_number":391,"context_line":"                         new_fed[0][\u0027protocols\u0027][0][\u0027unique_id\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_48acd4ed","line":391,"range":{"start_line":385,"start_character":8,"end_line":391,"end_character":65},"updated":"2017-02-28 17:02:21.000000000","message":"assertFederatedUserDict(...)","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":206,"context_line":"    def setUp(self):"},{"line_number":207,"context_line":"        super(TestUserWithFederatedUser, self).setUp()"},{"line_number":208,"context_line":"        self.useFixture(database.Database())"},{"line_number":209,"context_line":"        self.load_backends()"},{"line_number":210,"context_line":"        # Create user"},{"line_number":211,"context_line":"        self.domain \u003d unit.new_domain_ref()"},{"line_number":212,"context_line":"        self.domain \u003d self.resource_api.create_domain(self.domain[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_375b3f89","line":209,"updated":"2017-03-01 20:40:36.000000000","message":"Interesting, I would have expected these steps to be taken care of when we call .setUp() from the parent classes.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.fed_dict \u003d unit.new_federated_user_ref()"},{"line_number":219,"context_line":"        self.fed_dict[\u0027idp_id\u0027] \u003d self.idp[\u0027id\u0027]"},{"line_number":220,"context_line":"        self.fed_dict[\u0027protocol_id\u0027] \u003d self.protocol[\u0027id\u0027]"},{"line_number":221,"context_line":"        self.fed_dict[\u0027unique_id\u0027] \u003d \"jdoe\""},{"line_number":222,"context_line":"        self.fed_dict[\u0027user_id\u0027] \u003d self.user[\u0027id\u0027]"},{"line_number":223,"context_line":"        self.shadow_users_api.create_federated_object(self.fed_dict)"},{"line_number":224,"context_line":"        self.fed_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_7703f742","line":221,"updated":"2017-03-01 20:40:36.000000000","message":"nit: use single quotes or double quotes consistently.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        self.fed_dict \u003d unit.new_federated_user_ref()"},{"line_number":219,"context_line":"        self.fed_dict[\u0027idp_id\u0027] \u003d self.idp[\u0027id\u0027]"},{"line_number":220,"context_line":"        self.fed_dict[\u0027protocol_id\u0027] \u003d self.protocol[\u0027id\u0027]"},{"line_number":221,"context_line":"        self.fed_dict[\u0027unique_id\u0027] \u003d \"jdoe\""},{"line_number":222,"context_line":"        self.fed_dict[\u0027user_id\u0027] \u003d self.user[\u0027id\u0027]"},{"line_number":223,"context_line":"        self.shadow_users_api.create_federated_object(self.fed_dict)"},{"line_number":224,"context_line":"        self.fed_dict \u003d {"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_82682489","line":221,"in_reply_to":"ba2be162_7703f742","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        baduser \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":264,"context_line":"        baduser[\u0027federated\u0027] \u003d ["},{"line_number":265,"context_line":"            {"},{"line_number":266,"context_line":"                \u0027idp_id\u0027: \"fakeidp\","},{"line_number":267,"context_line":"                \u0027protocols\u0027: ["},{"line_number":268,"context_line":"                    {"},{"line_number":269,"context_line":"                        \u0027protocol_id\u0027: \"nonexistent\","}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_777857c5","line":266,"updated":"2017-03-01 20:40:36.000000000","message":"nit: user single quotes or double quotes consistently.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        baduser \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":264,"context_line":"        baduser[\u0027federated\u0027] \u003d ["},{"line_number":265,"context_line":"            {"},{"line_number":266,"context_line":"                \u0027idp_id\u0027: \"fakeidp\","},{"line_number":267,"context_line":"                \u0027protocols\u0027: ["},{"line_number":268,"context_line":"                    {"},{"line_number":269,"context_line":"                        \u0027protocol_id\u0027: \"nonexistent\","}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_a20528c3","line":266,"in_reply_to":"ba2be162_777857c5","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":266,"context_line":"                \u0027idp_id\u0027: \"fakeidp\","},{"line_number":267,"context_line":"                \u0027protocols\u0027: ["},{"line_number":268,"context_line":"                    {"},{"line_number":269,"context_line":"                        \u0027protocol_id\u0027: \"nonexistent\","},{"line_number":270,"context_line":"                        \u0027unique_id\u0027: \u0027unknown\u0027"},{"line_number":271,"context_line":"                    }"},{"line_number":272,"context_line":"                ]"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_b782cf92","line":269,"updated":"2017-03-01 20:40:36.000000000","message":"same comment here","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":266,"context_line":"                \u0027idp_id\u0027: \"fakeidp\","},{"line_number":267,"context_line":"                \u0027protocols\u0027: ["},{"line_number":268,"context_line":"                    {"},{"line_number":269,"context_line":"                        \u0027protocol_id\u0027: \"nonexistent\","},{"line_number":270,"context_line":"                        \u0027unique_id\u0027: \u0027unknown\u0027"},{"line_number":271,"context_line":"                    }"},{"line_number":272,"context_line":"                ]"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_c2085cdc","line":269,"in_reply_to":"ba2be162_b782cf92","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def test_create_user_with_federated_attributes(self):"},{"line_number":287,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":288,"context_line":"        unique_id \u003d \u0027ravelar\u0027"},{"line_number":289,"context_line":"        user[\u0027federated\u0027] \u003d ["},{"line_number":290,"context_line":"            {"},{"line_number":291,"context_line":"                \u0027idp_id\u0027: self.idp[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_573fd3d5","line":288,"updated":"2017-03-01 20:40:36.000000000","message":"For cases like there we typically stick to using uuids\n\n  unique_id \u003d uuid.uuid4().hex\n\nWhich we can still use in assertions later since we have it in a variable.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def test_create_user_with_federated_attributes(self):"},{"line_number":287,"context_line":"        user \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":288,"context_line":"        unique_id \u003d \u0027ravelar\u0027"},{"line_number":289,"context_line":"        user[\u0027federated\u0027] \u003d ["},{"line_number":290,"context_line":"            {"},{"line_number":291,"context_line":"                \u0027idp_id\u0027: self.idp[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_a22c484b","line":288,"in_reply_to":"ba2be162_573fd3d5","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        # Test that there are no current federated_users that match our users"},{"line_number":301,"context_line":"        # federated object and create the user"},{"line_number":302,"context_line":"        self.assertRaises(exception.UserNotFound,"},{"line_number":303,"context_line":"                          self.shadow_users_api.get_federated_user,"},{"line_number":304,"context_line":"                          self.idp[\u0027id\u0027],"},{"line_number":305,"context_line":"                          self.protocol[\u0027id\u0027],"},{"line_number":306,"context_line":"                          unique_id)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_faffcefe","line":303,"updated":"2017-03-01 20:40:36.000000000","message":"We could also pass this into the identity API too. Or we could make .get() calling the entire flow from the router -\u003e controller -\u003e manager and so on.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":312,"context_line":"            self.idp[\u0027id\u0027],"},{"line_number":313,"context_line":"            self.protocol[\u0027id\u0027],"},{"line_number":314,"context_line":"            unique_id)"},{"line_number":315,"context_line":"        self.assertIsNotNone(fed_user)"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    def test_update_user_with_invalid_idp_and_protocol_fails(self):"},{"line_number":318,"context_line":"        baduser \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_3a588632","line":315,"updated":"2017-03-01 20:40:36.000000000","message":"We could make this assertion stronger by ensuring the values we get back from the API are what we expect them to be.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        baduser \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":319,"context_line":"        baduser[\u0027federated\u0027] \u003d ["},{"line_number":320,"context_line":"            {"},{"line_number":321,"context_line":"                \u0027idp_id\u0027: \"fakeidp\","},{"line_number":322,"context_line":"                \u0027protocols\u0027: ["},{"line_number":323,"context_line":"                    {"},{"line_number":324,"context_line":"                        \u0027protocol_id\u0027: \"nonexistent\","}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_3745ff6f","line":321,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here as above.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":318,"context_line":"        baduser \u003d unit.new_user_ref(domain_id\u003dself.domain[\u0027id\u0027])"},{"line_number":319,"context_line":"        baduser[\u0027federated\u0027] \u003d ["},{"line_number":320,"context_line":"            {"},{"line_number":321,"context_line":"                \u0027idp_id\u0027: \"fakeidp\","},{"line_number":322,"context_line":"                \u0027protocols\u0027: ["},{"line_number":323,"context_line":"                    {"},{"line_number":324,"context_line":"                        \u0027protocol_id\u0027: \"nonexistent\","}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_0286f412","line":321,"in_reply_to":"ba2be162_3745ff6f","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":321,"context_line":"                \u0027idp_id\u0027: \"fakeidp\","},{"line_number":322,"context_line":"                \u0027protocols\u0027: ["},{"line_number":323,"context_line":"                    {"},{"line_number":324,"context_line":"                        \u0027protocol_id\u0027: \"nonexistent\","},{"line_number":325,"context_line":"                        \u0027unique_id\u0027: \u0027unknown\u0027"},{"line_number":326,"context_line":"                    }"},{"line_number":327,"context_line":"                ]"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_775f7741","line":324,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here as above.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":321,"context_line":"                \u0027idp_id\u0027: \"fakeidp\","},{"line_number":322,"context_line":"                \u0027protocols\u0027: ["},{"line_number":323,"context_line":"                    {"},{"line_number":324,"context_line":"                        \u0027protocol_id\u0027: \"nonexistent\","},{"line_number":325,"context_line":"                        \u0027unique_id\u0027: \u0027unknown\u0027"},{"line_number":326,"context_line":"                    }"},{"line_number":327,"context_line":"                ]"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_227db81c","line":324,"in_reply_to":"ba2be162_775f7741","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        user \u003d self.identity_api.create_user(user)"},{"line_number":345,"context_line":"        del user[\u0027federated\u0027]"},{"line_number":346,"context_line":"        self.assertTrue(\u0027federated\u0027 not in user)"},{"line_number":347,"context_line":"        user[\u0027name\u0027] \u003d \"James Doe\""},{"line_number":348,"context_line":"        user \u003d self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":349,"context_line":"        self.assertTrue(\u0027federated\u0027 in user)"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_1aed8225","line":347,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here as above.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        user \u003d self.identity_api.create_user(user)"},{"line_number":345,"context_line":"        del user[\u0027federated\u0027]"},{"line_number":346,"context_line":"        self.assertTrue(\u0027federated\u0027 not in user)"},{"line_number":347,"context_line":"        user[\u0027name\u0027] \u003d \"James Doe\""},{"line_number":348,"context_line":"        user \u003d self.identity_api.update_user(user[\u0027id\u0027], user)"},{"line_number":349,"context_line":"        self.assertTrue(\u0027federated\u0027 in user)"},{"line_number":350,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_4278ec2b","line":347,"in_reply_to":"ba2be162_1aed8225","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        # Test that update user can return a federated object with the user as"},{"line_number":352,"context_line":"        # a response if the user has any"},{"line_number":353,"context_line":"        user2 \u003d self.identity_api.get_user(self.user[\u0027id\u0027])"},{"line_number":354,"context_line":"        user2[\u0027name\u0027] \u003d \"James Smith\""},{"line_number":355,"context_line":"        del user2[\u0027federated\u0027]"},{"line_number":356,"context_line":"        user2 \u003d self.identity_api.update_user(user2[\u0027id\u0027], user2)"},{"line_number":357,"context_line":"        self.assertTrue(\u0027federated\u0027 in user2)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_9ad97286","line":354,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here as above.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":351,"context_line":"        # Test that update user can return a federated object with the user as"},{"line_number":352,"context_line":"        # a response if the user has any"},{"line_number":353,"context_line":"        user2 \u003d self.identity_api.get_user(self.user[\u0027id\u0027])"},{"line_number":354,"context_line":"        user2[\u0027name\u0027] \u003d \"James Smith\""},{"line_number":355,"context_line":"        del user2[\u0027federated\u0027]"},{"line_number":356,"context_line":"        user2 \u003d self.identity_api.update_user(user2[\u0027id\u0027], user2)"},{"line_number":357,"context_line":"        self.assertTrue(\u0027federated\u0027 in user2)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_6277b03a","line":354,"in_reply_to":"ba2be162_9ad97286","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                \u0027protocols\u0027: ["},{"line_number":366,"context_line":"                    {"},{"line_number":367,"context_line":"                        \u0027protocol_id\u0027: self.protocol[\u0027id\u0027],"},{"line_number":368,"context_line":"                        \u0027unique_id\u0027: \u0027ravelar\u0027"},{"line_number":369,"context_line":"                    }"},{"line_number":370,"context_line":"                ]"},{"line_number":371,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_bae8f611","line":368,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here as above.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":365,"context_line":"                \u0027protocols\u0027: ["},{"line_number":366,"context_line":"                    {"},{"line_number":367,"context_line":"                        \u0027protocol_id\u0027: self.protocol[\u0027id\u0027],"},{"line_number":368,"context_line":"                        \u0027unique_id\u0027: \u0027ravelar\u0027"},{"line_number":369,"context_line":"                    }"},{"line_number":370,"context_line":"                ]"},{"line_number":371,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_c2b93ccd","line":368,"in_reply_to":"ba2be162_bae8f611","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"7af90f4e7955147d7eb4970dc3dfb168f1da9cbb","unresolved":false,"context_lines":[{"line_number":373,"context_line":"        user2[\u0027federated\u0027] \u003d new_fed"},{"line_number":374,"context_line":"        user2 \u003d self.identity_api.update_user(user2[\u0027id\u0027], user2)"},{"line_number":375,"context_line":"        self.assertTrue(\u0027federated\u0027 in user2)"},{"line_number":376,"context_line":"        self.assertEqual(user2[\u0027federated\u0027][0], new_fed[0])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_5a729aae","line":376,"range":{"start_line":376,"start_character":8,"end_line":376,"end_character":59},"updated":"2017-03-01 20:49:23.000000000","message":"This isn\u0027t entirely testing replace, but only the first element of the federated array. Remove the indices or check the length also.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":373,"context_line":"        user2[\u0027federated\u0027] \u003d new_fed"},{"line_number":374,"context_line":"        user2 \u003d self.identity_api.update_user(user2[\u0027id\u0027], user2)"},{"line_number":375,"context_line":"        self.assertTrue(\u0027federated\u0027 in user2)"},{"line_number":376,"context_line":"        self.assertEqual(user2[\u0027federated\u0027][0], new_fed[0])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_a2b608da","line":376,"range":{"start_line":376,"start_character":8,"end_line":376,"end_character":59},"in_reply_to":"ba2be162_5a729aae","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"}],"keystone/tests/unit/test_v3_identity.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"3f640a051fe6d7efccdf28795a0a1c7d6564193a","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"        attribute \u003d [\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027]"},{"line_number":1152,"context_line":"        self._test_list_users_with_federated_parameter(attribute)"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"    def test_get_user_includes_required_federated_attributes(self):"},{"line_number":1155,"context_line":"        user \u003d self.identity_api.get_user(self.fed_user[\u0027id\u0027])"},{"line_number":1156,"context_line":"        self.assertIn(\u0027federated\u0027, user)"},{"line_number":1157,"context_line":"        self.assertIn(\u0027idp_id\u0027, user[\u0027federated\u0027][0])"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_c186bdb8","line":1154,"range":{"start_line":1154,"start_character":4,"end_line":1154,"end_character":7},"updated":"2017-02-10 16:52:14.000000000","message":"Suggest adding tests when creating/updating a federated object with an invalid idp, protocol_id","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"01eff73a1e95fcbce6265615e832e8cdba2eedbf","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"        attribute \u003d [\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027]"},{"line_number":1152,"context_line":"        self._test_list_users_with_federated_parameter(attribute)"},{"line_number":1153,"context_line":""},{"line_number":1154,"context_line":"    def test_get_user_includes_required_federated_attributes(self):"},{"line_number":1155,"context_line":"        user \u003d self.identity_api.get_user(self.fed_user[\u0027id\u0027])"},{"line_number":1156,"context_line":"        self.assertIn(\u0027federated\u0027, user)"},{"line_number":1157,"context_line":"        self.assertIn(\u0027idp_id\u0027, user[\u0027federated\u0027][0])"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa31d9ce_d91b8dc8","line":1154,"range":{"start_line":1154,"start_character":4,"end_line":1154,"end_character":7},"in_reply_to":"fa31d9ce_c186bdb8","updated":"2017-02-14 20:23:59.000000000","message":"Agreed! Added the new tests to identity/test_core","commit_id":"c1b04a8ce24c0e4c3805ab47de5906c78d60be2d"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"        self.post(\u0027/users\u0027, body\u003d{\u0027user\u0027: ref}, token\u003dself.get_admin_token(),"},{"line_number":1271,"context_line":"                  expected_status\u003dhttp_client.CREATED)"},{"line_number":1272,"context_line":""},{"line_number":1273,"context_line":"    def test_update_user_with_federated_attributes(self):"},{"line_number":1274,"context_line":"        \"\"\"Call ``PATCH /users/{user_id}``.\"\"\""},{"line_number":1275,"context_line":"        user \u003d self.fed_user.copy()"},{"line_number":1276,"context_line":"        del user[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_6b2724ca","line":1273,"range":{"start_line":1273,"start_character":8,"end_line":1273,"end_character":50},"updated":"2017-02-14 21:07:47.000000000","message":"I think we should test the federated validation here is well; ensure it returns the correct response.","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"        self.post(\u0027/users\u0027, body\u003d{\u0027user\u0027: ref}, token\u003dself.get_admin_token(),"},{"line_number":1271,"context_line":"                  expected_status\u003dhttp_client.CREATED)"},{"line_number":1272,"context_line":""},{"line_number":1273,"context_line":"    def test_update_user_with_federated_attributes(self):"},{"line_number":1274,"context_line":"        \"\"\"Call ``PATCH /users/{user_id}``.\"\"\""},{"line_number":1275,"context_line":"        user \u003d self.fed_user.copy()"},{"line_number":1276,"context_line":"        del user[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa31d9ce_4d11695c","line":1273,"range":{"start_line":1273,"start_character":8,"end_line":1273,"end_character":50},"in_reply_to":"fa31d9ce_6b2724ca","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c6d3116148e5b8d20c4e866012fce049ede0c038","unresolved":false,"context_lines":[{"line_number":1304,"context_line":"        self.assertEqual(user[\u0027federated\u0027], resp_user[\u0027federated\u0027])"},{"line_number":1305,"context_line":"        self.assertValidUserResponse(r, user)"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"        # Check we get the correct reponse for invalid idps and protocols"},{"line_number":1308,"context_line":"        user[\u0027federated\u0027][0][\u0027idp_id\u0027] \u003d \u0027fakeidp\u0027"},{"line_number":1309,"context_line":"        self.post(\u0027/users\u0027, body\u003d{\u0027user\u0027: user}, token\u003dself.get_admin_token(),"},{"line_number":1310,"context_line":"                  expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1311,"context_line":"        user[\u0027federated\u0027][0][\u0027idp_id\u0027] \u003d idp[\u0027id\u0027]"},{"line_number":1312,"context_line":"        user[\u0027federated\u0027][0][\u0027protocols\u0027][0][\u0027protocol_id\u0027] \u003d \u0027fakeprotocol_id\u0027"},{"line_number":1313,"context_line":"        self.post(\u0027/users\u0027, body\u003d{\u0027user\u0027: user}, token\u003dself.get_admin_token(),"},{"line_number":1314,"context_line":"                  expected_status\u003dhttp_client.NOT_FOUND)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_686b78b7","line":1314,"range":{"start_line":1307,"start_character":8,"end_line":1314,"end_character":56},"updated":"2017-02-15 19:11:01.000000000","message":"You should make this a separate test","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bfd31e751d736a03c177ed594aa1983ef7f0c4bf","unresolved":false,"context_lines":[{"line_number":1304,"context_line":"        self.assertEqual(user[\u0027federated\u0027], resp_user[\u0027federated\u0027])"},{"line_number":1305,"context_line":"        self.assertValidUserResponse(r, user)"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"        # Check we get the correct reponse for invalid idps and protocols"},{"line_number":1308,"context_line":"        user[\u0027federated\u0027][0][\u0027idp_id\u0027] \u003d \u0027fakeidp\u0027"},{"line_number":1309,"context_line":"        self.post(\u0027/users\u0027, body\u003d{\u0027user\u0027: user}, token\u003dself.get_admin_token(),"},{"line_number":1310,"context_line":"                  expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":1311,"context_line":"        user[\u0027federated\u0027][0][\u0027idp_id\u0027] \u003d idp[\u0027id\u0027]"},{"line_number":1312,"context_line":"        user[\u0027federated\u0027][0][\u0027protocols\u0027][0][\u0027protocol_id\u0027] \u003d \u0027fakeprotocol_id\u0027"},{"line_number":1313,"context_line":"        self.post(\u0027/users\u0027, body\u003d{\u0027user\u0027: user}, token\u003dself.get_admin_token(),"},{"line_number":1314,"context_line":"                  expected_status\u003dhttp_client.NOT_FOUND)"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_74d431eb","line":1314,"range":{"start_line":1307,"start_character":8,"end_line":1314,"end_character":56},"in_reply_to":"fa31d9ce_686b78b7","updated":"2017-02-15 20:59:58.000000000","message":"Done","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":1254,"context_line":"        self.assertEqual(user[\u0027federated\u0027], ref[\u0027federated\u0027])"},{"line_number":1255,"context_line":"        self.assertValidUserResponse(r, ref)"},{"line_number":1256,"context_line":""},{"line_number":1257,"context_line":"        idp, protocol \u003d self._create_federated_attributes()"},{"line_number":1258,"context_line":"        ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id)"},{"line_number":1259,"context_line":"        ref[\u0027federated\u0027] \u003d ["},{"line_number":1260,"context_line":"            {"},{"line_number":1261,"context_line":"                \u0027idp_id\u0027: idp[\u0027id\u0027],"},{"line_number":1262,"context_line":"                \u0027protocols\u0027: ["},{"line_number":1263,"context_line":"                    {"},{"line_number":1264,"context_line":"                        \u0027protocol_id\u0027: protocol[\u0027id\u0027],"},{"line_number":1265,"context_line":"                        \u0027unique_id\u0027: \u0027jdoe\u0027"},{"line_number":1266,"context_line":"                    }"},{"line_number":1267,"context_line":"                ]"},{"line_number":1268,"context_line":"            }"},{"line_number":1269,"context_line":"        ]"},{"line_number":1270,"context_line":"        self.post(\u0027/users\u0027, body\u003d{\u0027user\u0027: ref}, token\u003dself.get_admin_token(),"},{"line_number":1271,"context_line":"                  expected_status\u003dhttp_client.CREATED)"},{"line_number":1272,"context_line":""},{"line_number":1273,"context_line":"    def test_create_user_fails_when_given_invalid_idp_and_protocols(self):"},{"line_number":1274,"context_line":"        \"\"\"Call ``POST /users``.\"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_48e4d40c","line":1271,"range":{"start_line":1257,"start_character":8,"end_line":1271,"end_character":54},"updated":"2017-02-28 17:02:21.000000000","message":"What\u0027s the point of the second post? It looks like you just did this. Maybe add a comment.","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":1254,"context_line":"        self.assertEqual(user[\u0027federated\u0027], ref[\u0027federated\u0027])"},{"line_number":1255,"context_line":"        self.assertValidUserResponse(r, ref)"},{"line_number":1256,"context_line":""},{"line_number":1257,"context_line":"        idp, protocol \u003d self._create_federated_attributes()"},{"line_number":1258,"context_line":"        ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id)"},{"line_number":1259,"context_line":"        ref[\u0027federated\u0027] \u003d ["},{"line_number":1260,"context_line":"            {"},{"line_number":1261,"context_line":"                \u0027idp_id\u0027: idp[\u0027id\u0027],"},{"line_number":1262,"context_line":"                \u0027protocols\u0027: ["},{"line_number":1263,"context_line":"                    {"},{"line_number":1264,"context_line":"                        \u0027protocol_id\u0027: protocol[\u0027id\u0027],"},{"line_number":1265,"context_line":"                        \u0027unique_id\u0027: \u0027jdoe\u0027"},{"line_number":1266,"context_line":"                    }"},{"line_number":1267,"context_line":"                ]"},{"line_number":1268,"context_line":"            }"},{"line_number":1269,"context_line":"        ]"},{"line_number":1270,"context_line":"        self.post(\u0027/users\u0027, body\u003d{\u0027user\u0027: ref}, token\u003dself.get_admin_token(),"},{"line_number":1271,"context_line":"                  expected_status\u003dhttp_client.CREATED)"},{"line_number":1272,"context_line":""},{"line_number":1273,"context_line":"    def test_create_user_fails_when_given_invalid_idp_and_protocols(self):"},{"line_number":1274,"context_line":"        \"\"\"Call ``POST /users``.\"\"\""}],"source_content_type":"text/x-python","patch_set":22,"id":"ba2be162_d8c15982","line":1271,"range":{"start_line":1257,"start_character":8,"end_line":1271,"end_character":54},"in_reply_to":"ba2be162_48e4d40c","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":1221,"context_line":"        attribute \u003d [\u0027idp_id\u0027, \u0027protocol_id\u0027, \u0027unique_id\u0027]"},{"line_number":1222,"context_line":"        self._test_list_users_with_federated_parameter(attribute)"},{"line_number":1223,"context_line":""},{"line_number":1224,"context_line":"    def test_get_user_includes_required_federated_attributes(self):"},{"line_number":1225,"context_line":"        user \u003d self.identity_api.get_user(self.fed_user[\u0027id\u0027])"},{"line_number":1226,"context_line":"        self.assertIn(\u0027federated\u0027, user)"},{"line_number":1227,"context_line":"        self.assertIn(\u0027idp_id\u0027, user[\u0027federated\u0027][0])"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_7acf5e7f","line":1224,"updated":"2017-03-01 20:40:36.000000000","message":"We have methods very similar to this established in; \n\nhttps://github.com/openstack/keystone/blob/a66d0735b2829c8bdb30f2dc07e4b4400ceddc3b/keystone/tests/unit/test_v3.py#L979\n\n\nWe could add a new one called assertValidFederatedUser","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":1241,"context_line":"                \u0027protocols\u0027: ["},{"line_number":1242,"context_line":"                    {"},{"line_number":1243,"context_line":"                        \u0027protocol_id\u0027: protocol[\u0027id\u0027],"},{"line_number":1244,"context_line":"                        \u0027unique_id\u0027: \u0027ravelar\u0027"},{"line_number":1245,"context_line":"                    }"},{"line_number":1246,"context_line":"                ]"},{"line_number":1247,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_bac9d67a","line":1244,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here as in the previous testing module.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":1241,"context_line":"                \u0027protocols\u0027: ["},{"line_number":1242,"context_line":"                    {"},{"line_number":1243,"context_line":"                        \u0027protocol_id\u0027: protocol[\u0027id\u0027],"},{"line_number":1244,"context_line":"                        \u0027unique_id\u0027: \u0027ravelar\u0027"},{"line_number":1245,"context_line":"                    }"},{"line_number":1246,"context_line":"                ]"},{"line_number":1247,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_a2bc486d","line":1244,"in_reply_to":"ba2be162_bac9d67a","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"7af90f4e7955147d7eb4970dc3dfb168f1da9cbb","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"        r \u003d self.post("},{"line_number":1250,"context_line":"            \u0027/users\u0027,"},{"line_number":1251,"context_line":"            body\u003d{\u0027user\u0027: ref})"},{"line_number":1252,"context_line":"        user \u003d r.result[\u0027user\u0027].copy()"},{"line_number":1253,"context_line":"        self.assertEqual(user[\u0027name\u0027], ref[\u0027name\u0027])"},{"line_number":1254,"context_line":"        self.assertEqual(user[\u0027federated\u0027], ref[\u0027federated\u0027])"},{"line_number":1255,"context_line":"        self.assertValidUserResponse(r, ref)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_b7772f39","line":1252,"range":{"start_line":1252,"start_character":32,"end_line":1252,"end_character":38},"updated":"2017-03-01 20:49:23.000000000","message":"Is this copy really necessary? You\u0027re not modifying the object, just comparing it.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":1255,"context_line":"        self.assertValidUserResponse(r, ref)"},{"line_number":1256,"context_line":""},{"line_number":1257,"context_line":"    def test_create_user_fails_when_given_invalid_idp_and_protocols(self):"},{"line_number":1258,"context_line":"        \"\"\"Call ``POST /users``.\"\"\""},{"line_number":1259,"context_line":"        idp, protocol \u003d self._create_federated_attributes()"},{"line_number":1260,"context_line":"        ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id)"},{"line_number":1261,"context_line":"        ref[\u0027federated\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_5a453a15","line":1258,"updated":"2017-03-01 20:40:36.000000000","message":"nit: I\u0027d update the doc string here to include something about how the expected outcome is some sort of failure.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":1255,"context_line":"        self.assertValidUserResponse(r, ref)"},{"line_number":1256,"context_line":""},{"line_number":1257,"context_line":"    def test_create_user_fails_when_given_invalid_idp_and_protocols(self):"},{"line_number":1258,"context_line":"        \"\"\"Call ``POST /users``.\"\"\""},{"line_number":1259,"context_line":"        idp, protocol \u003d self._create_federated_attributes()"},{"line_number":1260,"context_line":"        ref \u003d unit.new_user_ref(domain_id\u003dself.domain_id)"},{"line_number":1261,"context_line":"        ref[\u0027federated\u0027] \u003d ["}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_02ba746e","line":1258,"in_reply_to":"ba2be162_5a453a15","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":1264,"context_line":"                \u0027protocols\u0027: ["},{"line_number":1265,"context_line":"                    {"},{"line_number":1266,"context_line":"                        \u0027protocol_id\u0027: \u0027fakeprotocol_id\u0027,"},{"line_number":1267,"context_line":"                        \u0027unique_id\u0027: \u0027ravelar\u0027"},{"line_number":1268,"context_line":"                    }"},{"line_number":1269,"context_line":"                ]"},{"line_number":1270,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_dac4ca60","line":1267,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here as in the previous testing module.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":1264,"context_line":"                \u0027protocols\u0027: ["},{"line_number":1265,"context_line":"                    {"},{"line_number":1266,"context_line":"                        \u0027protocol_id\u0027: \u0027fakeprotocol_id\u0027,"},{"line_number":1267,"context_line":"                        \u0027unique_id\u0027: \u0027ravelar\u0027"},{"line_number":1268,"context_line":"                    }"},{"line_number":1269,"context_line":"                ]"},{"line_number":1270,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_22b13890","line":1267,"in_reply_to":"ba2be162_dac4ca60","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":1280,"context_line":"        \"\"\"Call ``PATCH /users/{user_id}``.\"\"\""},{"line_number":1281,"context_line":"        user \u003d self.fed_user.copy()"},{"line_number":1282,"context_line":"        del user[\u0027id\u0027]"},{"line_number":1283,"context_line":"        user[\u0027name\u0027] \u003d \"James Doe\""},{"line_number":1284,"context_line":"        idp, protocol \u003d self._create_federated_attributes()"},{"line_number":1285,"context_line":"        user[\u0027federated\u0027] \u003d ["},{"line_number":1286,"context_line":"            {"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_9a917255","line":1283,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here about single versus double quotes.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":1280,"context_line":"        \"\"\"Call ``PATCH /users/{user_id}``.\"\"\""},{"line_number":1281,"context_line":"        user \u003d self.fed_user.copy()"},{"line_number":1282,"context_line":"        del user[\u0027id\u0027]"},{"line_number":1283,"context_line":"        user[\u0027name\u0027] \u003d \"James Doe\""},{"line_number":1284,"context_line":"        idp, protocol \u003d self._create_federated_attributes()"},{"line_number":1285,"context_line":"        user[\u0027federated\u0027] \u003d ["},{"line_number":1286,"context_line":"            {"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_62ab301e","line":1283,"in_reply_to":"ba2be162_9a917255","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"7af90f4e7955147d7eb4970dc3dfb168f1da9cbb","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"        r \u003d self.patch(\u0027/users/%(user_id)s\u0027 % {"},{"line_number":1297,"context_line":"            \u0027user_id\u0027: self.fed_user[\u0027id\u0027]},"},{"line_number":1298,"context_line":"            body\u003d{\u0027user\u0027: user})"},{"line_number":1299,"context_line":"        resp_user \u003d r.result[\u0027user\u0027].copy()"},{"line_number":1300,"context_line":"        self.assertEqual(user[\u0027name\u0027], resp_user[\u0027name\u0027])"},{"line_number":1301,"context_line":"        self.assertEqual(user[\u0027federated\u0027], resp_user[\u0027federated\u0027])"},{"line_number":1302,"context_line":"        self.assertValidUserResponse(r, user)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_17163ba7","line":1299,"range":{"start_line":1299,"start_character":37,"end_line":1299,"end_character":43},"updated":"2017-03-01 20:49:23.000000000","message":"Again, this seems unnecessary.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"        r \u003d self.patch(\u0027/users/%(user_id)s\u0027 % {"},{"line_number":1297,"context_line":"            \u0027user_id\u0027: self.fed_user[\u0027id\u0027]},"},{"line_number":1298,"context_line":"            body\u003d{\u0027user\u0027: user})"},{"line_number":1299,"context_line":"        resp_user \u003d r.result[\u0027user\u0027].copy()"},{"line_number":1300,"context_line":"        self.assertEqual(user[\u0027name\u0027], resp_user[\u0027name\u0027])"},{"line_number":1301,"context_line":"        self.assertEqual(user[\u0027federated\u0027], resp_user[\u0027federated\u0027])"},{"line_number":1302,"context_line":"        self.assertValidUserResponse(r, user)"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_82a66451","line":1299,"range":{"start_line":1299,"start_character":37,"end_line":1299,"end_character":43},"in_reply_to":"ba2be162_17163ba7","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"aa367c4f9f9b61631d78dab8146a056ce043cda6","unresolved":false,"context_lines":[{"line_number":1311,"context_line":"                \u0027protocols\u0027: ["},{"line_number":1312,"context_line":"                    {"},{"line_number":1313,"context_line":"                        \u0027protocol_id\u0027: \u0027fakeprotocol_id\u0027,"},{"line_number":1314,"context_line":"                        \u0027unique_id\u0027: \u0027ravelar\u0027"},{"line_number":1315,"context_line":"                    }"},{"line_number":1316,"context_line":"                ]"},{"line_number":1317,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_baae3683","line":1314,"updated":"2017-03-01 20:40:36.000000000","message":"Same comment here as in the previous testing module.","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":1311,"context_line":"                \u0027protocols\u0027: ["},{"line_number":1312,"context_line":"                    {"},{"line_number":1313,"context_line":"                        \u0027protocol_id\u0027: \u0027fakeprotocol_id\u0027,"},{"line_number":1314,"context_line":"                        \u0027unique_id\u0027: \u0027ravelar\u0027"},{"line_number":1315,"context_line":"                    }"},{"line_number":1316,"context_line":"                ]"},{"line_number":1317,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":28,"id":"ba2be162_a55e12e7","line":1314,"in_reply_to":"ba2be162_baae3683","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"}],"releasenotes/notes/create-user-with-federated-user-a0293669f15b659b.yaml":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7056097ef8de31929f1c6385b93f62967f0eb16c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - Adds helper function to allow user to include federated object attribute to"},{"line_number":4,"context_line":"    the user to create federated users along with users in create user API"},{"line_number":5,"context_line":"    (``POST /v3/users/``)."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"fa31d9ce_ee008203","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":24},"updated":"2017-02-14 21:07:47.000000000","message":"Huh? What helper function?","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"a11f806fe8a5c1086e23080aff3345f11d1e780f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - Adds helper function to allow user to include federated object attribute to"},{"line_number":4,"context_line":"    the user to create federated users along with users in create user API"},{"line_number":5,"context_line":"    (``POST /v3/users/``)."}],"source_content_type":"text/x-yaml","patch_set":7,"id":"fa31d9ce_c75458cb","line":3,"range":{"start_line":3,"start_character":4,"end_line":3,"end_character":24},"in_reply_to":"fa31d9ce_ee008203","updated":"2017-02-15 17:56:38.000000000","message":"Done","commit_id":"f39e1773a238ba857dbaff6b295e67222a9eebb3"}],"releasenotes/notes/extending-federated-users-to-the-user-api-71eda9958337b14a.yaml":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c6d3116148e5b8d20c4e866012fce049ede0c038","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a few methods in the shadow_backends. delete_federated_users will"},{"line_number":5,"context_line":"    delete federated objects associated with a user. create_federated_object"},{"line_number":6,"context_line":"    creates a federated user. get_federated_objects will get all federated"},{"line_number":7,"context_line":"    objects that are associated with a user. If you are using a custom backend,"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa31d9ce_684e183c","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":9},"updated":"2017-02-15 19:11:01.000000000","message":"Suggestion: \nAdded new methods to the shadows users backend: ``delete_federated_users``, ``create_federated_object``, ``get_federated_objects``. These methods are needed to support federated attributes via the user API.","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bfd31e751d736a03c177ed594aa1983ef7f0c4bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a few methods in the shadow_backends. delete_federated_users will"},{"line_number":5,"context_line":"    delete federated objects associated with a user. create_federated_object"},{"line_number":6,"context_line":"    creates a federated user. get_federated_objects will get all federated"},{"line_number":7,"context_line":"    objects that are associated with a user. If you are using a custom backend,"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa31d9ce_9424450d","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":9},"in_reply_to":"fa31d9ce_684e183c","updated":"2017-02-15 20:59:58.000000000","message":"Done","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c6d3116148e5b8d20c4e866012fce049ede0c038","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a few methods in the shadow_backends. delete_federated_users will"},{"line_number":5,"context_line":"    delete federated objects associated with a user. create_federated_object"},{"line_number":6,"context_line":"    creates a federated user. get_federated_objects will get all federated"},{"line_number":7,"context_line":"    objects that are associated with a user. If you are using a custom backend,"},{"line_number":8,"context_line":"    then these will be implemented in the shadow_backend/base.py file."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa31d9ce_6898d878","line":7,"range":{"start_line":4,"start_character":48,"end_line":7,"end_character":44},"updated":"2017-02-15 19:11:01.000000000","message":"I think you can take this part out.","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bfd31e751d736a03c177ed594aa1983ef7f0c4bf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added a few methods in the shadow_backends. delete_federated_users will"},{"line_number":5,"context_line":"    delete federated objects associated with a user. create_federated_object"},{"line_number":6,"context_line":"    creates a federated user. get_federated_objects will get all federated"},{"line_number":7,"context_line":"    objects that are associated with a user. If you are using a custom backend,"},{"line_number":8,"context_line":"    then these will be implemented in the shadow_backend/base.py file."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa31d9ce_540e4d8c","line":7,"range":{"start_line":4,"start_character":48,"end_line":7,"end_character":44},"in_reply_to":"fa31d9ce_6898d878","updated":"2017-02-15 20:59:58.000000000","message":"Done","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c6d3116148e5b8d20c4e866012fce049ede0c038","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Added a few methods in the shadow_backends. delete_federated_users will"},{"line_number":5,"context_line":"    delete federated objects associated with a user. create_federated_object"},{"line_number":6,"context_line":"    creates a federated user. get_federated_objects will get all federated"},{"line_number":7,"context_line":"    objects that are associated with a user. If you are using a custom backend,"},{"line_number":8,"context_line":"    then these will be implemented in the shadow_backend/base.py file."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa31d9ce_88f7ccd1","line":8,"range":{"start_line":7,"start_character":45,"end_line":8,"end_character":69},"updated":"2017-02-15 19:11:01.000000000","message":"If you have a custom implementation for the shadow users backend, you will need implement the new methods.","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"bfd31e751d736a03c177ed594aa1983ef7f0c4bf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Added a few methods in the shadow_backends. delete_federated_users will"},{"line_number":5,"context_line":"    delete federated objects associated with a user. create_federated_object"},{"line_number":6,"context_line":"    creates a federated user. get_federated_objects will get all federated"},{"line_number":7,"context_line":"    objects that are associated with a user. If you are using a custom backend,"},{"line_number":8,"context_line":"    then these will be implemented in the shadow_backend/base.py file."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa31d9ce_340b997e","line":8,"range":{"start_line":7,"start_character":45,"end_line":8,"end_character":69},"in_reply_to":"fa31d9ce_88f7ccd1","updated":"2017-02-15 20:59:58.000000000","message":"Done","commit_id":"2226a97a379d3baa0337560a2c834b3f257bae37"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"04b31cba583fcc791708598d75dea4ed46fce4d1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added these new methods to the backends: ``delete_federated_users``,"},{"line_number":5,"context_line":"    ``create_federated_object``, ``get_federated_objects``. These methods are"},{"line_number":6,"context_line":"    needed to support federated attributes via the user API. If you have a"},{"line_number":7,"context_line":"    custom implementation for the shadow users backend, you will need implement"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"da36d5c6_bafd583c","line":4,"updated":"2017-02-21 12:58:56.000000000","message":"This leaves me wondering which backend(s)?","commit_id":"c51653a11a66c83c9f30f76d6bcd0befd2de8b4c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fd23346032a8fa3884e70df5cef46d61a4b0f82c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added these new methods to the backends: ``delete_federated_users``,"},{"line_number":5,"context_line":"    ``create_federated_object``, ``get_federated_objects``. These methods are"},{"line_number":6,"context_line":"    needed to support federated attributes via the user API. If you have a"},{"line_number":7,"context_line":"    custom implementation for the shadow users backend, you will need implement"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"fa31d9ce_ec94d537","line":4,"range":{"start_line":4,"start_character":35,"end_line":4,"end_character":43},"updated":"2017-02-15 22:28:22.000000000","message":"nit: shadow user backend","commit_id":"c51653a11a66c83c9f30f76d6bcd0befd2de8b4c"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6068cf43caf4644f72d0da54088b6f2a9161a0e4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added these new methods to the backends: ``delete_federated_users``,"},{"line_number":5,"context_line":"    ``create_federated_object``, ``get_federated_objects``. These methods are"},{"line_number":6,"context_line":"    needed to support federated attributes via the user API. If you have a"},{"line_number":7,"context_line":"    custom implementation for the shadow users backend, you will need implement"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"fa31d9ce_ec305558","line":4,"range":{"start_line":4,"start_character":35,"end_line":4,"end_character":43},"in_reply_to":"fa31d9ce_ec94d537","updated":"2017-02-15 22:32:01.000000000","message":"Done","commit_id":"c51653a11a66c83c9f30f76d6bcd0befd2de8b4c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"04b31cba583fcc791708598d75dea4ed46fce4d1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Added these new methods to the backends: ``delete_federated_users``,"},{"line_number":5,"context_line":"    ``create_federated_object``, ``get_federated_objects``. These methods are"},{"line_number":6,"context_line":"    needed to support federated attributes via the user API. If you have a"},{"line_number":7,"context_line":"    custom implementation for the shadow users backend, you will need implement"},{"line_number":8,"context_line":"    the new methods."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"da36d5c6_1a990420","line":7,"updated":"2017-02-21 12:58:56.000000000","message":"This sentence should be first so that operators can quickly identify whether this release note applies to them or not, and move on.","commit_id":"c51653a11a66c83c9f30f76d6bcd0befd2de8b4c"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"9f836ced7ad597b720974e7d18e37b1221c8255c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added these new methods to the shadow_users backend:"},{"line_number":5,"context_line":"    ``delete_federated_users``, ``create_federated_object``,"},{"line_number":6,"context_line":"    ``get_federated_objects``. These methods are needed to support federated"},{"line_number":7,"context_line":"    attributes via the user API. If you have a custom implementation for the"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"fa31d9ce_4fb2334d","line":4,"range":{"start_line":4,"start_character":41,"end_line":4,"end_character":42},"updated":"2017-02-16 18:06:39.000000000","message":"nit: either remove the \u0027_\u0027 or add ``shadow_users``","commit_id":"7ed4db28481194429f1899021d6ecc290ec1dd5b"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"2157724260293179921ccac8869b70a1143dea64","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added these new methods to the shadow_users backend:"},{"line_number":5,"context_line":"    ``delete_federated_users``, ``create_federated_object``,"},{"line_number":6,"context_line":"    ``get_federated_objects``. These methods are needed to support federated"},{"line_number":7,"context_line":"    attributes via the user API. If you have a custom implementation for the"}],"source_content_type":"text/x-yaml","patch_set":17,"id":"da36d5c6_6ff9a54d","line":4,"range":{"start_line":4,"start_character":41,"end_line":4,"end_character":42},"in_reply_to":"fa31d9ce_4fb2334d","updated":"2017-02-17 21:50:52.000000000","message":"Done","commit_id":"7ed4db28481194429f1899021d6ecc290ec1dd5b"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"5550aa51fe5d001e2a4ab78b9510267041fa80b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"da36d5c6_a8545754","updated":"2017-02-20 12:04:10.000000000","message":"cite the API change? (the inclusion of the new attribute)","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"f3d91478d1e03da16081614b2ce7af8f484b7e4a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"da36d5c6_6ce021fb","in_reply_to":"da36d5c6_a8545754","updated":"2017-02-23 20:51:18.000000000","message":"Done","commit_id":"2052462a18fda2c4473b89921f1923af7676d998"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `GET /v3/users/{user_id}` returns a federated attribute to show the"},{"line_number":5,"context_line":"    users currenlty associated federated objects. `POST /v3/users` allows an"},{"line_number":6,"context_line":"    operator to add a federated attribute containing a list of federated"},{"line_number":7,"context_line":"    objects to associate with the user. `PATCH /v3/users` allows the operator"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_287c0020","line":4,"range":{"start_line":4,"start_character":50,"end_line":4,"end_character":59},"updated":"2017-02-28 17:02:21.000000000","message":"s/attribute/object","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `GET /v3/users/{user_id}` returns a federated attribute to show the"},{"line_number":5,"context_line":"    users currenlty associated federated objects. `POST /v3/users` allows an"},{"line_number":6,"context_line":"    operator to add a federated attribute containing a list of federated"},{"line_number":7,"context_line":"    objects to associate with the user. `PATCH /v3/users` allows the operator"},{"line_number":8,"context_line":"    to update a users associated federated objects by adding the federated"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_c8ba84c0","line":5,"range":{"start_line":4,"start_character":30,"end_line":5,"end_character":48},"updated":"2017-02-28 17:02:21.000000000","message":"suggestion: \"now returns a federated object associated with the user if any\"","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `GET /v3/users/{user_id}` returns a federated attribute to show the"},{"line_number":5,"context_line":"    users currenlty associated federated objects. `POST /v3/users` allows an"},{"line_number":6,"context_line":"    operator to add a federated attribute containing a list of federated"},{"line_number":7,"context_line":"    objects to associate with the user. `PATCH /v3/users` allows the operator"},{"line_number":8,"context_line":"    to update a users associated federated objects by adding the federated"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_f8553dc6","line":5,"range":{"start_line":4,"start_character":30,"end_line":5,"end_character":48},"in_reply_to":"ba2be162_c8ba84c0","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `GET /v3/users/{user_id}` returns a federated attribute to show the"},{"line_number":5,"context_line":"    users currenlty associated federated objects. `POST /v3/users` allows an"},{"line_number":6,"context_line":"    operator to add a federated attribute containing a list of federated"},{"line_number":7,"context_line":"    objects to associate with the user. `PATCH /v3/users` allows the operator"},{"line_number":8,"context_line":"    to update a users associated federated objects by adding the federated"},{"line_number":9,"context_line":"    attribute to the user object."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_28ca4050","line":6,"range":{"start_line":6,"start_character":32,"end_line":6,"end_character":41},"updated":"2017-02-28 17:02:21.000000000","message":"s/attribute/object","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `GET /v3/users/{user_id}` returns a federated attribute to show the"},{"line_number":5,"context_line":"    users currenlty associated federated objects. `POST /v3/users` allows an"},{"line_number":6,"context_line":"    operator to add a federated attribute containing a list of federated"},{"line_number":7,"context_line":"    objects to associate with the user. `PATCH /v3/users` allows the operator"},{"line_number":8,"context_line":"    to update a users associated federated objects by adding the federated"},{"line_number":9,"context_line":"    attribute to the user object."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_a8039075","line":7,"range":{"start_line":6,"start_character":16,"end_line":7,"end_character":11},"updated":"2017-02-28 17:02:21.000000000","message":"suggestion: \"add a list of federated objects...\"","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    `GET /v3/users/{user_id}` returns a federated attribute to show the"},{"line_number":5,"context_line":"    users currenlty associated federated objects. `POST /v3/users` allows an"},{"line_number":6,"context_line":"    operator to add a federated attribute containing a list of federated"},{"line_number":7,"context_line":"    objects to associate with the user. `PATCH /v3/users` allows the operator"},{"line_number":8,"context_line":"    to update a users associated federated objects by adding the federated"},{"line_number":9,"context_line":"    attribute to the user object."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_d8487930","line":7,"range":{"start_line":6,"start_character":16,"end_line":7,"end_character":11},"in_reply_to":"ba2be162_a8039075","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    users currenlty associated federated objects. `POST /v3/users` allows an"},{"line_number":6,"context_line":"    operator to add a federated attribute containing a list of federated"},{"line_number":7,"context_line":"    objects to associate with the user. `PATCH /v3/users` allows the operator"},{"line_number":8,"context_line":"    to update a users associated federated objects by adding the federated"},{"line_number":9,"context_line":"    attribute to the user object."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"upgrade:"},{"line_number":12,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_68f2789c","line":9,"range":{"start_line":8,"start_character":51,"end_line":9,"end_character":32},"updated":"2017-02-28 17:02:21.000000000","message":"you could remove this last part","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    users currenlty associated federated objects. `POST /v3/users` allows an"},{"line_number":6,"context_line":"    operator to add a federated attribute containing a list of federated"},{"line_number":7,"context_line":"    objects to associate with the user. `PATCH /v3/users` allows the operator"},{"line_number":8,"context_line":"    to update a users associated federated objects by adding the federated"},{"line_number":9,"context_line":"    attribute to the user object."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"upgrade:"},{"line_number":12,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_1853f1e2","line":9,"range":{"start_line":8,"start_character":51,"end_line":9,"end_character":32},"in_reply_to":"ba2be162_68f2789c","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"f0a344d752daaec8e131ad982d672be60aa09fbf","unresolved":false,"context_lines":[{"line_number":11,"context_line":"upgrade:"},{"line_number":12,"context_line":"  - |"},{"line_number":13,"context_line":"    Added these new methods to the shadow users backend:"},{"line_number":14,"context_line":"    ``delete_federated_users``, ``create_federated_object``,"},{"line_number":15,"context_line":"    ``get_federated_objects``. These methods are needed to support federated"},{"line_number":16,"context_line":"    attributes via the user API. If you have a custom implementation for the"},{"line_number":17,"context_line":"    shadow users backend, you will need implement the new methods."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_e8590890","line":14,"range":{"start_line":14,"start_character":6,"end_line":14,"end_character":28},"updated":"2017-02-28 17:02:21.000000000","message":"actually, currently it\u0027s delete_user_federated_attribute, but I\u0027d suggest delete_federated_object","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"8be7e1bcd9b5b79cd8c118971366bc0065259f54","unresolved":false,"context_lines":[{"line_number":11,"context_line":"upgrade:"},{"line_number":12,"context_line":"  - |"},{"line_number":13,"context_line":"    Added these new methods to the shadow users backend:"},{"line_number":14,"context_line":"    ``delete_federated_users``, ``create_federated_object``,"},{"line_number":15,"context_line":"    ``get_federated_objects``. These methods are needed to support federated"},{"line_number":16,"context_line":"    attributes via the user API. If you have a custom implementation for the"},{"line_number":17,"context_line":"    shadow users backend, you will need implement the new methods."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"ba2be162_780f8de1","line":14,"range":{"start_line":14,"start_character":6,"end_line":14,"end_character":28},"in_reply_to":"ba2be162_e8590890","updated":"2017-03-01 07:09:42.000000000","message":"Done","commit_id":"8361372156b8d22b0e5aa0c20ba22a705c1e6cdc"},{"author":{"_account_id":16465,"name":"Kristi Nikolla","email":"knikolla@bu.edu","username":"knikolla"},"change_message_id":"7af90f4e7955147d7eb4970dc3dfb168f1da9cbb","unresolved":false,"context_lines":[{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    If you have a custom implementation for the shadow users backend, you will"},{"line_number":12,"context_line":"    need implement the new methods:"},{"line_number":13,"context_line":"    ``delete_federated_object``, ``create_federated_object``,"},{"line_number":14,"context_line":"    ``get_federated_objects``. These methods are needed to support federated"},{"line_number":15,"context_line":"    attributes via the user API."}],"source_content_type":"text/x-yaml","patch_set":28,"id":"ba2be162_572a732d","line":12,"range":{"start_line":12,"start_character":8,"end_line":12,"end_character":9},"updated":"2017-03-01 20:49:23.000000000","message":"nit: to","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"},{"author":{"_account_id":18464,"name":"Richard Avelar","email":"csravelar@gmail.com","username":"razone"},"change_message_id":"6b170a29c8accfccc112c097cb05a66d2d365cc0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"upgrade:"},{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    If you have a custom implementation for the shadow users backend, you will"},{"line_number":12,"context_line":"    need implement the new methods:"},{"line_number":13,"context_line":"    ``delete_federated_object``, ``create_federated_object``,"},{"line_number":14,"context_line":"    ``get_federated_objects``. These methods are needed to support federated"},{"line_number":15,"context_line":"    attributes via the user API."}],"source_content_type":"text/x-yaml","patch_set":28,"id":"ba2be162_052a7e2c","line":12,"range":{"start_line":12,"start_character":8,"end_line":12,"end_character":9},"in_reply_to":"ba2be162_572a732d","updated":"2017-03-02 00:13:43.000000000","message":"Done","commit_id":"a2956b4432a708c9474a788af91ce28688ab7aac"}]}
