)]}'
{"keystone/federation/V8_backends/sql.py":[{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"97d6dde23f7badc802df87870bc2b7ed9461b03c","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_cc5c7a4d","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"updated":"2016-04-01 03:14:03.000000000","message":"Don\u0027t we already have a generic method in keystone.common.sql to handle conflicts?  So why do we need this?","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"baf391a467a40328a5145a4e9751947d9b6009ad","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_b871beaa","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"in_reply_to":"9a061dce_67be99d5","updated":"2016-04-06 15:40:48.000000000","message":"@Brant I just think we should make use of the common code.  Otherwise, why have it.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"1cbfaf6b73b9d5cfbf337099e1122d39dcc23f05","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_e4fddf09","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"in_reply_to":"ba0121b8_7bf18294","updated":"2016-04-02 08:28:58.000000000","message":"@Rodrigo I saw your other comment regarding this, so I\u0027m okay. However, I think it would be nice if we could somehow extend the common method to meet these requirements.  So that we don\u0027t have to do this every time we want to show more detail.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"beedfc101e7f7845ab79ca6914641522f69d0827","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_7bf18294","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"in_reply_to":"ba0121b8_c4527812","updated":"2016-04-01 16:37:37.000000000","message":"But the generic method includes the details in the returned message:\nhttps://github.com/openstack/keystone/blob/master/keystone/common/sql/core.py#L413\n\nWhile not as pretty as your message, it does provide the information.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"13cbb56329913841bfc36ead63ff7b3e51442436","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_c4527812","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"in_reply_to":"ba0121b8_cc5c7a4d","updated":"2016-04-01 14:19:24.000000000","message":"this is to add a more detailed information about the conflict (since it is related to remote IDs)","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87bfc9c57b90841c7d4f9e29f32eb310330435e9","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_67be99d5","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"in_reply_to":"ba0121b8_e4fddf09","updated":"2016-04-05 20:34:48.000000000","message":"Ron - make your proposal in a separate review. Then we can see what the code looks like.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"eb9594a6b96457ba53b222454dd6da2070779c40","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            msg \u003d _(\u0027Duplicate entry: %s\u0027)"},{"line_number":177,"context_line":"        msg \u003d msg % e.value"},{"line_number":178,"context_line":"        raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # Identity Provider CRUD"},{"line_number":181,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027identity_provider\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_41679db6","line":178,"updated":"2016-03-31 20:24:48.000000000","message":"I think this should be something that\u0027s handled in the manager layer. This will make it so that we have less duplicate code between backend versions.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"7d3e1730fb90a1b169563f71a9960751d0a4f4b8","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            msg \u003d _(\u0027Duplicate entry: %s\u0027)"},{"line_number":177,"context_line":"        msg \u003d msg % e.value"},{"line_number":178,"context_line":"        raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # Identity Provider CRUD"},{"line_number":181,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027identity_provider\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_42779c9f","line":178,"in_reply_to":"ba0121b8_41679db6","updated":"2016-03-31 21:11:20.000000000","message":"++","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5ef081fa81dcf54ac217c363de0557920140cb97","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            msg \u003d _(\u0027Duplicate entry: %s\u0027)"},{"line_number":177,"context_line":"        msg \u003d msg % e.value"},{"line_number":178,"context_line":"        raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # Identity Provider CRUD"},{"line_number":181,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027identity_provider\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_4507a681","line":178,"in_reply_to":"ba0121b8_41679db6","updated":"2016-03-31 21:46:56.000000000","message":"The manager can\u0027t be expected to interpret sql exceptions.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"97d6dde23f7badc802df87870bc2b7ed9461b03c","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        else:"},{"line_number":176,"context_line":"            msg \u003d _(\u0027Duplicate entry: %s\u0027)"},{"line_number":177,"context_line":"        msg \u003d msg % e.value"},{"line_number":178,"context_line":"        raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # Identity Provider CRUD"},{"line_number":181,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027identity_provider\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_4c506a32","line":178,"in_reply_to":"ba0121b8_4507a681","updated":"2016-04-01 03:14:03.000000000","message":"Ah, good point","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"97d6dde23f7badc802df87870bc2b7ed9461b03c","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            ref \u003d self._get_idp_from_remote_id(session, remote_id)"},{"line_number":223,"context_line":"            return ref.to_dict()"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def update_idp(self, idp_id, idp):"},{"line_number":226,"context_line":"        try:"},{"line_number":227,"context_line":"            with sql.session_for_write() as session:"},{"line_number":228,"context_line":"                idp_ref \u003d self._get_idp(session, idp_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_8c14424d","line":225,"range":{"start_line":225,"start_character":4,"end_line":225,"end_character":7},"updated":"2016-04-01 03:14:03.000000000","message":"Can\u0027t we use the generic method in keystone.common.sql, so something like this for update as well:\n@sql.handle_conflicts(conflict_type\u003d\u0027identity_provider\u0027)","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"13cbb56329913841bfc36ead63ff7b3e51442436","unresolved":false,"context_lines":[{"line_number":222,"context_line":"            ref \u003d self._get_idp_from_remote_id(session, remote_id)"},{"line_number":223,"context_line":"            return ref.to_dict()"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    def update_idp(self, idp_id, idp):"},{"line_number":226,"context_line":"        try:"},{"line_number":227,"context_line":"            with sql.session_for_write() as session:"},{"line_number":228,"context_line":"                idp_ref \u003d self._get_idp(session, idp_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_443f88b3","line":225,"range":{"start_line":225,"start_character":4,"end_line":225,"end_character":7},"in_reply_to":"ba0121b8_8c14424d","updated":"2016-04-01 14:19:24.000000000","message":"see comment above","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"}],"keystone/federation/backends/sql.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"91d7a0e185353f30592c5a7a5ea872dc0a501ab4","unresolved":false,"context_lines":[{"line_number":232,"context_line":"                for attr in IdentityProviderModel.mutable_attributes:"},{"line_number":233,"context_line":"                    setattr(idp_ref, attr, getattr(new_idp, attr))"},{"line_number":234,"context_line":"                return idp_ref.to_dict()"},{"line_number":235,"context_line":"        except sql.DBDuplicateEntry as e:"},{"line_number":236,"context_line":"            conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":237,"context_line":"            details \u003d six.text_type(e)"},{"line_number":238,"context_line":"            LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1af94dfe_ffd040f8","line":235,"updated":"2016-03-17 18:27:25.000000000","message":"It would be nice to reuse this logic since it\u0027s in at least two places. I think that can happen in a later patch if desired.","commit_id":"c9193535ca2887a3a3eeb85a491c6440a15dec35"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5198cc941e711252f71d8a5676abd972fc918707","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    # Identity Provider CRUD"},{"line_number":169,"context_line":"    def handle_conflict(self, exception):"},{"line_number":170,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":171,"context_line":"        details \u003d six.text_type(exception)"},{"line_number":172,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_64b58e7c","line":169,"range":{"start_line":169,"start_character":8,"end_line":169,"end_character":23},"updated":"2016-03-18 17:51:10.000000000","message":"this should be a private function","commit_id":"1811647b3d7096b839d6fd2ce142402118637bea"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c56fe3631c794136eb29702945e237c119e45d8d","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    # Identity Provider CRUD"},{"line_number":169,"context_line":"    def handle_conflict(self, exception):"},{"line_number":170,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":171,"context_line":"        details \u003d six.text_type(exception)"},{"line_number":172,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa0719c6_2dde776d","line":169,"range":{"start_line":169,"start_character":8,"end_line":169,"end_character":23},"in_reply_to":"1af94dfe_64b58e7c","updated":"2016-03-21 18:43:01.000000000","message":"++","commit_id":"1811647b3d7096b839d6fd2ce142402118637bea"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6ef73c553dab56edd62d4a1557f1ed02d515f642","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    # Identity Provider CRUD"},{"line_number":169,"context_line":"    def handle_conflict(self, exception):"},{"line_number":170,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":171,"context_line":"        details \u003d six.text_type(exception)"},{"line_number":172,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa0719c6_c331a3ee","line":169,"range":{"start_line":169,"start_character":8,"end_line":169,"end_character":23},"in_reply_to":"1af94dfe_64b58e7c","updated":"2016-03-21 12:21:31.000000000","message":"left public because it is being used by a superclass","commit_id":"1811647b3d7096b839d6fd2ce142402118637bea"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"52e9920bfdc5db4c0e1be664fda5344f28c695fe","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    # Identity Provider CRUD"},{"line_number":169,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":170,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":171,"context_line":"        details \u003d six.text_type(e)"}],"source_content_type":"text/x-python","patch_set":3,"id":"da0c15f0_5b4bce2b","line":168,"updated":"2016-03-24 20:49:20.000000000","message":"this comment should be moved down to before create_idp. Or just get rid of it because these comments are worthless.","commit_id":"f88a59891ac418e6e42086e73a0942cf6b9d23bd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f66ba706325bd5a8e90e141f59939593dad2b716","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    # Identity Provider CRUD"},{"line_number":169,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":170,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":171,"context_line":"        details \u003d six.text_type(e)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_cf3521db","line":168,"in_reply_to":"da0c15f0_5b4bce2b","updated":"2016-03-29 19:28:33.000000000","message":"Done","commit_id":"f88a59891ac418e6e42086e73a0942cf6b9d23bd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"52e9920bfdc5db4c0e1be664fda5344f28c695fe","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        else:"},{"line_number":177,"context_line":"            msg \u003d _(\u0027Duplicate entry: %s\u0027)"},{"line_number":178,"context_line":"        msg \u003d msg % e.value"},{"line_number":179,"context_line":"        raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":182,"context_line":"        idp[\u0027id\u0027] \u003d idp_id"}],"source_content_type":"text/x-python","patch_set":3,"id":"da0c15f0_bbbaeabe","line":179,"updated":"2016-03-24 20:49:20.000000000","message":"(unrelated) seems kind of dangerous to return details of the sql exception to the user.","commit_id":"f88a59891ac418e6e42086e73a0942cf6b9d23bd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"97d6dde23f7badc802df87870bc2b7ed9461b03c","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_9fc902af","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"updated":"2016-04-01 03:14:03.000000000","message":"It looks like you are duplicating code (V8_backends), is there a common place you could put this?","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"baf391a467a40328a5145a4e9751947d9b6009ad","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_1899cac4","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"in_reply_to":"9a061dce_c727a562","updated":"2016-04-06 15:40:48.000000000","message":"Good point re: duplicating code between drivers","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87bfc9c57b90841c7d4f9e29f32eb310330435e9","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_c727a562","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"in_reply_to":"ba0121b8_848a4062","updated":"2016-04-05 20:34:48.000000000","message":"let\u0027s not worry about duplicating stuff between versions of the drivers. It should be duplicated so that we don\u0027t have to worry as much about inadvertently changing behavior of the old driver.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"13cbb56329913841bfc36ead63ff7b3e51442436","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    _CONFLICT_LOG_MSG \u003d \u0027Conflict %(conflict_type)s: %(details)s\u0027"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _handle_idp_conflict(self, e):"},{"line_number":169,"context_line":"        conflict_type \u003d \u0027identity_provider\u0027"},{"line_number":170,"context_line":"        details \u003d six.text_type(e)"},{"line_number":171,"context_line":"        LOG.debug(self._CONFLICT_LOG_MSG, {\u0027conflict_type\u0027: conflict_type,"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_848a4062","line":168,"range":{"start_line":168,"start_character":8,"end_line":168,"end_character":28},"in_reply_to":"ba0121b8_9fc902af","updated":"2016-04-01 14:19:24.000000000","message":"agreed, not sure that we have such a place (mainly because of the imports that are needed)","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"97d6dde23f7badc802df87870bc2b7ed9461b03c","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # Identity Provider CRUD"},{"line_number":181,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":182,"context_line":"        idp[\u0027id\u0027] \u003d idp_id"},{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            with sql.session_for_write() as session:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_1f34d2db","line":181,"range":{"start_line":181,"start_character":8,"end_line":181,"end_character":18},"updated":"2016-04-01 03:14:03.000000000","message":"So same thing here, why are we not using the generic method in keystone.common.sql to handle conflicts?","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"13cbb56329913841bfc36ead63ff7b3e51442436","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        raise exception.Conflict(type\u003dconflict_type, details\u003dmsg)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    # Identity Provider CRUD"},{"line_number":181,"context_line":"    def create_idp(self, idp_id, idp):"},{"line_number":182,"context_line":"        idp[\u0027id\u0027] \u003d idp_id"},{"line_number":183,"context_line":"        try:"},{"line_number":184,"context_line":"            with sql.session_for_write() as session:"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_64e0cc29","line":181,"range":{"start_line":181,"start_character":8,"end_line":181,"end_character":18},"in_reply_to":"ba0121b8_1f34d2db","updated":"2016-04-01 14:19:24.000000000","message":"see comment in the other file","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"}],"keystone/federation/core.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"5198cc941e711252f71d8a5676abd972fc918707","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        return self.driver.get_idp_from_remote_id(remote_id)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def update_idp(self, idp_id, idp):"},{"line_number":553,"context_line":"        try:"},{"line_number":554,"context_line":"            return self.driver.update_idp(idp_id, idp)"},{"line_number":555,"context_line":"        except sql.DBDuplicateEntry as e:"},{"line_number":556,"context_line":"            self.handle_conflict(e)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"    def create_protocol(self, idp_id, protocol_id, protocol):"},{"line_number":559,"context_line":"        return self.driver.create_protocol(idp_id, protocol_id, protocol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1af94dfe_04500a31","line":556,"range":{"start_line":553,"start_character":8,"end_line":556,"end_character":35},"updated":"2016-03-18 17:51:10.000000000","message":"i\u0027m confused about why we need this here","commit_id":"1811647b3d7096b839d6fd2ce142402118637bea"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"6ef73c553dab56edd62d4a1557f1ed02d515f642","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        return self.driver.get_idp_from_remote_id(remote_id)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def update_idp(self, idp_id, idp):"},{"line_number":553,"context_line":"        try:"},{"line_number":554,"context_line":"            return self.driver.update_idp(idp_id, idp)"},{"line_number":555,"context_line":"        except sql.DBDuplicateEntry as e:"},{"line_number":556,"context_line":"            self.handle_conflict(e)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"    def create_protocol(self, idp_id, protocol_id, protocol):"},{"line_number":559,"context_line":"        return self.driver.create_protocol(idp_id, protocol_id, protocol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa0719c6_03043b13","line":556,"range":{"start_line":553,"start_character":8,"end_line":556,"end_character":35},"in_reply_to":"1af94dfe_04500a31","updated":"2016-03-21 12:21:31.000000000","message":"this is to replicate the behavior, otherwise the legacy driver tests won\u0027t pass. Is this the wrong place to put it?","commit_id":"1811647b3d7096b839d6fd2ce142402118637bea"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c56fe3631c794136eb29702945e237c119e45d8d","unresolved":false,"context_lines":[{"line_number":550,"context_line":"        return self.driver.get_idp_from_remote_id(remote_id)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def update_idp(self, idp_id, idp):"},{"line_number":553,"context_line":"        try:"},{"line_number":554,"context_line":"            return self.driver.update_idp(idp_id, idp)"},{"line_number":555,"context_line":"        except sql.DBDuplicateEntry as e:"},{"line_number":556,"context_line":"            self.handle_conflict(e)"},{"line_number":557,"context_line":""},{"line_number":558,"context_line":"    def create_protocol(self, idp_id, protocol_id, protocol):"},{"line_number":559,"context_line":"        return self.driver.create_protocol(idp_id, protocol_id, protocol)"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa0719c6_ad828750","line":556,"range":{"start_line":553,"start_character":8,"end_line":556,"end_character":35},"in_reply_to":"fa0719c6_03043b13","updated":"2016-03-21 18:43:01.000000000","message":"Yeah, I\u0027m confused as well.  Can you refactor legacy driver tests?","commit_id":"1811647b3d7096b839d6fd2ce142402118637bea"}],"keystone/tests/unit/backend/legacy_drivers/federation/V8/api_v3.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"52e9920bfdc5db4c0e1be664fda5344f28c695fe","unresolved":false,"context_lines":[{"line_number":84,"context_line":"    def test_update_idp_remote_repeated(self):"},{"line_number":85,"context_line":"        \"\"\"Update IdP to match ID of an existing IdP."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        Expect HTTP 500 ISE code for the latter call."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        Note: V9 drivers raise an HTTP 409 Conflict error, however the V8"},{"line_number":90,"context_line":"        driver raises an HTTP 500 ISE error."}],"source_content_type":"text/x-python","patch_set":3,"id":"da0c15f0_9bf28699","line":87,"updated":"2016-03-24 20:49:20.000000000","message":"why?","commit_id":"f88a59891ac418e6e42086e73a0942cf6b9d23bd"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"52e9920bfdc5db4c0e1be664fda5344f28c695fe","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        Expect HTTP 500 ISE code for the latter call."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        Note: V9 drivers raise an HTTP 409 Conflict error, however the V8"},{"line_number":90,"context_line":"        driver raises an HTTP 500 ISE error."},{"line_number":91,"context_line":"        \"\"\""},{"line_number":92,"context_line":"        # Create first identity provider"},{"line_number":93,"context_line":"        body \u003d self.default_body.copy()"}],"source_content_type":"text/x-python","patch_set":3,"id":"da0c15f0_db2a3ee7","line":90,"updated":"2016-03-24 20:49:20.000000000","message":"We can fix the V8 driver.","commit_id":"f88a59891ac418e6e42086e73a0942cf6b9d23bd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f66ba706325bd5a8e90e141f59939593dad2b716","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        Expect HTTP 500 ISE code for the latter call."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        Note: V9 drivers raise an HTTP 409 Conflict error, however the V8"},{"line_number":90,"context_line":"        driver raises an HTTP 500 ISE error."},{"line_number":91,"context_line":"        \"\"\""},{"line_number":92,"context_line":"        # Create first identity provider"},{"line_number":93,"context_line":"        body \u003d self.default_body.copy()"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_87ab0dd6","line":90,"in_reply_to":"da0c15f0_db2a3ee7","updated":"2016-03-29 19:28:33.000000000","message":"Done","commit_id":"f88a59891ac418e6e42086e73a0942cf6b9d23bd"}],"keystone/tests/unit/test_v3_federation.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"52e9920bfdc5db4c0e1be664fda5344f28c695fe","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"                          expected_status\u003dhttp_client.CONFLICT)"},{"line_number":1018,"context_line":"        resp_data \u003d jsonutils.loads(resp.body)"},{"line_number":1019,"context_line":"        self.assertIn(\u0027Duplicate remote ID\u0027,"},{"line_number":1020,"context_line":"                      resp_data.get(\u0027error\u0027, {}).get(\u0027message\u0027))"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"    def test_list_idps(self, iterations\u003d5):"},{"line_number":1023,"context_line":"        \"\"\"Lists all available IdentityProviders."}],"source_content_type":"text/x-python","patch_set":3,"id":"da0c15f0_dbed1e90","line":1020,"updated":"2016-03-24 20:49:20.000000000","message":"shouldn\u0027t use get here, it\u0027ll be harder to tell what\u0027s wrong since we won\u0027t be able to tell if it\u0027s \u0027error\u0027 or \u0027message\u0027 that\u0027s missing.","commit_id":"f88a59891ac418e6e42086e73a0942cf6b9d23bd"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"f66ba706325bd5a8e90e141f59939593dad2b716","unresolved":false,"context_lines":[{"line_number":1017,"context_line":"                          expected_status\u003dhttp_client.CONFLICT)"},{"line_number":1018,"context_line":"        resp_data \u003d jsonutils.loads(resp.body)"},{"line_number":1019,"context_line":"        self.assertIn(\u0027Duplicate remote ID\u0027,"},{"line_number":1020,"context_line":"                      resp_data.get(\u0027error\u0027, {}).get(\u0027message\u0027))"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"    def test_list_idps(self, iterations\u003d5):"},{"line_number":1023,"context_line":"        \"\"\"Lists all available IdentityProviders."}],"source_content_type":"text/x-python","patch_set":3,"id":"ba0121b8_8792ed9d","line":1020,"in_reply_to":"da0c15f0_dbed1e90","updated":"2016-03-29 19:28:33.000000000","message":"Done","commit_id":"f88a59891ac418e6e42086e73a0942cf6b9d23bd"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"e1622a354a47f77d0dbb1ac59fcbc13bf5dfb828","unresolved":false,"context_lines":[{"line_number":988,"context_line":"        self.assertEqual(sorted(body[\u0027remote_ids\u0027]),"},{"line_number":989,"context_line":"                         sorted(returned_idp.get(\u0027remote_ids\u0027)))"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"    def test_update_idp_remote_repeated(self):"},{"line_number":992,"context_line":"        \"\"\"Updates an IdentityProvider entity reusing a remote_id."},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"        A remote_id is the same for both so the second IdP is not"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_9fb3c209","line":991,"range":{"start_line":991,"start_character":8,"end_line":991,"end_character":39},"updated":"2016-04-01 03:20:42.000000000","message":"This test the functionality at a high level, but shouldn\u0027t we have a test for the backends specifically here:\ntests/unit/federation/backends/test_sql.py","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"baf391a467a40328a5145a4e9751947d9b6009ad","unresolved":false,"context_lines":[{"line_number":988,"context_line":"        self.assertEqual(sorted(body[\u0027remote_ids\u0027]),"},{"line_number":989,"context_line":"                         sorted(returned_idp.get(\u0027remote_ids\u0027)))"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"    def test_update_idp_remote_repeated(self):"},{"line_number":992,"context_line":"        \"\"\"Updates an IdentityProvider entity reusing a remote_id."},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"        A remote_id is the same for both so the second IdP is not"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_18fc2ab7","line":991,"range":{"start_line":991,"start_character":8,"end_line":991,"end_character":39},"in_reply_to":"9a061dce_875f6de4","updated":"2016-04-06 15:40:48.000000000","message":"@Brant Then we should have unit tests here: tests/unit/federation/backends/test_sql.py. The more unit tests, the better. We want good test coverage across every component.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"13cbb56329913841bfc36ead63ff7b3e51442436","unresolved":false,"context_lines":[{"line_number":988,"context_line":"        self.assertEqual(sorted(body[\u0027remote_ids\u0027]),"},{"line_number":989,"context_line":"                         sorted(returned_idp.get(\u0027remote_ids\u0027)))"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"    def test_update_idp_remote_repeated(self):"},{"line_number":992,"context_line":"        \"\"\"Updates an IdentityProvider entity reusing a remote_id."},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"        A remote_id is the same for both so the second IdP is not"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba0121b8_84e1a02c","line":991,"range":{"start_line":991,"start_character":8,"end_line":991,"end_character":39},"in_reply_to":"ba0121b8_9fb3c209","updated":"2016-04-01 14:19:24.000000000","message":"++ will add a test there","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"87bfc9c57b90841c7d4f9e29f32eb310330435e9","unresolved":false,"context_lines":[{"line_number":988,"context_line":"        self.assertEqual(sorted(body[\u0027remote_ids\u0027]),"},{"line_number":989,"context_line":"                         sorted(returned_idp.get(\u0027remote_ids\u0027)))"},{"line_number":990,"context_line":""},{"line_number":991,"context_line":"    def test_update_idp_remote_repeated(self):"},{"line_number":992,"context_line":"        \"\"\"Updates an IdentityProvider entity reusing a remote_id."},{"line_number":993,"context_line":""},{"line_number":994,"context_line":"        A remote_id is the same for both so the second IdP is not"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_875f6de4","line":991,"range":{"start_line":991,"start_character":8,"end_line":991,"end_character":39},"in_reply_to":"ba0121b8_9fb3c209","updated":"2016-04-05 20:34:48.000000000","message":"There is no tests/unit/federation/backends/test_sql.py , so I don\u0027t think we should hold up this change for creating one. Also, if there\u0027s a test at the component level then no need for this test at all since it would just be showing the same thing.","commit_id":"775c5c6e89cf5fc76ee28466a9490d42047ace5f"}]}
