)]}'
{"keystone/contrib/federation/backends/sql.py":[{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"49d14dc9f38b271b5617ffae873c3efec29395dd","unresolved":false,"context_lines":[{"line_number":96,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse)"},{"line_number":97,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"},{"line_number":98,"context_line":"    auth_url \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":99,"context_line":"    sp_url \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":100,"context_line":"    relay_state_prefix \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a6ced46_44d8a3ef","line":99,"updated":"2015-03-23 17:28:54.000000000","message":"seems like I missed that in the SQL migration patch","commit_id":"35a91ef6d417b181d138aaef179ff49fe970cd3b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9b86cd79f0ac125dc39f2b7ad37f1b1363b30346","unresolved":false,"context_lines":[{"line_number":88,"context_line":"class ServiceProviderModel(sql.ModelBase, sql.DictBase):"},{"line_number":89,"context_line":"    __tablename__ \u003d \u0027service_provider\u0027"},{"line_number":90,"context_line":"    attributes \u003d [\u0027auth_url\u0027, \u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027,"},{"line_number":91,"context_line":"                  \u0027relay_state_prefix\u0027, \u0027sp_url\u0027]"},{"line_number":92,"context_line":"    mutable_attributes \u003d frozenset([\u0027auth_url\u0027, \u0027description\u0027, \u0027enabled\u0027,"},{"line_number":93,"context_line":"                                    \u0027relay_state_prefix\u0027, \u0027sp_url\u0027])"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6ced46_955b752d","line":91,"updated":"2015-03-24 16:23:21.000000000","message":"Reading the shibboleth documentation again, my understanding is that the relaystate can also be a hardcoded value. Like \u002725:cookie\u0027?\n\nhttps://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPSessions","commit_id":"cfcff82c98a11afad78f56f763d88b14c2073e31"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"8f15b4550a5b30435990cb688b3194aa9b06d30b","unresolved":false,"context_lines":[{"line_number":88,"context_line":"class ServiceProviderModel(sql.ModelBase, sql.DictBase):"},{"line_number":89,"context_line":"    __tablename__ \u003d \u0027service_provider\u0027"},{"line_number":90,"context_line":"    attributes \u003d [\u0027auth_url\u0027, \u0027id\u0027, \u0027enabled\u0027, \u0027description\u0027,"},{"line_number":91,"context_line":"                  \u0027relay_state_prefix\u0027, \u0027sp_url\u0027]"},{"line_number":92,"context_line":"    mutable_attributes \u003d frozenset([\u0027auth_url\u0027, \u0027description\u0027, \u0027enabled\u0027,"},{"line_number":93,"context_line":"                                    \u0027relay_state_prefix\u0027, \u0027sp_url\u0027])"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6ced46_0bb5a630","line":91,"in_reply_to":"1a6ced46_955b752d","updated":"2015-03-24 17:00:35.000000000","message":"my only concern is if we set a different prefix (from what is configured in the SP), the SP could fail while parsing the assertion.","commit_id":"cfcff82c98a11afad78f56f763d88b14c2073e31"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fa2b80fbe2a63b3cf1569f78b738b381f5d8e1cf","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"},{"line_number":98,"context_line":"    auth_url \u003d sql.Column(sql.String(256), nullable\u003dFalse)"},{"line_number":99,"context_line":"    sp_url \u003d sql.Column(sql.String(256), nullable\u003dFalse)"},{"line_number":100,"context_line":"    relay_state_prefix \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @classmethod"},{"line_number":103,"context_line":"    def from_dict(cls, dictionary):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a6ced46_b9f73ed2","line":100,"updated":"2015-03-26 08:38:36.000000000","message":"please see my comment on https://review.openstack.org/#/c/166078/5/keystone/contrib/federation/migrate_repo/versions/007_add_relay_state_to_sp.py","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"20a681e5e2347ea726031a3b83f0b0b72c55c30c","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    description \u003d sql.Column(sql.Text(), nullable\u003dTrue)"},{"line_number":98,"context_line":"    auth_url \u003d sql.Column(sql.String(256), nullable\u003dFalse)"},{"line_number":99,"context_line":"    sp_url \u003d sql.Column(sql.String(256), nullable\u003dFalse)"},{"line_number":100,"context_line":"    relay_state_prefix \u003d sql.Column(sql.String(256), nullable\u003dTrue)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @classmethod"},{"line_number":103,"context_line":"    def from_dict(cls, dictionary):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa963961_8130f857","line":100,"in_reply_to":"1a6ced46_b9f73ed2","updated":"2015-03-27 07:49:57.000000000","message":"i\u0027ll change this to nullable\u003dFalse","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"}],"keystone/contrib/federation/core.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"e2a0b540dffde7963b1225435322b6e7733a0b64","unresolved":false,"context_lines":[{"line_number":45,"context_line":"IDENTITY_PROVIDER \u003d \u0027OS-FEDERATION:identity_provider\u0027"},{"line_number":46,"context_line":"PROTOCOL \u003d \u0027OS-FEDERATION:protocol\u0027"},{"line_number":47,"context_line":"FEDERATED_DOMAIN_KEYWORD \u003d \u0027Federated\u0027"},{"line_number":48,"context_line":"RELAY_STATE_DEFAULT_PREFIX \u003d \u0027ss:mem\u0027"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"@dependency.provider(\u0027federation_api\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_131734a4","line":48,"updated":"2015-03-20 03:18:18.000000000","message":"RELAY_STATE_DEFAULT_PREFIX \u003d \u0027ss:mem:\u0027\n\nthe colon should be part of the prefix","commit_id":"7555e6c7c3087aee0dfcfb05809daec9a7d60b0c"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fa2b80fbe2a63b3cf1569f78b738b381f5d8e1cf","unresolved":false,"context_lines":[{"line_number":45,"context_line":"IDENTITY_PROVIDER \u003d \u0027OS-FEDERATION:identity_provider\u0027"},{"line_number":46,"context_line":"PROTOCOL \u003d \u0027OS-FEDERATION:protocol\u0027"},{"line_number":47,"context_line":"FEDERATED_DOMAIN_KEYWORD \u003d \u0027Federated\u0027"},{"line_number":48,"context_line":"RELAY_STATE_DEFAULT_PREFIX \u003d \u0027ss:mem:\u0027"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"@dependency.provider(\u0027federation_api\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a6ced46_39334eac","line":48,"updated":"2015-03-26 08:38:36.000000000","message":"Making this a configurable options is a good idea or not a good idea?","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"20a681e5e2347ea726031a3b83f0b0b72c55c30c","unresolved":false,"context_lines":[{"line_number":45,"context_line":"IDENTITY_PROVIDER \u003d \u0027OS-FEDERATION:identity_provider\u0027"},{"line_number":46,"context_line":"PROTOCOL \u003d \u0027OS-FEDERATION:protocol\u0027"},{"line_number":47,"context_line":"FEDERATED_DOMAIN_KEYWORD \u003d \u0027Federated\u0027"},{"line_number":48,"context_line":"RELAY_STATE_DEFAULT_PREFIX \u003d \u0027ss:mem:\u0027"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"@dependency.provider(\u0027federation_api\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa963961_81659846","line":48,"in_reply_to":"1a6ced46_39334eac","updated":"2015-03-27 07:49:57.000000000","message":"i like that idea.","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"a1f9fc49e4cb075b10769e6ff70cf69b0d5ad60e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"IDENTITY_PROVIDER \u003d \u0027OS-FEDERATION:identity_provider\u0027"},{"line_number":46,"context_line":"PROTOCOL \u003d \u0027OS-FEDERATION:protocol\u0027"},{"line_number":47,"context_line":"FEDERATED_DOMAIN_KEYWORD \u003d \u0027Federated\u0027"},{"line_number":48,"context_line":"RELAY_STATE_DEFAULT_PREFIX \u003d CONF.saml.relay_state_prefix"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"@dependency.provider(\u0027federation_api\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa963961_f2bae6e0","line":48,"updated":"2015-03-27 15:47:56.000000000","message":"seems that CONF isn\u0027t loaded yet at this point when the controller.py uses it","commit_id":"2b155cc5f1ca3c35c833d59b833a883b73b398b7"}],"keystone/contrib/federation/migrate_repo/versions/007_add_relay_state_to_sp.py":[{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"74849c76c7c0cc9e9d02eda5433188296b55c942","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    idp_table \u003d utils.get_table(migrate_engine, _SP_TABLE_NAME)"},{"line_number":25,"context_line":"    relay_state_prefix \u003d sql.Column(_RELAY_STATE_PREFIX, sql.String(256),"},{"line_number":26,"context_line":"                                    nullable\u003dTrue)"},{"line_number":27,"context_line":"    idp_table.create_column(relay_state_prefix)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_377edbe4","line":26,"updated":"2015-03-20 09:24:37.000000000","message":"We make it nullable, but in fact if the value is not provided controoler will set it to some default hardocded value.  So I don\u0027t see any way for this attribute to be value, maybe we then should mark it nullable\u003dFalse ?","commit_id":"35a91ef6d417b181d138aaef179ff49fe970cd3b"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"bd37f3323f6cd69fd7c7738530d5f17d836a7517","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    idp_table \u003d utils.get_table(migrate_engine, _SP_TABLE_NAME)"},{"line_number":25,"context_line":"    relay_state_prefix \u003d sql.Column(_RELAY_STATE_PREFIX, sql.String(256),"},{"line_number":26,"context_line":"                                    nullable\u003dTrue)"},{"line_number":27,"context_line":"    idp_table.create_column(relay_state_prefix)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_df0904de","line":26,"in_reply_to":"9a80dd14_2eacb89e","updated":"2015-03-20 16:27:44.000000000","message":"If I am reading the doc correctly, the relaystate attribute is optional.\n\nhttps://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPSessions\n\nBut \"ss:mem:\" is the recommended setting as it utilizes SP\u0027s in-memory cache to preserve the original request.","commit_id":"35a91ef6d417b181d138aaef179ff49fe970cd3b"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fb0d99e0135035f20c6aaed2ce8b5a0576d88e96","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    idp_table \u003d utils.get_table(migrate_engine, _SP_TABLE_NAME)"},{"line_number":25,"context_line":"    relay_state_prefix \u003d sql.Column(_RELAY_STATE_PREFIX, sql.String(256),"},{"line_number":26,"context_line":"                                    nullable\u003dTrue)"},{"line_number":27,"context_line":"    idp_table.create_column(relay_state_prefix)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a80dd14_2eacb89e","line":26,"in_reply_to":"9a80dd14_377edbe4","updated":"2015-03-20 15:24:36.000000000","message":"Edge case time... what if the user has their shib set to a prefix of \"\". Now i\u0027m wondering how to satisfy that...","commit_id":"35a91ef6d417b181d138aaef179ff49fe970cd3b"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fa2b80fbe2a63b3cf1569f78b738b381f5d8e1cf","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    idp_table \u003d utils.get_table(migrate_engine, _SP_TABLE_NAME)"},{"line_number":25,"context_line":"    relay_state_prefix \u003d sql.Column(_RELAY_STATE_PREFIX, sql.String(256),"},{"line_number":26,"context_line":"                                    nullable\u003dTrue)"},{"line_number":27,"context_line":"    idp_table.create_column(relay_state_prefix)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a6ced46_590d6ae7","line":26,"updated":"2015-03-26 08:38:36.000000000","message":"I will let others to weigh and simply wanted to raise a discussion here:\n\nI agree we don\u0027t need to make users specify this value explicitely while adding new Service Provider objects (hence JSONschema allows for null value), but the controller does sets default value either way. So it looks like all in all we want to end up with attribute being non null always.\nSomebody pointed out the migration case - why not simply add a migration helper which will add default values for those that were not added ?I think this will not significantly eat db store, will it? \nThe end resull is that we don\u0027t accept relay_state_prefix attribute being null, so why allow for such \u0027inconsistency\u0027  at the DB layer?\nAs long as there are no veto\u0027s or other technical contraints I vote for making this attribute not nullable.","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"20a681e5e2347ea726031a3b83f0b0b72c55c30c","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    idp_table \u003d utils.get_table(migrate_engine, _SP_TABLE_NAME)"},{"line_number":25,"context_line":"    relay_state_prefix \u003d sql.Column(_RELAY_STATE_PREFIX, sql.String(256),"},{"line_number":26,"context_line":"                                    nullable\u003dTrue)"},{"line_number":27,"context_line":"    idp_table.create_column(relay_state_prefix)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa963961_615a9485","line":26,"in_reply_to":"1a6ced46_590d6ae7","updated":"2015-03-27 07:49:57.000000000","message":"you have a point.","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"811023073fa2c972f1a40b6a8b28c6a4c3d2433b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"fa963961_75dc80e4","updated":"2015-03-27 16:21:50.000000000","message":"this needs to change to 008","commit_id":"2b155cc5f1ca3c35c833d59b833a883b73b398b7"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"930fd97c203a055528ef6c7d85ca145c0a0dbf31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"fa963961_e02c4c4c","updated":"2015-03-27 16:37:54.000000000","message":"needs to be 008 now","commit_id":"984c42d6ad83265be3b73c5b707e5c430f73e05c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"42fec479ac426f7b827464ba7577f099ba95da97","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"fa963961_00c29033","in_reply_to":"fa963961_e02c4c4c","updated":"2015-03-27 16:43:27.000000000","message":"Done","commit_id":"984c42d6ad83265be3b73c5b707e5c430f73e05c"}],"keystone/tests/unit/test_sql_migrate_extensions.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"930fd97c203a055528ef6c7d85ca145c0a0dbf31","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        self.assertEqual(\u0027\u0027, sp.sp_url)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def test_add_relay_state_column(self):"},{"line_number":314,"context_line":"        self.upgrade(7, repository\u003dself.repo_path)"},{"line_number":315,"context_line":"        self.assertTableColumns(self.service_provider,"},{"line_number":316,"context_line":"                                [\u0027id\u0027, \u0027description\u0027, \u0027enabled\u0027, \u0027auth_url\u0027,"},{"line_number":317,"context_line":"                                 \u0027relay_state_prefix\u0027, \u0027sp_url\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa963961_80b900ec","line":314,"updated":"2015-03-27 16:37:54.000000000","message":"change to 8","commit_id":"984c42d6ad83265be3b73c5b707e5c430f73e05c"},{"author":{"_account_id":11022,"name":"Rodrigo Duarte Sousa","email":"rodrigodsousa@gmail.com","username":"rodrigods"},"change_message_id":"42fec479ac426f7b827464ba7577f099ba95da97","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        self.assertEqual(\u0027\u0027, sp.sp_url)"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    def test_add_relay_state_column(self):"},{"line_number":314,"context_line":"        self.upgrade(7, repository\u003dself.repo_path)"},{"line_number":315,"context_line":"        self.assertTableColumns(self.service_provider,"},{"line_number":316,"context_line":"                                [\u0027id\u0027, \u0027description\u0027, \u0027enabled\u0027, \u0027auth_url\u0027,"},{"line_number":317,"context_line":"                                 \u0027relay_state_prefix\u0027, \u0027sp_url\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa963961_40c89855","line":314,"in_reply_to":"fa963961_80b900ec","updated":"2015-03-27 16:43:27.000000000","message":"Done","commit_id":"984c42d6ad83265be3b73c5b707e5c430f73e05c"}],"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":"fa2b80fbe2a63b3cf1569f78b738b381f5d8e1cf","unresolved":false,"context_lines":[{"line_number":3023,"context_line":"                               keys_to_check\u003dself.SP_KEYS)"},{"line_number":3024,"context_line":""},{"line_number":3025,"context_line":"    def test_create_sp_relay_state_default(self):"},{"line_number":3026,"context_line":"        \"\"\"Create an SP without relay state, should default to `ss:mem`.\"\"\""},{"line_number":3027,"context_line":"        url \u003d self.base_url(suffix\u003duuid.uuid4().hex)"},{"line_number":3028,"context_line":"        sp \u003d self.sp_ref()"},{"line_number":3029,"context_line":"        del sp[\u0027relay_state_prefix\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a6ced46_99b0c244","line":3026,"updated":"2015-03-26 08:38:36.000000000","message":"\u0027an\u0027 or \u0027a\u0027 SP?","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"20a681e5e2347ea726031a3b83f0b0b72c55c30c","unresolved":false,"context_lines":[{"line_number":3023,"context_line":"                               keys_to_check\u003dself.SP_KEYS)"},{"line_number":3024,"context_line":""},{"line_number":3025,"context_line":"    def test_create_sp_relay_state_default(self):"},{"line_number":3026,"context_line":"        \"\"\"Create an SP without relay state, should default to `ss:mem`.\"\"\""},{"line_number":3027,"context_line":"        url \u003d self.base_url(suffix\u003duuid.uuid4().hex)"},{"line_number":3028,"context_line":"        sp \u003d self.sp_ref()"},{"line_number":3029,"context_line":"        del sp[\u0027relay_state_prefix\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa963961_c14ba0af","line":3026,"in_reply_to":"1a6ced46_99b0c244","updated":"2015-03-27 07:49:57.000000000","message":"an is correct, since it\u0027s an acronym and S sounds like \u0027ess\u0027.","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"fa2b80fbe2a63b3cf1569f78b738b381f5d8e1cf","unresolved":false,"context_lines":[{"line_number":3034,"context_line":"                         sp_result[\u0027relay_state_prefix\u0027])"},{"line_number":3035,"context_line":""},{"line_number":3036,"context_line":"    def test_create_sp_relay_state_non_default(self):"},{"line_number":3037,"context_line":"        \"\"\"Create an SP with custom relay state.\"\"\""},{"line_number":3038,"context_line":"        url \u003d self.base_url(suffix\u003duuid.uuid4().hex)"},{"line_number":3039,"context_line":"        sp \u003d self.sp_ref()"},{"line_number":3040,"context_line":"        non_default_prefix \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a6ced46_d9b6ba3d","line":3037,"updated":"2015-03-26 08:38:36.000000000","message":"\u0027an\u0027 or \u0027a\u0027 SP?","commit_id":"1af987da7a2ba2f938c445a0a1f45d9296da8884"}]}
