)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7ac684587601c6068df3a18ed713a7b72acf8d69","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     henriquetruta \u003chenrique@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-12-16 11:12:37 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Constraint to prevent duplicates endpoints"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prevent the creation of endpoints with duplicate combination of"},{"line_number":10,"context_line":"service_id, region_id and interface by creating a unique constraint"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"fa69d971_314e6fc2","line":7,"range":{"start_line":7,"start_character":22,"end_line":7,"end_character":32},"updated":"2015-12-29 21:37:35.000000000","message":"-\u003e duplicate","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     henriquetruta \u003chenrique@lsd.ufcg.edu.br\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-12-16 11:12:37 -0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Constraint to prevent duplicates endpoints"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prevent the creation of endpoints with duplicate combination of"},{"line_number":10,"context_line":"service_id, region_id and interface by creating a unique constraint"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"fa69d971_8429b339","line":7,"range":{"start_line":7,"start_character":22,"end_line":7,"end_character":32},"in_reply_to":"fa69d971_314e6fc2","updated":"2016-01-11 20:02:23.000000000","message":"Done","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7ac684587601c6068df3a18ed713a7b72acf8d69","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Prevent the creation of endpoints with duplicate combination of"},{"line_number":10,"context_line":"service_id, region_id and interface by creating a unique constraint"},{"line_number":11,"context_line":"in endpoint table."},{"line_number":12,"context_line":"Some tests that created duplicated entries were modified to comply"},{"line_number":13,"context_line":"with this new constraint."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"fa69d971_b1d01fcb","line":12,"updated":"2015-12-29 21:37:35.000000000","message":"this should be done in a separate commit so that it\u0027s easier for reviewers to tell which tests this is referring to.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Prevent the creation of endpoints with duplicate combination of"},{"line_number":10,"context_line":"service_id, region_id and interface by creating a unique constraint"},{"line_number":11,"context_line":"in endpoint table."},{"line_number":12,"context_line":"Some tests that created duplicated entries were modified to comply"},{"line_number":13,"context_line":"with this new constraint."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Henrique Truta \u003chenrique@lsd.ufcg.edu.br\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"fa69d971_049b8373","line":12,"in_reply_to":"fa69d971_b1d01fcb","updated":"2016-01-11 20:02:23.000000000","message":"not sure if why understand why we need to separate this. The tests were ok, but now they do not pass the constraint created on this patch and had to be removed.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"}],"keystone/catalog/backends/sql.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"8fc76dab3533490ed70965efc92092901b7bf0cf","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        try:"},{"line_number":229,"context_line":"            with session.begin():"},{"line_number":230,"context_line":"                session.add(new_endpoint)"},{"line_number":231,"context_line":"        except Exception:"},{"line_number":232,"context_line":"            msg \u003d (\u0027Duplicate Endpoint, %s.\u0027) % endpoint_id"},{"line_number":233,"context_line":"            raise exception.Conflict(type\u003d\u0027endpoint\u0027, details\u003dmsg)"},{"line_number":234,"context_line":"        return new_endpoint.to_dict()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_08d5641b","line":231,"updated":"2014-11-24 02:10:10.000000000","message":"Do we really want to catch all exceptions here?","commit_id":"ed36d3fbafaa0c376c359c0b9e2451d99efbf4ee"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f9ceb89023a1b10a258d519c08d24e376c7b98b1","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        try:"},{"line_number":229,"context_line":"            with session.begin():"},{"line_number":230,"context_line":"                session.add(new_endpoint)"},{"line_number":231,"context_line":"        except Exception:"},{"line_number":232,"context_line":"            msg \u003d (\u0027Duplicate Endpoint, %s.\u0027) % endpoint_id"},{"line_number":233,"context_line":"            raise exception.Conflict(type\u003d\u0027endpoint\u0027, details\u003dmsg)"},{"line_number":234,"context_line":"        return new_endpoint.to_dict()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_32a2c54b","line":231,"in_reply_to":"5a890539_08d5641b","updated":"2014-12-01 21:40:16.000000000","message":"I would think not, I think the case we would want here would be a ConflictError.","commit_id":"ed36d3fbafaa0c376c359c0b9e2451d99efbf4ee"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"d2e9837338e2cbf4006e703946be0f0731fc22fc","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        try:"},{"line_number":229,"context_line":"            with session.begin():"},{"line_number":230,"context_line":"                session.add(new_endpoint)"},{"line_number":231,"context_line":"        except Exception:"},{"line_number":232,"context_line":"            msg \u003d (\u0027Duplicate Endpoint, %s.\u0027) % endpoint_id"},{"line_number":233,"context_line":"            raise exception.Conflict(type\u003d\u0027endpoint\u0027, details\u003dmsg)"},{"line_number":234,"context_line":"        return new_endpoint.to_dict()"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_806f7291","line":231,"in_reply_to":"5a890539_32a2c54b","updated":"2014-12-02 22:58:32.000000000","message":"I\u0027ll change the exception. thanks :)","commit_id":"ed36d3fbafaa0c376c359c0b9e2451d99efbf4ee"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1faeec6e5f1433d95069994af1f8b96407a723a4","unresolved":false,"context_lines":[{"line_number":229,"context_line":"            with session.begin():"},{"line_number":230,"context_line":"                session.add(new_endpoint)"},{"line_number":231,"context_line":"        except Exception:"},{"line_number":232,"context_line":"            msg \u003d (\u0027Duplicate Endpoint, %s.\u0027) % endpoint_id"},{"line_number":233,"context_line":"            raise exception.Conflict(type\u003d\u0027endpoint\u0027, details\u003dmsg)"},{"line_number":234,"context_line":"        return new_endpoint.to_dict()"},{"line_number":235,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_be809747","line":232,"updated":"2014-11-19 01:12:04.000000000","message":"This should be translation: \n\n    msg \u003d _(\u0027Duplicate Endpoint, %s.\u0027) % endpoint_id\n\nYou will need to add an \"import _ from keystone.i18n\" as well in the import block at the top.","commit_id":"ed36d3fbafaa0c376c359c0b9e2451d99efbf4ee"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"d2e9837338e2cbf4006e703946be0f0731fc22fc","unresolved":false,"context_lines":[{"line_number":229,"context_line":"            with session.begin():"},{"line_number":230,"context_line":"                session.add(new_endpoint)"},{"line_number":231,"context_line":"        except Exception:"},{"line_number":232,"context_line":"            msg \u003d (\u0027Duplicate Endpoint, %s.\u0027) % endpoint_id"},{"line_number":233,"context_line":"            raise exception.Conflict(type\u003d\u0027endpoint\u0027, details\u003dmsg)"},{"line_number":234,"context_line":"        return new_endpoint.to_dict()"},{"line_number":235,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5a890539_000b82d6","line":232,"in_reply_to":"5a890539_be809747","updated":"2014-12-02 22:58:32.000000000","message":"ok. Thanks!","commit_id":"ed36d3fbafaa0c376c359c0b9e2451d99efbf4ee"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"562a1ee69f389cdd720f395215cd8fd78bb16f79","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":87,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":88,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":89,"context_line":"                                           \u0027interface\u0027, \u0027url\u0027), {})"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"class Catalog(catalog.Driver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa1b9901_e336c7e6","line":89,"updated":"2015-08-22 13:12:38.000000000","message":"I once tried this to fix the duplicated bug like what you did here. (https://bugs.launchpad.net/keystone/+bug/1403408)\n\n\n\u0027url\u0027 is defined as \"TEXT\" while \"TEXT\" cannot be used as primary key or index, if we include \u0027url\u0027 as it should be into UniqueConstraint, we will hit \"BLOB / TEXT Column Used in Key Specification Without a Key Length\" exception.\n\n\nI try to run your migration code, but it\u0027s not work at all, so I suspect there is some issue with your migraiton code.\n\nsee, http://www.databaseskill.com/981875/","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"75d9d882b3b8814a31aa235a51d520776167fc15","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":87,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":88,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":89,"context_line":"                                           \u0027interface\u0027, \u0027url\u0027), {})"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"class Catalog(catalog.Driver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_fa7fb314","line":89,"in_reply_to":"9a1a9d01_ddfd646f","updated":"2015-10-16 14:43:19.000000000","message":"Done","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"81c8f57cc845e52881a5754bca3c90c49c707706","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":87,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":88,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":89,"context_line":"                                           \u0027interface\u0027, \u0027url\u0027), {})"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"class Catalog(catalog.Driver):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_ddfd646f","line":89,"in_reply_to":"fa1b9901_e336c7e6","updated":"2015-10-04 01:24:11.000000000","message":"I believe service_id, region_id and interface are enough.","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e35c1dcb5a4bd293642a19c2f5372d26bd15d961","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        session \u003d sql.get_session()"},{"line_number":230,"context_line":"        new_endpoint \u003d Endpoint.from_dict(endpoint_ref)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # NOTE(henry-nash): We\u0027d like to just let the foreign key constraint"},{"line_number":233,"context_line":"        # check for existence of the region, but this won\u0027t work with sqlite."},{"line_number":234,"context_line":"        if endpoint_ref.get(\u0027region_id\u0027) is not None:"},{"line_number":235,"context_line":"            self.get_region(endpoint_ref[\u0027region_id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_cff9e081","line":232,"updated":"2015-05-29 21:43:35.000000000","message":"What does this block have to do with adding a unique constraint?","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"9d08c7c6e32b5b979100cc811dd4b6d06e46a852","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        session \u003d sql.get_session()"},{"line_number":230,"context_line":"        new_endpoint \u003d Endpoint.from_dict(endpoint_ref)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # NOTE(henry-nash): We\u0027d like to just let the foreign key constraint"},{"line_number":233,"context_line":"        # check for existence of the region, but this won\u0027t work with sqlite."},{"line_number":234,"context_line":"        if endpoint_ref.get(\u0027region_id\u0027) is not None:"},{"line_number":235,"context_line":"            self.get_region(endpoint_ref[\u0027region_id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_e5282d88","line":232,"in_reply_to":"7a016987_cff9e081","updated":"2015-05-31 09:34:36.000000000","message":"Sorry, this is a error in the merge. I\u0027ll remove this code.","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"81c8f57cc845e52881a5754bca3c90c49c707706","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        session \u003d sql.get_session()"},{"line_number":230,"context_line":"        new_endpoint \u003d Endpoint.from_dict(endpoint_ref)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # NOTE(henry-nash): We\u0027d like to just let the foreign key constraint"},{"line_number":233,"context_line":"        # check for existence of the region, but this won\u0027t work with sqlite."},{"line_number":234,"context_line":"        if endpoint_ref.get(\u0027region_id\u0027) is not None:"},{"line_number":235,"context_line":"            self.get_region(endpoint_ref[\u0027region_id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_1ddd1c14","line":232,"in_reply_to":"7a016987_e5282d88","updated":"2015-10-04 01:24:11.000000000","message":"++","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"75d9d882b3b8814a31aa235a51d520776167fc15","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        session \u003d sql.get_session()"},{"line_number":230,"context_line":"        new_endpoint \u003d Endpoint.from_dict(endpoint_ref)"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        # NOTE(henry-nash): We\u0027d like to just let the foreign key constraint"},{"line_number":233,"context_line":"        # check for existence of the region, but this won\u0027t work with sqlite."},{"line_number":234,"context_line":"        if endpoint_ref.get(\u0027region_id\u0027) is not None:"},{"line_number":235,"context_line":"            self.get_region(endpoint_ref[\u0027region_id\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_1a85cf05","line":232,"in_reply_to":"9a1a9d01_1ddd1c14","updated":"2015-10-16 14:43:19.000000000","message":"Done","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e397b39728466951ba7f1b2e2eda5f509de5ab70","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone.common import sql"},{"line_number":25,"context_line":"from keystone import exception"},{"line_number":26,"context_line":"from keystone.i18n import _"},{"line_number":27,"context_line":"from oslo_db import exception as db_exception"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_b43e2726","line":27,"updated":"2015-10-16 17:01:48.000000000","message":"this is third party and shouldn\u0027t be in this section","commit_id":"b637ecf449084804bb5e3e7f66f1311f84a61fd1"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"941aca1502b0d56f644c2e1be3fd0b5c5943731f","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from keystone.common import sql"},{"line_number":25,"context_line":"from keystone import exception"},{"line_number":26,"context_line":"from keystone.i18n import _"},{"line_number":27,"context_line":"from oslo_db import exception as db_exception"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_efa12647","line":27,"in_reply_to":"5a2ca52d_b43e2726","updated":"2015-10-16 17:32:19.000000000","message":"Done","commit_id":"b637ecf449084804bb5e3e7f66f1311f84a61fd1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e397b39728466951ba7f1b2e2eda5f509de5ab70","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":88,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":89,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":90,"context_line":"                                           \u0027interface\u0027), {})"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class Catalog(catalog.CatalogDriverV8):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_d4ce432c","line":90,"updated":"2015-10-16 17:01:48.000000000","message":"Is the {} needed here?","commit_id":"b637ecf449084804bb5e3e7f66f1311f84a61fd1"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"941aca1502b0d56f644c2e1be3fd0b5c5943731f","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":88,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":89,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":90,"context_line":"                                           \u0027interface\u0027), {})"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class Catalog(catalog.CatalogDriverV8):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_eaad949b","line":90,"in_reply_to":"5a2ca52d_d4ce432c","updated":"2015-10-16 17:32:19.000000000","message":"yes, didn\u0027t find documentation saying it is, but it has broken everything when I removed.","commit_id":"b637ecf449084804bb5e3e7f66f1311f84a61fd1"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e397b39728466951ba7f1b2e2eda5f509de5ab70","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                session.add(new_endpoint)"},{"line_number":236,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":237,"context_line":"            raise exception.ValidationError("},{"line_number":238,"context_line":"                message\u003d_(\u0027there already is an existing endpoint with this \u0027"},{"line_number":239,"context_line":"                          \u0027configuration of service_id, region_id and \u0027"},{"line_number":240,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":241,"context_line":"                          \u0027%(interface)s)\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_748e4fd1","line":238,"updated":"2015-10-16 17:01:48.000000000","message":"s/there already is/There is already/\n\ns/configuration/combination/","commit_id":"b637ecf449084804bb5e3e7f66f1311f84a61fd1"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"941aca1502b0d56f644c2e1be3fd0b5c5943731f","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                session.add(new_endpoint)"},{"line_number":236,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":237,"context_line":"            raise exception.ValidationError("},{"line_number":238,"context_line":"                message\u003d_(\u0027there already is an existing endpoint with this \u0027"},{"line_number":239,"context_line":"                          \u0027configuration of service_id, region_id and \u0027"},{"line_number":240,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":241,"context_line":"                          \u0027%(interface)s)\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_0abc90da","line":238,"in_reply_to":"5a2ca52d_748e4fd1","updated":"2015-10-16 17:32:19.000000000","message":"Done","commit_id":"b637ecf449084804bb5e3e7f66f1311f84a61fd1"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"ab6cf750a1b7ee1451a0fcf27264cd2ac2db39e7","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":88,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":89,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":90,"context_line":"                                           \u0027interface\u0027), {})"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class Catalog(catalog.CatalogDriverV8):"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a2ca52d_33a2289a","line":90,"updated":"2015-10-16 19:03:05.000000000","message":"Shouldn\u0027t we also be including url in this constraint?\n\nThis will only allow for three unique endpoints for a service in a given region. This would be a pretty big issue for a deployment that has a lot of endpoints for a service in a region, thinking of something like compute.","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"16a69b3f45569c84b67c4bac1221acc60e84dc4b","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":88,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":89,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":90,"context_line":"                                           \u0027interface\u0027), {})"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class Catalog(catalog.CatalogDriverV8):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_82c4865f","line":90,"in_reply_to":"5a2ca52d_33a2289a","updated":"2015-10-19 20:43:23.000000000","message":"Done","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"e0c5ed50abe88c30b9c85892cf056f39123d27fc","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":88,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":89,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":90,"context_line":"                                           \u0027interface\u0027), {})"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"class Catalog(catalog.CatalogDriverV8):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_20764a70","line":90,"in_reply_to":"5a2ca52d_33a2289a","updated":"2015-10-22 07:17:31.000000000","message":"Lance, pls check my comment here:\nhttps://review.openstack.org/#/c/134095/3/keystone/catalog/backends/sql.py, Text cannnot be a part of unique constaint.","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5bf6d27ff394562e6bbf1f1a420af1b36c8b495f","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            with session.begin():"},{"line_number":235,"context_line":"                session.add(new_endpoint)"},{"line_number":236,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":237,"context_line":"            raise exception.ValidationError("},{"line_number":238,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":239,"context_line":"                          \u0027combination of service_id, region_id and \u0027"},{"line_number":240,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a2ca52d_73f500eb","line":237,"updated":"2015-10-16 19:03:58.000000000","message":"keystone uses Conflict for the case when the object already exists everywhere else.","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"16a69b3f45569c84b67c4bac1221acc60e84dc4b","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            with session.begin():"},{"line_number":235,"context_line":"                session.add(new_endpoint)"},{"line_number":236,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":237,"context_line":"            raise exception.ValidationError("},{"line_number":238,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":239,"context_line":"                          \u0027combination of service_id, region_id and \u0027"},{"line_number":240,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_2206d2ce","line":237,"in_reply_to":"5a2ca52d_73f500eb","updated":"2015-10-19 20:43:23.000000000","message":"Done","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5bf6d27ff394562e6bbf1f1a420af1b36c8b495f","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                session.add(new_endpoint)"},{"line_number":236,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":237,"context_line":"            raise exception.ValidationError("},{"line_number":238,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":239,"context_line":"                          \u0027combination of service_id, region_id and \u0027"},{"line_number":240,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":241,"context_line":"                          \u0027%(interface)s)\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a2ca52d_b30b98d5","line":238,"updated":"2015-10-16 19:03:58.000000000","message":"the message creation should be up in the manager so that the result is the same for all drivers.","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"16a69b3f45569c84b67c4bac1221acc60e84dc4b","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                session.add(new_endpoint)"},{"line_number":236,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":237,"context_line":"            raise exception.ValidationError("},{"line_number":238,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":239,"context_line":"                          \u0027combination of service_id, region_id and \u0027"},{"line_number":240,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":241,"context_line":"                          \u0027%(interface)s)\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_62c92a78","line":238,"in_reply_to":"5a2ca52d_b30b98d5","updated":"2015-10-19 20:43:23.000000000","message":"Done","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a74189780ebc390e117381cef6d7e16cfa56e297","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    service_id \u003d sql.Column(sql.String(64),"},{"line_number":81,"context_line":"                            sql.ForeignKey(\u0027service.id\u0027),"},{"line_number":82,"context_line":"                            nullable\u003dFalse)"},{"line_number":83,"context_line":"    url \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":84,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse, default\u003dTrue,"},{"line_number":85,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":86,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa80f949_d2d30e37","line":83,"updated":"2015-11-05 03:32:49.000000000","message":"this should be in the parent patch where the type of endpoint.url column is updated to String.","commit_id":"38cfcd3b08e3498cd23851e702aa1f631bfc814b"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"12ef7d344604b2736c6a97f2032c1544b945dd64","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    service_id \u003d sql.Column(sql.String(64),"},{"line_number":81,"context_line":"                            sql.ForeignKey(\u0027service.id\u0027),"},{"line_number":82,"context_line":"                            nullable\u003dFalse)"},{"line_number":83,"context_line":"    url \u003d sql.Column(sql.String(255), nullable\u003dFalse)"},{"line_number":84,"context_line":"    enabled \u003d sql.Column(sql.Boolean, nullable\u003dFalse, default\u003dTrue,"},{"line_number":85,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":86,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa80f949_ef073d1a","line":83,"in_reply_to":"fa80f949_d2d30e37","updated":"2015-11-05 11:39:19.000000000","message":"Done","commit_id":"38cfcd3b08e3498cd23851e702aa1f631bfc814b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7ac684587601c6068df3a18ed713a7b72acf8d69","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":81,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":82,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":83,"context_line":"                                           \u0027interface\u0027), {})"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"class Catalog(catalog.CatalogDriverV8):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_31fc2f3e","line":83,"updated":"2015-12-29 21:37:35.000000000","message":"based on the docs I don\u0027t think the {} is necessary -- http://docs.sqlalchemy.org/en/latest/orm/extensions/declarative/table_config.html","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"58fe998aeb0cdc28c340592f8913dec0362a5f00","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":81,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":82,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":83,"context_line":"                                           \u0027interface\u0027), {})"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"class Catalog(catalog.CatalogDriverV8):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_849b4172","line":83,"in_reply_to":"fa69d971_31fc2f3e","updated":"2016-01-07 21:35:06.000000000","message":"++","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                         server_default\u003dsqlalchemy.sql.expression.true())"},{"line_number":81,"context_line":"    extra \u003d sql.Column(sql.JsonBlob())"},{"line_number":82,"context_line":"    __table_args__ \u003d (sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":83,"context_line":"                                           \u0027interface\u0027), {})"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"class Catalog(catalog.CatalogDriverV8):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_64827f02","line":83,"in_reply_to":"fa69d971_849b4172","updated":"2016-01-11 20:02:23.000000000","message":"True... Looks like it is just a hack used everywhere to transform it into a tuple","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d9a735fa0446c57b895b9f3412f0876f5b7a7765","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":227,"context_line":"                          \u0027%(interface)s).\u0027)"},{"line_number":228,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":229,"context_line":"                    \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"},{"line_number":230,"context_line":"                    \u0027interface\u0027: endpoint_ref[\u0027interface\u0027]})"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def delete_endpoint(self, endpoint_id):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7af24918_39dd3843","line":229,"range":{"start_line":229,"start_character":19,"end_line":229,"end_character":20},"updated":"2016-03-01 13:47:28.000000000","message":"doesn\u0027t tox dislike this?\ncould you please fix this little nit?","commit_id":"e6041084ee3bc6a2c884179495ddbd1fa34abaaf"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"3a97559e8517291fb83cf3ad53d9c18d667e958c","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":227,"context_line":"                          \u0027%(interface)s).\u0027)"},{"line_number":228,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":229,"context_line":"                    \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"},{"line_number":230,"context_line":"                    \u0027interface\u0027: endpoint_ref[\u0027interface\u0027]})"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def delete_endpoint(self, endpoint_id):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7af24918_4112be63","line":229,"range":{"start_line":229,"start_character":19,"end_line":229,"end_character":20},"in_reply_to":"7af24918_39dd3843","updated":"2016-03-01 17:31:05.000000000","message":"Done","commit_id":"e6041084ee3bc6a2c884179495ddbd1fa34abaaf"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"1574c1236b931e18eea3304b682e624c453769a4","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":227,"context_line":"                          \u0027%(interface)s).\u0027)"},{"line_number":228,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":229,"context_line":"                    \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"},{"line_number":230,"context_line":"                    \u0027interface\u0027: endpoint_ref[\u0027interface\u0027]})"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def delete_endpoint(self, endpoint_id):"}],"source_content_type":"text/x-python","patch_set":21,"id":"7af24918_ca32c6f1","line":229,"updated":"2016-03-03 15:51:44.000000000","message":"(nit) indentation","commit_id":"a8084fed506a827677f6fbcce78c96165dec92d3"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"03f6f5c6dcc52d18adc84a826553a7785b991d0c","unresolved":false,"context_lines":[{"line_number":226,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":227,"context_line":"                          \u0027%(interface)s).\u0027)"},{"line_number":228,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":229,"context_line":"                    \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"},{"line_number":230,"context_line":"                    \u0027interface\u0027: endpoint_ref[\u0027interface\u0027]})"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def delete_endpoint(self, endpoint_id):"}],"source_content_type":"text/x-python","patch_set":21,"id":"5aef4532_b3bd8c6a","line":229,"in_reply_to":"7af24918_ca32c6f1","updated":"2016-03-08 20:37:25.000000000","message":"Done","commit_id":"a8084fed506a827677f6fbcce78c96165dec92d3"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"7ccb920bdc3417b33dc0473046956f118ed95c71","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    # Endpoints"},{"line_number":216,"context_line":"    def create_endpoint(self, endpoint_id, endpoint_ref):"},{"line_number":217,"context_line":"        new_endpoint \u003d Endpoint.from_dict(endpoint_ref)"},{"line_number":218,"context_line":"        try:"},{"line_number":219,"context_line":"            with sql.session_for_write() as session:"},{"line_number":220,"context_line":"                session.add(new_endpoint)"},{"line_number":221,"context_line":"            return new_endpoint.to_dict()"}],"source_content_type":"text/x-python","patch_set":22,"id":"dab17558_e984f40b","line":218,"updated":"2016-05-10 16:44:17.000000000","message":"This type of new constraint needs to be enforced at the manager level as well, this cannot strictly be something that is enforced at the driver level. Secondarily this would be an API incompat/break. So -2 (sorry) until we resolve these issues.","commit_id":"d131d63fde01ab72b84c46d121701d355c66d648"}],"keystone/catalog/core.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7cdc2e79c909a808b81cc068f54f240fc3a8fb76","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":244,"context_line":"            raise exception.Conflict("},{"line_number":245,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":246,"context_line":"                          \u0027combination of service_id, region_id and \u0027"},{"line_number":247,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":248,"context_line":"                          \u0027%(interface)s)\u0027)"},{"line_number":249,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a26ad4f_f05bf92c","line":246,"updated":"2015-10-27 14:16:29.000000000","message":"and url.","commit_id":"19fc0996dfa1b58eeb986d227b5a6e2f37d01763"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"45f661d9ac0a35c435e6bfae5bd00f63dd7b44ee","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":244,"context_line":"            raise exception.Conflict("},{"line_number":245,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":246,"context_line":"                          \u0027combination of service_id, region_id and \u0027"},{"line_number":247,"context_line":"                          \u0027interface (%(service_id)s, %(region_id)s, \u0027"},{"line_number":248,"context_line":"                          \u0027%(interface)s)\u0027)"},{"line_number":249,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa80f949_99429f3d","line":246,"in_reply_to":"1a26ad4f_f05bf92c","updated":"2015-11-04 20:17:22.000000000","message":"Done","commit_id":"19fc0996dfa1b58eeb986d227b5a6e2f37d01763"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"180e5a94cb7f14a60f7635a989ee55bb33c33db9","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":245,"context_line":"                          \u0027combination of service_id, region_id, interface \u0027"},{"line_number":246,"context_line":"                          \u0027and url (%(service_id)s, %(region_id)s, \u0027"},{"line_number":247,"context_line":"                          \u0027%(interface)s %(url)s)\u0027)"},{"line_number":248,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":249,"context_line":"                   \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"},{"line_number":250,"context_line":"                   \u0027interface\u0027: endpoint_ref[\u0027interface\u0027],"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa80f949_cf034041","line":247,"updated":"2015-11-05 20:53:42.000000000","message":"(nit) A comma after %(interface)s would help to keep consistency in the error message.","commit_id":"33d414b718fe6b735603959d618a2ef6c115da3c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"180e5a94cb7f14a60f7635a989ee55bb33c33db9","unresolved":false,"context_lines":[{"line_number":246,"context_line":"                          \u0027and url (%(service_id)s, %(region_id)s, \u0027"},{"line_number":247,"context_line":"                          \u0027%(interface)s %(url)s)\u0027)"},{"line_number":248,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":249,"context_line":"                   \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"},{"line_number":250,"context_line":"                   \u0027interface\u0027: endpoint_ref[\u0027interface\u0027],"},{"line_number":251,"context_line":"                   \u0027url\u0027: endpoint_ref[\u0027url\u0027]})"},{"line_number":252,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fa80f949_4a2dfe44","line":249,"updated":"2015-11-05 20:53:42.000000000","message":"endpoint_create schema allows an endpoint to be created without specifying region. In this case, we\u0027d get a KeyError here.\nAlso check in the db schema that this property is nullable.","commit_id":"33d414b718fe6b735603959d618a2ef6c115da3c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7ac684587601c6068df3a18ed713a7b72acf8d69","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        self._assert_service_exists(endpoint_ref[\u0027service_id\u0027])"},{"line_number":260,"context_line":"        try:"},{"line_number":261,"context_line":"            ref \u003d self.driver.create_endpoint(endpoint_id, endpoint_ref)"},{"line_number":262,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":263,"context_line":"            raise exception.Conflict("},{"line_number":264,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":265,"context_line":"                          \u0027combination of service_id, region_id and interface \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_31aaef1a","line":262,"updated":"2015-12-29 21:37:35.000000000","message":"The backend might not be based on an SQL database, so I don\u0027t think we should rely on the backend raising DBDuplicateEntry. There could be a specific error for it (or use exception.Conflict).","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9c0afd85169031168b85ccea17220b1a19214472","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        self._assert_service_exists(endpoint_ref[\u0027service_id\u0027])"},{"line_number":260,"context_line":"        try:"},{"line_number":261,"context_line":"            ref \u003d self.driver.create_endpoint(endpoint_id, endpoint_ref)"},{"line_number":262,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":263,"context_line":"            raise exception.Conflict("},{"line_number":264,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":265,"context_line":"                          \u0027combination of service_id, region_id and interface \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_a7eb24db","line":262,"in_reply_to":"fa69d971_31aaef1a","updated":"2016-01-06 20:09:09.000000000","message":"++","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        self._assert_service_exists(endpoint_ref[\u0027service_id\u0027])"},{"line_number":260,"context_line":"        try:"},{"line_number":261,"context_line":"            ref \u003d self.driver.create_endpoint(endpoint_id, endpoint_ref)"},{"line_number":262,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":263,"context_line":"            raise exception.Conflict("},{"line_number":264,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":265,"context_line":"                          \u0027combination of service_id, region_id and interface \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_e1785380","line":262,"in_reply_to":"fa69d971_a7eb24db","updated":"2016-01-11 20:02:23.000000000","message":"Done. Just moved it to the backend","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9c0afd85169031168b85ccea17220b1a19214472","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":263,"context_line":"            raise exception.Conflict("},{"line_number":264,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":265,"context_line":"                          \u0027combination of service_id, region_id and interface \u0027"},{"line_number":266,"context_line":"                          \u0027(%(service_id)s, %(region_id)s, %(interface)s)\u0027)"},{"line_number":267,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":268,"context_line":"                   \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_07dc7044","line":265,"range":{"start_line":265,"start_character":42,"end_line":265,"end_character":77},"updated":"2016-01-06 20:09:09.000000000","message":"could list the ID after the entity to clearly dictate which id represents each entity.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        except db_exception.DBDuplicateEntry:"},{"line_number":263,"context_line":"            raise exception.Conflict("},{"line_number":264,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":265,"context_line":"                          \u0027combination of service_id, region_id and interface \u0027"},{"line_number":266,"context_line":"                          \u0027(%(service_id)s, %(region_id)s, %(interface)s)\u0027)"},{"line_number":267,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":268,"context_line":"                   \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_618d437b","line":265,"range":{"start_line":265,"start_character":42,"end_line":265,"end_character":77},"in_reply_to":"fa69d971_07dc7044","updated":"2016-01-11 20:02:23.000000000","message":"We\u0027d need to do an extra query to get the ID, I don\u0027t think it is worth that","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"48bc01c5a0f1d614441a6e6d5d139e7dae7fbb0a","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            raise exception.Conflict("},{"line_number":264,"context_line":"                message\u003d_(\u0027There is already an existing endpoint with this \u0027"},{"line_number":265,"context_line":"                          \u0027combination of service_id, region_id and interface \u0027"},{"line_number":266,"context_line":"                          \u0027(%(service_id)s, %(region_id)s, %(interface)s)\u0027)"},{"line_number":267,"context_line":"                % {\u0027service_id\u0027: endpoint_ref[\u0027service_id\u0027],"},{"line_number":268,"context_line":"                   \u0027region_id\u0027: endpoint_ref[\u0027region_id\u0027],"},{"line_number":269,"context_line":"                   \u0027interface\u0027: endpoint_ref[\u0027interface\u0027]})"}],"source_content_type":"text/x-python","patch_set":14,"id":"3a7e1126_1078b2f1","line":266,"range":{"start_line":266,"start_character":72,"end_line":266,"end_character":75},"updated":"2015-12-17 18:26:08.000000000","message":"Nice! I like clear and concise error messages.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"}],"keystone/common/sql/migrate_repo/versions/073_add_constraint_endpoint.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"81c8f57cc845e52881a5754bca3c90c49c707706","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9a1a9d01_dde6c4e7","updated":"2015-10-04 01:24:11.000000000","message":"It should be 076 at this point.","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e35c1dcb5a4bd293642a19c2f5372d26bd15d961","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import migrate"},{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"_ENDPOINT_TABLE_NAME \u003d \u0027endpoint\u0027"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_6fbe6caf","line":15,"updated":"2015-05-29 21:43:35.000000000","message":"(nit) add newline here","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"9d08c7c6e32b5b979100cc811dd4b6d06e46a852","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import migrate"},{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"_ENDPOINT_TABLE_NAME \u003d \u0027endpoint\u0027"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_c52bf180","line":15,"in_reply_to":"7a016987_6fbe6caf","updated":"2015-05-31 09:34:36.000000000","message":"Done","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e35c1dcb5a4bd293642a19c2f5372d26bd15d961","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def upgrade(migrate_engine):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_4fde1012","line":20,"updated":"2015-05-29 21:43:35.000000000","message":"(nit) remove newline here","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"9d08c7c6e32b5b979100cc811dd4b6d06e46a852","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"def upgrade(migrate_engine):"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_a51eb55c","line":20,"in_reply_to":"7a016987_4fde1012","updated":"2015-05-31 09:34:36.000000000","message":"Done","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"}],"keystone/common/sql/migrate_repo/versions/081_add_constraint_endpoint.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5bf6d27ff394562e6bbf1f1a420af1b36c8b495f","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":26,"context_line":"                             endpoint_table.c.region_id,"},{"line_number":27,"context_line":"                             endpoint_table.c.interface).create()"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a2ca52d_f3c27052","line":25,"updated":"2015-10-16 19:03:58.000000000","message":"there should be a test that shows what happens if the constraint can\u0027t be added because duplicate entries already exist.","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"16a69b3f45569c84b67c4bac1221acc60e84dc4b","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":26,"context_line":"                             endpoint_table.c.region_id,"},{"line_number":27,"context_line":"                             endpoint_table.c.interface).create()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_a5974c8f","line":25,"in_reply_to":"5a2ca52d_f3c27052","updated":"2015-10-19 20:43:23.000000000","message":"Done","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"9a8a54eb64e0ce1c22d7c50ad8e8ff010903f557","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":26,"context_line":"                             endpoint_table.c.region_id,"},{"line_number":27,"context_line":"                             endpoint_table.c.url,"},{"line_number":28,"context_line":"                             endpoint_table.c.interface).create()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a29b11f_00d6aef0","line":27,"updated":"2015-10-22 07:28:39.000000000","message":"so, are you sure you this mirgation can be applied successfully?\n\nI am not sure why it\u0027s not failed when the testcase invoke this scripts, maybe it just failed silently.\n\nTry to execute your script manually or just manipulate your db directly and see whether this got effective.","commit_id":"a458fc713bee7fd9e69695a0b5f3351b19a561bd"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"ea991187745701933c2e89020d289995668f2ad4","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":26,"context_line":"                             endpoint_table.c.region_id,"},{"line_number":27,"context_line":"                             endpoint_table.c.url,"},{"line_number":28,"context_line":"                             endpoint_table.c.interface).create()"}],"source_content_type":"text/x-python","patch_set":7,"id":"3a29b11f_ca861e65","line":27,"in_reply_to":"3a29b11f_00d6aef0","updated":"2015-10-26 23:21:45.000000000","message":"Your comments was addressed.","commit_id":"a458fc713bee7fd9e69695a0b5f3351b19a561bd"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7cdc2e79c909a808b81cc068f54f240fc3a8fb76","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    # Changing the url type for VARCHAR, since a TEXT column can not be"},{"line_number":26,"context_line":"    # part of a UniqueConstraint"},{"line_number":27,"context_line":"    endpoint_table.c.url.alter(type\u003dsql.String(length\u003d255))"},{"line_number":28,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":29,"context_line":"                            endpoint_table.c.region_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a26ad4f_b511f35f","line":26,"updated":"2015-10-27 14:16:29.000000000","message":"I think there might be more work to be done here, suppose the deployment with the existed records doesn\u0027s match UniqueConstraint, the upgrade will fail, are you expecting they will clean the db manually before upgrading their env?\n\nSome work could be done here, don\u0027t let user face something they don\u0027t have know any context.","commit_id":"19fc0996dfa1b58eeb986d227b5a6e2f37d01763"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"45f661d9ac0a35c435e6bfae5bd00f63dd7b44ee","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    # Changing the url type for VARCHAR, since a TEXT column can not be"},{"line_number":26,"context_line":"    # part of a UniqueConstraint"},{"line_number":27,"context_line":"    endpoint_table.c.url.alter(type\u003dsql.String(length\u003d255))"},{"line_number":28,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":29,"context_line":"                            endpoint_table.c.region_id,"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa80f949_b93683e5","line":26,"in_reply_to":"1a26ad4f_b511f35f","updated":"2015-11-04 20:17:22.000000000","message":"the tests are now split up to avoid that. thanks","commit_id":"19fc0996dfa1b58eeb986d227b5a6e2f37d01763"}],"keystone/common/sql/migrate_repo/versions/087_add_unique_constraint_endpoint.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7ac684587601c6068df3a18ed713a7b72acf8d69","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"_ENDPOINT_TABLE_NAME \u003d \u0027endpoint\u0027"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_9174fbcf","line":17,"updated":"2015-12-29 21:37:35.000000000","message":"suggest move this down to where it\u0027s used. this is only used in one place, so no need to make it module scoped.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":14,"context_line":"import sqlalchemy as sql"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"_ENDPOINT_TABLE_NAME \u003d \u0027endpoint\u0027"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"def upgrade(migrate_engine):"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_21bbcbe6","line":17,"in_reply_to":"fa69d971_9174fbcf","updated":"2016-01-11 20:02:23.000000000","message":"Done","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7ac684587601c6068df3a18ed713a7b72acf8d69","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":26,"context_line":"                             endpoint_table.c.region_id,"},{"line_number":27,"context_line":"                             endpoint_table.c.interface).create()"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_114fab93","line":25,"updated":"2015-12-29 21:37:35.000000000","message":"I think we\u0027ll need to catch whatever exception is raised when the new constraint can\u0027t be applied and print a useful message that explains why it\u0027s failing and what to do about it.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9c0afd85169031168b85ccea17220b1a19214472","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":26,"context_line":"                             endpoint_table.c.region_id,"},{"line_number":27,"context_line":"                             endpoint_table.c.interface).create()"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_e76b5c1c","line":25,"in_reply_to":"fa69d971_114fab93","updated":"2016-01-06 20:09:09.000000000","message":"Yes, the test_endpoint_unique_constraint_fails_if_duplicates test case in this patch exposes that. Maybe the test case can assert that a useful error message is logged.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":22,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    endpoint_table \u003d sql.Table(_ENDPOINT_TABLE_NAME, meta, autoload\u003dTrue)"},{"line_number":25,"context_line":"    migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":26,"context_line":"                             endpoint_table.c.region_id,"},{"line_number":27,"context_line":"                             endpoint_table.c.interface).create()"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_4166ff51","line":25,"in_reply_to":"fa69d971_e76b5c1c","updated":"2016-01-11 20:02:23.000000000","message":"Done","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"}],"keystone/common/sql/migrate_repo/versions/088_add_unique_constraint_endpoint.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"01e2ea8f7a6f8c20cde845b07bb751b372df6515","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":31,"context_line":"                                 endpoint_table.c.region_id,"},{"line_number":32,"context_line":"                                 endpoint_table.c.interface).create()"},{"line_number":33,"context_line":"    except Exception as e:"},{"line_number":34,"context_line":"        LOG.error(_LE(\u0027There was an error when trying to create the unique \u0027"},{"line_number":35,"context_line":"                      \u0027constraint at the endpoint table: \"%s\". There might \u0027"},{"line_number":36,"context_line":"                      \u0027be duplicate endpoint entries. Please remove them \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a5ae5dd_45fae676","line":33,"updated":"2016-02-04 15:00:02.000000000","message":"The specific exception should be caught so that we don\u0027t misreport what the problem was.","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0be31596827ebd63727165d9f756a3fa04984170","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":31,"context_line":"                                 endpoint_table.c.region_id,"},{"line_number":32,"context_line":"                                 endpoint_table.c.interface).create()"},{"line_number":33,"context_line":"    except Exception as e:"},{"line_number":34,"context_line":"        LOG.error(_LE(\u0027There was an error when trying to create the unique \u0027"},{"line_number":35,"context_line":"                      \u0027constraint at the endpoint table: \"%s\". There might \u0027"},{"line_number":36,"context_line":"                      \u0027be duplicate endpoint entries. Please remove them \u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_5f7890c4","line":33,"in_reply_to":"5a5ae5dd_45fae676","updated":"2016-02-18 14:13:53.000000000","message":"Done","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"01e2ea8f7a6f8c20cde845b07bb751b372df6515","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                                 endpoint_table.c.interface).create()"},{"line_number":33,"context_line":"    except Exception as e:"},{"line_number":34,"context_line":"        LOG.error(_LE(\u0027There was an error when trying to create the unique \u0027"},{"line_number":35,"context_line":"                      \u0027constraint at the endpoint table: \"%s\". There might \u0027"},{"line_number":36,"context_line":"                      \u0027be duplicate endpoint entries. Please remove them \u0027"},{"line_number":37,"context_line":"                      \u0027before upgrading.\u0027) % e)"},{"line_number":38,"context_line":"        raise(e)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a5ae5dd_25000aaa","line":35,"range":{"start_line":35,"start_character":34,"end_line":35,"end_character":36},"updated":"2016-02-04 15:00:02.000000000","message":"change to \"on\"","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0be31596827ebd63727165d9f756a3fa04984170","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                                 endpoint_table.c.interface).create()"},{"line_number":33,"context_line":"    except Exception as e:"},{"line_number":34,"context_line":"        LOG.error(_LE(\u0027There was an error when trying to create the unique \u0027"},{"line_number":35,"context_line":"                      \u0027constraint at the endpoint table: \"%s\". There might \u0027"},{"line_number":36,"context_line":"                      \u0027be duplicate endpoint entries. Please remove them \u0027"},{"line_number":37,"context_line":"                      \u0027before upgrading.\u0027) % e)"},{"line_number":38,"context_line":"        raise(e)"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_3f730ce9","line":35,"range":{"start_line":35,"start_character":34,"end_line":35,"end_character":36},"in_reply_to":"5a5ae5dd_25000aaa","updated":"2016-02-18 14:13:53.000000000","message":"Done","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"01e2ea8f7a6f8c20cde845b07bb751b372df6515","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                      \u0027constraint at the endpoint table: \"%s\". There might \u0027"},{"line_number":36,"context_line":"                      \u0027be duplicate endpoint entries. Please remove them \u0027"},{"line_number":37,"context_line":"                      \u0027before upgrading.\u0027) % e)"},{"line_number":38,"context_line":"        raise(e)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a5ae5dd_2546cabf","line":38,"updated":"2016-02-04 15:00:02.000000000","message":"change this to just raise to reraise the exception.","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0be31596827ebd63727165d9f756a3fa04984170","unresolved":false,"context_lines":[{"line_number":35,"context_line":"                      \u0027constraint at the endpoint table: \"%s\". There might \u0027"},{"line_number":36,"context_line":"                      \u0027be duplicate endpoint entries. Please remove them \u0027"},{"line_number":37,"context_line":"                      \u0027before upgrading.\u0027) % e)"},{"line_number":38,"context_line":"        raise(e)"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_da4dce73","line":38,"in_reply_to":"5a5ae5dd_2546cabf","updated":"2016-02-18 14:13:53.000000000","message":"Done","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"}],"keystone/common/sql/migrate_repo/versions/095_add_unique_constraint_endpoint.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"7ccb920bdc3417b33dc0473046956f118ed95c71","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        migrate.UniqueConstraint(endpoint_table.c.service_id,"},{"line_number":33,"context_line":"                                 endpoint_table.c.region_id,"},{"line_number":34,"context_line":"                                 endpoint_table.c.interface).create()"},{"line_number":35,"context_line":"    except db_exception.DBDuplicateEntry as e:"},{"line_number":36,"context_line":"        msg \u003d _(\u0027There was an error when trying to create the unique \u0027"},{"line_number":37,"context_line":"                \u0027constraint on the endpoint table: \"%(exception)s\". \u0027"},{"line_number":38,"context_line":"                \u0027There might be duplicate endpoint entries. Please remove \u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"dab17558_497ee019","line":35,"updated":"2016-05-10 16:44:17.000000000","message":"This is something we need to resolve automatically. This is not something that should be solved here somehow. We should not be asking operators to \"cleanup\" entries. Please come up with a solution to handle this properly.","commit_id":"d131d63fde01ab72b84c46d121701d355c66d648"}],"keystone/tests/unit/common/test_notifications.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5bf6d27ff394562e6bbf1f1a420af1b36c8b495f","unresolved":false,"context_lines":[{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    def test_create_endpoint(self):"},{"line_number":442,"context_line":"        endpoint_ref \u003d self.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":443,"context_line":"                                             interface\u003d\u0027internal\u0027)"},{"line_number":444,"context_line":"        self.catalog_api.create_endpoint(endpoint_ref[\u0027id\u0027], endpoint_ref)"},{"line_number":445,"context_line":"        self._assert_notify_sent(endpoint_ref[\u0027id\u0027], CREATED_OPERATION,"},{"line_number":446,"context_line":"                                 \u0027endpoint\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a2ca52d_13804cf4","line":443,"updated":"2015-10-16 19:03:58.000000000","message":"change new_endpoint_ref to have a default interface rather than having to change all the tests to include unnecessary information.\n\nAlso, shouldn\u0027t \u0027public\u0027 be the default interface?","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"16a69b3f45569c84b67c4bac1221acc60e84dc4b","unresolved":false,"context_lines":[{"line_number":440,"context_line":""},{"line_number":441,"context_line":"    def test_create_endpoint(self):"},{"line_number":442,"context_line":"        endpoint_ref \u003d self.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":443,"context_line":"                                             interface\u003d\u0027internal\u0027)"},{"line_number":444,"context_line":"        self.catalog_api.create_endpoint(endpoint_ref[\u0027id\u0027], endpoint_ref)"},{"line_number":445,"context_line":"        self._assert_notify_sent(endpoint_ref[\u0027id\u0027], CREATED_OPERATION,"},{"line_number":446,"context_line":"                                 \u0027endpoint\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_45d43846","line":443,"in_reply_to":"5a2ca52d_13804cf4","updated":"2015-10-19 20:43:23.000000000","message":"public is the default interface. We set it to internal, since there already is a public one","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9c0afd85169031168b85ccea17220b1a19214472","unresolved":false,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def test_create_endpoint(self):"},{"line_number":440,"context_line":"        endpoint_ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":441,"context_line":"                                             interface\u003d\u0027internal\u0027,"},{"line_number":442,"context_line":"                                             region_id\u003dself.region_id)"},{"line_number":443,"context_line":"        self.catalog_api.create_endpoint(endpoint_ref[\u0027id\u0027], endpoint_ref)"},{"line_number":444,"context_line":"        self._assert_notify_sent(endpoint_ref[\u0027id\u0027], CREATED_OPERATION,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_478b481f","line":441,"range":{"start_line":441,"start_character":55,"end_line":441,"end_character":64},"updated":"2016-01-06 20:09:09.000000000","message":"why do these need to change?","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def test_create_endpoint(self):"},{"line_number":440,"context_line":"        endpoint_ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":441,"context_line":"                                             interface\u003d\u0027internal\u0027,"},{"line_number":442,"context_line":"                                             region_id\u003dself.region_id)"},{"line_number":443,"context_line":"        self.catalog_api.create_endpoint(endpoint_ref[\u0027id\u0027], endpoint_ref)"},{"line_number":444,"context_line":"        self._assert_notify_sent(endpoint_ref[\u0027id\u0027], CREATED_OPERATION,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_a47957fe","line":441,"range":{"start_line":441,"start_character":55,"end_line":441,"end_character":64},"in_reply_to":"fa69d971_049d1159","updated":"2016-01-11 20:02:23.000000000","message":"they need to change because they create duplicate endpoints, and they were broken by the new constraint.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"58fe998aeb0cdc28c340592f8913dec0362a5f00","unresolved":false,"context_lines":[{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def test_create_endpoint(self):"},{"line_number":440,"context_line":"        endpoint_ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":441,"context_line":"                                             interface\u003d\u0027internal\u0027,"},{"line_number":442,"context_line":"                                             region_id\u003dself.region_id)"},{"line_number":443,"context_line":"        self.catalog_api.create_endpoint(endpoint_ref[\u0027id\u0027], endpoint_ref)"},{"line_number":444,"context_line":"        self._assert_notify_sent(endpoint_ref[\u0027id\u0027], CREATED_OPERATION,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_049d1159","line":441,"range":{"start_line":441,"start_character":55,"end_line":441,"end_character":64},"in_reply_to":"fa69d971_478b481f","updated":"2016-01-07 21:35:06.000000000","message":"Seems like if the changes are needed they should be in a different commit.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"e8e69a6ff3f0fa75e5108140881a437dbadc75a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"9aed3d3a_7cd6d528","updated":"2016-03-01 03:51:10.000000000","message":"why did these change?\n\nedit -- ah, they were \u0027public\u0027 by default in new_endpoint_ref..","commit_id":"ea6559b9d47903944b552b871d3243bdff17ad17"}],"keystone/tests/unit/core.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"01e2ea8f7a6f8c20cde845b07bb751b372df6515","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        \u0027description\u0027: uuid.uuid4().hex,"},{"line_number":274,"context_line":"        \u0027interface\u0027: interface,"},{"line_number":275,"context_line":"        \u0027service_id\u0027: service_id,"},{"line_number":276,"context_line":"        \u0027enabled\u0027: True,"},{"line_number":277,"context_line":"        \u0027url\u0027: \u0027https://\u0027 + uuid.uuid4().hex + \u0027.com\u0027,"},{"line_number":278,"context_line":"    }"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5a5ae5dd_c0d1e458","line":276,"updated":"2016-02-04 15:00:02.000000000","message":"what about adding a unique constraint requires changing this? This should be explained in the commit message if it\u0027s really necessary.","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0be31596827ebd63727165d9f756a3fa04984170","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        \u0027description\u0027: uuid.uuid4().hex,"},{"line_number":274,"context_line":"        \u0027interface\u0027: interface,"},{"line_number":275,"context_line":"        \u0027service_id\u0027: service_id,"},{"line_number":276,"context_line":"        \u0027enabled\u0027: True,"},{"line_number":277,"context_line":"        \u0027url\u0027: \u0027https://\u0027 + uuid.uuid4().hex + \u0027.com\u0027,"},{"line_number":278,"context_line":"    }"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_280b4f25","line":276,"in_reply_to":"5a5ae5dd_c0d1e458","updated":"2016-02-18 14:13:53.000000000","message":"Done","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d9a735fa0446c57b895b9f3412f0876f5b7a7765","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        \u0027description\u0027: uuid.uuid4().hex,"},{"line_number":274,"context_line":"        \u0027interface\u0027: interface,"},{"line_number":275,"context_line":"        \u0027service_id\u0027: service_id,"},{"line_number":276,"context_line":"        \u0027enabled\u0027: True,"},{"line_number":277,"context_line":"        \u0027url\u0027: \u0027https://\u0027 + uuid.uuid4().hex + \u0027.com\u0027,"},{"line_number":278,"context_line":"    }"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7af24918_99aa8c6f","line":276,"range":{"start_line":276,"start_character":8,"end_line":276,"end_character":24},"updated":"2016-03-01 13:47:28.000000000","message":"looks unrelated to me","commit_id":"e6041084ee3bc6a2c884179495ddbd1fa34abaaf"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"3a97559e8517291fb83cf3ad53d9c18d667e958c","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        \u0027description\u0027: uuid.uuid4().hex,"},{"line_number":274,"context_line":"        \u0027interface\u0027: interface,"},{"line_number":275,"context_line":"        \u0027service_id\u0027: service_id,"},{"line_number":276,"context_line":"        \u0027enabled\u0027: True,"},{"line_number":277,"context_line":"        \u0027url\u0027: \u0027https://\u0027 + uuid.uuid4().hex + \u0027.com\u0027,"},{"line_number":278,"context_line":"    }"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7af24918_1d7936fd","line":276,"range":{"start_line":276,"start_character":8,"end_line":276,"end_character":24},"in_reply_to":"7af24918_99aa8c6f","updated":"2016-03-01 17:31:05.000000000","message":"it\u0027s not unrelated, we explained on the commit message.","commit_id":"e6041084ee3bc6a2c884179495ddbd1fa34abaaf"}],"keystone/tests/unit/test_associate_project_endpoint_extension.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9c0afd85169031168b85ccea17220b1a19214472","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: endpoint_ref})"},{"line_number":553,"context_line":"            return r.result[\u0027endpoint\u0027][\u0027id\u0027]"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        new_service_ref \u003d unit.new_service_ref()"},{"line_number":556,"context_line":"        response \u003d self.post(\u0027/services\u0027, body\u003d{\u0027service\u0027: new_service_ref})"},{"line_number":557,"context_line":"        new_service_id \u003d response.result[\u0027service\u0027][\u0027id\u0027]"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        # create three endpoints"},{"line_number":560,"context_line":"        endpoint_id1 \u003d _create_an_endpoint(\u0027internal\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_07347047","line":557,"range":{"start_line":555,"start_character":8,"end_line":557,"end_character":57},"updated":"2016-01-06 20:09:09.000000000","message":"this service doesn\u0027t seem to be effecting the outcome of the test, right? Before the test passed without having this service, now we need it?","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"2458727e1411d66b31fdcf275db957226d2ee798","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: endpoint_ref})"},{"line_number":553,"context_line":"            return r.result[\u0027endpoint\u0027][\u0027id\u0027]"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        new_service_ref \u003d unit.new_service_ref()"},{"line_number":556,"context_line":"        response \u003d self.post(\u0027/services\u0027, body\u003d{\u0027service\u0027: new_service_ref})"},{"line_number":557,"context_line":"        new_service_id \u003d response.result[\u0027service\u0027][\u0027id\u0027]"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        # create three endpoints"},{"line_number":560,"context_line":"        endpoint_id1 \u003d _create_an_endpoint(\u0027internal\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9a68dd71_92422b67","line":557,"range":{"start_line":555,"start_character":8,"end_line":557,"end_character":57},"in_reply_to":"ba63e191_c248668a","updated":"2016-01-22 18:42:02.000000000","message":"I think that we don\u0027t have a good answer for that question... the test already create this 3 endpoints, and we didn\u0027t change that behavior.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: endpoint_ref})"},{"line_number":553,"context_line":"            return r.result[\u0027endpoint\u0027][\u0027id\u0027]"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        new_service_ref \u003d unit.new_service_ref()"},{"line_number":556,"context_line":"        response \u003d self.post(\u0027/services\u0027, body\u003d{\u0027service\u0027: new_service_ref})"},{"line_number":557,"context_line":"        new_service_id \u003d response.result[\u0027service\u0027][\u0027id\u0027]"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        # create three endpoints"},{"line_number":560,"context_line":"        endpoint_id1 \u003d _create_an_endpoint(\u0027internal\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_e4e50fa8","line":557,"range":{"start_line":555,"start_character":8,"end_line":557,"end_character":57},"in_reply_to":"fa69d971_04ebd1b1","updated":"2016-01-11 20:02:23.000000000","message":"that\u0027s because this test is supposed to create 3 endpoints, and with the constraint, we cannot have more than 3 endpoints for service in a region.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"58fe998aeb0cdc28c340592f8913dec0362a5f00","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: endpoint_ref})"},{"line_number":553,"context_line":"            return r.result[\u0027endpoint\u0027][\u0027id\u0027]"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        new_service_ref \u003d unit.new_service_ref()"},{"line_number":556,"context_line":"        response \u003d self.post(\u0027/services\u0027, body\u003d{\u0027service\u0027: new_service_ref})"},{"line_number":557,"context_line":"        new_service_id \u003d response.result[\u0027service\u0027][\u0027id\u0027]"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        # create three endpoints"},{"line_number":560,"context_line":"        endpoint_id1 \u003d _create_an_endpoint(\u0027internal\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_04ebd1b1","line":557,"range":{"start_line":555,"start_character":8,"end_line":557,"end_character":57},"in_reply_to":"fa69d971_07347047","updated":"2016-01-07 21:35:06.000000000","message":"This seems like it may go along with the interface changes in the previous file.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"f366665d12f8e6b686f587e32683a6c332b1f8a7","unresolved":false,"context_lines":[{"line_number":552,"context_line":"            r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: endpoint_ref})"},{"line_number":553,"context_line":"            return r.result[\u0027endpoint\u0027][\u0027id\u0027]"},{"line_number":554,"context_line":""},{"line_number":555,"context_line":"        new_service_ref \u003d unit.new_service_ref()"},{"line_number":556,"context_line":"        response \u003d self.post(\u0027/services\u0027, body\u003d{\u0027service\u0027: new_service_ref})"},{"line_number":557,"context_line":"        new_service_id \u003d response.result[\u0027service\u0027][\u0027id\u0027]"},{"line_number":558,"context_line":""},{"line_number":559,"context_line":"        # create three endpoints"},{"line_number":560,"context_line":"        endpoint_id1 \u003d _create_an_endpoint(\u0027internal\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba63e191_c248668a","line":557,"range":{"start_line":555,"start_character":8,"end_line":557,"end_character":57},"in_reply_to":"fa69d971_e4e50fa8","updated":"2016-01-18 18:50:44.000000000","message":"Why is it creating three? If I delete that they the test still works fine.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"}],"keystone/tests/unit/test_backend_sql.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"01e2ea8f7a6f8c20cde845b07bb751b372df6515","unresolved":false,"context_lines":[{"line_number":602,"context_line":"                          self.catalog_api.delete_region,"},{"line_number":603,"context_line":"                          region[\u0027id\u0027])"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def test_create_endpoint_with_duplicate_entry(self):"},{"line_number":606,"context_line":"        service_ref \u003d unit.new_service_ref()"},{"line_number":607,"context_line":"        self.catalog_api.create_service(service_ref[\u0027id\u0027], service_ref)"},{"line_number":608,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"5a5ae5dd_c02d6447","line":605,"updated":"2016-02-04 15:00:02.000000000","message":"this should be in test_backend.CatalogTests so that the behavior is forced on all the backend implementations.","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0be31596827ebd63727165d9f756a3fa04984170","unresolved":false,"context_lines":[{"line_number":602,"context_line":"                          self.catalog_api.delete_region,"},{"line_number":603,"context_line":"                          region[\u0027id\u0027])"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def test_create_endpoint_with_duplicate_entry(self):"},{"line_number":606,"context_line":"        service_ref \u003d unit.new_service_ref()"},{"line_number":607,"context_line":"        self.catalog_api.create_service(service_ref[\u0027id\u0027], service_ref)"},{"line_number":608,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_08292b8a","line":605,"in_reply_to":"5a5ae5dd_c02d6447","updated":"2016-02-18 14:13:53.000000000","message":"Done","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"81c8f57cc845e52881a5754bca3c90c49c707706","unresolved":false,"context_lines":[{"line_number":553,"context_line":"            self.assertFalse(self._does_index_exist(\u0027assignment\u0027,"},{"line_number":554,"context_line":"                                                    \u0027assignment_role_id_fkey\u0027))"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"    def test_unique_contraint_endpoint(self):"},{"line_number":557,"context_line":"        self.upgrade(73)"},{"line_number":558,"context_line":"        service_id \u003d uuid.uuid4().hex"},{"line_number":559,"context_line":"        interface \u003d uuid.uuid4().hex[:8]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_fde948b8","line":556,"updated":"2015-10-04 01:24:11.000000000","message":"s/contraint/constraint","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"75d9d882b3b8814a31aa235a51d520776167fc15","unresolved":false,"context_lines":[{"line_number":553,"context_line":"            self.assertFalse(self._does_index_exist(\u0027assignment\u0027,"},{"line_number":554,"context_line":"                                                    \u0027assignment_role_id_fkey\u0027))"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"    def test_unique_contraint_endpoint(self):"},{"line_number":557,"context_line":"        self.upgrade(73)"},{"line_number":558,"context_line":"        service_id \u003d uuid.uuid4().hex"},{"line_number":559,"context_line":"        interface \u003d uuid.uuid4().hex[:8]"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_7a8e437a","line":556,"in_reply_to":"9a1a9d01_fde948b8","updated":"2015-10-16 14:43:19.000000000","message":"Done","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"81c8f57cc845e52881a5754bca3c90c49c707706","unresolved":false,"context_lines":[{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        session.close()"},{"line_number":589,"context_line":"        session \u003d self.Session()"},{"line_number":590,"context_line":"        self.metadata.clear()"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":593,"context_line":"                            with_pass_enab_domain\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_bdcc3062","line":590,"updated":"2015-10-04 01:24:11.000000000","message":"tearDown already close all the sessions. Also, why are we instantiating the the session again? I believe we don\u0027t need these 3 lines at all.","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"75d9d882b3b8814a31aa235a51d520776167fc15","unresolved":false,"context_lines":[{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        session.close()"},{"line_number":589,"context_line":"        session \u003d self.Session()"},{"line_number":590,"context_line":"        self.metadata.clear()"},{"line_number":591,"context_line":""},{"line_number":592,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":593,"context_line":"                            with_pass_enab_domain\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_9ae23f2e","line":590,"in_reply_to":"9a1a9d01_bdcc3062","updated":"2015-10-16 14:43:19.000000000","message":"Done","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7cdc2e79c909a808b81cc068f54f240fc3a8fb76","unresolved":false,"context_lines":[{"line_number":667,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"        self.assertRaises("},{"line_number":670,"context_line":"            db_exception.DBDuplicateEntry,"},{"line_number":671,"context_line":"            self.insert_dict,"},{"line_number":672,"context_line":"            session,"},{"line_number":673,"context_line":"            \u0027endpoint\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a26ad4f_f52a0be7","line":670,"updated":"2015-10-27 14:16:29.000000000","message":"The testcase is not clear enough.\n\nsuppose only interface+service_id are all we had for UniqueConstraint, this testcase will still pass.\n\nThere need some testcases to test that interface+service_id+url+region_id are UniqueConstraint, for example, you can create two recodes which has the same interface, service_id, url, but it will raise DBDuplicateEntry if region_id is also the same.","commit_id":"19fc0996dfa1b58eeb986d227b5a6e2f37d01763"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"45f661d9ac0a35c435e6bfae5bd00f63dd7b44ee","unresolved":false,"context_lines":[{"line_number":667,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":668,"context_line":""},{"line_number":669,"context_line":"        self.assertRaises("},{"line_number":670,"context_line":"            db_exception.DBDuplicateEntry,"},{"line_number":671,"context_line":"            self.insert_dict,"},{"line_number":672,"context_line":"            session,"},{"line_number":673,"context_line":"            \u0027endpoint\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa80f949_47cbe91e","line":670,"in_reply_to":"1a26ad4f_f52a0be7","updated":"2015-11-04 20:17:22.000000000","message":"Done","commit_id":"19fc0996dfa1b58eeb986d227b5a6e2f37d01763"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a74189780ebc390e117381cef6d7e16cfa56e297","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        self.upgrade(83)"},{"line_number":688,"context_line":"        # After the migration it is not"},{"line_number":689,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":10,"id":"fa80f949_72ca6270","line":688,"updated":"2015-11-05 03:32:49.000000000","message":"not for what? add some code before here to show it\u0027s possible to create two endpoints which has the same reference data except \u0027id\u0027.","commit_id":"38cfcd3b08e3498cd23851e702aa1f631bfc814b"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"12ef7d344604b2736c6a97f2032c1544b945dd64","unresolved":false,"context_lines":[{"line_number":685,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"},{"line_number":686,"context_line":""},{"line_number":687,"context_line":"        self.upgrade(83)"},{"line_number":688,"context_line":"        # After the migration it is not"},{"line_number":689,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":690,"context_line":""},{"line_number":691,"context_line":"        self.assertRaises("}],"source_content_type":"text/x-python","patch_set":10,"id":"fa80f949_6f134d67","line":688,"in_reply_to":"fa80f949_72ca6270","updated":"2015-11-05 11:39:19.000000000","message":"Done","commit_id":"38cfcd3b08e3498cd23851e702aa1f631bfc814b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a74189780ebc390e117381cef6d7e16cfa56e297","unresolved":false,"context_lines":[{"line_number":696,"context_line":"            endpoint)"},{"line_number":697,"context_line":""},{"line_number":698,"context_line":"        original_dict \u003d copy.deepcopy(endpoint)"},{"line_number":699,"context_line":"        # Insertion is allowed if any of the attributes is changed"},{"line_number":700,"context_line":"        endpoint[\u0027interface\u0027] \u003d uuid.uuid4().hex"},{"line_number":701,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":702,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa80f949_d28f8e21","line":699,"updated":"2015-11-05 03:32:49.000000000","message":"Nice! Happy to see this update.","commit_id":"38cfcd3b08e3498cd23851e702aa1f631bfc814b"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"a74189780ebc390e117381cef6d7e16cfa56e297","unresolved":false,"context_lines":[{"line_number":733,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        self.assertRaises(db_exception.DBDuplicateEntry,"},{"line_number":736,"context_line":"                          self.upgrade,"},{"line_number":737,"context_line":"                          83)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa80f949_52f95e7f","line":736,"updated":"2015-11-05 03:32:49.000000000","message":"I am still want to raise the question here, how it will be if the existing deployment already has those kind of duplicated endpoints?\n\nIn the current IMPL, it will fail to upgrade, right? you are expecting end user should clean the DB manually, cannot this be done in the migration code?","commit_id":"38cfcd3b08e3498cd23851e702aa1f631bfc814b"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"12ef7d344604b2736c6a97f2032c1544b945dd64","unresolved":false,"context_lines":[{"line_number":733,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        self.assertRaises(db_exception.DBDuplicateEntry,"},{"line_number":736,"context_line":"                          self.upgrade,"},{"line_number":737,"context_line":"                          83)"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa80f949_af19358a","line":736,"in_reply_to":"fa80f949_52f95e7f","updated":"2015-11-05 11:39:19.000000000","message":"it is not trivial to remove these duplicates. As discussed with bknudson in previous patchsets, we should only raise an error if it fails.","commit_id":"38cfcd3b08e3498cd23851e702aa1f631bfc814b"},{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"58fe998aeb0cdc28c340592f8913dec0362a5f00","unresolved":false,"context_lines":[{"line_number":839,"context_line":"            \u0027endpoint\u0027,"},{"line_number":840,"context_line":"            endpoint)"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"        original_dict \u003d copy.deepcopy(endpoint)"},{"line_number":843,"context_line":"        # Insertion is allowed if any of the attributes is changed"},{"line_number":844,"context_line":"        endpoint[\u0027interface\u0027] \u003d uuid.uuid4().hex"},{"line_number":845,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_844581b4","line":842,"updated":"2016-01-07 21:35:06.000000000","message":"Is a deepcopy needed?","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":839,"context_line":"            \u0027endpoint\u0027,"},{"line_number":840,"context_line":"            endpoint)"},{"line_number":841,"context_line":""},{"line_number":842,"context_line":"        original_dict \u003d copy.deepcopy(endpoint)"},{"line_number":843,"context_line":"        # Insertion is allowed if any of the attributes is changed"},{"line_number":844,"context_line":"        endpoint[\u0027interface\u0027] \u003d uuid.uuid4().hex"},{"line_number":845,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_7a708c40","line":842,"in_reply_to":"fa69d971_844581b4","updated":"2016-01-11 20:02:23.000000000","message":"no... removed","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"01e2ea8f7a6f8c20cde845b07bb751b372df6515","unresolved":false,"context_lines":[{"line_number":847,"context_line":"            endpoint)"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        original_dict \u003d copy.copy(endpoint)"},{"line_number":850,"context_line":"        # Insertion is allowed if any of the attributes is changed"},{"line_number":851,"context_line":"        endpoint[\u0027interface\u0027] \u003d uuid.uuid4().hex"},{"line_number":852,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":853,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a5ae5dd_a0862811","line":850,"range":{"start_line":850,"start_character":38,"end_line":850,"end_character":55},"updated":"2016-02-04 15:00:02.000000000","message":"suggest change to \"attribute\"","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0be31596827ebd63727165d9f756a3fa04984170","unresolved":false,"context_lines":[{"line_number":847,"context_line":"            endpoint)"},{"line_number":848,"context_line":""},{"line_number":849,"context_line":"        original_dict \u003d copy.copy(endpoint)"},{"line_number":850,"context_line":"        # Insertion is allowed if any of the attributes is changed"},{"line_number":851,"context_line":"        endpoint[\u0027interface\u0027] \u003d uuid.uuid4().hex"},{"line_number":852,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":853,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_ba9e0ab6","line":850,"range":{"start_line":850,"start_character":38,"end_line":850,"end_character":55},"in_reply_to":"5a5ae5dd_a0862811","updated":"2016-02-18 14:13:53.000000000","message":"Done","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"01e2ea8f7a6f8c20cde845b07bb751b372df6515","unresolved":false,"context_lines":[{"line_number":877,"context_line":""},{"line_number":878,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":879,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"},{"line_number":880,"context_line":""},{"line_number":881,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":882,"context_line":"                            with_pass_enab_domain\u003dFalse):"},{"line_number":883,"context_line":"        # Populate the appropriate fields in the user"}],"source_content_type":"text/x-python","patch_set":16,"id":"5a5ae5dd_c0900446","line":880,"updated":"2016-02-04 15:00:02.000000000","message":"There should also be a test that shows that an error is logged if the database before the migration contains duplicate endpoints.","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"0be31596827ebd63727165d9f756a3fa04984170","unresolved":false,"context_lines":[{"line_number":877,"context_line":""},{"line_number":878,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":879,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"},{"line_number":880,"context_line":""},{"line_number":881,"context_line":"    def populate_user_table(self, with_pass_enab\u003dFalse,"},{"line_number":882,"context_line":"                            with_pass_enab_domain\u003dFalse):"},{"line_number":883,"context_line":"        # Populate the appropriate fields in the user"}],"source_content_type":"text/x-python","patch_set":16,"id":"dae33548_0ed65327","line":880,"in_reply_to":"5a5ae5dd_c0900446","updated":"2016-02-18 14:13:53.000000000","message":"We tried to made this test in the previous patch set but it doesn\u0027t work on python3 as you can see here: https://review.openstack.org/#/c/134095/15..16/keystone/tests/unit/test_sql_upgrade.py\n\nIf you know how to fix it, I appreciate that.","commit_id":"a817811db2ee071cc13da4e94931d637fc927b55"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d9a735fa0446c57b895b9f3412f0876f5b7a7765","unresolved":false,"context_lines":[{"line_number":994,"context_line":""},{"line_number":995,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":996,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"},{"line_number":997,"context_line":""},{"line_number":998,"context_line":""},{"line_number":999,"context_line":"class VersionTests(SqlMigrateBase):"},{"line_number":1000,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7af24918_596ac41b","line":997,"updated":"2016-03-01 13:47:28.000000000","message":"something seems to be missing here","commit_id":"e6041084ee3bc6a2c884179495ddbd1fa34abaaf"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"3a97559e8517291fb83cf3ad53d9c18d667e958c","unresolved":false,"context_lines":[{"line_number":994,"context_line":""},{"line_number":995,"context_line":"        endpoint[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":996,"context_line":"        self.insert_dict(session, \u0027endpoint\u0027, endpoint)"},{"line_number":997,"context_line":""},{"line_number":998,"context_line":""},{"line_number":999,"context_line":"class VersionTests(SqlMigrateBase):"},{"line_number":1000,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7af24918_5dd1fecc","line":997,"in_reply_to":"7af24918_596ac41b","updated":"2016-03-01 17:31:05.000000000","message":"I added a test raising a conflict on this case.","commit_id":"e6041084ee3bc6a2c884179495ddbd1fa34abaaf"}],"keystone/tests/unit/test_v3_catalog.py":[{"author":{"_account_id":7725,"name":"David Stanek","email":"dstanek@dstanek.com","username":"dstanek"},"change_message_id":"e35c1dcb5a4bd293642a19c2f5372d26bd15d961","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        r \u003d self.post("},{"line_number":473,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":474,"context_line":"            body\u003d{\u0027endpoint\u0027: other_ref},"},{"line_number":475,"context_line":"            expected_status\u003d500)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def test_create_endpoint_enabled_str_false(self):"},{"line_number":478,"context_line":"        \"\"\"Call ``POST /endpoints`` with enabled: \u0027False\u0027.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_8f4648be","line":475,"updated":"2015-05-29 21:43:35.000000000","message":"I don\u0027t think this should be a server error. It should be some sort of 4XX. Probably a validation error.","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"81c8f57cc845e52881a5754bca3c90c49c707706","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        r \u003d self.post("},{"line_number":473,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":474,"context_line":"            body\u003d{\u0027endpoint\u0027: other_ref},"},{"line_number":475,"context_line":"            expected_status\u003d500)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def test_create_endpoint_enabled_str_false(self):"},{"line_number":478,"context_line":"        \"\"\"Call ``POST /endpoints`` with enabled: \u0027False\u0027.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a1a9d01_1d043c7c","line":475,"in_reply_to":"7a016987_8f4648be","updated":"2015-10-04 01:24:11.000000000","message":"++ Yeah, should be the same for any other duplicated entry.","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"9d08c7c6e32b5b979100cc811dd4b6d06e46a852","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        r \u003d self.post("},{"line_number":473,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":474,"context_line":"            body\u003d{\u0027endpoint\u0027: other_ref},"},{"line_number":475,"context_line":"            expected_status\u003d500)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def test_create_endpoint_enabled_str_false(self):"},{"line_number":478,"context_line":"        \"\"\"Call ``POST /endpoints`` with enabled: \u0027False\u0027.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_852179a0","line":475,"in_reply_to":"7a016987_8f4648be","updated":"2015-05-31 09:34:36.000000000","message":"You\u0027re right, I\u0027ll fix this.","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"75d9d882b3b8814a31aa235a51d520776167fc15","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        r \u003d self.post("},{"line_number":473,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":474,"context_line":"            body\u003d{\u0027endpoint\u0027: other_ref},"},{"line_number":475,"context_line":"            expected_status\u003d500)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def test_create_endpoint_enabled_str_false(self):"},{"line_number":478,"context_line":"        \"\"\"Call ``POST /endpoints`` with enabled: \u0027False\u0027.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5a2ca52d_ba7e1b17","line":475,"in_reply_to":"9a1a9d01_1d043c7c","updated":"2015-10-16 14:43:19.000000000","message":"Done","commit_id":"aa211104e66b1d2079bf0a4d7e7b2ae8b3822824"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9d3a02b0e39824113aef760540a9c296fe4b6744","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        ref \u003d self.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":539,"context_line":"                                    interface\u003d\u0027internal\u0027,"},{"line_number":540,"context_line":"                                    enabled\u003dTrue)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"        r \u003d self.post("},{"line_number":543,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":544,"context_line":"            body\u003d{\u0027endpoint\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a2ca52d_ad66d54e","line":541,"updated":"2015-10-16 18:24:06.000000000","message":"unrelated whitespace change?","commit_id":"e63fb1586e5ac6aea880c9224dd82456130d2a27"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"26747181e038f417b8133573e6e99b9ca885af72","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        ref \u003d self.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":539,"context_line":"                                    interface\u003d\u0027internal\u0027,"},{"line_number":540,"context_line":"                                    enabled\u003dTrue)"},{"line_number":541,"context_line":""},{"line_number":542,"context_line":"        r \u003d self.post("},{"line_number":543,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":544,"context_line":"            body\u003d{\u0027endpoint\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a2ca52d_9008d2db","line":541,"in_reply_to":"5a2ca52d_ad66d54e","updated":"2015-10-16 18:36:59.000000000","message":"Done","commit_id":"e63fb1586e5ac6aea880c9224dd82456130d2a27"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9d3a02b0e39824113aef760540a9c296fe4b6744","unresolved":false,"context_lines":[{"line_number":570,"context_line":"                                    interface\u003d\"internal\","},{"line_number":571,"context_line":"                                    url\u003d\u0027https://123.com\u0027,"},{"line_number":572,"context_line":"                                    enabled\u003dTrue)"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"        r \u003d self.post("},{"line_number":575,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":576,"context_line":"            body\u003d{\u0027endpoint\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a2ca52d_ed484db5","line":573,"updated":"2015-10-16 18:24:06.000000000","message":"nit: remove this line to be consistent with similar tests.","commit_id":"e63fb1586e5ac6aea880c9224dd82456130d2a27"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"26747181e038f417b8133573e6e99b9ca885af72","unresolved":false,"context_lines":[{"line_number":570,"context_line":"                                    interface\u003d\"internal\","},{"line_number":571,"context_line":"                                    url\u003d\u0027https://123.com\u0027,"},{"line_number":572,"context_line":"                                    enabled\u003dTrue)"},{"line_number":573,"context_line":""},{"line_number":574,"context_line":"        r \u003d self.post("},{"line_number":575,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":576,"context_line":"            body\u003d{\u0027endpoint\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a2ca52d_d06baa83","line":573,"in_reply_to":"5a2ca52d_ed484db5","updated":"2015-10-16 18:36:59.000000000","message":"Done","commit_id":"e63fb1586e5ac6aea880c9224dd82456130d2a27"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"9d3a02b0e39824113aef760540a9c296fe4b6744","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        other_ref \u003d self.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":580,"context_line":"                                          region_id\u003dself.region_id,"},{"line_number":581,"context_line":"                                          interface\u003d\"internal\","},{"line_number":582,"context_line":"                                          url\u003d\u0027https://123.com\u0027,"},{"line_number":583,"context_line":"                                          enabled\u003dTrue)"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        r \u003d self.post("}],"source_content_type":"text/x-python","patch_set":5,"id":"5a2ca52d_6dd3ddd5","line":582,"updated":"2015-10-16 18:24:06.000000000","message":"can we use something like \n\n    url\u003d\u0027https://example.com\u0027\n\n?","commit_id":"e63fb1586e5ac6aea880c9224dd82456130d2a27"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"26747181e038f417b8133573e6e99b9ca885af72","unresolved":false,"context_lines":[{"line_number":579,"context_line":"        other_ref \u003d self.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":580,"context_line":"                                          region_id\u003dself.region_id,"},{"line_number":581,"context_line":"                                          interface\u003d\"internal\","},{"line_number":582,"context_line":"                                          url\u003d\u0027https://123.com\u0027,"},{"line_number":583,"context_line":"                                          enabled\u003dTrue)"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        r \u003d self.post("}],"source_content_type":"text/x-python","patch_set":5,"id":"5a2ca52d_f066e6b9","line":582,"in_reply_to":"5a2ca52d_6dd3ddd5","updated":"2015-10-16 18:36:59.000000000","message":"Done","commit_id":"e63fb1586e5ac6aea880c9224dd82456130d2a27"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5bf6d27ff394562e6bbf1f1a420af1b36c8b495f","unresolved":false,"context_lines":[{"line_number":566,"context_line":"        \"\"\"Call ``POST /endpoints``.\"\"\""},{"line_number":567,"context_line":"        ref \u003d self.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":568,"context_line":"                                    region_id\u003dself.region_id,"},{"line_number":569,"context_line":"                                    interface\u003d\"internal\","},{"line_number":570,"context_line":"                                    url\u003d\u0027https://example.com\u0027,"},{"line_number":571,"context_line":"                                    enabled\u003dTrue)"},{"line_number":572,"context_line":"        r \u003d self.post("}],"source_content_type":"text/x-python","patch_set":6,"id":"5a2ca52d_b3e398d8","line":569,"updated":"2015-10-16 19:03:58.000000000","message":"use \u0027 for strings for consistency.","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"16a69b3f45569c84b67c4bac1221acc60e84dc4b","unresolved":false,"context_lines":[{"line_number":566,"context_line":"        \"\"\"Call ``POST /endpoints``.\"\"\""},{"line_number":567,"context_line":"        ref \u003d self.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":568,"context_line":"                                    region_id\u003dself.region_id,"},{"line_number":569,"context_line":"                                    interface\u003d\"internal\","},{"line_number":570,"context_line":"                                    url\u003d\u0027https://example.com\u0027,"},{"line_number":571,"context_line":"                                    enabled\u003dTrue)"},{"line_number":572,"context_line":"        r \u003d self.post("}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_a5c50c8f","line":569,"in_reply_to":"5a2ca52d_b3e398d8","updated":"2015-10-19 20:43:23.000000000","message":"Done","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"5bf6d27ff394562e6bbf1f1a420af1b36c8b495f","unresolved":false,"context_lines":[{"line_number":583,"context_line":"        r \u003d self.post("},{"line_number":584,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":585,"context_line":"            body\u003d{\u0027endpoint\u0027: other_ref},"},{"line_number":586,"context_line":"            expected_status\u003d400)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def test_create_endpoint_enabled_str_false(self):"},{"line_number":589,"context_line":"        \"\"\"Call ``POST /endpoints`` with enabled: \u0027False\u0027.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"5a2ca52d_13ce0c63","line":586,"updated":"2015-10-16 19:03:58.000000000","message":"use http_client.BAD_REQUEST for consistency.","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"16a69b3f45569c84b67c4bac1221acc60e84dc4b","unresolved":false,"context_lines":[{"line_number":583,"context_line":"        r \u003d self.post("},{"line_number":584,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":585,"context_line":"            body\u003d{\u0027endpoint\u0027: other_ref},"},{"line_number":586,"context_line":"            expected_status\u003d400)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def test_create_endpoint_enabled_str_false(self):"},{"line_number":589,"context_line":"        \"\"\"Call ``POST /endpoints`` with enabled: \u0027False\u0027.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a29b11f_c5c0487f","line":586,"in_reply_to":"5a2ca52d_13ce0c63","updated":"2015-10-19 20:43:23.000000000","message":"Done","commit_id":"c1c9d7abb2ab08fd311e9ca76b4ce747dc44b2ce"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"7cdc2e79c909a808b81cc068f54f240fc3a8fb76","unresolved":false,"context_lines":[{"line_number":568,"context_line":"                                    region_id\u003dself.region_id,"},{"line_number":569,"context_line":"                                    interface\u003d\u0027internal\u0027,"},{"line_number":570,"context_line":"                                    url\u003d\u0027https://example.com\u0027,"},{"line_number":571,"context_line":"                                    enabled\u003dTrue)"},{"line_number":572,"context_line":"        r \u003d self.post("},{"line_number":573,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":574,"context_line":"            body\u003d{\u0027endpoint\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a26ad4f_10d0f552","line":571,"updated":"2015-10-27 14:16:29.000000000","message":"same comment here, duplication will only happen when serivice_id + region_id + interface + url.\n\n\nany part of this set (serivice_id + region_id + interface + url) will success instead of raising exception.","commit_id":"19fc0996dfa1b58eeb986d227b5a6e2f37d01763"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"45f661d9ac0a35c435e6bfae5bd00f63dd7b44ee","unresolved":false,"context_lines":[{"line_number":568,"context_line":"                                    region_id\u003dself.region_id,"},{"line_number":569,"context_line":"                                    interface\u003d\u0027internal\u0027,"},{"line_number":570,"context_line":"                                    url\u003d\u0027https://example.com\u0027,"},{"line_number":571,"context_line":"                                    enabled\u003dTrue)"},{"line_number":572,"context_line":"        r \u003d self.post("},{"line_number":573,"context_line":"            \u0027/endpoints\u0027,"},{"line_number":574,"context_line":"            body\u003d{\u0027endpoint\u0027: ref})"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa80f949_c7d7d9bd","line":571,"in_reply_to":"1a26ad4f_10d0f552","updated":"2015-11-04 20:17:22.000000000","message":"done in the sql upgrade file","commit_id":"19fc0996dfa1b58eeb986d227b5a6e2f37d01763"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"9a9f6848c911eff2c0fc7936aef706f5820bdad0","unresolved":false,"context_lines":[{"line_number":511,"context_line":"    def test_create_endpoint_no_enabled(self):"},{"line_number":512,"context_line":"        \"\"\"Call ``POST /endpoints``.\"\"\""},{"line_number":513,"context_line":"        ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":514,"context_line":"                                    interface\u003d\u0027internal\u0027,"},{"line_number":515,"context_line":"                                    region_id\u003dself.region_id)"},{"line_number":516,"context_line":"        r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: ref})"},{"line_number":517,"context_line":"        ref[\u0027enabled\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a710552_ae25f8c2","line":514,"updated":"2015-12-15 06:34:21.000000000","message":"I am curious why we need to change this.","commit_id":"de8de8f936a31820f91c9e46bf94d371528fe9ef"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"2fc3c6b18692724e4f0bdf8799f23180f9c045a1","unresolved":false,"context_lines":[{"line_number":511,"context_line":"    def test_create_endpoint_no_enabled(self):"},{"line_number":512,"context_line":"        \"\"\"Call ``POST /endpoints``.\"\"\""},{"line_number":513,"context_line":"        ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":514,"context_line":"                                    interface\u003d\u0027internal\u0027,"},{"line_number":515,"context_line":"                                    region_id\u003dself.region_id)"},{"line_number":516,"context_line":"        r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: ref})"},{"line_number":517,"context_line":"        ref[\u0027enabled\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":13,"id":"5a710552_8062f1ab","line":514,"in_reply_to":"5a710552_ae25f8c2","updated":"2015-12-16 13:42:23.000000000","message":"Guang, we need this because this call was creating a duplicate endpoint, once there already is an endpoint with this service and wigh the public interface","commit_id":"de8de8f936a31820f91c9e46bf94d371528fe9ef"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"7ac684587601c6068df3a18ed713a7b72acf8d69","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: ref},"},{"line_number":545,"context_line":"                  expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"    def test_create_endpoint_with_duplicate_entry(self):"},{"line_number":548,"context_line":"        \"\"\"Call ``POST /endpoints``.\"\"\""},{"line_number":549,"context_line":"        ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":550,"context_line":"                                    region_id\u003dself.region_id,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_111d6b73","line":547,"updated":"2015-12-29 21:37:35.000000000","message":"this should be in test_backends. We don\u0027t have to go through the whole request stack to validate this behavior.","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"20ba76f914fb9831e51b4a6c3fee26cda96f37f7","unresolved":false,"context_lines":[{"line_number":544,"context_line":"        self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: ref},"},{"line_number":545,"context_line":"                  expected_status\u003dhttp_client.BAD_REQUEST)"},{"line_number":546,"context_line":""},{"line_number":547,"context_line":"    def test_create_endpoint_with_duplicate_entry(self):"},{"line_number":548,"context_line":"        \"\"\"Call ``POST /endpoints``.\"\"\""},{"line_number":549,"context_line":"        ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":550,"context_line":"                                    region_id\u003dself.region_id,"}],"source_content_type":"text/x-python","patch_set":14,"id":"fa69d971_0159e734","line":547,"in_reply_to":"fa69d971_111d6b73","updated":"2016-01-11 20:02:23.000000000","message":"Done","commit_id":"0bbeae7a2829bfbdddcccf23644941627bed75b2"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"d9a735fa0446c57b895b9f3412f0876f5b7a7765","unresolved":false,"context_lines":[{"line_number":511,"context_line":"    def test_create_endpoint_no_enabled(self):"},{"line_number":512,"context_line":"        \"\"\"Call ``POST /endpoints``.\"\"\""},{"line_number":513,"context_line":"        ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":514,"context_line":"                                    interface\u003d\u0027internal\u0027,"},{"line_number":515,"context_line":"                                    region_id\u003dself.region_id)"},{"line_number":516,"context_line":"        r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: ref})"},{"line_number":517,"context_line":"        ref[\u0027enabled\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":20,"id":"7af24918_b94e68bf","line":514,"range":{"start_line":514,"start_character":46,"end_line":514,"end_character":56},"updated":"2016-03-01 13:47:28.000000000","message":"i wonder why changes like this were required","commit_id":"e6041084ee3bc6a2c884179495ddbd1fa34abaaf"},{"author":{"_account_id":8866,"name":"Raildo Mascena de Sousa Filho","email":"rmascena@redhat.com","username":"raildo"},"change_message_id":"3a97559e8517291fb83cf3ad53d9c18d667e958c","unresolved":false,"context_lines":[{"line_number":511,"context_line":"    def test_create_endpoint_no_enabled(self):"},{"line_number":512,"context_line":"        \"\"\"Call ``POST /endpoints``.\"\"\""},{"line_number":513,"context_line":"        ref \u003d unit.new_endpoint_ref(service_id\u003dself.service_id,"},{"line_number":514,"context_line":"                                    interface\u003d\u0027internal\u0027,"},{"line_number":515,"context_line":"                                    region_id\u003dself.region_id)"},{"line_number":516,"context_line":"        r \u003d self.post(\u0027/endpoints\u0027, body\u003d{\u0027endpoint\u0027: ref})"},{"line_number":517,"context_line":"        ref[\u0027enabled\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":20,"id":"7af24918_546569df","line":514,"range":{"start_line":514,"start_character":46,"end_line":514,"end_character":56},"in_reply_to":"7af24918_b94e68bf","updated":"2016-03-01 17:31:05.000000000","message":"because we use \u0027public\u0027 by default in new_endpoint_ref, so if we keep this same interface, the constraint will fail on this tests.","commit_id":"e6041084ee3bc6a2c884179495ddbd1fa34abaaf"}]}
