)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"IdP ID registration and validation"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch extend the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variable to use to identify the remote_id"},{"line_number":12,"context_line":"based on the used protocol"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"ba7be1f8_53c5638c","line":9,"updated":"2015-03-03 01:50:49.000000000","message":"extends*","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"IdP ID registration and validation"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch extend the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variable to use to identify the remote_id"},{"line_number":12,"context_line":"based on the used protocol"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"ba7be1f8_b452fb64","line":9,"in_reply_to":"ba7be1f8_53c5638c","updated":"2015-03-03 08:57:15.000000000","message":"Done","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch extend the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variable to use to identify the remote_id"},{"line_number":12,"context_line":"based on the used protocol"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I12a262c55b5f6b5cc7007865edf30f14269da537"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"ba7be1f8_93bb5b0e","line":11,"updated":"2015-03-03 01:50:49.000000000","message":"variables*","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch extend the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variable to use to identify the remote_id"},{"line_number":12,"context_line":"based on the used protocol"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I12a262c55b5f6b5cc7007865edf30f14269da537"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"ba7be1f8_d44befae","line":11,"in_reply_to":"ba7be1f8_93bb5b0e","updated":"2015-03-03 08:57:15.000000000","message":"Done","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The patch extend the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variable to use to identify the remote_id"},{"line_number":12,"context_line":"based on the used protocol"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I12a262c55b5f6b5cc7007865edf30f14269da537"},{"line_number":15,"context_line":"Implements: blueprint idp-id-registration"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"ba7be1f8_b3b85f12","line":12,"updated":"2015-03-03 01:50:49.000000000","message":"s/used protocol/protocol used./","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":9,"context_line":"The patch extend the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variable to use to identify the remote_id"},{"line_number":12,"context_line":"based on the used protocol"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I12a262c55b5f6b5cc7007865edf30f14269da537"},{"line_number":15,"context_line":"Implements: blueprint idp-id-registration"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"ba7be1f8_14c90726","line":12,"in_reply_to":"ba7be1f8_b3b85f12","updated":"2015-03-03 08:57:15.000000000","message":"Done","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c4a3d89202d8d42ce057921cabf93f707926f8c8","unresolved":false,"context_lines":[{"line_number":7,"context_line":"IdP ID registration and validation"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch extends the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variables to use to identify the remote_id"},{"line_number":12,"context_line":"based on the protocol used."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"9a80dd14_1956292b","line":10,"updated":"2015-03-16 22:51:34.000000000","message":"(nit) includes","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a242c4bbb0e34e6fb6c1da95f8e71770fd4cf38d","unresolved":false,"context_lines":[{"line_number":7,"context_line":"IdP ID registration and validation"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch extends the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variables to use to identify the remote_id"},{"line_number":12,"context_line":"based on the protocol used."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"9a80dd14_7d8e1b7b","line":10,"in_reply_to":"9a80dd14_1956292b","updated":"2015-03-17 10:57:45.000000000","message":"Done","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c4a3d89202d8d42ce057921cabf93f707926f8c8","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch extends the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variables to use to identify the remote_id"},{"line_number":12,"context_line":"based on the protocol used."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I12a262c55b5f6b5cc7007865edf30f14269da537"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"9a80dd14_793485fb","line":11,"updated":"2015-03-16 22:51:34.000000000","message":"(nit) used","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a242c4bbb0e34e6fb6c1da95f8e71770fd4cf38d","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The patch extends the remote_id defined for an IdP"},{"line_number":10,"context_line":"to a list of values and include the definition of two"},{"line_number":11,"context_line":"configuration variables to use to identify the remote_id"},{"line_number":12,"context_line":"based on the protocol used."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I12a262c55b5f6b5cc7007865edf30f14269da537"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"9a80dd14_1d451f17","line":11,"in_reply_to":"9a80dd14_793485fb","updated":"2015-03-17 10:57:45.000000000","message":"Done","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"}],"keystone/common/config.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"04a10f618987798995d4dd759d56b0417e9ed3fc","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                   help\u003d\u0027Federation backend driver.\u0027),"},{"line_number":506,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027, default\u003d\u0027\u0027,"},{"line_number":507,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":508,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":509,"context_line":"        cfg.StrOpt(\u0027remote_id_attribute\u0027,"},{"line_number":510,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":511,"context_line":"                        \u0027Identity Provider from the environment (e.g. if \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_4acbafa3","line":508,"updated":"2015-02-19 02:24:19.000000000","message":"what are we going to do about this value?","commit_id":"ef1962546917ac60e9741e16dd575a8d07842de6"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"929112d22adeee3632a1dc3832dd0ec4765cfe8d","unresolved":false,"context_lines":[{"line_number":505,"context_line":"                   help\u003d\u0027Federation backend driver.\u0027),"},{"line_number":506,"context_line":"        cfg.StrOpt(\u0027assertion_prefix\u0027, default\u003d\u0027\u0027,"},{"line_number":507,"context_line":"                   help\u003d\u0027Value to be used when filtering assertion parameters \u0027"},{"line_number":508,"context_line":"                        \u0027from the environment.\u0027),"},{"line_number":509,"context_line":"        cfg.StrOpt(\u0027remote_id_attribute\u0027,"},{"line_number":510,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":511,"context_line":"                        \u0027Identity Provider from the environment (e.g. if \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_f46fe125","line":508,"in_reply_to":"da86d52c_4acbafa3","updated":"2015-02-19 10:46:33.000000000","message":"This is used in case of different protocols from saml2 and oid. Additionally, during the spec there were comment about enabling two different plugin for the same protocol, like mod_shibboleth and mod_mellon, so you could use this attribute for one and the saml2 attribute for the other (however, I have many concern about a configuration like that)","commit_id":"ef1962546917ac60e9741e16dd575a8d07842de6"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"bcf5ed6f732d14f988bf3757d1cea402cbb0af6d","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":533,"context_line":"                        \u0027Identity Provider from the environment when oidc \u0027"},{"line_number":534,"context_line":"                        \u0027protocol is used\u0027),"},{"line_number":535,"context_line":"    ],"},{"line_number":536,"context_line":"    \u0027policy\u0027: ["},{"line_number":537,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":538,"context_line":"                   default\u003d\u0027keystone.policy.backends.sql.Policy\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_e73003a0","line":535,"updated":"2015-02-19 16:28:10.000000000","message":"oh, we should remove this as we cannot limit ourselves to saml2 and oidc protocols only.","commit_id":"d4820c7b1c15664225761fb48f36816a9a9475e3"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"c1f34c8af056df555d70a104d1a2d52d3c7fd6a1","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":533,"context_line":"                        \u0027Identity Provider from the environment when oidc \u0027"},{"line_number":534,"context_line":"                        \u0027protocol is used\u0027),"},{"line_number":535,"context_line":"    ],"},{"line_number":536,"context_line":"    \u0027policy\u0027: ["},{"line_number":537,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":538,"context_line":"                   default\u003d\u0027keystone.policy.backends.sql.Policy\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba7be1f8_c073b4af","line":535,"in_reply_to":"ba7be1f8_434d1572","updated":"2015-02-20 10:25:42.000000000","message":"I found a saml section which is mainly oriented to the IdP feature of keystone but I am not able to find the oidc section. If the sections are already there we could use these to define the remote_id_attribute and leave the one in federation for the other protocols.","commit_id":"d4820c7b1c15664225761fb48f36816a9a9475e3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4b8128758a427c6832aaad10075dd61497fcad4a","unresolved":false,"context_lines":[{"line_number":532,"context_line":"                   help\u003d\u0027Value to be used to obtain the entity ID of the \u0027"},{"line_number":533,"context_line":"                        \u0027Identity Provider from the environment when oidc \u0027"},{"line_number":534,"context_line":"                        \u0027protocol is used\u0027),"},{"line_number":535,"context_line":"    ],"},{"line_number":536,"context_line":"    \u0027policy\u0027: ["},{"line_number":537,"context_line":"        cfg.StrOpt(\u0027driver\u0027,"},{"line_number":538,"context_line":"                   default\u003d\u0027keystone.policy.backends.sql.Policy\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba7be1f8_434d1572","line":535,"in_reply_to":"da86d52c_e73003a0","updated":"2015-02-20 06:12:11.000000000","message":"also we already have sections for oidc and saml2","commit_id":"d4820c7b1c15664225761fb48f36816a9a9475e3"}],"keystone/contrib/federation/backends/sql.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fbf19d6002b56b8f7c191cf480fe54392fc6b553","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                           primary_key\u003dTrue,"},{"line_number":58,"context_line":"                           nullable\u003dFalse,"},{"line_number":59,"context_line":"                           unique\u003dTrue)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":63,"context_line":"        new_dictionary \u003d dictionary.copy()"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_efe547a4","line":60,"updated":"2015-02-19 12:12:49.000000000","message":"nothing serious, but i think primary_key\u003dTrue implies nullable\u003dFalse and unique\u003dTrue.","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"2d1e8a37499920060cb9a25b5c458e12b70620aa","unresolved":false,"context_lines":[{"line_number":57,"context_line":"                           primary_key\u003dTrue,"},{"line_number":58,"context_line":"                           nullable\u003dFalse,"},{"line_number":59,"context_line":"                           unique\u003dTrue)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":63,"context_line":"        new_dictionary \u003d dictionary.copy()"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_357df21c","line":60,"in_reply_to":"da86d52c_efe547a4","updated":"2015-02-19 14:32:34.000000000","message":"The table has primary_key the couple (idp_id, remote_id) so is the couple unique. MySql should accept (idp1, remote1) and idp2,remote1) as unique. You are right for the nullable","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":72,"context_line":"class IdentityProviderModel(sql.ModelBase, sql.DictBase):"},{"line_number":73,"context_line":"    __tablename__ \u003d \u0027identity_provider\u0027"},{"line_number":74,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027, \u0027remote_ids\u0027]"},{"line_number":75,"context_line":"    mutable_attributes \u003d frozenset([\u0027description\u0027, \u0027enabled\u0027, \u0027remote_ids\u0027])"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":78,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_78e7d4e4","line":75,"updated":"2015-03-02 07:35:58.000000000","message":"in the upgrade flow of the 006 migration script, the \u0027remote_id\u0027 column is never dropped or renamed. should it be dropped? should it be renamed to \u0027remote_ids\u0027? And this should relationship be shown there as well?","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4ca0efeec37ee8796c54e362171cdf49f84cc49c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"class IdentityProviderModel(sql.ModelBase, sql.DictBase):"},{"line_number":73,"context_line":"    __tablename__ \u003d \u0027identity_provider\u0027"},{"line_number":74,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027, \u0027remote_ids\u0027]"},{"line_number":75,"context_line":"    mutable_attributes \u003d frozenset([\u0027description\u0027, \u0027enabled\u0027, \u0027remote_ids\u0027])"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    id \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":78,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_53e031cc","line":75,"in_reply_to":"ba7be1f8_78e7d4e4","updated":"2015-03-02 08:07:51.000000000","message":"There is a line 38 in https://review.openstack.org/#/c/152156/16/keystone/contrib/federation/migrate_repo/versions/006_add_remote_id_table.py ....\n\nIn the DB there is a PK-FK relationship between identity_provider and idp_remote_ids tables, but in the SQLalchemy abstraction it is more like object with a list being an object\u0027s attribute.","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":53,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":54,"context_line":"                        primary_key\u003dTrue)"},{"line_number":55,"context_line":"    remote_id \u003d sql.Column(sql.String(255),"},{"line_number":56,"context_line":"                           primary_key\u003dTrue,"},{"line_number":57,"context_line":"                           unique\u003dTrue)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_2e85e806","line":55,"updated":"2015-03-03 01:50:49.000000000","message":"I don\u0027t know if it\u0027s likely or not, but the old IDs were bigger and might not fit during the migration.","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":53,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":54,"context_line":"                        primary_key\u003dTrue)"},{"line_number":55,"context_line":"    remote_id \u003d sql.Column(sql.String(255),"},{"line_number":56,"context_line":"                           primary_key\u003dTrue,"},{"line_number":57,"context_line":"                           unique\u003dTrue)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_316a9dee","line":55,"in_reply_to":"ba7be1f8_2e85e806","updated":"2015-03-03 08:57:15.000000000","message":"reverted to 256","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"f6d9a1b94f0eec14b78e9eb3e4a08dfc0e62a6df","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":53,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":54,"context_line":"                        primary_key\u003dTrue)"},{"line_number":55,"context_line":"    remote_id \u003d sql.Column(sql.String(255),"},{"line_number":56,"context_line":"                           primary_key\u003dTrue,"},{"line_number":57,"context_line":"                           unique\u003dTrue)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_943df0df","line":55,"in_reply_to":"ba7be1f8_316a9dee","updated":"2015-03-03 11:37:44.000000000","message":"It is impossible.  255 is the limit for a varchar primary key!","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e0917e9e5c2f6c965e9e5c58cd224bbe5d51a21","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return d"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class IdentityProviderModel(sql.ModelBase, sql.DictBase):"},{"line_number":73,"context_line":"    __tablename__ \u003d \u0027identity_provider\u0027"},{"line_number":74,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027, \u0027remote_ids\u0027]"},{"line_number":75,"context_line":"    mutable_attributes \u003d frozenset([\u0027description\u0027, \u0027enabled\u0027, \u0027remote_ids\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a80dd14_84360ee6","line":72,"updated":"2015-03-11 13:26:31.000000000","message":"Why is this a DictBase if you don\u0027t need/use any of the methods? Should it be a ModelDictMixin or maybe neither?","commit_id":"29f7bfef74363cbd6c5018502cfaf3c1e6415260"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"93abdb93e1a4a2f75725bcf9193a3f6d746d01d3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        return d"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"class IdentityProviderModel(sql.ModelBase, sql.DictBase):"},{"line_number":73,"context_line":"    __tablename__ \u003d \u0027identity_provider\u0027"},{"line_number":74,"context_line":"    attributes \u003d [\u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027, \u0027remote_ids\u0027]"},{"line_number":75,"context_line":"    mutable_attributes \u003d frozenset([\u0027description\u0027, \u0027enabled\u0027, \u0027remote_ids\u0027])"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a80dd14_749f0351","line":72,"in_reply_to":"9a80dd14_84360ee6","updated":"2015-03-11 14:39:47.000000000","message":"Actually, all the class in the file are subclass of sql.DictBase but reimplement the method so I was thinking it was useful for some reasons I do not know and I put it to be uniform with the other. Do I have to remove?","commit_id":"29f7bfef74363cbd6c5018502cfaf3c1e6415260"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        return d"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class IdPRemoteIdsModel(sql.ModelBase, sql.DictBase):"},{"line_number":47,"context_line":"    __tablename__ \u003d \u0027idp_remote_ids\u0027"},{"line_number":48,"context_line":"    attributes \u003d [\u0027idp_id\u0027, \u0027remote_id\u0027]"},{"line_number":49,"context_line":"    mutable_attributes \u003d frozenset([\u0027idp_id\u0027, \u0027remote_id\u0027])"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_2e93015c","line":46,"updated":"2015-03-13 16:25:47.000000000","message":"this new class should be moved after IdentityProviderModel so that it\u0027s easier to review in gerrit and see what changes have been made to IdentityProviderModel vs what\u0027s new.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        return d"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class IdPRemoteIdsModel(sql.ModelBase, sql.DictBase):"},{"line_number":47,"context_line":"    __tablename__ \u003d \u0027idp_remote_ids\u0027"},{"line_number":48,"context_line":"    attributes \u003d [\u0027idp_id\u0027, \u0027remote_id\u0027]"},{"line_number":49,"context_line":"    mutable_attributes \u003d frozenset([\u0027idp_id\u0027, \u0027remote_id\u0027])"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_937e9be2","line":46,"in_reply_to":"9a80dd14_2e93015c","updated":"2015-03-16 12:42:25.000000000","message":"Done","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":53,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":54,"context_line":"                        primary_key\u003dTrue)"},{"line_number":55,"context_line":"    remote_id \u003d sql.Column(sql.String(255),"},{"line_number":56,"context_line":"                           primary_key\u003dTrue,"},{"line_number":57,"context_line":"                           unique\u003dTrue)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_794ea170","line":55,"updated":"2015-03-13 16:25:47.000000000","message":"this went from 256 to 255... what happened?","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                        sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":53,"context_line":"                                       ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":54,"context_line":"                        primary_key\u003dTrue)"},{"line_number":55,"context_line":"    remote_id \u003d sql.Column(sql.String(255),"},{"line_number":56,"context_line":"                           primary_key\u003dTrue,"},{"line_number":57,"context_line":"                           unique\u003dTrue)"},{"line_number":58,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_f3551750","line":55,"in_reply_to":"9a80dd14_794ea170","updated":"2015-03-16 12:42:25.000000000","message":"255 is the upper limit for mysql keys. If you put 256 keystone will not start.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @classmethod"},{"line_number":60,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":61,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":62,"context_line":"        return cls(**new_dictionary)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def to_dict(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_2ec22185","line":61,"updated":"2015-03-13 16:25:47.000000000","message":"according to the coverage report this isn\u0027t tested.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @classmethod"},{"line_number":60,"context_line":"    def from_dict(cls, dictionary):"},{"line_number":61,"context_line":"        new_dictionary \u003d dictionary.copy()"},{"line_number":62,"context_line":"        return cls(**new_dictionary)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def to_dict(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_b3e63fae","line":61,"in_reply_to":"9a80dd14_2ec22185","updated":"2015-03-16 12:42:25.000000000","message":"This conversion is called anytime you manage an IdentityProviderModel and this is tested. Do I miss something?","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def to_dict(self):"},{"line_number":65,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes.\"\"\""},{"line_number":66,"context_line":"        d \u003d dict()"},{"line_number":67,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":68,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":69,"context_line":"        return d"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_4ebbd50e","line":66,"updated":"2015-03-13 16:25:47.000000000","message":"according to the coverage report this isn\u0027t tested.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def to_dict(self):"},{"line_number":65,"context_line":"        \"\"\"Return a dictionary with model\u0027s attributes.\"\"\""},{"line_number":66,"context_line":"        d \u003d dict()"},{"line_number":67,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":68,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":69,"context_line":"        return d"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_f303573f","line":66,"in_reply_to":"9a80dd14_4ebbd50e","updated":"2015-03-16 12:42:25.000000000","message":"see above","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    remote_ids \u003d orm.relationship(\u0027IdPRemoteIdsModel\u0027,"},{"line_number":55,"context_line":"                                  order_by\u003d\u0027IdPRemoteIdsModel.remote_id\u0027,"},{"line_number":56,"context_line":"                                  cascade\u003d\u0027all, delete-orphan\u0027)"},{"line_number":57,"context_line":"    remote_id \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @classmethod"},{"line_number":60,"context_line":"    def from_dict(cls, dictionary):"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_ed44ea1a","line":57,"updated":"2015-03-18 07:33:26.000000000","message":"shouldn\u0027t this be removed?","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    remote_ids \u003d orm.relationship(\u0027IdPRemoteIdsModel\u0027,"},{"line_number":55,"context_line":"                                  order_by\u003d\u0027IdPRemoteIdsModel.remote_id\u0027,"},{"line_number":56,"context_line":"                                  cascade\u003d\u0027all, delete-orphan\u0027)"},{"line_number":57,"context_line":"    remote_id \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @classmethod"},{"line_number":60,"context_line":"    def from_dict(cls, dictionary):"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_6b39bdd7","line":57,"in_reply_to":"9a80dd14_ed44ea1a","updated":"2015-03-18 10:31:45.000000000","message":"Actually, it was removed but I put back because I need this for the migration. Using sqlalchemy to move the remote_id from the table \"identity_provider\" to the new table I need this attribute in the model. I was trying to add a new \"temporary\" model for the table used during the migration but I found several limitation with sqlalchemy and at the end I opted with this solution where the attribute is there but it is not used but the migration (it is not included in the attributes list).\n\nIf there is an alternative solution allowing to use sqlalchemy for the migration and remove this attribute I am happy to remove it again because I do not like this too much.","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"92d28b1b1a4f662d188501784ca831324104167c","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    remote_ids \u003d orm.relationship(\u0027IdPRemoteIdsModel\u0027,"},{"line_number":55,"context_line":"                                  order_by\u003d\u0027IdPRemoteIdsModel.remote_id\u0027,"},{"line_number":56,"context_line":"                                  cascade\u003d\u0027all, delete-orphan\u0027)"},{"line_number":57,"context_line":"    remote_id \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @classmethod"},{"line_number":60,"context_line":"    def from_dict(cls, dictionary):"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6ced46_2b3a2fe7","line":57,"updated":"2015-03-25 17:38:06.000000000","message":"Why does this have remote_ids and remote_id?","commit_id":"ca67d8736e87d2023782a346ea68a5d0dc4de89d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"611abb6e6cd07a13b7b96a3849b544ef3ed8130b","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    remote_ids \u003d orm.relationship(\u0027IdPRemoteIdsModel\u0027,"},{"line_number":55,"context_line":"                                  order_by\u003d\u0027IdPRemoteIdsModel.remote_id\u0027,"},{"line_number":56,"context_line":"                                  cascade\u003d\u0027all, delete-orphan\u0027)"},{"line_number":57,"context_line":"    remote_id \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @classmethod"},{"line_number":60,"context_line":"    def from_dict(cls, dictionary):"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6ced46_8ecdf187","line":57,"in_reply_to":"1a6ced46_2b3a2fe7","updated":"2015-03-25 17:45:28.000000000","message":"Actually, it was removed but I put back because I need this for the migration. Using sqlalchemy to move the remote_id from the table \"identity_provider\" to the new table I need this attribute in the model. I was trying to add a new \"temporary\" model for the table used during the migration but I found several limitation with sqlalchemy and at the end I opted with this solution where the attribute is there but it is not used except for the migration (it is not included in the attributes list).\nIf there is an alternative solution allowing to use sqlalchemy for the migration and remove this attribute I am happy to remove it again because I do not like this too much.","commit_id":"ca67d8736e87d2023782a346ea68a5d0dc4de89d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c13d9dd3d82fc532ed13c139ab1d8ee91e4b4452","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    remote_ids \u003d orm.relationship(\u0027IdPRemoteIdsModel\u0027,"},{"line_number":55,"context_line":"                                  order_by\u003d\u0027IdPRemoteIdsModel.remote_id\u0027,"},{"line_number":56,"context_line":"                                  cascade\u003d\u0027all, delete-orphan\u0027)"},{"line_number":57,"context_line":"    remote_id \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @classmethod"},{"line_number":60,"context_line":"    def from_dict(cls, dictionary):"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6ced46_a42489c5","line":57,"in_reply_to":"1a6ced46_8ecdf187","updated":"2015-03-25 20:44:01.000000000","message":"It seems bad that this will make the models out of sync with the migrations.","commit_id":"ca67d8736e87d2023782a346ea68a5d0dc4de89d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"92eb7a615cd56c685cfd8ffa1c6a0c91f6f9dca9","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    remote_ids \u003d orm.relationship(\u0027IdPRemoteIdsModel\u0027,"},{"line_number":55,"context_line":"                                  order_by\u003d\u0027IdPRemoteIdsModel.remote_id\u0027,"},{"line_number":56,"context_line":"                                  cascade\u003d\u0027all, delete-orphan\u0027)"},{"line_number":57,"context_line":"    remote_id \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    @classmethod"},{"line_number":60,"context_line":"    def from_dict(cls, dictionary):"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6ced46_c275f5fa","line":57,"in_reply_to":"1a6ced46_a42489c5","updated":"2015-03-25 21:26:34.000000000","message":"I quite agree. I tried to create a different model in the migration script where I put the remote_id but sqlalchemy raise exception because the table is already bounded with a model.\n\nMaybe there is a solution to create a temporary model or add and remote the remote_id dynamically but I did not find the way to it. Therefore, I thought this is better then have plain SQL in the migration.\nI am investigating alternative solutions and if someone has an hint to fix this in a better way it is great.","commit_id":"ca67d8736e87d2023782a346ea68a5d0dc4de89d"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cc32c200f4ae7f6b071cd7dad658d604bcaa5a52","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        identity_provider \u003d cls(**new_dictionary)"},{"line_number":63,"context_line":"        remote_ids \u003d []"},{"line_number":64,"context_line":"        for remote in remote_ids_list:"},{"line_number":65,"context_line":"            remote_ids.append(IdPRemoteIdsModel(remote_id\u003dremote))"},{"line_number":66,"context_line":"        identity_provider.remote_ids \u003d remote_ids"},{"line_number":67,"context_line":"        return identity_provider"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"fa963961_a2b43ed1","line":65,"updated":"2015-03-26 13:35:28.000000000","message":"how does the idp_id get filled in....I assume because it is a FK? Maybe add a comment saying that, since it\u0027s not particularly obvious.","commit_id":"8ab59b67c280327a08fb82cee33a301d45403e1d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"d1596a98220b35526df815c54cdf3a7264d782b3","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        identity_provider \u003d cls(**new_dictionary)"},{"line_number":63,"context_line":"        remote_ids \u003d []"},{"line_number":64,"context_line":"        for remote in remote_ids_list:"},{"line_number":65,"context_line":"            remote_ids.append(IdPRemoteIdsModel(remote_id\u003dremote))"},{"line_number":66,"context_line":"        identity_provider.remote_ids \u003d remote_ids"},{"line_number":67,"context_line":"        return identity_provider"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"fa963961_6509a031","line":65,"in_reply_to":"fa963961_a2b43ed1","updated":"2015-03-26 15:09:48.000000000","message":"Done","commit_id":"8ab59b67c280327a08fb82cee33a301d45403e1d"}],"keystone/contrib/federation/migrate_repo/versions/006_add_remote_id_table.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"04a10f618987798995d4dd759d56b0417e9ed3fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"da86d52c_4a7d6f6c","updated":"2015-02-19 02:24:19.000000000","message":"something here is causing keystone to not be able to start. check the devstack logs","commit_id":"ef1962546917ac60e9741e16dd575a8d07842de6"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"929112d22adeee3632a1dc3832dd0ec4765cfe8d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"da86d52c_6fb5d8eb","in_reply_to":"da86d52c_4a7d6f6c","updated":"2015-02-19 10:46:33.000000000","message":"Yes, the key was too long!\nFixed","commit_id":"ef1962546917ac60e9741e16dd575a8d07842de6"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fbf19d6002b56b8f7c191cf480fe54392fc6b553","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                   # but should be included"},{"line_number":28,"context_line":"                   #"},{"line_number":29,"context_line":"                   # sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                   #                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":31,"context_line":"                   primary_key\u003dTrue,"},{"line_number":32,"context_line":"                   nullable\u003dFalse),"},{"line_number":33,"context_line":"        sql.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_52219cb2","line":30,"updated":"2015-02-19 12:12:49.000000000","message":"this should work if you add something like \n\nidp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue) somewhere above, say line 19.","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"2d1e8a37499920060cb9a25b5c458e12b70620aa","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                   # but should be included"},{"line_number":28,"context_line":"                   #"},{"line_number":29,"context_line":"                   # sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                   #                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":31,"context_line":"                   primary_key\u003dTrue,"},{"line_number":32,"context_line":"                   nullable\u003dFalse),"},{"line_number":33,"context_line":"        sql.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_f557da57","line":30,"in_reply_to":"da86d52c_52219cb2","updated":"2015-02-19 14:32:34.000000000","message":"It sound like a bad implementation of sqlalchemy but it works :)","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"b5ee6eeb7ea2075a882d5e2f371fe29cbb63d635","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                   # but should be included"},{"line_number":28,"context_line":"                   #"},{"line_number":29,"context_line":"                   # sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                   #                ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":31,"context_line":"                   primary_key\u003dTrue,"},{"line_number":32,"context_line":"                   nullable\u003dFalse),"},{"line_number":33,"context_line":"        sql.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_987ecead","line":30,"in_reply_to":"da86d52c_f557da57","updated":"2015-02-19 14:58:15.000000000","message":"it might be migrations system, not sqlalchemy.","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fbf19d6002b56b8f7c191cf480fe54392fc6b553","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                           \u0027SELECT id, remote_id FROM identity_provider\u0027)"},{"line_number":44,"context_line":"    idp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"},{"line_number":45,"context_line":"    idp_table.drop_column(\u0027remote_id\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def downgrade(migrate_engine):"},{"line_number":49,"context_line":"    meta \u003d sql.MetaData()"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_d23bcc99","line":46,"updated":"2015-02-19 12:12:49.000000000","message":"niiice!","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"08c5993715a9494485c44d800628031086cdebe6","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        sql.Column(\u0027remote_id\u0027,"},{"line_number":29,"context_line":"                   sql.String(255),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue,"},{"line_number":31,"context_line":"                   unique\u003dTrue),"},{"line_number":32,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":33,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_d2eed8b3","line":31,"updated":"2015-02-23 20:34:01.000000000","message":"should this be unique?\n\nif we have many IdPs, then can\u0027t they share a remote_id value?","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"1b44b2ee52b5140bd40fc5854ded360422750f03","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        sql.Column(\u0027remote_id\u0027,"},{"line_number":29,"context_line":"                   sql.String(255),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue,"},{"line_number":31,"context_line":"                   unique\u003dTrue),"},{"line_number":32,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":33,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_3e228801","line":31,"in_reply_to":"ba7be1f8_68560ad4","updated":"2015-02-24 10:20:59.000000000","message":"Additionally, keystone IdP identifies a mapping for users coming from a remote IdP. If you associate the same remote IdP with multiple keystone IdP the mapping become ambiguous. The same user could have different policies depending on the log-in link.\n\nThe other way, multiple remote IdPs in a single keystone IdP, makes sense because in this case the mapping is shared and there are not ambiguities.","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e1570e51b04548345ffa67f6cb0119bda033af4c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        sql.Column(\u0027remote_id\u0027,"},{"line_number":29,"context_line":"                   sql.String(255),"},{"line_number":30,"context_line":"                   primary_key\u003dTrue,"},{"line_number":31,"context_line":"                   unique\u003dTrue),"},{"line_number":32,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":33,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":34,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_68560ad4","line":31,"in_reply_to":"ba7be1f8_d2eed8b3","updated":"2015-02-24 09:15:19.000000000","message":"sadly, yes. In websso patch we get identity_provider object by querying remote_id brought to us in an assertion/claim.","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":"    idp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"},{"line_number":20,"context_line":"    # NOTE: the table should be utf8 but this create problems with"},{"line_number":21,"context_line":"    # identity_provider table which is not. Both should be fixed"},{"line_number":22,"context_line":"    remote_id_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027idp_remote_ids\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_98e008fc","line":20,"updated":"2015-03-02 07:35:58.000000000","message":"change this to:\n\n  # NOTE(launchpad-id): The table ...","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4ca0efeec37ee8796c54e362171cdf49f84cc49c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":"    idp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"},{"line_number":20,"context_line":"    # NOTE: the table should be utf8 but this create problems with"},{"line_number":21,"context_line":"    # identity_provider table which is not. Both should be fixed"},{"line_number":22,"context_line":"    remote_id_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027idp_remote_ids\u0027,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_18017806","line":20,"in_reply_to":"ba7be1f8_98e008fc","updated":"2015-03-02 08:07:51.000000000","message":"++","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":"    idp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"},{"line_number":20,"context_line":"    # NOTE: the table should be utf8 but this create problems with"},{"line_number":21,"context_line":"    # identity_provider table which is not. Both should be fixed"},{"line_number":22,"context_line":"    remote_id_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027idp_remote_ids\u0027,"},{"line_number":24,"context_line":"        meta,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_38babce1","line":21,"updated":"2015-03-02 07:35:58.000000000","message":"Remove \"Both should be fixed\", since it seems incomplete. File a bug for it","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4ca0efeec37ee8796c54e362171cdf49f84cc49c","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":"    idp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"},{"line_number":20,"context_line":"    # NOTE: the table should be utf8 but this create problems with"},{"line_number":21,"context_line":"    # identity_provider table which is not. Both should be fixed"},{"line_number":22,"context_line":"    remote_id_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027idp_remote_ids\u0027,"},{"line_number":24,"context_line":"        meta,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_f31cc56c","line":21,"in_reply_to":"ba7be1f8_38babce1","updated":"2015-03-02 08:07:51.000000000","message":"There is a bug https://bugs.launchpad.net/keystone/+bug/1426334 already filed.\nProbably the link or bug-id could be added in the NOTE.","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        sql.Column(\u0027remote_id\u0027,"},{"line_number":31,"context_line":"                   sql.String(255),"},{"line_number":32,"context_line":"                   primary_key\u003dTrue,"},{"line_number":33,"context_line":"                   unique\u003dTrue))"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    remote_id_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":36,"context_line":"    migrate_engine.execute(\u0027INSERT INTO idp_remote_ids (idp_id,remote_id) \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_189a586e","line":33,"updated":"2015-03-02 07:35:58.000000000","message":"Write a note explaining why it\u0027s unique.","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d95f50f67e15d513b281c05f3573f73820a97f35","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        sql.Column(\u0027remote_id\u0027,"},{"line_number":31,"context_line":"                   sql.String(255),"},{"line_number":32,"context_line":"                   primary_key\u003dTrue,"},{"line_number":33,"context_line":"                   unique\u003dTrue))"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    remote_id_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":36,"context_line":"    migrate_engine.execute(\u0027INSERT INTO idp_remote_ids (idp_id,remote_id) \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_d37181df","line":33,"in_reply_to":"ba7be1f8_189a586e","updated":"2015-03-02 08:42:36.000000000","message":"Done","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e0917e9e5c2f6c965e9e5c58cd224bbe5d51a21","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                   sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":28,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":29,"context_line":"                   primary_key\u003dTrue),"},{"line_number":30,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO pipe"},{"line_number":31,"context_line":"        # must be able to identify identity provider object basing on the"},{"line_number":32,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":33,"context_line":"        sql.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a80dd14_445fb672","line":30,"updated":"2015-03-11 13:26:31.000000000","message":"Isn\u0027t the primary key unique already?","commit_id":"29f7bfef74363cbd6c5018502cfaf3c1e6415260"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"93abdb93e1a4a2f75725bcf9193a3f6d746d01d3","unresolved":false,"context_lines":[{"line_number":27,"context_line":"                   sql.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":28,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":29,"context_line":"                   primary_key\u003dTrue),"},{"line_number":30,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO pipe"},{"line_number":31,"context_line":"        # must be able to identify identity provider object basing on the"},{"line_number":32,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":33,"context_line":"        sql.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a80dd14_41408356","line":30,"in_reply_to":"9a80dd14_445fb672","updated":"2015-03-11 14:39:47.000000000","message":"Primary Key is the couple (idp_id, remote_id) so the couple has to be unique and not the single element. For the websso is requested that the remote_id is unique.","commit_id":"29f7bfef74363cbd6c5018502cfaf3c1e6415260"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3a5c2569feced58bbbc21f17f997ae3a17be6fbd","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":29,"context_line":"                   primary_key\u003dTrue),"},{"line_number":30,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO pipe"},{"line_number":31,"context_line":"        # must be able to identify identity provider object basing on the"},{"line_number":32,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":33,"context_line":"        sql.Column(\u0027remote_id\u0027,"},{"line_number":34,"context_line":"                   sql.String(255),"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_42206ff7","line":31,"updated":"2015-03-11 21:33:52.000000000","message":"objects based*?","commit_id":"ae6cf4d45b80f3aa87f3398e8d0a4d1e25fb37a8"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"5c03f96176ec68afb20e78aa7140d6b0627e620b","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":29,"context_line":"                   primary_key\u003dTrue),"},{"line_number":30,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO pipe"},{"line_number":31,"context_line":"        # must be able to identify identity provider object basing on the"},{"line_number":32,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":33,"context_line":"        sql.Column(\u0027remote_id\u0027,"},{"line_number":34,"context_line":"                   sql.String(255),"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_146f79c6","line":31,"in_reply_to":"9a80dd14_42206ff7","updated":"2015-03-12 10:41:36.000000000","message":"Done","commit_id":"ae6cf4d45b80f3aa87f3398e8d0a4d1e25fb37a8"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"3a5c2569feced58bbbc21f17f997ae3a17be6fbd","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    remote_id \u003d sql.Column(\u0027remote_id\u0027, sql.String(255), nullable\u003dTrue)"},{"line_number":51,"context_line":"    idp_table.create_column(remote_id)"},{"line_number":52,"context_line":"    # NOTE: version 004 does not support multiple remote_ids so only the"},{"line_number":53,"context_line":"    #       first is restored and the other dropped"},{"line_number":54,"context_line":"    migrate_engine.execute(\u0027UPDATE identity_provider SET remote_id\u003d(SELECT \u0027"},{"line_number":55,"context_line":"                           \u0027remote_id from idp_remote_ids WHERE \u0027"},{"line_number":56,"context_line":"                           \u0027idp_remote_ids.idp_id\u003didentity_provider.id)\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_02b0378a","line":53,"updated":"2015-03-11 21:33:52.000000000","message":"Does this need to be officially documented anywhere?","commit_id":"ae6cf4d45b80f3aa87f3398e8d0a4d1e25fb37a8"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"5c03f96176ec68afb20e78aa7140d6b0627e620b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    remote_id \u003d sql.Column(\u0027remote_id\u0027, sql.String(255), nullable\u003dTrue)"},{"line_number":51,"context_line":"    idp_table.create_column(remote_id)"},{"line_number":52,"context_line":"    # NOTE: version 004 does not support multiple remote_ids so only the"},{"line_number":53,"context_line":"    #       first is restored and the other dropped"},{"line_number":54,"context_line":"    migrate_engine.execute(\u0027UPDATE identity_provider SET remote_id\u003d(SELECT \u0027"},{"line_number":55,"context_line":"                           \u0027remote_id from idp_remote_ids WHERE \u0027"},{"line_number":56,"context_line":"                           \u0027idp_remote_ids.idp_id\u003didentity_provider.id)\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"9a80dd14_d49b21c7","line":53,"in_reply_to":"9a80dd14_02b0378a","updated":"2015-03-12 10:41:36.000000000","message":"If someone tests kilo and then return back this should not be a problem because it return as it was before with only one entity per IdP. Anyway, there is a documentation or a place where downgrade problems should adverted? Generally, this is done only for the upgrade!","commit_id":"ae6cf4d45b80f3aa87f3398e8d0a4d1e25fb37a8"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":"    idp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"},{"line_number":20,"context_line":"    # NOTE(marco-fargetta): the table should be utf8 but this create problems"},{"line_number":21,"context_line":"    # with identity_provider table which is not. See bug #1426334."},{"line_number":22,"context_line":"    remote_id_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027idp_remote_ids\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_0ef9dd7f","line":20,"updated":"2015-03-13 16:25:47.000000000","message":"the table is utf8.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":"    idp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"},{"line_number":20,"context_line":"    # NOTE(marco-fargetta): the table should be utf8 but this create problems"},{"line_number":21,"context_line":"    # with identity_provider table which is not. See bug #1426334."},{"line_number":22,"context_line":"    remote_id_table \u003d sql.Table("},{"line_number":23,"context_line":"        \u0027idp_remote_ids\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_a9e5f0dc","line":20,"in_reply_to":"9a80dd14_0ef9dd7f","updated":"2015-03-16 12:42:25.000000000","message":"Done","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    remote_id_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":41,"context_line":"    migrate_engine.execute(\u0027INSERT INTO idp_remote_ids (idp_id,remote_id) \u0027"},{"line_number":42,"context_line":"                           \u0027SELECT id, remote_id FROM identity_provider\u0027)"},{"line_number":43,"context_line":"    idp_table.drop_column(\u0027remote_id\u0027)"},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_4ec1152e","line":41,"updated":"2015-03-13 16:25:47.000000000","message":"rather than writing sql we need to use sqlalchemy to build the sql so that it can work on all the databases that sqlalchemy supports.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":49,"context_line":"    idp_table \u003d sql.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"},{"line_number":50,"context_line":"    remote_id \u003d sql.Column(\u0027remote_id\u0027, sql.String(255), nullable\u003dTrue)"},{"line_number":51,"context_line":"    idp_table.create_column(remote_id)"},{"line_number":52,"context_line":"    # NOTE: version 004 does not support multiple remote_ids so only the"},{"line_number":53,"context_line":"    #       first is restored and the other dropped"},{"line_number":54,"context_line":"    migrate_engine.execute(\u0027UPDATE identity_provider SET remote_id\u003d(SELECT \u0027"},{"line_number":55,"context_line":"                           \u0027remote_id from idp_remote_ids WHERE \u0027"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_ae31b15b","line":52,"updated":"2015-03-13 16:25:47.000000000","message":"I\u0027d rather the downgrade failed rather than destroying data.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    idp_table.create_column(remote_id)"},{"line_number":52,"context_line":"    # NOTE: version 004 does not support multiple remote_ids so only the"},{"line_number":53,"context_line":"    #       first is restored and the other dropped"},{"line_number":54,"context_line":"    migrate_engine.execute(\u0027UPDATE identity_provider SET remote_id\u003d(SELECT \u0027"},{"line_number":55,"context_line":"                           \u0027remote_id from idp_remote_ids WHERE \u0027"},{"line_number":56,"context_line":"                           \u0027idp_remote_ids.idp_id\u003didentity_provider.id)\u0027)"},{"line_number":57,"context_line":"    table \u003d sql.Table(\u0027idp_remote_ids\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_aee371d7","line":54,"updated":"2015-03-13 16:25:47.000000000","message":"rather than writing sql we need to use sqlalchemy to build the sql so that it can work on all the databases that sqlalchemy supports.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                   orm.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":31,"context_line":"                   primary_key\u003dTrue),"},{"line_number":32,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO pipe"},{"line_number":33,"context_line":"        # must be able to identify identity provider object based on the"},{"line_number":34,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":35,"context_line":"        orm.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_cacf0c56","line":32,"updated":"2015-03-18 07:33:26.000000000","message":"pipe?","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                   orm.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":31,"context_line":"                   primary_key\u003dTrue),"},{"line_number":32,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO pipe"},{"line_number":33,"context_line":"        # must be able to identify identity provider object based on the"},{"line_number":34,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":35,"context_line":"        orm.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_8fcc3ebd","line":32,"in_reply_to":"9a80dd14_cacf0c56","updated":"2015-03-18 10:31:45.000000000","message":"Done","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":31,"context_line":"                   primary_key\u003dTrue),"},{"line_number":32,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO pipe"},{"line_number":33,"context_line":"        # must be able to identify identity provider object based on the"},{"line_number":34,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":35,"context_line":"        orm.Column(\u0027remote_id\u0027,"},{"line_number":36,"context_line":"                   orm.String(255),"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_0ada0417","line":33,"updated":"2015-03-18 07:33:26.000000000","message":"objects*","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":31,"context_line":"                   primary_key\u003dTrue),"},{"line_number":32,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO pipe"},{"line_number":33,"context_line":"        # must be able to identify identity provider object based on the"},{"line_number":34,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":35,"context_line":"        orm.Column(\u0027remote_id\u0027,"},{"line_number":36,"context_line":"                   orm.String(255),"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_afc2e283","line":33,"in_reply_to":"9a80dd14_0ada0417","updated":"2015-03-18 10:31:45.000000000","message":"Done","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"291001d430a6d1175f4fc81dce728eff101d81a4","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        orm.Column(\u0027idp_id\u0027,"},{"line_number":28,"context_line":"                   orm.String(64),"},{"line_number":29,"context_line":"                   orm.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO auth"},{"line_number":32,"context_line":"        # must be able to identify identity provider objects based on the"},{"line_number":33,"context_line":"        # remote_id value conveyed in the assertion."}],"source_content_type":"text/x-python","patch_set":29,"id":"9a80dd14_3df8d9c3","line":30,"updated":"2015-03-18 16:00:57.000000000","message":"why was primary key removed?","commit_id":"fd752d8ecce3cd16bec31d41b17035d583851ca0"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"291001d430a6d1175f4fc81dce728eff101d81a4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                   orm.String(64),"},{"line_number":29,"context_line":"                   orm.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO auth"},{"line_number":32,"context_line":"        # must be able to identify identity provider objects based on the"},{"line_number":33,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":34,"context_line":"        orm.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a80dd14_dd2edd41","line":31,"updated":"2015-03-18 16:00:57.000000000","message":"why was the unique\u003dTrue removed?","commit_id":"fd752d8ecce3cd16bec31d41b17035d583851ca0"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"3c4e000d8b12964b402fc19cef6eac4bbe1fdd13","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                   orm.String(64),"},{"line_number":29,"context_line":"                   orm.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO auth"},{"line_number":32,"context_line":"        # must be able to identify identity provider objects based on the"},{"line_number":33,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":34,"context_line":"        orm.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a80dd14_a0df42d5","line":31,"in_reply_to":"9a80dd14_00e72ee5","updated":"2015-03-18 16:22:52.000000000","message":"Done","commit_id":"fd752d8ecce3cd16bec31d41b17035d583851ca0"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"d808f9e708c29f06201e3f4a39f56e404ba4a7bc","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                   orm.String(64),"},{"line_number":29,"context_line":"                   orm.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO auth"},{"line_number":32,"context_line":"        # must be able to identify identity provider objects based on the"},{"line_number":33,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":34,"context_line":"        orm.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a80dd14_fd43a169","line":31,"in_reply_to":"9a80dd14_dd2edd41","updated":"2015-03-18 16:08:50.000000000","message":"When I wrote this I was thinking to have PrimaryKey(idp_id,remote_id). Then Marek required that remote_id has to be unique because needed for the websso and I add the flag unique in the column. However, I thought all the possible combinations and I think the result of having the remote_id as primary key is the same as the double column plus the unique and should be more efficient in the DB.","commit_id":"fd752d8ecce3cd16bec31d41b17035d583851ca0"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"125ce6fb786251797d15865ece61f22236c512d9","unresolved":false,"context_lines":[{"line_number":28,"context_line":"                   orm.String(64),"},{"line_number":29,"context_line":"                   orm.ForeignKey(\u0027identity_provider.id\u0027,"},{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        # NOTE(marek-denis): remote_id must be unique as Keystone WebSSO auth"},{"line_number":32,"context_line":"        # must be able to identify identity provider objects based on the"},{"line_number":33,"context_line":"        # remote_id value conveyed in the assertion."},{"line_number":34,"context_line":"        orm.Column(\u0027remote_id\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a80dd14_00e72ee5","line":31,"in_reply_to":"9a80dd14_fd43a169","updated":"2015-03-18 16:18:54.000000000","message":"then this comment no longer applies, remove it :)","commit_id":"fd752d8ecce3cd16bec31d41b17035d583851ca0"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"020d7003ba7fb7d081558d4eecaa877b0fcf5c71","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        orm.Column(\u0027remote_id\u0027,"},{"line_number":32,"context_line":"                   orm.String(255),"},{"line_number":33,"context_line":"                   primary_key\u003dTrue),"},{"line_number":34,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":35,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_1aaac070","line":33,"updated":"2015-03-20 21:37:16.000000000","message":"you\u0027re gonna hate me, but can we bring back the unique id concept? i think it\u0027s essential, i\u0027m so sorry!","commit_id":"ca67d8736e87d2023782a346ea68a5d0dc4de89d"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"34240fbb00a1c8266ec4a1e877ea50fe90d3f489","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        orm.Column(\u0027remote_id\u0027,"},{"line_number":32,"context_line":"                   orm.String(255),"},{"line_number":33,"context_line":"                   primary_key\u003dTrue),"},{"line_number":34,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":35,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"9a80dd14_f87c1422","line":33,"in_reply_to":"9a80dd14_1aaac070","updated":"2015-03-20 22:48:38.000000000","message":"It\u0027s ok Steve, don\u0027t worry :-)\nAnyway, isn\u0027t primary_key\u003dTrue already assuring that the remote_id will be unique per se? \nMy understanding from this commento-convo was that it\u0027s a debate \"why add unique\u003dTrue since we already have primary_key\u003dTrue\". Otherwise I\u0027d stand still and defend remote_id uniqueness :-)","commit_id":"ca67d8736e87d2023782a346ea68a5d0dc4de89d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"50742b21c5a7c4c24f30521e71822fc8384695df","unresolved":false,"context_lines":[{"line_number":30,"context_line":"                                  ondelete\u003d\u0027CASCADE\u0027)),"},{"line_number":31,"context_line":"        orm.Column(\u0027remote_id\u0027,"},{"line_number":32,"context_line":"                   orm.String(255),"},{"line_number":33,"context_line":"                   primary_key\u003dTrue),"},{"line_number":34,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":35,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6ced46_a1631bb0","line":33,"in_reply_to":"9a80dd14_f87c1422","updated":"2015-03-23 12:05:40.000000000","message":"It is not a problem to add but as specified by Marek the primary_key\u003dTrue implies the uniqueness of the field. Previously it was there because the primary_key\u003dTrue was in both the remote_id and the idp_id and this translate to sql as PRIMARY KEY (`idp_id`.`remote_id`), this does not imply the uniqueness of the remote_id but that of the combination.\n\nThus, add only the unique id concept in remote_id does not make sense if we do not put back the idea of a primary key as a couple or some other changes.\n\nI would leave as it is now but if you (and others) prefer the unique approach for me is OK","commit_id":"ca67d8736e87d2023782a346ea68a5d0dc4de89d"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c13d9dd3d82fc532ed13c139ab1d8ee91e4b4452","unresolved":false,"context_lines":[{"line_number":40,"context_line":"                                      IdentityProviderModel.remote_id):"},{"line_number":41,"context_line":"            session.add(IdPRemoteIdsModel(idp_id\u003didentity.id,"},{"line_number":42,"context_line":"                                          remote_id\u003didentity.remote_id))"},{"line_number":43,"context_line":"    idp_table.drop_column(\u0027remote_id\u0027)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def downgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":30,"id":"1a6ced46_84606d02","line":43,"updated":"2015-03-25 20:44:01.000000000","message":"Can you drop this if we still have it defined in the models? Seems weird and will get us out of sync.","commit_id":"ca67d8736e87d2023782a346ea68a5d0dc4de89d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6c6cc88f718e3b5d262c6634e9424b024f05caba","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"def downgrade(migrate_engine):"},{"line_number":47,"context_line":"    raise NotImplementedError(\u0027Downgrade to pre-Kilo release db schema is \u0027"},{"line_number":48,"context_line":"                              \u0027unsupported.\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"1a6ced46_d16e982e","line":47,"updated":"2015-03-26 06:03:18.000000000","message":"just call pass - this patch (https://review.openstack.org/#/c/167834/) will land, and we can stop caring about downgrades","commit_id":"456b9723a9bc724e40b0625ecd3f363c1ec3f61c"}],"keystone/contrib/federation/migrate_repo/versions/007_add_remote_id_table.py":[{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"1b95be8ada3dcbab9680b6e7f3650bf7cde52d97","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def downgrade(migrate_engine):"},{"line_number":46,"context_line":"    pass"}],"source_content_type":"text/x-python","patch_set":34,"id":"1a6ced46_cf56e7cd","line":46,"updated":"2015-03-26 11:45:05.000000000","message":"This is not possible because the table \"idp_remote_ids\" has a foreign key with the identity_provider table. If you do not remove the table and/or not raise exception you get error during the downgrade of 001 script.\n\nI will drop the table for now and put back the remote-id column. What should we do with the data in table? My initial approach was to populate back the column but some information could be missed because the column accept only one remote_id and we have many. The comment were to stop the downgrade but it seems there is no agreement on this.","commit_id":"46f2f5b8a61a5775a4c2945c9e79c45e4eeb303e"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"cc32c200f4ae7f6b071cd7dad658d604bcaa5a52","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    idp_table.drop_column(\u0027remote_id\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def downgrade(migrate_engine):"},{"line_number":46,"context_line":"    meta \u003d orm.MetaData()"},{"line_number":47,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":48,"context_line":"    idp_table \u003d orm.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa963961_a2e1de00","line":45,"updated":"2015-03-26 13:35:28.000000000","message":"we no longer have to provide downgrades, so we can delete this.","commit_id":"8ab59b67c280327a08fb82cee33a301d45403e1d"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"d1596a98220b35526df815c54cdf3a7264d782b3","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    idp_table.drop_column(\u0027remote_id\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def downgrade(migrate_engine):"},{"line_number":46,"context_line":"    meta \u003d orm.MetaData()"},{"line_number":47,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":48,"context_line":"    idp_table \u003d orm.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":36,"id":"fa963961_11dd7614","line":45,"in_reply_to":"fa963961_a2e1de00","updated":"2015-03-26 15:09:48.000000000","message":"Actually, the patch disabling the downgrades is not yet merged:\n\nhttps://review.openstack.org/#/c/167834/\n\nHence, I am leaving as it is for the moment.","commit_id":"8ab59b67c280327a08fb82cee33a301d45403e1d"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"891543afd497c667c5e249849714339dc779ab8c","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    with sql.transaction() as session:"},{"line_number":38,"context_line":"        for identity in session.query(idp_table.c.id,"},{"line_number":39,"context_line":"                                      idp_table.c.remote_id):"},{"line_number":40,"context_line":"            session.add(IdPRemoteIdsModel(idp_id\u003didentity.id,"},{"line_number":41,"context_line":"                                          remote_id\u003didentity.remote_id))"},{"line_number":42,"context_line":"    idp_table.drop_column(\u0027remote_id\u0027)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"fa963961_8db6f43b","line":40,"updated":"2015-03-27 00:04:41.000000000","message":"This is likely to break if IdPRemoteIdsModel changes in the future. My -1 can be reversed if a followup patch is proposed to address this issue. The rest of this looks pretty good.","commit_id":"59a4fe1783e68d2f280250ff8e3a5773bcb0664d"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"741e4aeaadee0a99a914cf7db0a360275086fc50","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    with sql.transaction() as session:"},{"line_number":38,"context_line":"        for identity in session.query(idp_table.c.id,"},{"line_number":39,"context_line":"                                      idp_table.c.remote_id):"},{"line_number":40,"context_line":"            session.add(IdPRemoteIdsModel(idp_id\u003didentity.id,"},{"line_number":41,"context_line":"                                          remote_id\u003didentity.remote_id))"},{"line_number":42,"context_line":"    idp_table.drop_column(\u0027remote_id\u0027)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":39,"id":"fa963961_4d87cc61","line":40,"in_reply_to":"fa963961_8db6f43b","updated":"2015-03-27 00:06:01.000000000","message":"It is actually 100% ok to duplicate the model here in the migration file if that is useful. You know the state of the table prior to migrating, and you know what the state should be when done. This has no bearing on the model in keystone.contrib.federation.backends.sql.","commit_id":"59a4fe1783e68d2f280250ff8e3a5773bcb0664d"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e20c6c2111ba6c0e3c5b085c5f2043c341ff05a7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    idp_table.drop_column(\u0027remote_id\u0027)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def downgrade(migrate_engine):"},{"line_number":46,"context_line":"    meta \u003d orm.MetaData()"},{"line_number":47,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":48,"context_line":"    idp_table \u003d orm.Table(\u0027identity_provider\u0027, meta, autoload\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":39,"id":"fa963961_9c818492","line":45,"updated":"2015-03-27 06:25:52.000000000","message":"the patch for removing downgrades has been merged, this section can be removed.","commit_id":"59a4fe1783e68d2f280250ff8e3a5773bcb0664d"}],"keystone/contrib/federation/utils.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"04a10f618987798995d4dd759d56b0417e9ed3fc","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    if protocol \u003d\u003d \u0027saml2\u0027:"},{"line_number":143,"context_line":"        remote_id_parameter \u003d CONF.saml2.remote_id_attribute"},{"line_number":144,"context_line":"    if protocol \u003d\u003d \u0027oidc\u0027:"},{"line_number":145,"context_line":"        remote_id_parameter \u003d CONF.saml2.remote_id_attribute"},{"line_number":146,"context_line":"    if not remote_id_parameter:"},{"line_number":147,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":148,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_ea38e3a1","line":145,"updated":"2015-02-19 02:24:19.000000000","message":"CONF.oidc?","commit_id":"ef1962546917ac60e9741e16dd575a8d07842de6"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"929112d22adeee3632a1dc3832dd0ec4765cfe8d","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    if protocol \u003d\u003d \u0027saml2\u0027:"},{"line_number":143,"context_line":"        remote_id_parameter \u003d CONF.saml2.remote_id_attribute"},{"line_number":144,"context_line":"    if protocol \u003d\u003d \u0027oidc\u0027:"},{"line_number":145,"context_line":"        remote_id_parameter \u003d CONF.saml2.remote_id_attribute"},{"line_number":146,"context_line":"    if not remote_id_parameter:"},{"line_number":147,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":148,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"da86d52c_5458ad89","line":145,"in_reply_to":"da86d52c_ea38e3a1","updated":"2015-02-19 10:46:33.000000000","message":"Done","commit_id":"ef1962546917ac60e9741e16dd575a8d07842de6"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fbf19d6002b56b8f7c191cf480fe54392fc6b553","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    if protocol \u003d\u003d \u0027oidc\u0027:"},{"line_number":145,"context_line":"        remote_id_parameter \u003d CONF.oidc.remote_id_attribute"},{"line_number":146,"context_line":"    if not remote_id_parameter:"},{"line_number":147,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":148,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"},{"line_number":149,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IdP %s \u0027),"},{"line_number":150,"context_line":"                    idp[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_b25f38e4","line":147,"updated":"2015-02-19 12:12:49.000000000","message":"i super dislike it. There should be another way to do this more generically.","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"2d1e8a37499920060cb9a25b5c458e12b70620aa","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    if protocol \u003d\u003d \u0027oidc\u0027:"},{"line_number":145,"context_line":"        remote_id_parameter \u003d CONF.oidc.remote_id_attribute"},{"line_number":146,"context_line":"    if not remote_id_parameter:"},{"line_number":147,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":148,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"},{"line_number":149,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IdP %s \u0027),"},{"line_number":150,"context_line":"                    idp[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_e9fb7f78","line":147,"in_reply_to":"da86d52c_b25f38e4","updated":"2015-02-19 14:32:34.000000000","message":"Done","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"eaf23ce0ddef2ee904b4d62ed725329713e27689","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":144,"context_line":"        remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":145,"context_line":"    except AttributeError:"},{"line_number":146,"context_line":"        pass"},{"line_number":147,"context_line":"    if not remote_id_parameter:"},{"line_number":148,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_385962fd","line":145,"updated":"2015-02-19 15:00:37.000000000","message":"this is much better. Now, AFAIR we need to first register the group that\u0027s name is equal to protocol\u0027s name so the values from keystone.conf will be really accessible. Probably worth checking on a real keystone deployment....","commit_id":"d4820c7b1c15664225761fb48f36816a9a9475e3"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"f944ee58e5fb7ca59b9bf3c9426946dbeaa98131","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":144,"context_line":"        remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":145,"context_line":"    except AttributeError:"},{"line_number":146,"context_line":"        pass"},{"line_number":147,"context_line":"    if not remote_id_parameter:"},{"line_number":148,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_ae50a82c","line":145,"in_reply_to":"da86d52c_385962fd","updated":"2015-02-19 15:39:00.000000000","message":"What do you mean with \"register the group\". It is not clear to me!","commit_id":"d4820c7b1c15664225761fb48f36816a9a9475e3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"08c5993715a9494485c44d800628031086cdebe6","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":144,"context_line":"        remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":145,"context_line":"    except AttributeError:"},{"line_number":146,"context_line":"        CONF.register_opt(cfg.StrOpt(\u0027remote_id_attribute\u0027),"},{"line_number":147,"context_line":"                          group\u003dprotocol)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            conf_protocol \u003d getattr(CONF, protocol)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_32b81476","line":146,"updated":"2015-02-23 20:34:01.000000000","message":"why are we registering them now? is there a reason we don\u0027t just add them to:\n\nhttps://github.com/openstack/keystone/blob/master/keystone/common/config.py#L859\n\nand \n\nwe could make a new group and option for \u0027oidc\u0027.","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e1570e51b04548345ffa67f6cb0119bda033af4c","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":144,"context_line":"        remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":145,"context_line":"    except AttributeError:"},{"line_number":146,"context_line":"        CONF.register_opt(cfg.StrOpt(\u0027remote_id_attribute\u0027),"},{"line_number":147,"context_line":"                          group\u003dprotocol)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            conf_protocol \u003d getattr(CONF, protocol)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_889b3e71","line":146,"in_reply_to":"ba7be1f8_32b81476","updated":"2015-02-24 09:15:19.000000000","message":"If you preregister groups like \u0027saml2\u0027, \u0027oidc\u0027 you will also constrain yourself to protocol objects called \u0027saml2\u0027 and \u0027oidc\u0027. As we decided the naming is free we need to keep supporting this freedom. The whole idea behind:\n\n- add a protocol \u0027myawesomeprotocol\u0027\n\nedit keystone.conf and add\n[auth]\nmethods \u003d password,myawesomeprotocol\nmyawesomeprotocol \u003d driver.backend.sql.Protocol\n\nnow, user adds still in the keystone.conf:\n\n[myawesomeprotocol]\nremote_id_attribute \u003d \u0027ParameterNameInClaim\u0027\n\nNow, to be able to to read this value in line 146 we first need to register it.","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"\"\"Check if the IdP providing the assertion is the one registered for"},{"line_number":140,"context_line":"       the mapping"},{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":144,"context_line":"        remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":145,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_f802e4b2","line":142,"updated":"2015-03-02 07:35:58.000000000","message":"this seems weird to me, maybe add a note explaining it?\n\n  NOTE (marco): Since we support any protocol ID, we attempt to\n  retrieve the remote_id_attribute of the protocol ID. If it\u0027s not\n  registered in the config, then register the option and try again.\n  This allows the user to register protocols other than oidc and\n  saml2.","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4ca0efeec37ee8796c54e362171cdf49f84cc49c","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"\"\"Check if the IdP providing the assertion is the one registered for"},{"line_number":140,"context_line":"       the mapping"},{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":144,"context_line":"        remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":145,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_932389a6","line":142,"in_reply_to":"ba7be1f8_f802e4b2","updated":"2015-03-02 08:07:51.000000000","message":"++","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d95f50f67e15d513b281c05f3573f73820a97f35","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    \"\"\"Check if the IdP providing the assertion is the one registered for"},{"line_number":140,"context_line":"       the mapping"},{"line_number":141,"context_line":"    \"\"\""},{"line_number":142,"context_line":"    try:"},{"line_number":143,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":144,"context_line":"        remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":145,"context_line":"    except AttributeError:"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_cef2ba9a","line":142,"in_reply_to":"ba7be1f8_f802e4b2","updated":"2015-03-02 08:42:36.000000000","message":"Done","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        CONF.register_opt(cfg.StrOpt(\u0027remote_id_attribute\u0027),"},{"line_number":147,"context_line":"                          group\u003dprotocol)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":150,"context_line":"            remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":151,"context_line":"        except Exception:"},{"line_number":152,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_586130a7","line":149,"updated":"2015-03-02 07:35:58.000000000","message":"this is repeated logic from line 142-143, this may be optimized on a later patch","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d95f50f67e15d513b281c05f3573f73820a97f35","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        CONF.register_opt(cfg.StrOpt(\u0027remote_id_attribute\u0027),"},{"line_number":147,"context_line":"                          group\u003dprotocol)"},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":150,"context_line":"            remote_id_parameter \u003d conf_protocol.remote_id_attribute"},{"line_number":151,"context_line":"        except Exception:"},{"line_number":152,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_2e37d6b1","line":149,"in_reply_to":"ba7be1f8_586130a7","updated":"2015-03-02 08:42:36.000000000","message":"moved to separate sub-fun.","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        except Exception:"},{"line_number":152,"context_line":"            pass"},{"line_number":153,"context_line":"    if not remote_id_parameter:"},{"line_number":154,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":155,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"},{"line_number":156,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IdP %s \u0027),"},{"line_number":157,"context_line":"                    idp[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_d8452016","line":154,"updated":"2015-03-02 07:35:58.000000000","message":"we could probably remove this option now, if we are going to support this on a per-protocol level. this may be done at a later patch","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d95f50f67e15d513b281c05f3573f73820a97f35","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        except Exception:"},{"line_number":152,"context_line":"            pass"},{"line_number":153,"context_line":"    if not remote_id_parameter:"},{"line_number":154,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":155,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"},{"line_number":156,"context_line":"        LOG.warning(_LW(\u0027Impossible to identify the IdP %s \u0027),"},{"line_number":157,"context_line":"                    idp[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_eebdbe03","line":154,"in_reply_to":"ba7be1f8_d8452016","updated":"2015-03-02 08:42:36.000000000","message":"I will talk with Morgan about it.","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"2e0917e9e5c2f6c965e9e5c58cd224bbe5d51a21","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def validate_idp(idp, protocol, assertion):"},{"line_number":140,"context_line":"    \"\"\"Check if the IdP providing the assertion is the one registered for"},{"line_number":141,"context_line":"       the mapping"},{"line_number":142,"context_line":"    \"\"\""},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"9a80dd14_8f91c754","line":140,"updated":"2015-03-11 13:26:31.000000000","message":"Suggest: Validate the IdP providing the assertion is registered for the mapping.","commit_id":"29f7bfef74363cbd6c5018502cfaf3c1e6415260"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"93abdb93e1a4a2f75725bcf9193a3f6d746d01d3","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"def validate_idp(idp, protocol, assertion):"},{"line_number":140,"context_line":"    \"\"\"Check if the IdP providing the assertion is the one registered for"},{"line_number":141,"context_line":"       the mapping"},{"line_number":142,"context_line":"    \"\"\""},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"9a80dd14_d4118fb0","line":140,"in_reply_to":"9a80dd14_8f91c754","updated":"2015-03-11 14:39:47.000000000","message":"Done","commit_id":"29f7bfef74363cbd6c5018502cfaf3c1e6415260"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_remote_id_param():"},{"line_number":144,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":145,"context_line":"        return conf_protocol.remote_id_attribute"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    # NOTE(marco-fargetta): Since we support any protocol ID, we attempt to"},{"line_number":148,"context_line":"    # retrieve the remote_id_attribute of the protocol ID. If it\u0027s not"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_aef4515b","line":145,"updated":"2015-03-13 16:25:47.000000000","message":"suggest use CONF[protocol][\u0027remote_id_attribute\u0027] -- no need for getattr here.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def get_remote_id_param():"},{"line_number":144,"context_line":"        conf_protocol \u003d getattr(CONF, protocol)"},{"line_number":145,"context_line":"        return conf_protocol.remote_id_attribute"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    # NOTE(marco-fargetta): Since we support any protocol ID, we attempt to"},{"line_number":148,"context_line":"    # retrieve the remote_id_attribute of the protocol ID. If it\u0027s not"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_93369b01","line":145,"in_reply_to":"9a80dd14_aef4515b","updated":"2015-03-16 12:42:25.000000000","message":"Done","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        try:"},{"line_number":158,"context_line":"            remote_id_parameter \u003d get_remote_id_param()"},{"line_number":159,"context_line":"        except AttributeError:"},{"line_number":160,"context_line":"            LOG.warning(_LW(\"Cannot find \u0027remote_id_attibute\u0027 in \""},{"line_number":161,"context_line":"                            \"configuration group %s. Trying default location \""},{"line_number":162,"context_line":"                            \"CONF.federation.remote_id_attribute\"), protocol)"},{"line_number":163,"context_line":"    if not remote_id_parameter:"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_2e6b011f","line":160,"updated":"2015-03-13 16:25:47.000000000","message":"according to the coverage report this isn\u0027t tested.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        try:"},{"line_number":158,"context_line":"            remote_id_parameter \u003d get_remote_id_param()"},{"line_number":159,"context_line":"        except AttributeError:"},{"line_number":160,"context_line":"            LOG.warning(_LW(\"Cannot find \u0027remote_id_attibute\u0027 in \""},{"line_number":161,"context_line":"                            \"configuration group %s. Trying default location \""},{"line_number":162,"context_line":"                            \"CONF.federation.remote_id_attribute\"), protocol)"},{"line_number":163,"context_line":"    if not remote_id_parameter:"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_eeb0ce44","line":160,"in_reply_to":"9a80dd14_2e6b011f","updated":"2015-03-16 12:42:25.000000000","message":"This case should go in this test:\ntest_issue_unscoped_token_with_remote_no_attribute\n\nLine 1841 of https://review.openstack.org/#/c/152156/25/keystone/tests/unit/test_v3_federation.py","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            remote_id_parameter \u003d get_remote_id_param()"},{"line_number":159,"context_line":"        except AttributeError:"},{"line_number":160,"context_line":"            LOG.warning(_LW(\"Cannot find \u0027remote_id_attibute\u0027 in \""},{"line_number":161,"context_line":"                            \"configuration group %s. Trying default location \""},{"line_number":162,"context_line":"                            \"CONF.federation.remote_id_attribute\"), protocol)"},{"line_number":163,"context_line":"    if not remote_id_parameter:"},{"line_number":164,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_4e7e75b0","line":161,"updated":"2015-03-13 16:25:47.000000000","message":"use a named replacement since that should make it easier for the translaters.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            remote_id_parameter \u003d get_remote_id_param()"},{"line_number":159,"context_line":"        except AttributeError:"},{"line_number":160,"context_line":"            LOG.warning(_LW(\"Cannot find \u0027remote_id_attibute\u0027 in \""},{"line_number":161,"context_line":"                            \"configuration group %s. Trying default location \""},{"line_number":162,"context_line":"                            \"CONF.federation.remote_id_attribute\"), protocol)"},{"line_number":163,"context_line":"    if not remote_id_parameter:"},{"line_number":164,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_ae97b638","line":161,"in_reply_to":"9a80dd14_4e7e75b0","updated":"2015-03-16 12:42:25.000000000","message":"I am not sure about this but I cahnge it","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        except AttributeError:"},{"line_number":160,"context_line":"            LOG.warning(_LW(\"Cannot find \u0027remote_id_attibute\u0027 in \""},{"line_number":161,"context_line":"                            \"configuration group %s. Trying default location \""},{"line_number":162,"context_line":"                            \"CONF.federation.remote_id_attribute\"), protocol)"},{"line_number":163,"context_line":"    if not remote_id_parameter:"},{"line_number":164,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":165,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_4e55951c","line":162,"updated":"2015-03-13 16:25:47.000000000","message":"Why is this a warning? Is the admin supposed to define this?","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d0a2efea17abcd9c770625379821a0ad9625cbde","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        except AttributeError:"},{"line_number":160,"context_line":"            LOG.warning(_LW(\"Cannot find \u0027remote_id_attibute\u0027 in \""},{"line_number":161,"context_line":"                            \"configuration group %s. Trying default location \""},{"line_number":162,"context_line":"                            \"CONF.federation.remote_id_attribute\"), protocol)"},{"line_number":163,"context_line":"    if not remote_id_parameter:"},{"line_number":164,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":165,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_848e892c","line":162,"in_reply_to":"9a80dd14_4e55951c","updated":"2015-03-13 18:17:35.000000000","message":"it\u0027s a warning because a keystone admin can set this up on a per-protocol level in the config file, so...\n\n  [oidc]\n  remote_id_attribute \u003d \"HTTP_OIDC_ISS\"\n\nor have a single global one that applies to all protocols\n\n  [federation]\n  remote_id_attribute \u003d \"my_env_var\"\n\nor none at all, for this reason look at my comment in the tests","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"e195c9592d1ceab1424057a91862b2dc0b657487","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        except AttributeError:"},{"line_number":160,"context_line":"            LOG.warning(_LW(\"Cannot find \u0027remote_id_attibute\u0027 in \""},{"line_number":161,"context_line":"                            \"configuration group %s. Trying default location \""},{"line_number":162,"context_line":"                            \"CONF.federation.remote_id_attribute\"), protocol)"},{"line_number":163,"context_line":"    if not remote_id_parameter:"},{"line_number":164,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":165,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_878e8b2c","line":162,"in_reply_to":"9a80dd14_848e892c","updated":"2015-03-13 18:34:52.000000000","message":"an admin \"can\" set this up, or is \"required\" to set it up? I don\u0027t think we need to warn about something that somebody can do if they feel like it. Can I ignore this or do I have to make a change?","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        except AttributeError:"},{"line_number":160,"context_line":"            LOG.warning(_LW(\"Cannot find \u0027remote_id_attibute\u0027 in \""},{"line_number":161,"context_line":"                            \"configuration group %s. Trying default location \""},{"line_number":162,"context_line":"                            \"CONF.federation.remote_id_attribute\"), protocol)"},{"line_number":163,"context_line":"    if not remote_id_parameter:"},{"line_number":164,"context_line":"        remote_id_parameter \u003d CONF.federation.remote_id_attribute"},{"line_number":165,"context_line":"    if not remote_id_parameter or not idp[\u0027remote_ids\u0027]:"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_ce214a9f","line":162,"in_reply_to":"9a80dd14_878e8b2c","updated":"2015-03-16 12:42:25.000000000","message":"I have changed the log level from warning to debug. In this case the admin can verify what is going on but there is not log in case it is the desired behavior.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c4a3d89202d8d42ce057921cabf93f707926f8c8","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"# Unless required by applicable law or agreed to in writing, software"},{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_3c467b50","line":5,"updated":"2015-03-16 22:51:34.000000000","message":"(nit) why was this change made?","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"71f5671a22b181ff4f53756fad5726c6260fb7fe","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"# Unless required by applicable law or agreed to in writing, software"},{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_72756af9","line":5,"in_reply_to":"9a80dd14_3c467b50","updated":"2015-03-17 12:10:58.000000000","message":"no idea, I will revert","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a242c4bbb0e34e6fb6c1da95f8e71770fd4cf38d","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"# http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"# Unless required by applicable law or agreed to in writing, software"},{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_f2c87aaa","line":5,"in_reply_to":"9a80dd14_3c467b50","updated":"2015-03-17 10:57:45.000000000","message":"reverted","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c4a3d89202d8d42ce057921cabf93f707926f8c8","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"MAPPING_SCHEMA \u003d {"},{"line_number":33,"context_line":"    \"type\": \"object\","},{"line_number":34,"context_line":"    \"required\": [\u0027rules\u0027],"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_bc718baa","line":31,"updated":"2015-03-16 22:51:34.000000000","message":"Seems unrelated","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a242c4bbb0e34e6fb6c1da95f8e71770fd4cf38d","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"CONF \u003d cfg.CONF"},{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"MAPPING_SCHEMA \u003d {"},{"line_number":33,"context_line":"    \"type\": \"object\","},{"line_number":34,"context_line":"    \"required\": [\u0027rules\u0027],"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_b23522aa","line":31,"in_reply_to":"9a80dd14_bc718baa","updated":"2015-03-17 10:57:45.000000000","message":"reverted","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3eb233acbdad5f062894363f5cb6dea578f94d2b","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        try:"},{"line_number":208,"context_line":"            remote_id_parameter \u003d CONF[protocol][\u0027remote_id_attribute\u0027]"},{"line_number":209,"context_line":"        except AttributeError:"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Cannot find \"remote_id_attibute\" in configuration \u0027"},{"line_number":211,"context_line":"                    \u0027group %(protocol). Trying default location in \u0027"},{"line_number":212,"context_line":"                    \u0027group federation.\u0027) % {\u0027protocol\u0027: protocol}"},{"line_number":213,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_074c20c7","line":210,"updated":"2015-03-16 14:41:37.000000000","message":"debug messages should not be translated.","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c4a3d89202d8d42ce057921cabf93f707926f8c8","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        try:"},{"line_number":208,"context_line":"            remote_id_parameter \u003d CONF[protocol][\u0027remote_id_attribute\u0027]"},{"line_number":209,"context_line":"        except AttributeError:"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Cannot find \"remote_id_attibute\" in configuration \u0027"},{"line_number":211,"context_line":"                    \u0027group %(protocol). Trying default location in \u0027"},{"line_number":212,"context_line":"                    \u0027group federation.\u0027) % {\u0027protocol\u0027: protocol}"},{"line_number":213,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_5c996fcf","line":210,"in_reply_to":"9a80dd14_074c20c7","updated":"2015-03-16 22:51:34.000000000","message":"++","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"71f5671a22b181ff4f53756fad5726c6260fb7fe","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        try:"},{"line_number":208,"context_line":"            remote_id_parameter \u003d CONF[protocol][\u0027remote_id_attribute\u0027]"},{"line_number":209,"context_line":"        except AttributeError:"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Cannot find \"remote_id_attibute\" in configuration \u0027"},{"line_number":211,"context_line":"                    \u0027group %(protocol). Trying default location in \u0027"},{"line_number":212,"context_line":"                    \u0027group federation.\u0027) % {\u0027protocol\u0027: protocol}"},{"line_number":213,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_6c55bcf8","line":210,"in_reply_to":"9a80dd14_074c20c7","updated":"2015-03-17 12:10:58.000000000","message":"Done","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a242c4bbb0e34e6fb6c1da95f8e71770fd4cf38d","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        try:"},{"line_number":208,"context_line":"            remote_id_parameter \u003d CONF[protocol][\u0027remote_id_attribute\u0027]"},{"line_number":209,"context_line":"        except AttributeError:"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Cannot find \"remote_id_attibute\" in configuration \u0027"},{"line_number":211,"context_line":"                    \u0027group %(protocol). Trying default location in \u0027"},{"line_number":212,"context_line":"                    \u0027group federation.\u0027) % {\u0027protocol\u0027: protocol}"},{"line_number":213,"context_line":"            LOG.debug(msg)"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_92b49e36","line":210,"in_reply_to":"9a80dd14_5c996fcf","updated":"2015-03-17 10:57:45.000000000","message":"Done","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3eb233acbdad5f062894363f5cb6dea578f94d2b","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            remote_id_parameter \u003d CONF[protocol][\u0027remote_id_attribute\u0027]"},{"line_number":209,"context_line":"        except AttributeError:"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Cannot find \"remote_id_attibute\" in configuration \u0027"},{"line_number":211,"context_line":"                    \u0027group %(protocol). Trying default location in \u0027"},{"line_number":212,"context_line":"                    \u0027group federation.\u0027) % {\u0027protocol\u0027: protocol}"},{"line_number":213,"context_line":"            LOG.debug(msg)"},{"line_number":214,"context_line":"    if not remote_id_parameter:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_8781f0c4","line":211,"updated":"2015-03-16 14:41:37.000000000","message":"\"%(protocol)\" needs an s... this shows there isn\u0027t test coverage.","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c4a3d89202d8d42ce057921cabf93f707926f8c8","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            remote_id_parameter \u003d CONF[protocol][\u0027remote_id_attribute\u0027]"},{"line_number":209,"context_line":"        except AttributeError:"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Cannot find \"remote_id_attibute\" in configuration \u0027"},{"line_number":211,"context_line":"                    \u0027group %(protocol). Trying default location in \u0027"},{"line_number":212,"context_line":"                    \u0027group federation.\u0027) % {\u0027protocol\u0027: protocol}"},{"line_number":213,"context_line":"            LOG.debug(msg)"},{"line_number":214,"context_line":"    if not remote_id_parameter:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_9ca3e7ff","line":211,"in_reply_to":"9a80dd14_8781f0c4","updated":"2015-03-16 22:51:34.000000000","message":"++","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"71f5671a22b181ff4f53756fad5726c6260fb7fe","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            remote_id_parameter \u003d CONF[protocol][\u0027remote_id_attribute\u0027]"},{"line_number":209,"context_line":"        except AttributeError:"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Cannot find \"remote_id_attibute\" in configuration \u0027"},{"line_number":211,"context_line":"                    \u0027group %(protocol). Trying default location in \u0027"},{"line_number":212,"context_line":"                    \u0027group federation.\u0027) % {\u0027protocol\u0027: protocol}"},{"line_number":213,"context_line":"            LOG.debug(msg)"},{"line_number":214,"context_line":"    if not remote_id_parameter:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_8c583032","line":211,"in_reply_to":"9a80dd14_8781f0c4","updated":"2015-03-17 12:10:58.000000000","message":"Done. The log was in the wrong place, the code in this exception should never fire","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a242c4bbb0e34e6fb6c1da95f8e71770fd4cf38d","unresolved":false,"context_lines":[{"line_number":208,"context_line":"            remote_id_parameter \u003d CONF[protocol][\u0027remote_id_attribute\u0027]"},{"line_number":209,"context_line":"        except AttributeError:"},{"line_number":210,"context_line":"            msg \u003d _(\u0027Cannot find \"remote_id_attibute\" in configuration \u0027"},{"line_number":211,"context_line":"                    \u0027group %(protocol). Trying default location in \u0027"},{"line_number":212,"context_line":"                    \u0027group federation.\u0027) % {\u0027protocol\u0027: protocol}"},{"line_number":213,"context_line":"            LOG.debug(msg)"},{"line_number":214,"context_line":"    if not remote_id_parameter:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_d285365a","line":211,"in_reply_to":"9a80dd14_9ca3e7ff","updated":"2015-03-17 10:57:45.000000000","message":"Done.\n\nI am not sure how to test that messages is correctly formated and debug log is correctly created. self.assertRaises() will not work in this case, will it?","commit_id":"70b9e689706e43e2069ac9f573ff40e2a7adbf35"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#     http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"# Unless required by applicable law or agreed to in writing, software"},{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_caf62c90","line":5,"updated":"2015-03-18 07:33:26.000000000","message":"undo this change","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#     http://www.apache.org/licenses/LICENSE-2.0"},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"# Unless required by applicable law or agreed to in writing, software"},{"line_number":8,"context_line":"# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_ef013ab0","line":5,"in_reply_to":"9a80dd14_caf62c90","updated":"2015-03-18 10:31:45.000000000","message":"Done","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        domain_id \u003d (domain.get(\u0027id\u0027) or"},{"line_number":336,"context_line":"                     assignment_api.get_domain_by_name("},{"line_number":337,"context_line":"                         domain.get(\u0027name\u0027)).get(\u0027id\u0027))"},{"line_number":338,"context_line":"        return domain_id"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    for group in group_names:"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_aa8578d0","line":337,"updated":"2015-03-18 07:33:26.000000000","message":"undo this change","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        \"\"\""},{"line_number":335,"context_line":"        domain_id \u003d (domain.get(\u0027id\u0027) or"},{"line_number":336,"context_line":"                     assignment_api.get_domain_by_name("},{"line_number":337,"context_line":"                         domain.get(\u0027name\u0027)).get(\u0027id\u0027))"},{"line_number":338,"context_line":"        return domain_id"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    for group in group_names:"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_4f07a6c9","line":337,"in_reply_to":"9a80dd14_aa8578d0","updated":"2015-03-18 10:31:45.000000000","message":"Done","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"}],"keystone/tests/unit/test_v3_federation.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e072040164453c2b55335a6822f2b95eb28d36cf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"da86d52c_b81397b6","updated":"2015-02-19 13:02:13.000000000","message":"I am missing tests that show that remote_ids are unique.\nProposed test plan:\n\na) add IdP_1 with remote_ids \u003d [\u0027a\u0027, \u0027b\u0027]\nb) add IdP_2 with remote_ids \u003d [\u0027a\u0027, \u0027c\u0027]\n\nexpect server to compain about adding \u0027a\u0027 again.\nI think this is a must-have test as we must be sure this works and remote_ids are unique (as for websso where we get identity_provider object basing on remote_id value).","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"2d1e8a37499920060cb9a25b5c458e12b70620aa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"da86d52c_04ffda66","in_reply_to":"da86d52c_b81397b6","updated":"2015-02-19 14:32:34.000000000","message":"Done","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e072040164453c2b55335a6822f2b95eb28d36cf","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":152,"context_line":"        body[\u0027description\u0027] \u003d uuid.uuid4().hex"},{"line_number":153,"context_line":"        body[\u0027remote_ids\u0027] \u003d []"},{"line_number":154,"context_line":"        body[\u0027remote_ids\u0027].append(uuid.uuid4().hex)"},{"line_number":155,"context_line":"        resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":156,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":157,"context_line":"                                 keys_to_check\u003dkeys_to_check,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_18b103e0","line":154,"updated":"2015-02-19 13:02:13.000000000","message":"Since the main change is that we now support multiple remote_ids tied to one Identity PRovider I\u0027d advise to add multiple remote_ids. Everywhere.","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"c726ce663a46ecd3965402183db9d86a5fae7f2d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":152,"context_line":"        body[\u0027description\u0027] \u003d uuid.uuid4().hex"},{"line_number":153,"context_line":"        body[\u0027remote_ids\u0027] \u003d []"},{"line_number":154,"context_line":"        body[\u0027remote_ids\u0027].append(uuid.uuid4().hex)"},{"line_number":155,"context_line":"        resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":156,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":157,"context_line":"                                 keys_to_check\u003dkeys_to_check,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_bea53fb6","line":154,"in_reply_to":"da86d52c_18b103e0","updated":"2015-02-19 13:44:48.000000000","message":"Also, you can squeeze those two lines to:\n\nbody[\u0027remote_ids\u0027] \u003d [uuid.uuid4().hex]","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"2d1e8a37499920060cb9a25b5c458e12b70620aa","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":152,"context_line":"        body[\u0027description\u0027] \u003d uuid.uuid4().hex"},{"line_number":153,"context_line":"        body[\u0027remote_ids\u0027] \u003d []"},{"line_number":154,"context_line":"        body[\u0027remote_ids\u0027].append(uuid.uuid4().hex)"},{"line_number":155,"context_line":"        resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":156,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":157,"context_line":"                                 keys_to_check\u003dkeys_to_check,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_694b0fb1","line":154,"in_reply_to":"da86d52c_18b103e0","updated":"2015-02-19 14:32:34.000000000","message":"Done","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"2d1e8a37499920060cb9a25b5c458e12b70620aa","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":152,"context_line":"        body[\u0027description\u0027] \u003d uuid.uuid4().hex"},{"line_number":153,"context_line":"        body[\u0027remote_ids\u0027] \u003d []"},{"line_number":154,"context_line":"        body[\u0027remote_ids\u0027].append(uuid.uuid4().hex)"},{"line_number":155,"context_line":"        resp \u003d self._create_default_idp(body\u003dbody)"},{"line_number":156,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":157,"context_line":"                                 keys_to_check\u003dkeys_to_check,"}],"source_content_type":"text/x-python","patch_set":10,"id":"da86d52c_296e772f","line":154,"in_reply_to":"da86d52c_bea53fb6","updated":"2015-02-19 14:32:34.000000000","message":"Done","commit_id":"1f80311d112c94111fb5ab5a937ab27cc6122087"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"4b8128758a427c6832aaad10075dd61497fcad4a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"ba7be1f8_e347e91b","updated":"2015-02-20 06:12:11.000000000","message":"this needs more test cases in general\n\n  - updating remote_ids should be a separate test\n  - creating remote_ids with non-array entry\n  - i don\u0027t think the changes to the controller and plugin are actually being tested.\n  - the changes in how we handle the config are not being tested either.\n\nshouldn\u0027t the schema be updated, too?","commit_id":"d4820c7b1c15664225761fb48f36816a9a9475e3"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"c1f34c8af056df555d70a104d1a2d52d3c7fd6a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"ba7be1f8_a0996070","in_reply_to":"ba7be1f8_e347e91b","updated":"2015-02-20 10:25:42.000000000","message":"There is not API to update the remote_ids but it has to be performed with the IdP update and actually during the update test remote_ids are modified. Is there a reason for a separate test?\n\nOK for the non-array test\n\nThe controller is tested when a token with remote, wrong remote, and so is requested. During the test the config take the saml2 section so the config is almost tested. I\u0027ll check if I am missing some combinations.\n\nWhich/where is the schema to update?","commit_id":"d4820c7b1c15664225761fb48f36816a9a9475e3"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"eaf23ce0ddef2ee904b4d62ed725329713e27689","unresolved":false,"context_lines":[{"line_number":162,"context_line":"                                 ref\u003dbody)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    def test_create_idp_remote_repeated(self):"},{"line_number":165,"context_line":"        \"\"\"Creates two IdentityProvider entities associated to some"},{"line_number":166,"context_line":"        remote_ids. A remote_id is the same for both so the second has not"},{"line_number":167,"context_line":"        to be accepted because of the uniqueness of the remote_id"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"da86d52c_f8f26a6d","line":165,"updated":"2015-02-19 15:00:37.000000000","message":"(nit) remote_ids are rather associated to identity_providers.","commit_id":"d4820c7b1c15664225761fb48f36816a9a9475e3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"08c5993715a9494485c44d800628031086cdebe6","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                 expected_status\u003d409)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def test_create_idp_remote_empty(self):"},{"line_number":189,"context_line":"        \"\"\"Creates an IdP with empty remote_ids."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        \"\"\""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_15369a03","line":189,"updated":"2015-02-23 20:34:01.000000000","message":"make this one line","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e1570e51b04548345ffa67f6cb0119bda033af4c","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                 expected_status\u003d409)"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    def test_create_idp_remote_empty(self):"},{"line_number":189,"context_line":"        \"\"\"Creates an IdP with empty remote_ids."},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        \"\"\""},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_08874e10","line":189,"in_reply_to":"ba7be1f8_15369a03","updated":"2015-02-24 09:15:19.000000000","message":"++","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"08c5993715a9494485c44d800628031086cdebe6","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":200,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":201,"context_line":"                                 ref\u003dbody)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def test_update_idp_remote_ids(self):"},{"line_number":204,"context_line":"        \"\"\"Update IdP\u0027s remote_ids parameter.\"\"\""},{"line_number":205,"context_line":"        body \u003d self.default_body.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_400bf224","line":202,"updated":"2015-02-23 20:34:01.000000000","message":"does it make sense to make 2 idps with the same remote_ids?\nto try out the unique constraint?","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"1b44b2ee52b5140bd40fc5854ded360422750f03","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":200,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":201,"context_line":"                                 ref\u003dbody)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def test_update_idp_remote_ids(self):"},{"line_number":204,"context_line":"        \"\"\"Update IdP\u0027s remote_ids parameter.\"\"\""},{"line_number":205,"context_line":"        body \u003d self.default_body.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_99754e9a","line":202,"in_reply_to":"ba7be1f8_400bf224","updated":"2015-02-24 10:20:59.000000000","message":"But the unique test is the previous \"test_create_idp_remote_repeated\" where I add two IdPs where one remote_id is the same and I get the error because the second is not unique. This test aims at verify the empty list does not generate error. Do I have to merge them? How?","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"e1570e51b04548345ffa67f6cb0119bda033af4c","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        self.assertValidResponse(resp, \u0027identity_provider\u0027, dummy_validator,"},{"line_number":200,"context_line":"                                 keys_to_check\u003dkeys_to_check,"},{"line_number":201,"context_line":"                                 ref\u003dbody)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def test_update_idp_remote_ids(self):"},{"line_number":204,"context_line":"        \"\"\"Update IdP\u0027s remote_ids parameter.\"\"\""},{"line_number":205,"context_line":"        body \u003d self.default_body.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_88a97e7d","line":202,"in_reply_to":"ba7be1f8_400bf224","updated":"2015-02-24 09:15:19.000000000","message":"he adds this only one.","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"1a80c4dd02606bf6166fa3d90ae0c37822fba4b8","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":341,"context_line":"        body \u003d body[\u0027identity_provider\u0027]"},{"line_number":342,"context_line":"        for key in body.keys():"},{"line_number":343,"context_line":"            if type(body[key]) is list:"},{"line_number":344,"context_line":"                self.assertEqual(sorted(body[key]),"},{"line_number":345,"context_line":"                                 sorted(updated_idp.get(key)))"},{"line_number":346,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_77860815","line":343,"updated":"2015-02-23 15:19:38.000000000","message":"we could  explicitly check those 3 keys manually.","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"1a80c4dd02606bf6166fa3d90ae0c37822fba4b8","unresolved":false,"context_lines":[{"line_number":350,"context_line":"        updated_idp \u003d self._fetch_attribute_from_response(resp,"},{"line_number":351,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":352,"context_line":"        for key in body.keys():"},{"line_number":353,"context_line":"            if type(body[key]) is list:"},{"line_number":354,"context_line":"                self.assertEqual(sorted(body[key]),"},{"line_number":355,"context_line":"                                 sorted(updated_idp.get(key)))"},{"line_number":356,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba7be1f8_b777a03a","line":353,"updated":"2015-02-23 15:19:38.000000000","message":"same here.","commit_id":"da82e15868904d0b11d660c266838ff75f9f2d01"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        \"\"\""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        keys_to_check \u003d list(self.idp_keys)"},{"line_number":176,"context_line":"        keys_to_check.append(\u0027remote_ids\u0027)"},{"line_number":177,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":178,"context_line":"        repeated_remote_id \u003d uuid.uuid4().hex"},{"line_number":179,"context_line":"        body[\u0027description\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_d8f2809a","line":176,"updated":"2015-03-02 07:35:58.000000000","message":"these two lines are unused","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4ca0efeec37ee8796c54e362171cdf49f84cc49c","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        \"\"\""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        keys_to_check \u003d list(self.idp_keys)"},{"line_number":176,"context_line":"        keys_to_check.append(\u0027remote_ids\u0027)"},{"line_number":177,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":178,"context_line":"        repeated_remote_id \u003d uuid.uuid4().hex"},{"line_number":179,"context_line":"        body[\u0027description\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_f34da5c5","line":176,"in_reply_to":"ba7be1f8_d8f2809a","updated":"2015-03-02 08:07:51.000000000","message":"Done","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        keys_to_check.append(\u0027remote_ids\u0027)"},{"line_number":177,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":178,"context_line":"        repeated_remote_id \u003d uuid.uuid4().hex"},{"line_number":179,"context_line":"        body[\u0027description\u0027] \u003d uuid.uuid4().hex"},{"line_number":180,"context_line":"        body[\u0027remote_ids\u0027] \u003d [uuid.uuid4().hex,"},{"line_number":181,"context_line":"                              uuid.uuid4().hex,"},{"line_number":182,"context_line":"                              uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_582e90fb","line":179,"updated":"2015-03-02 07:35:58.000000000","message":"this line is unnecessary","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4ca0efeec37ee8796c54e362171cdf49f84cc49c","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        keys_to_check.append(\u0027remote_ids\u0027)"},{"line_number":177,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":178,"context_line":"        repeated_remote_id \u003d uuid.uuid4().hex"},{"line_number":179,"context_line":"        body[\u0027description\u0027] \u003d uuid.uuid4().hex"},{"line_number":180,"context_line":"        body[\u0027remote_ids\u0027] \u003d [uuid.uuid4().hex,"},{"line_number":181,"context_line":"                              uuid.uuid4().hex,"},{"line_number":182,"context_line":"                              uuid.uuid4().hex,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_134959b7","line":179,"in_reply_to":"ba7be1f8_582e90fb","updated":"2015-03-02 08:07:51.000000000","message":"Done","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                         sorted(updated_idp.get(\u0027remote_ids\u0027)))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        resp \u003d self.get(url)"},{"line_number":227,"context_line":"        updated_idp \u003d self._fetch_attribute_from_response(resp,"},{"line_number":228,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":229,"context_line":"        self.assertEqual(sorted(body[\u0027remote_ids\u0027]),"},{"line_number":230,"context_line":"                         sorted(updated_idp.get(\u0027remote_ids\u0027)))"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_5863f040","line":227,"updated":"2015-03-02 07:35:58.000000000","message":"call this returned_idp, nothing was updated","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"d95f50f67e15d513b281c05f3573f73820a97f35","unresolved":false,"context_lines":[{"line_number":224,"context_line":"                         sorted(updated_idp.get(\u0027remote_ids\u0027)))"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"        resp \u003d self.get(url)"},{"line_number":227,"context_line":"        updated_idp \u003d self._fetch_attribute_from_response(resp,"},{"line_number":228,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":229,"context_line":"        self.assertEqual(sorted(body[\u0027remote_ids\u0027]),"},{"line_number":230,"context_line":"                         sorted(updated_idp.get(\u0027remote_ids\u0027)))"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_8e0fe287","line":227,"in_reply_to":"ba7be1f8_5863f040","updated":"2015-03-02 08:42:36.000000000","message":"Done","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6cd394a896bb89558fd76ed4b9c9259f82dd8797","unresolved":false,"context_lines":[{"line_number":965,"context_line":"    USER \u003d \u0027user@ORGANIZATION\u0027"},{"line_number":966,"context_line":"    ASSERTION_PREFIX \u003d \u0027PREFIX_\u0027"},{"line_number":967,"context_line":"    IDP_WITH_REMOTE \u003d \u0027ORG_IDP_REMOTE\u0027"},{"line_number":968,"context_line":"    REMOTE_ID \u003d [\u0027entityID_IDP1\u0027, \u0027entityID_IDP2\u0027]"},{"line_number":969,"context_line":"    REMOTE_ID_ATTR \u003d \u0027Shib-Identity-Provider\u0027"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"    UNSCOPED_V3_SAML2_REQ \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_d8d520b8","line":968,"updated":"2015-03-02 07:35:58.000000000","message":"looks like REMOTE_ID[1] is never used, maybe drop it?","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"4ca0efeec37ee8796c54e362171cdf49f84cc49c","unresolved":false,"context_lines":[{"line_number":965,"context_line":"    USER \u003d \u0027user@ORGANIZATION\u0027"},{"line_number":966,"context_line":"    ASSERTION_PREFIX \u003d \u0027PREFIX_\u0027"},{"line_number":967,"context_line":"    IDP_WITH_REMOTE \u003d \u0027ORG_IDP_REMOTE\u0027"},{"line_number":968,"context_line":"    REMOTE_ID \u003d [\u0027entityID_IDP1\u0027, \u0027entityID_IDP2\u0027]"},{"line_number":969,"context_line":"    REMOTE_ID_ATTR \u003d \u0027Shib-Identity-Provider\u0027"},{"line_number":970,"context_line":""},{"line_number":971,"context_line":"    UNSCOPED_V3_SAML2_REQ \u003d {"}],"source_content_type":"text/x-python","patch_set":16,"id":"ba7be1f8_138b1969","line":968,"in_reply_to":"ba7be1f8_d8d520b8","updated":"2015-03-02 08:07:51.000000000","message":"We are adding \u003e1 remote_id in line 1973 and it\u0027s better by default add more than one rmeote_id since this is the main goal of this patch.","commit_id":"7354cfc799632bfd6a61affdc4095cb64bdf4bd9"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                                 ref\u003dbody)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_create_idp_remote(self):"},{"line_number":149,"context_line":"        \"\"\"Creates the IdentityProvider entity associated to some"},{"line_number":150,"context_line":"        remote_ids."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_13dbeb4f","line":149,"updated":"2015-03-03 01:50:49.000000000","message":"First line should be a single line summary.\n\nhttp://docs.openstack.org/developer/hacking/#docstrings","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                                 ref\u003dbody)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_create_idp_remote(self):"},{"line_number":149,"context_line":"        \"\"\"Creates the IdentityProvider entity associated to some"},{"line_number":150,"context_line":"        remote_ids."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_d103010e","line":149,"in_reply_to":"ba7be1f8_13dbeb4f","updated":"2015-03-03 08:57:15.000000000","message":"Done","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def test_create_idp_remote_repeated(self):"},{"line_number":167,"context_line":"        \"\"\"Creates two IdentityProvider entities with some remote_ids."},{"line_number":168,"context_line":"        A remote_id is the same for both so the second has not"},{"line_number":169,"context_line":"        to be accepted because of the uniqueness of the remote_ids"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        Expect HTTP 409 code for the latter call."}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_93eefbeb","line":168,"updated":"2015-03-03 01:50:49.000000000","message":"Needs to be a newline to split the summary from the rest of the docstring.\n\nhttp://docs.openstack.org/developer/hacking/#docstrings","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def test_create_idp_remote_repeated(self):"},{"line_number":167,"context_line":"        \"\"\"Creates two IdentityProvider entities with some remote_ids."},{"line_number":168,"context_line":"        A remote_id is the same for both so the second has not"},{"line_number":169,"context_line":"        to be accepted because of the uniqueness of the remote_ids"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        Expect HTTP 409 code for the latter call."}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_5407ff17","line":168,"in_reply_to":"ba7be1f8_93eefbeb","updated":"2015-03-03 08:57:15.000000000","message":"Done","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":340,"context_line":"        body \u003d body[\u0027identity_provider\u0027]"},{"line_number":341,"context_line":"        for key in body.keys():"},{"line_number":342,"context_line":"            if type(body[key]) is list:"},{"line_number":343,"context_line":"                self.assertEqual(sorted(body[key]),"},{"line_number":344,"context_line":"                                 sorted(updated_idp.get(key)))"},{"line_number":345,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_d3bb13e3","line":342,"updated":"2015-03-03 01:50:49.000000000","message":"isinstance(body[key], list)","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":339,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":340,"context_line":"        body \u003d body[\u0027identity_provider\u0027]"},{"line_number":341,"context_line":"        for key in body.keys():"},{"line_number":342,"context_line":"            if type(body[key]) is list:"},{"line_number":343,"context_line":"                self.assertEqual(sorted(body[key]),"},{"line_number":344,"context_line":"                                 sorted(updated_idp.get(key)))"},{"line_number":345,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_f42e338b","line":342,"in_reply_to":"ba7be1f8_d3bb13e3","updated":"2015-03-03 08:57:15.000000000","message":"Done","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":349,"context_line":"        updated_idp \u003d self._fetch_attribute_from_response(resp,"},{"line_number":350,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":351,"context_line":"        for key in body.keys():"},{"line_number":352,"context_line":"            if type(body[key]) is list:"},{"line_number":353,"context_line":"                self.assertEqual(sorted(body[key]),"},{"line_number":354,"context_line":"                                 sorted(updated_idp.get(key)))"},{"line_number":355,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_73c8a755","line":352,"updated":"2015-03-03 01:50:49.000000000","message":"same","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":349,"context_line":"        updated_idp \u003d self._fetch_attribute_from_response(resp,"},{"line_number":350,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":351,"context_line":"        for key in body.keys():"},{"line_number":352,"context_line":"            if type(body[key]) is list:"},{"line_number":353,"context_line":"                self.assertEqual(sorted(body[key]),"},{"line_number":354,"context_line":"                                 sorted(updated_idp.get(key)))"},{"line_number":355,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_144f476c","line":352,"in_reply_to":"ba7be1f8_73c8a755","updated":"2015-03-03 08:57:15.000000000","message":"Done","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"343d7f1cc0de8916a207ef4f162e83164e5c89a6","unresolved":false,"context_lines":[{"line_number":1967,"context_line":"                                       self.idp)"},{"line_number":1968,"context_line":"        # Add IDP with remote"},{"line_number":1969,"context_line":"        self.idp_with_remote \u003d self.idp_ref(id\u003dself.IDP_WITH_REMOTE)"},{"line_number":1970,"context_line":"        self.idp_with_remote[\u0027remote_ids\u0027] \u003d self.REMOTE_ID"},{"line_number":1971,"context_line":"        self.federation_api.create_idp(self.idp_with_remote[\u0027id\u0027],"},{"line_number":1972,"context_line":"                                       self.idp_with_remote)"},{"line_number":1973,"context_line":"        # Add a mapping"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_ee883073","line":1970,"updated":"2015-03-03 01:50:49.000000000","message":"self.REMOTE_ID seems odd now that it contains multiple IDs","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"670e67d73c12bb1ead6317e6a07064e23d9264da","unresolved":false,"context_lines":[{"line_number":1967,"context_line":"                                       self.idp)"},{"line_number":1968,"context_line":"        # Add IDP with remote"},{"line_number":1969,"context_line":"        self.idp_with_remote \u003d self.idp_ref(id\u003dself.IDP_WITH_REMOTE)"},{"line_number":1970,"context_line":"        self.idp_with_remote[\u0027remote_ids\u0027] \u003d self.REMOTE_ID"},{"line_number":1971,"context_line":"        self.federation_api.create_idp(self.idp_with_remote[\u0027id\u0027],"},{"line_number":1972,"context_line":"                                       self.idp_with_remote)"},{"line_number":1973,"context_line":"        # Add a mapping"}],"source_content_type":"text/x-python","patch_set":17,"id":"ba7be1f8_d4176fec","line":1970,"in_reply_to":"ba7be1f8_ee883073","updated":"2015-03-03 08:57:15.000000000","message":"Done","commit_id":"4928cd5333806955a561964d75399504f8e986d4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":792,"context_line":"        return r"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    def test_create_idp_remote(self):"},{"line_number":795,"context_line":"        \"\"\"Creates the IdentityProvider entity associated to a remote_ids.\"\"\""},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"        keys_to_check \u003d list(self.idp_keys)"},{"line_number":798,"context_line":"        keys_to_check.append(\u0027remote_ids\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_f9aff1e0","line":795,"updated":"2015-03-13 16:25:47.000000000","message":"change \"a remote_ids\" to \"remote_ids\"","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":792,"context_line":"        return r"},{"line_number":793,"context_line":""},{"line_number":794,"context_line":"    def test_create_idp_remote(self):"},{"line_number":795,"context_line":"        \"\"\"Creates the IdentityProvider entity associated to a remote_ids.\"\"\""},{"line_number":796,"context_line":""},{"line_number":797,"context_line":"        keys_to_check \u003d list(self.idp_keys)"},{"line_number":798,"context_line":"        keys_to_check.append(\u0027remote_ids\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_0ece025a","line":795,"in_reply_to":"9a80dd14_f9aff1e0","updated":"2015-03-16 12:42:25.000000000","message":"Done","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":810,"context_line":"        \"\"\"Creates two IdentityProvider entities with some remote_ids"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"        A remote_id is the same for both so the second has not"},{"line_number":813,"context_line":"        to be accepted because of the uniqueness of the remote_ids"},{"line_number":814,"context_line":""},{"line_number":815,"context_line":"        Expect HTTP 409 code for the latter call."},{"line_number":816,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_398d097d","line":813,"updated":"2015-03-13 16:25:47.000000000","message":"what does \"has not to be accepted\" mean?","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":810,"context_line":"        \"\"\"Creates two IdentityProvider entities with some remote_ids"},{"line_number":811,"context_line":""},{"line_number":812,"context_line":"        A remote_id is the same for both so the second has not"},{"line_number":813,"context_line":"        to be accepted because of the uniqueness of the remote_ids"},{"line_number":814,"context_line":""},{"line_number":815,"context_line":"        Expect HTTP 409 code for the latter call."},{"line_number":816,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_6e14de9f","line":813,"in_reply_to":"9a80dd14_398d097d","updated":"2015-03-16 12:42:25.000000000","message":"Cannot be created","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":831,"context_line":"                 expected_status\u003d409)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"    def test_create_idp_remote_empty(self):"},{"line_number":834,"context_line":"        \"\"\"Creates an IdP with empty remote_ids.\"\"\""},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        keys_to_check \u003d list(self.idp_keys)"},{"line_number":837,"context_line":"        keys_to_check.append(\u0027remote_ids\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_79d14156","line":834,"updated":"2015-03-13 16:25:47.000000000","message":"why do we allow this?","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d0a2efea17abcd9c770625379821a0ad9625cbde","unresolved":false,"context_lines":[{"line_number":831,"context_line":"                 expected_status\u003d409)"},{"line_number":832,"context_line":""},{"line_number":833,"context_line":"    def test_create_idp_remote_empty(self):"},{"line_number":834,"context_line":"        \"\"\"Creates an IdP with empty remote_ids.\"\"\""},{"line_number":835,"context_line":""},{"line_number":836,"context_line":"        keys_to_check \u003d list(self.idp_keys)"},{"line_number":837,"context_line":"        keys_to_check.append(\u0027remote_ids\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_04e53908","line":834,"in_reply_to":"9a80dd14_79d14156","updated":"2015-03-13 18:17:35.000000000","message":"we allow this for backwards compatibility, it\u0027s not necessary to define remote_ids if your IdP keystone resource represents a single external identity provider.\n\nthe driving use case for remote_ids is the case where you want a single keystone IdP resource calls \u0027universities\u0027, and your remote_ids can be \u0027uni of north dakota\u0027, \u0027uni of minn.\u0027 and they can share the same mapping.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":844,"context_line":"                                 ref\u003dbody)"},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"    def test_update_idp_remote_ids(self):"},{"line_number":847,"context_line":"        \"\"\"Update IdP\u0027s remote_ids parameter.\"\"\""},{"line_number":848,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":849,"context_line":"        body[\u0027remote_ids\u0027] \u003d [uuid.uuid4().hex]"},{"line_number":850,"context_line":"        default_resp \u003d self._create_default_idp(body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_b93e5989","line":847,"updated":"2015-03-13 16:25:47.000000000","message":"There should also be a test to set the remote_ids to an empty list.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":844,"context_line":"                                 ref\u003dbody)"},{"line_number":845,"context_line":""},{"line_number":846,"context_line":"    def test_update_idp_remote_ids(self):"},{"line_number":847,"context_line":"        \"\"\"Update IdP\u0027s remote_ids parameter.\"\"\""},{"line_number":848,"context_line":"        body \u003d self.default_body.copy()"},{"line_number":849,"context_line":"        body[\u0027remote_ids\u0027] \u003d [uuid.uuid4().hex]"},{"line_number":850,"context_line":"        default_resp \u003d self._create_default_idp(body\u003dbody)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_ae3976f3","line":847,"in_reply_to":"9a80dd14_b93e5989","updated":"2015-03-16 12:42:25.000000000","message":"Done","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":1873,"context_line":"                          self._issue_unscoped_token,"},{"line_number":1874,"context_line":"                          idp\u003dself.IDP_WITH_REMOTE,"},{"line_number":1875,"context_line":"                          environment\u003d{"},{"line_number":1876,"context_line":"                              self.REMOTE_ID_ATTR: [uuid.uuid4().hex]"},{"line_number":1877,"context_line":"                          })"},{"line_number":1878,"context_line":""},{"line_number":1879,"context_line":"    def test_issue_unscoped_token_with_remote_default_wrong(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_99c0b551","line":1876,"updated":"2015-03-13 16:25:47.000000000","message":"REMOTE_ID_ATTR is a list? isn\u0027t it a string in the other tests?","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":1873,"context_line":"                          self._issue_unscoped_token,"},{"line_number":1874,"context_line":"                          idp\u003dself.IDP_WITH_REMOTE,"},{"line_number":1875,"context_line":"                          environment\u003d{"},{"line_number":1876,"context_line":"                              self.REMOTE_ID_ATTR: [uuid.uuid4().hex]"},{"line_number":1877,"context_line":"                          })"},{"line_number":1878,"context_line":""},{"line_number":1879,"context_line":"    def test_issue_unscoped_token_with_remote_default_wrong(self):"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_69d5b81a","line":1876,"in_reply_to":"9a80dd14_99c0b551","updated":"2015-03-16 12:42:25.000000000","message":"Done","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"a4e66e730ab9cb21837014f034cf1893907c8042","unresolved":false,"context_lines":[{"line_number":2204,"context_line":"                }"},{"line_number":2205,"context_line":"            ]"},{"line_number":2206,"context_line":"        }"},{"line_number":2207,"context_line":"        self.federation_api.update_mapping(self.mapping[\u0027id\u0027], rules)"},{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":"        r \u003d self._issue_unscoped_token(assertion\u003d\u0027TESTER_ASSERTION\u0027)"},{"line_number":2210,"context_line":"        token_id \u003d r.headers.get(\u0027X-Subject-Token\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_19ccc588","line":2207,"updated":"2015-03-13 16:25:47.000000000","message":"revert the whitespace change on the previous line.","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"0f5d27b5121008e48aefd10d2c42976c7f8ab198","unresolved":false,"context_lines":[{"line_number":2204,"context_line":"                }"},{"line_number":2205,"context_line":"            ]"},{"line_number":2206,"context_line":"        }"},{"line_number":2207,"context_line":"        self.federation_api.update_mapping(self.mapping[\u0027id\u0027], rules)"},{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":"        r \u003d self._issue_unscoped_token(assertion\u003d\u0027TESTER_ASSERTION\u0027)"},{"line_number":2210,"context_line":"        token_id \u003d r.headers.get(\u0027X-Subject-Token\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"9a80dd14_e9a448a7","line":2207,"in_reply_to":"9a80dd14_19ccc588","updated":"2015-03-16 12:42:25.000000000","message":"Done","commit_id":"1525a1abf6cb766e1d86d4eed872528358f3aede"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"c4a3d89202d8d42ce057921cabf93f707926f8c8","unresolved":false,"context_lines":[{"line_number":792,"context_line":"        r \u003d self.get(url)"},{"line_number":793,"context_line":"        return r"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    def test_create_idp(self):"},{"line_number":796,"context_line":"        \"\"\"Creates the IdentityProvider entity.\"\"\""},{"line_number":797,"context_line":""},{"line_number":798,"context_line":"        keys_to_check \u003d self.idp_keys"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_7c61d3a7","side":"PARENT","line":795,"updated":"2015-03-16 22:51:34.000000000","message":"Is this no longer a valid usecase?","commit_id":"06aa22a8ee75a2412c7076adb0eaa297b08a4b11"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"71f5671a22b181ff4f53756fad5726c6260fb7fe","unresolved":false,"context_lines":[{"line_number":792,"context_line":"        r \u003d self.get(url)"},{"line_number":793,"context_line":"        return r"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    def test_create_idp(self):"},{"line_number":796,"context_line":"        \"\"\"Creates the IdentityProvider entity.\"\"\""},{"line_number":797,"context_line":""},{"line_number":798,"context_line":"        keys_to_check \u003d self.idp_keys"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_129d0e5a","side":"PARENT","line":795,"in_reply_to":"9a80dd14_7c61d3a7","updated":"2015-03-17 12:10:58.000000000","message":"Put back","commit_id":"06aa22a8ee75a2412c7076adb0eaa297b08a4b11"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"a242c4bbb0e34e6fb6c1da95f8e71770fd4cf38d","unresolved":false,"context_lines":[{"line_number":792,"context_line":"        r \u003d self.get(url)"},{"line_number":793,"context_line":"        return r"},{"line_number":794,"context_line":""},{"line_number":795,"context_line":"    def test_create_idp(self):"},{"line_number":796,"context_line":"        \"\"\"Creates the IdentityProvider entity.\"\"\""},{"line_number":797,"context_line":""},{"line_number":798,"context_line":"        keys_to_check \u003d self.idp_keys"}],"source_content_type":"text/x-python","patch_set":26,"id":"9a80dd14_b20362bd","side":"PARENT","line":795,"in_reply_to":"9a80dd14_7c61d3a7","updated":"2015-03-17 10:57:45.000000000","message":"i think it is.","commit_id":"06aa22a8ee75a2412c7076adb0eaa297b08a4b11"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":1022,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":1023,"context_line":"        body \u003d body[\u0027identity_provider\u0027]"},{"line_number":1024,"context_line":"        for key in body.keys():"},{"line_number":1025,"context_line":"            if isinstance(body[key], list):"},{"line_number":1026,"context_line":"                self.assertEqual(sorted(body[key]),"},{"line_number":1027,"context_line":"                                 sorted(updated_idp.get(key)))"},{"line_number":1028,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_0de69e44","line":1025,"updated":"2015-03-18 07:33:26.000000000","message":"why is this different now? is the else branch ever used now?","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":1022,"context_line":"                                                          \u0027identity_provider\u0027)"},{"line_number":1023,"context_line":"        body \u003d body[\u0027identity_provider\u0027]"},{"line_number":1024,"context_line":"        for key in body.keys():"},{"line_number":1025,"context_line":"            if isinstance(body[key], list):"},{"line_number":1026,"context_line":"                self.assertEqual(sorted(body[key]),"},{"line_number":1027,"context_line":"                                 sorted(updated_idp.get(key)))"},{"line_number":1028,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_2f035277","line":1025,"in_reply_to":"9a80dd14_0de69e44","updated":"2015-03-18 10:31:45.000000000","message":"Yes, because the remote_id is a list and during the test I notices that the returned list was in a different order so the asserEqual was failing because of that even the elements were the same. Therefore the list are sorted before the test.","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":2011,"context_line":"                                       })"},{"line_number":2012,"context_line":"        self.assertIsNotNone(r.headers.get(\u0027X-Subject-Token\u0027))"},{"line_number":2013,"context_line":""},{"line_number":2014,"context_line":"    def test_issue_unscoped_token_with_saml2_remote(self):"},{"line_number":2015,"context_line":"        self.config_fixture.config(group\u003d\u0027saml2\u0027,"},{"line_number":2016,"context_line":"                                   remote_id_attribute\u003dself.REMOTE_ID_ATTR)"},{"line_number":2017,"context_line":"        r \u003d self._issue_unscoped_token(idp\u003dself.IDP_WITH_REMOTE,"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_cdf726d3","line":2014,"updated":"2015-03-18 07:33:26.000000000","message":"a test where remote_id_attribute is undefined for saml2 and federation would be good.\n\nalso a test that adds a random protocol, would show code that loads and registers the config options properly","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":2011,"context_line":"                                       })"},{"line_number":2012,"context_line":"        self.assertIsNotNone(r.headers.get(\u0027X-Subject-Token\u0027))"},{"line_number":2013,"context_line":""},{"line_number":2014,"context_line":"    def test_issue_unscoped_token_with_saml2_remote(self):"},{"line_number":2015,"context_line":"        self.config_fixture.config(group\u003d\u0027saml2\u0027,"},{"line_number":2016,"context_line":"                                   remote_id_attribute\u003dself.REMOTE_ID_ATTR)"},{"line_number":2017,"context_line":"        r \u003d self._issue_unscoped_token(idp\u003dself.IDP_WITH_REMOTE,"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_0f484eb2","line":2014,"in_reply_to":"9a80dd14_cdf726d3","updated":"2015-03-18 10:31:45.000000000","message":"Actually, saml2 is considered as random protocol because there is nothing referring to saml2 and the option is registered in the config for that. It is not clear the test we should add, could you give more info?","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":2031,"context_line":"                              self.REMOTE_ID_ATTR: uuid.uuid4().hex"},{"line_number":2032,"context_line":"                          })"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"    def test_issue_unscoped_token_with_remote_default_wrong(self):"},{"line_number":2035,"context_line":"        \"\"\"Test that protocol remote_id_Attribute has higher priority."},{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"        Make sure the parameter stored under ``protocol`` section has higher"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_8d7b6e7a","line":2034,"updated":"2015-03-18 07:33:26.000000000","message":"this test name doesn\u0027t seem to indicate much about the test","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":2031,"context_line":"                              self.REMOTE_ID_ATTR: uuid.uuid4().hex"},{"line_number":2032,"context_line":"                          })"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"    def test_issue_unscoped_token_with_remote_default_wrong(self):"},{"line_number":2035,"context_line":"        \"\"\"Test that protocol remote_id_Attribute has higher priority."},{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"        Make sure the parameter stored under ``protocol`` section has higher"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_0fdf6ed7","line":2034,"in_reply_to":"9a80dd14_8d7b6e7a","updated":"2015-03-18 10:31:45.000000000","message":"Changed with \"test_issue_unscoped_token_with_remote_default_overwritten\"","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"d800004ab000d3d60140de5417ce8ffb5ff43bb3","unresolved":false,"context_lines":[{"line_number":2032,"context_line":"                          })"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"    def test_issue_unscoped_token_with_remote_default_wrong(self):"},{"line_number":2035,"context_line":"        \"\"\"Test that protocol remote_id_Attribute has higher priority."},{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"        Make sure the parameter stored under ``protocol`` section has higher"},{"line_number":2038,"context_line":"        priority over parameter from default ``federation`` configuration"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_6d9d5abb","line":2035,"updated":"2015-03-18 07:33:26.000000000","message":"attribute*","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"},{"author":{"_account_id":10335,"name":"Marco Fargetta","email":"marco.fargetta@ct.infn.it","username":"fmarco76"},"change_message_id":"a25df99defc7b652483abd862109128bf2b661c5","unresolved":false,"context_lines":[{"line_number":2032,"context_line":"                          })"},{"line_number":2033,"context_line":""},{"line_number":2034,"context_line":"    def test_issue_unscoped_token_with_remote_default_wrong(self):"},{"line_number":2035,"context_line":"        \"\"\"Test that protocol remote_id_Attribute has higher priority."},{"line_number":2036,"context_line":""},{"line_number":2037,"context_line":"        Make sure the parameter stored under ``protocol`` section has higher"},{"line_number":2038,"context_line":"        priority over parameter from default ``federation`` configuration"}],"source_content_type":"text/x-python","patch_set":28,"id":"9a80dd14_8fd35ed4","line":2035,"in_reply_to":"9a80dd14_6d9d5abb","updated":"2015-03-18 10:31:45.000000000","message":"Done","commit_id":"a7110df527682b4e5c5c22824f557a742cd4f53f"}]}
