)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"834c9b658d37aa52612eab515435a388fceb8b58","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch addes two tables called \"registered limit\""},{"line_number":10,"context_line":"and \"limit\" for unified limits feature."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Co-Authore-By: Colleen Murphy\u003ccolleen@gazlene.net\u003e"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I67441454fc17d20e50e6fa7199c07014c97d83f6"},{"line_number":15,"context_line":"bp: unified-limits"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"ff82abbf_b528f396","line":12,"range":{"start_line":12,"start_character":3,"end_line":12,"end_character":10},"updated":"2017-11-27 15:04:17.000000000","message":"Authored*","commit_id":"f16f592d39f891a682cee0d25effab567803b5f5"}],"keystone/common/sql/expand_repo/versions/031_expand_add_limits_tables.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"88abbdbc9bc402927ef2870efe62e98c99d5275f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   sql.ForeignKey(region_table.c.id), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":39,"context_line":"        sql.Column(\u0027default_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027),"},{"line_number":41,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":42,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":43,"context_line":"    registered_limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df87a7cf_006ab718","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":73},"updated":"2017-12-19 20:01:51.000000000","message":"Does the default_limit also have to be in the unique constraint? Is it possible to use a NULL region_id in a unique constraint?","commit_id":"9052590c57be94a986803c15bd1bd91b73d61aaf"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2a9f9bd9f5264cf7f5800d0c420e79270df3afca","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   sql.ForeignKey(region_table.c.id), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":39,"context_line":"        sql.Column(\u0027default_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027),"},{"line_number":41,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":42,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":43,"context_line":"    registered_limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df87a7cf_cfc15756","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":73},"in_reply_to":"df87a7cf_006ab718","updated":"2017-12-20 01:42:00.000000000","message":"1. ``default_limit`` should not be in the unique constraint. If so, there will be a case like:\nNova RegionOne instance 5\nNova RegionOne instance 10\n\nThis is incorrect.\n\n2. NULL could be in a unique constraint, but it has a problem here like:\nSuppose there are two line in tale already.\n\nNova RegionOne instance 5\nNova NULL      instance 10\n\nThen insert a new line \"Nova RegionOne instance 5\", DB will raise duplicated error.\nIf the new line is \"Nova NULL  instance 10\", everything goes well. But it will break our design goal.\n\nSo now I think we should give region_id a default value, such as \u0027\u0027, then the UniqueConstraint( \u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027) will be OK enough.","commit_id":"9052590c57be94a986803c15bd1bd91b73d61aaf"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"3d5d6088ef91c91b31e7a7d2231371579a23e65b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   sql.ForeignKey(region_table.c.id), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":39,"context_line":"        sql.Column(\u0027default_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027),"},{"line_number":41,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":42,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":43,"context_line":"    registered_limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df87a7cf_f5bbce0b","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":73},"in_reply_to":"df87a7cf_cfc15756","updated":"2017-12-20 03:47:28.000000000","message":"Well. The region_id has the foreignKey in region table. So it can\u0027t be \u0027\u0027, I think the only way now is to control it in code logic.","commit_id":"9052590c57be94a986803c15bd1bd91b73d61aaf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"88abbdbc9bc402927ef2870efe62e98c99d5275f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        sql.Column(\u0027region_id\u0027, sql.String(64)),"},{"line_number":54,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":55,"context_line":"        sql.Column(\u0027resource_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":56,"context_line":"        sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027),"},{"line_number":57,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":58,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":59,"context_line":"    limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":11,"id":"df87a7cf_a072eb10","line":56,"range":{"start_line":56,"start_character":8,"end_line":56,"end_character":73},"updated":"2017-12-19 20:01:51.000000000","message":"Same comment here as above.","commit_id":"9052590c57be94a986803c15bd1bd91b73d61aaf"}],"keystone/common/sql/expand_repo/versions/032_expand_add_limits_tables.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d0cbbe797a16d46ba22a4ee264e35b6fdf93fc0f","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   sql.ForeignKey(region_table.c.id), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":39,"context_line":"        sql.Column(\u0027default_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027),"},{"line_number":41,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":42,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":43,"context_line":"    registered_limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_d1e4f9ae","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":73},"updated":"2017-12-26 20:38:08.000000000","message":"This would mean that we could have the following:\n\n  Nova RegionOne cores 10\n  Nova RegionOne cores 20\n\nas two separate limits. Which one is correct?","commit_id":"4b6a0faa82226c0c82edc794f8f8c6a6564acf92"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"86de37d581be0f26198e49731eee2820ba54f3ca","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   sql.ForeignKey(region_table.c.id), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":39,"context_line":"        sql.Column(\u0027default_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027),"},{"line_number":41,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":42,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":43,"context_line":"    registered_limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_871ab37a","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":73},"in_reply_to":"bf8cb3f7_d1e4f9ae","updated":"2017-12-27 01:55:42.000000000","message":"\u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027 is UniqueConstraint. So \"Nova RegionOne cores\" can\u0027t be exist double. I think \"Nova Region cores 20\" can\u0027t be inserted if \"Nova RegionOne cores 10\" exist.\n\nI\u0027ll update the test for your case.","commit_id":"4b6a0faa82226c0c82edc794f8f8c6a6564acf92"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d0cbbe797a16d46ba22a4ee264e35b6fdf93fc0f","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        sql.Column(\u0027region_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":54,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":55,"context_line":"        sql.Column(\u0027resource_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":56,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":57,"context_line":"                             \u0027resource_name\u0027),"},{"line_number":58,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":59,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":60,"context_line":"    limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_d1fdd93a","line":57,"range":{"start_line":56,"start_character":9,"end_line":57,"end_character":46},"updated":"2017-12-26 20:38:08.000000000","message":"Similar comment here, but just with the addition of a project_id\n\n  e3b7a9e42c5648ddbc33c80df325195c Nova us-west cores 10\n  e3b7a9e42c5648ddbc33c80df325195c Nova us-west cores 20\n\nWhich one is correct if the resource limit isn\u0027t a part of the unique constraint?","commit_id":"4b6a0faa82226c0c82edc794f8f8c6a6564acf92"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"86de37d581be0f26198e49731eee2820ba54f3ca","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        sql.Column(\u0027region_id\u0027, sql.String(64), nullable\u003dTrue),"},{"line_number":54,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":55,"context_line":"        sql.Column(\u0027resource_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":56,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027service_id\u0027, \u0027region_id\u0027,"},{"line_number":57,"context_line":"                             \u0027resource_name\u0027),"},{"line_number":58,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":59,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":60,"context_line":"    limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_a71d7774","line":57,"range":{"start_line":56,"start_character":9,"end_line":57,"end_character":46},"in_reply_to":"bf8cb3f7_d1fdd93a","updated":"2017-12-27 01:55:42.000000000","message":"ditto","commit_id":"4b6a0faa82226c0c82edc794f8f8c6a6564acf92"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"12b57f97d9c170f4ae8d50b158a2f210f1136708","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   sql.ForeignKey(region_table.c.id), nullable\u003dTrue),"},{"line_number":38,"context_line":"        sql.Column(\u0027resource_name\u0027, sql.String(255)),"},{"line_number":39,"context_line":"        sql.Column(\u0027default_limit\u0027, sql.Integer, nullable\u003dFalse),"},{"line_number":40,"context_line":"        sql.UniqueConstraint(\u0027service_id\u0027, \u0027region_id\u0027, \u0027resource_name\u0027),"},{"line_number":41,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":42,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":43,"context_line":"    registered_limit_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_0e2313aa","line":40,"range":{"start_line":40,"start_character":8,"end_line":40,"end_character":73},"updated":"2017-12-27 19:51:09.000000000","message":"Ok - I think this make sense now. Thanks for adding the test case for this.","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"12b57f97d9c170f4ae8d50b158a2f210f1136708","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":60,"context_line":"    limit_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    migrate.ForeignKeyConstraint("},{"line_number":63,"context_line":"        columns\u003d[limit_table.c.service_id,"},{"line_number":64,"context_line":"                 limit_table.c.region_id,"},{"line_number":65,"context_line":"                 limit_table.c.resource_name],"},{"line_number":66,"context_line":"        refcolumns\u003d[registered_limit_table.c.service_id,"},{"line_number":67,"context_line":"                    registered_limit_table.c.region_id,"},{"line_number":68,"context_line":"                    registered_limit_table.c.resource_name]).create()"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_ce3c4bca","line":68,"range":{"start_line":62,"start_character":3,"end_line":68,"end_character":69},"updated":"2017-12-27 19:51:09.000000000","message":"We sometimes forego using FK is there is a change that the referenced table might not be used (e.g. cases where LDAP is used). But since all this information is part of the catalog API and we only supply one upstream driver for it, then I think we\u0027re OK using FKs here.","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4e3d39da1a249f14f0164b7fc43132e81fc0cd07","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        mysql_charset\u003d\u0027utf8\u0027)"},{"line_number":60,"context_line":"    limit_table.create(migrate_engine, checkfirst\u003dTrue)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    migrate.ForeignKeyConstraint("},{"line_number":63,"context_line":"        columns\u003d[limit_table.c.service_id,"},{"line_number":64,"context_line":"                 limit_table.c.region_id,"},{"line_number":65,"context_line":"                 limit_table.c.resource_name],"},{"line_number":66,"context_line":"        refcolumns\u003d[registered_limit_table.c.service_id,"},{"line_number":67,"context_line":"                    registered_limit_table.c.region_id,"},{"line_number":68,"context_line":"                    registered_limit_table.c.resource_name]).create()"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_7f098fdb","line":68,"range":{"start_line":62,"start_character":3,"end_line":68,"end_character":69},"in_reply_to":"bf8cb3f7_ce3c4bca","updated":"2017-12-28 01:23:54.000000000","message":"I\u0027v tried to user FK before, but the CI was not happy. It seems that in PostgreSQL, the column which FK referenced  must be primary key, unfortunately the region_id could be None so that it can\u0027t use FK for it in Psql. It\u0027s the reason that I used FKs here.\n\nHere is the log for PS3: http://logs.openstack.org/41/523041/3/check/openstack-tox-py27/0aaab5b/testr_results.html.gz","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"88abbdbc9bc402927ef2870efe62e98c99d5275f","unresolved":false,"context_lines":[{"line_number":2538,"context_line":""},{"line_number":2539,"context_line":"        registered_limit_table \u003d sqlalchemy.Table("},{"line_number":2540,"context_line":"            registered_limit_table_name, self.metadata, autoload\u003dTrue)"},{"line_number":2541,"context_line":"        registered_limit \u003d {"},{"line_number":2542,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2543,"context_line":"            \u0027service_id\u0027: service_id,"},{"line_number":2544,"context_line":"            \u0027region_id\u0027: \u0027RegionOne\u0027,"},{"line_number":2545,"context_line":"            \u0027resource_name\u0027: \u0027cores\u0027,"},{"line_number":2546,"context_line":"            \u0027default_limit\u0027: 10"},{"line_number":2547,"context_line":"        }"},{"line_number":2548,"context_line":"        registered_limit_table.insert().values(registered_limit).execute()"},{"line_number":2549,"context_line":""},{"line_number":2550,"context_line":"        limit_table \u003d sqlalchemy.Table("}],"source_content_type":"text/x-python","patch_set":11,"id":"df87a7cf_60c70314","line":2547,"range":{"start_line":2541,"start_character":8,"end_line":2547,"end_character":9},"updated":"2017-12-19 20:01:51.000000000","message":"What happens if you try and insert a registered limit reference with a NULL region_id?","commit_id":"9052590c57be94a986803c15bd1bd91b73d61aaf"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2a9f9bd9f5264cf7f5800d0c420e79270df3afca","unresolved":false,"context_lines":[{"line_number":2538,"context_line":""},{"line_number":2539,"context_line":"        registered_limit_table \u003d sqlalchemy.Table("},{"line_number":2540,"context_line":"            registered_limit_table_name, self.metadata, autoload\u003dTrue)"},{"line_number":2541,"context_line":"        registered_limit \u003d {"},{"line_number":2542,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2543,"context_line":"            \u0027service_id\u0027: service_id,"},{"line_number":2544,"context_line":"            \u0027region_id\u0027: \u0027RegionOne\u0027,"},{"line_number":2545,"context_line":"            \u0027resource_name\u0027: \u0027cores\u0027,"},{"line_number":2546,"context_line":"            \u0027default_limit\u0027: 10"},{"line_number":2547,"context_line":"        }"},{"line_number":2548,"context_line":"        registered_limit_table.insert().values(registered_limit).execute()"},{"line_number":2549,"context_line":""},{"line_number":2550,"context_line":"        limit_table \u003d sqlalchemy.Table("}],"source_content_type":"text/x-python","patch_set":11,"id":"df87a7cf_4fcd4783","line":2547,"range":{"start_line":2541,"start_character":8,"end_line":2547,"end_character":9},"in_reply_to":"df87a7cf_60c70314","updated":"2017-12-20 01:42:00.000000000","message":"I\u0027ll update it later.","commit_id":"9052590c57be94a986803c15bd1bd91b73d61aaf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"88abbdbc9bc402927ef2870efe62e98c99d5275f","unresolved":false,"context_lines":[{"line_number":2548,"context_line":"        registered_limit_table.insert().values(registered_limit).execute()"},{"line_number":2549,"context_line":""},{"line_number":2550,"context_line":"        limit_table \u003d sqlalchemy.Table("},{"line_number":2551,"context_line":"            limit_table_name, self.metadata, autoload\u003dTrue)"},{"line_number":2552,"context_line":"        limit \u003d {"},{"line_number":2553,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2554,"context_line":"            \u0027project_id\u0027: project_id,"},{"line_number":2555,"context_line":"            \u0027service_id\u0027: service_id,"},{"line_number":2556,"context_line":"            \u0027region_id\u0027: \u0027RegionOne\u0027,"},{"line_number":2557,"context_line":"            \u0027resource_name\u0027: \u0027cores\u0027,"},{"line_number":2558,"context_line":"            \u0027resource_limit\u0027: 5"},{"line_number":2559,"context_line":"        }"},{"line_number":2560,"context_line":"        limit_table.insert().values(limit).execute()"},{"line_number":2561,"context_line":""},{"line_number":2562,"context_line":""},{"line_number":2563,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df87a7cf_20cd7b2f","line":2560,"range":{"start_line":2551,"start_character":8,"end_line":2560,"end_character":52},"updated":"2017-12-19 20:01:51.000000000","message":"Same comment here as above. We should add those cases into this test or a separate test.","commit_id":"9052590c57be94a986803c15bd1bd91b73d61aaf"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"2a9f9bd9f5264cf7f5800d0c420e79270df3afca","unresolved":false,"context_lines":[{"line_number":2548,"context_line":"        registered_limit_table.insert().values(registered_limit).execute()"},{"line_number":2549,"context_line":""},{"line_number":2550,"context_line":"        limit_table \u003d sqlalchemy.Table("},{"line_number":2551,"context_line":"            limit_table_name, self.metadata, autoload\u003dTrue)"},{"line_number":2552,"context_line":"        limit \u003d {"},{"line_number":2553,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2554,"context_line":"            \u0027project_id\u0027: project_id,"},{"line_number":2555,"context_line":"            \u0027service_id\u0027: service_id,"},{"line_number":2556,"context_line":"            \u0027region_id\u0027: \u0027RegionOne\u0027,"},{"line_number":2557,"context_line":"            \u0027resource_name\u0027: \u0027cores\u0027,"},{"line_number":2558,"context_line":"            \u0027resource_limit\u0027: 5"},{"line_number":2559,"context_line":"        }"},{"line_number":2560,"context_line":"        limit_table.insert().values(limit).execute()"},{"line_number":2561,"context_line":""},{"line_number":2562,"context_line":""},{"line_number":2563,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"}],"source_content_type":"text/x-python","patch_set":11,"id":"df87a7cf_8fb7cff5","line":2560,"range":{"start_line":2551,"start_character":8,"end_line":2560,"end_character":52},"in_reply_to":"df87a7cf_20cd7b2f","updated":"2017-12-20 01:42:00.000000000","message":"sure","commit_id":"9052590c57be94a986803c15bd1bd91b73d61aaf"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d0cbbe797a16d46ba22a4ee264e35b6fdf93fc0f","unresolved":false,"context_lines":[{"line_number":2587,"context_line":"        }"},{"line_number":2588,"context_line":"        registered_limit_table.insert().values(registered_limit).execute()"},{"line_number":2589,"context_line":""},{"line_number":2590,"context_line":"        registered_limit_without_region \u003d {"},{"line_number":2591,"context_line":"            \u0027id\u0027: uuid.uuid4().hex,"},{"line_number":2592,"context_line":"            \u0027service_id\u0027: service_id,"},{"line_number":2593,"context_line":"            \u0027resource_name\u0027: \u0027cores\u0027,"},{"line_number":2594,"context_line":"            \u0027default_limit\u0027: 10"},{"line_number":2595,"context_line":"        }"},{"line_number":2596,"context_line":"        registered_limit_table.insert().values("},{"line_number":2597,"context_line":"            registered_limit_without_region).execute()"},{"line_number":2598,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"bf8cb3f7_b1c135e7","line":2595,"range":{"start_line":2590,"start_character":8,"end_line":2595,"end_character":9},"updated":"2017-12-26 20:38:08.000000000","message":"Thanks for adding this.","commit_id":"4b6a0faa82226c0c82edc794f8f8c6a6564acf92"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"8cade0187ea59e26b475fea72c8b37e07b445e90","unresolved":false,"context_lines":[{"line_number":2592,"context_line":"        # region_id and resource name."},{"line_number":2593,"context_line":"        registered_limit[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":2594,"context_line":"        registered_limit[\u0027default_limit\u0027] \u003d 20"},{"line_number":2595,"context_line":"        self.assertRaises(db_exception.DBDuplicateEntry,"},{"line_number":2596,"context_line":"                          registered_limit_table.insert().values("},{"line_number":2597,"context_line":"                              registered_limit).execute)"},{"line_number":2598,"context_line":""},{"line_number":2599,"context_line":"        # Insert one without region_id"},{"line_number":2600,"context_line":"        registered_limit_without_region \u003d {"}],"source_content_type":"text/x-python","patch_set":17,"id":"bf8cb3f7_2aaa8ed1","line":2597,"range":{"start_line":2595,"start_character":0,"end_line":2597,"end_character":56},"updated":"2017-12-27 02:03:32.000000000","message":"Here is the case for the same service_id,region_id and resource name.","commit_id":"08af006437a6f94cddadf506893afc0ec3d4f2b7"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"12b57f97d9c170f4ae8d50b158a2f210f1136708","unresolved":false,"context_lines":[{"line_number":2562,"context_line":"        service \u003d {\u0027id\u0027: service_id,"},{"line_number":2563,"context_line":"                   \u0027type\u0027: \u0027compute\u0027,"},{"line_number":2564,"context_line":"                   \u0027enabled\u0027: True"},{"line_number":2565,"context_line":"                   }"},{"line_number":2566,"context_line":"        region \u003d {\u0027id\u0027: \u0027RegionOne\u0027,"},{"line_number":2567,"context_line":"                  \u0027description\u0027: \u0027test\u0027"},{"line_number":2568,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_ae31c7ee","line":2565,"range":{"start_line":2565,"start_character":19,"end_line":2565,"end_character":20},"updated":"2017-12-27 19:51:09.000000000","message":"nit: this could be pulled up to the next line to be consistent with the indentation/format on line 2574.","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4e3d39da1a249f14f0164b7fc43132e81fc0cd07","unresolved":false,"context_lines":[{"line_number":2562,"context_line":"        service \u003d {\u0027id\u0027: service_id,"},{"line_number":2563,"context_line":"                   \u0027type\u0027: \u0027compute\u0027,"},{"line_number":2564,"context_line":"                   \u0027enabled\u0027: True"},{"line_number":2565,"context_line":"                   }"},{"line_number":2566,"context_line":"        region \u003d {\u0027id\u0027: \u0027RegionOne\u0027,"},{"line_number":2567,"context_line":"                  \u0027description\u0027: \u0027test\u0027"},{"line_number":2568,"context_line":"                  }"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_bf5077d6","line":2565,"range":{"start_line":2565,"start_character":19,"end_line":2565,"end_character":20},"in_reply_to":"bf8cb3f7_ae31c7ee","updated":"2017-12-28 01:23:54.000000000","message":"Done","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"12b57f97d9c170f4ae8d50b158a2f210f1136708","unresolved":false,"context_lines":[{"line_number":2565,"context_line":"                   }"},{"line_number":2566,"context_line":"        region \u003d {\u0027id\u0027: \u0027RegionOne\u0027,"},{"line_number":2567,"context_line":"                  \u0027description\u0027: \u0027test\u0027"},{"line_number":2568,"context_line":"                  }"},{"line_number":2569,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2570,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2571,"context_line":"                   \u0027name\u0027: \u0027nova\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_4e4efb6f","line":2568,"range":{"start_line":2568,"start_character":18,"end_line":2568,"end_character":19},"updated":"2017-12-27 19:51:09.000000000","message":"Same nit here.","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4e3d39da1a249f14f0164b7fc43132e81fc0cd07","unresolved":false,"context_lines":[{"line_number":2565,"context_line":"                   }"},{"line_number":2566,"context_line":"        region \u003d {\u0027id\u0027: \u0027RegionOne\u0027,"},{"line_number":2567,"context_line":"                  \u0027description\u0027: \u0027test\u0027"},{"line_number":2568,"context_line":"                  }"},{"line_number":2569,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2570,"context_line":"        project \u003d {\u0027id\u0027: project_id,"},{"line_number":2571,"context_line":"                   \u0027name\u0027: \u0027nova\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_5f5febe4","line":2568,"range":{"start_line":2568,"start_character":18,"end_line":2568,"end_character":19},"in_reply_to":"bf8cb3f7_4e4efb6f","updated":"2017-12-28 01:23:54.000000000","message":"Done","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"12b57f97d9c170f4ae8d50b158a2f210f1136708","unresolved":false,"context_lines":[{"line_number":2607,"context_line":"            registered_limit_without_region).execute()"},{"line_number":2608,"context_line":""},{"line_number":2609,"context_line":"        # It will not raise error if insert another one with same service_id"},{"line_number":2610,"context_line":"        # and resource_name but the region_id is None. This should be"},{"line_number":2611,"context_line":"        # controlled at the Manager layer to forbid this behavior."},{"line_number":2612,"context_line":"        registered_limit_without_region[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":2613,"context_line":"        registered_limit_table.insert().values("},{"line_number":2614,"context_line":"            registered_limit_without_region).execute()"}],"source_content_type":"text/x-python","patch_set":18,"id":"bf8cb3f7_6e517f0e","line":2611,"range":{"start_line":2610,"start_character":55,"end_line":2611,"end_character":66},"updated":"2017-12-27 19:51:09.000000000","message":"How come this doesn\u0027t fail the uniqueness constraint?","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"},{"author":{"_account_id":15054,"name":"wangxiyuan","email":"wangxiyuan1007@gmail.com","username":"wangxiyuan"},"change_message_id":"4e3d39da1a249f14f0164b7fc43132e81fc0cd07","unresolved":false,"context_lines":[{"line_number":2607,"context_line":"            registered_limit_without_region).execute()"},{"line_number":2608,"context_line":""},{"line_number":2609,"context_line":"        # It will not raise error if insert another one with same service_id"},{"line_number":2610,"context_line":"        # and resource_name but the region_id is None. This should be"},{"line_number":2611,"context_line":"        # controlled at the Manager layer to forbid this behavior."},{"line_number":2612,"context_line":"        registered_limit_without_region[\u0027id\u0027] \u003d uuid.uuid4().hex"},{"line_number":2613,"context_line":"        registered_limit_table.insert().values("},{"line_number":2614,"context_line":"            registered_limit_without_region).execute()"}],"source_content_type":"text/x-python","patch_set":18,"id":"9f91af0f_7f93cf50","line":2611,"range":{"start_line":2610,"start_character":55,"end_line":2611,"end_character":66},"in_reply_to":"bf8cb3f7_6e517f0e","updated":"2017-12-28 01:23:54.000000000","message":"For example: UniqueConstraint A, B, C.\nwe can insert a line: A1, B1, C1. Then if we insert a same line A1, B1, C1, DB will raise DBDuplicateEntry error.\n\nBut if one of A, B, C columns is None, then the UniqueConstraint will lose efficacy. It means that if we insert a line A1, None, C1, and insert a same line A1, None C1, DB will not raise error.\n\nSo in our case, \"region_id\" could be None. To solve the problem here are two way:\n1. give \"reigon_id\" a default value, such as empty string. But \"regiond_id\" here has the FK in \"region\" table, so we must create a default region in region table first.\n\n2. We can control it at the Manage layer to forbid inserting this kind of value.\n\nI think the second way is better. So that I add a function here: https://review.openstack.org/#/c/524082/16/keystone/limit/backends/sql.py L185\n\nP.S. Maybe there is a better way to use DB operation. But I don\u0027t know. If so, it will be the best way!","commit_id":"0aa71a0e8c7ad3be89a88302d85b1816ab96771a"}]}
