)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f7f0352dd2cece187bb14296a311d3f879eb5d67","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add database migration for project tags"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change adds the SQL database migration for adding a new"},{"line_number":10,"context_line":"project_tag table that consists of an id, project_id, and"},{"line_number":11,"context_line":"name. The id is a unique value for that tag, the project_id"},{"line_number":12,"context_line":"is the id that the tag is mapped to, and the name is the"},{"line_number":13,"context_line":"simple string value of the tag."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":42,"id":"7f515b1d_e3531338","line":10,"range":{"start_line":10,"start_character":38,"end_line":10,"end_character":40},"updated":"2017-09-28 20:26:25.000000000","message":"It looks like the id column was removed in a previous patch. The expand script only adds a table with two columns, project_id and name. The primary_key being the combination of the two, which seems to make sense since that should always be unique. It will also prevent duplicate tags on the same project.","commit_id":"3125c35d17da960ad61eaf1ab9bfac67ccb19e5d"}],"keystone/common/sql/contract_repo/versions/024_contract_add_project_tags_table.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b69663ebe9e606b739a9bbe48811a87c67efcc3f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f1a1f67_2a16ab56","line":1,"updated":"2017-07-17 20:19:33.000000000","message":"Same comment here regarding the file naming.","commit_id":"b8e16e3da7abe8de4b6435ea8f674c0c2a3a756e"}],"keystone/common/sql/core.py":[{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"e2d56f3905d897c6c9d9a0241ebb8eb91150b667","unresolved":false,"context_lines":[{"line_number":68,"context_line":"joinedload \u003d sql.orm.joinedload"},{"line_number":69,"context_line":"# Suppress flake8\u0027s unused import warning for flag_modified:"},{"line_number":70,"context_line":"flag_modified \u003d flag_modified"},{"line_number":71,"context_line":"Unicode \u003d sql.Unicode"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"def initialize():"}],"source_content_type":"text/x-python","patch_set":18,"id":"ff346bd7_c7621cd9","line":71,"range":{"start_line":71,"start_character":0,"end_line":71,"end_character":7},"updated":"2017-07-21 22:05:19.000000000","message":"this is needed for resource/backends/sql.py class ProjectTag","commit_id":"499ad3f14b9680b5a3a8847044be81692afc41f6"}],"keystone/common/sql/data_migration_repo/versions/024_contract_add_project_tags_table.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b69663ebe9e606b739a9bbe48811a87c67efcc3f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f1a1f67_0a0f6f37","line":1,"updated":"2017-07-17 20:19:33.000000000","message":"Same comment here regarding the file naming.","commit_id":"b8e16e3da7abe8de4b6435ea8f674c0c2a3a756e"}],"keystone/common/sql/expand_repo/versions/024_contract_add_project_tags_table.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b69663ebe9e606b739a9bbe48811a87c67efcc3f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f1a1f67_aa53db38","line":1,"updated":"2017-07-17 20:19:33.000000000","message":"I think this file is named wrong. I think the convention is to use something like:\n\n  expand_repo/versions/024_expand_add_project_tags_table.py","commit_id":"b8e16e3da7abe8de4b6435ea8f674c0c2a3a756e"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"539a45469a15674a11bbb635b1c204d0dee20725","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"# not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"# a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f1a1f67_9b1bcf7f","line":1,"in_reply_to":"1f1a1f67_aa53db38","updated":"2017-07-17 22:20:56.000000000","message":"yeah I copied without double checking, will fix","commit_id":"b8e16e3da7abe8de4b6435ea8f674c0c2a3a756e"}],"keystone/common/sql/expand_repo/versions/024_expand_add_project_tags_table.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"798363e830b1f19f6efd207478a0a13f6dca840b","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64),"},{"line_number":29,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":30,"context_line":"                   nullable\u003dFalse),"},{"line_number":31,"context_line":"        sql.Column(\u0027name\u0027, sql.String(60), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":33,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":34,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f1a1f67_18586a54","line":31,"updated":"2017-07-20 19:13:51.000000000","message":"Do all tags on a project have to be unique? I can\u0027t have [\u0027blue\u0027, \u0027red\u0027, \u0027green\u0027, \u0027blue\u0027] tags on a project, can I? I don\u0027t think I saw any bits in the spec on that. The reason why I ask is because if we don\u0027t allow multiple of the same tags, then we might be able to use a uniqueness constraint between the project_id and the name to ensure ever tag is unique, instead of having an ID we\u0027ll never use.","commit_id":"e343e59a823b0cc096743f4b1fd76fc60fd5b720"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"69e2950556c149f202ee2952ba06aa1e7df150b8","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64),"},{"line_number":29,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":30,"context_line":"                   nullable\u003dFalse),"},{"line_number":31,"context_line":"        sql.Column(\u0027name\u0027, sql.String(60), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":33,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":34,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f1a1f67_26d1c458","line":31,"range":{"start_line":31,"start_character":31,"end_line":31,"end_character":41},"updated":"2017-07-20 23:09:55.000000000","message":"on another note, if we want the names to be case sensitive we need to include a collation and indicate binary. So, String(60) -\u003e String(60, collation\u003d\u0027utf8_bin\u0027)\n\ncollation reference- http://docs.sqlalchemy.org/en/latest/core/type_basics.html\nI confirmed on keystone: http://paste.openstack.org/show/616093/","commit_id":"e343e59a823b0cc096743f4b1fd76fc60fd5b720"},{"author":{"_account_id":22604,"name":"Samuel Pilla","email":"sp516w@att.com","username":"samuel.pilla"},"change_message_id":"f66a218c74679515b3b63cde365e2854efbe306c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64),"},{"line_number":29,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":30,"context_line":"                   nullable\u003dFalse),"},{"line_number":31,"context_line":"        sql.Column(\u0027name\u0027, sql.String(60), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":33,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":34,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f1a1f67_73bb0172","line":31,"in_reply_to":"1f1a1f67_18586a54","updated":"2017-07-20 19:42:30.000000000","message":"All tags will be unique, no duplicates. And yes we were discussing the tag_id issue. We will probably remove it because of the name being unique (like you mentioned) and then can add in the constraints between the name and project_id.","commit_id":"e343e59a823b0cc096743f4b1fd76fc60fd5b720"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"59c8689ad83495239ecdcd1690256ff6f0f79f65","unresolved":false,"context_lines":[{"line_number":28,"context_line":"        sql.Column(\u0027project_id\u0027, sql.String(64),"},{"line_number":29,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":30,"context_line":"                   nullable\u003dFalse),"},{"line_number":31,"context_line":"        sql.Column(\u0027name\u0027, sql.String(60), nullable\u003dFalse),"},{"line_number":32,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":33,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":34,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f1a1f67_f717fca2","line":31,"in_reply_to":"1f1a1f67_73bb0172","updated":"2017-07-20 20:10:43.000000000","message":"to elaborate [\u0027blue\u0027, \u0027red\u0027, \u0027green\u0027, \u0027blue\u0027] is not allowed. However, tag names can be duplicates iff they have different project ids.","commit_id":"e343e59a823b0cc096743f4b1fd76fc60fd5b720"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"b89523583a1e2f1682b77432a63ddfca91e642dd","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                   sql.String(64),"},{"line_number":33,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":34,"context_line":"                   nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027name\u0027,"},{"line_number":36,"context_line":"                   sql.Unicode(60),"},{"line_number":37,"context_line":"                   nullable\u003dFalse),"},{"line_number":38,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"ff346bd7_817884f8","line":35,"range":{"start_line":35,"start_character":20,"end_line":35,"end_character":24},"updated":"2017-07-21 21:05:42.000000000","message":"this will be treated case sensitive as long as we use id as the primary key, but if we step away from using ids, and use project_id-name as the primary keys, \u00271234-aaa\u0027 and \u00271234-AAA\u0027 will be treated duplicates.","commit_id":"4fc8bae5566b8d1d909957712edae1a9d0c3b65e"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"c40d7b62c5aea4b1d3e2e0cfe3289851042653f8","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"def upgrade(migrate_engine):"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    # Upgrade operations go here. Don\u0027t create your own engine; bind"},{"line_number":19,"context_line":"    # migrate_engine to your metadata"},{"line_number":20,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":21,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_dfabb61a","line":19,"range":{"start_line":18,"start_character":0,"end_line":19,"end_character":37},"updated":"2017-07-25 14:34:03.000000000","message":"remove this comment, not needed","commit_id":"c4369c1020a3d6113ee7e3a27bc88a229f8dd581"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"67f02f0b5253208983a27eaf623f123ed26e72a4","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"def upgrade(migrate_engine):"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    # Upgrade operations go here. Don\u0027t create your own engine; bind"},{"line_number":19,"context_line":"    # migrate_engine to your metadata"},{"line_number":20,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":21,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_c2bab908","line":19,"range":{"start_line":18,"start_character":0,"end_line":19,"end_character":37},"in_reply_to":"ff346bd7_dfabb61a","updated":"2017-07-25 15:04:43.000000000","message":"Done","commit_id":"c4369c1020a3d6113ee7e3a27bc88a229f8dd581"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"c40d7b62c5aea4b1d3e2e0cfe3289851042653f8","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sql.Column(\u0027id\u0027,"},{"line_number":28,"context_line":"                   sql.Integer,"},{"line_number":29,"context_line":"                   primary_key\u003dTrue,"},{"line_number":30,"context_line":"                   autoincrement\u003dTrue),"},{"line_number":31,"context_line":"        sql.Column(\u0027project_id\u0027,"},{"line_number":32,"context_line":"                   sql.String(64),"},{"line_number":33,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_1f601e01","line":30,"updated":"2017-07-25 14:34:03.000000000","message":"we dont need an ID. we can just make project_id,name the Pk\n\nsee comment https://review.openstack.org/#/c/484529/3/specs/keystone/pike/project-tags.rst","commit_id":"c4369c1020a3d6113ee7e3a27bc88a229f8dd581"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"67f02f0b5253208983a27eaf623f123ed26e72a4","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        sql.Column(\u0027id\u0027,"},{"line_number":28,"context_line":"                   sql.Integer,"},{"line_number":29,"context_line":"                   primary_key\u003dTrue,"},{"line_number":30,"context_line":"                   autoincrement\u003dTrue),"},{"line_number":31,"context_line":"        sql.Column(\u0027project_id\u0027,"},{"line_number":32,"context_line":"                   sql.String(64),"},{"line_number":33,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_75d50943","line":30,"in_reply_to":"ff346bd7_1f601e01","updated":"2017-07-25 15:04:43.000000000","message":"Done","commit_id":"c4369c1020a3d6113ee7e3a27bc88a229f8dd581"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"c40d7b62c5aea4b1d3e2e0cfe3289851042653f8","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":34,"context_line":"                   nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027name\u0027,"},{"line_number":36,"context_line":"                   sql.Unicode(60),"},{"line_number":37,"context_line":"                   nullable\u003dFalse),"},{"line_number":38,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":39,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_ff71dadf","line":36,"range":{"start_line":36,"start_character":23,"end_line":36,"end_character":30},"updated":"2017-07-25 14:34:03.000000000","message":"why doesnt string work?\n\nplease add a comment stating why this needs to be unicode, as different from all the other types used in keystone (this was added just for this)","commit_id":"c4369c1020a3d6113ee7e3a27bc88a229f8dd581"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"67f02f0b5253208983a27eaf623f123ed26e72a4","unresolved":false,"context_lines":[{"line_number":33,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":34,"context_line":"                   nullable\u003dFalse),"},{"line_number":35,"context_line":"        sql.Column(\u0027name\u0027,"},{"line_number":36,"context_line":"                   sql.Unicode(60),"},{"line_number":37,"context_line":"                   nullable\u003dFalse),"},{"line_number":38,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":39,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ff346bd7_d5f035cc","line":36,"range":{"start_line":36,"start_character":23,"end_line":36,"end_character":30},"in_reply_to":"ff346bd7_ff71dadf","updated":"2017-07-25 15:04:43.000000000","message":"This is to mirror nova\u0027s behavior with server tag to allow for tags to be case sensitive.  Postgresql\u0027s columns are already case sensitive; but not for MySQL.  I will add a note to explain this.","commit_id":"c4369c1020a3d6113ee7e3a27bc88a229f8dd581"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bc225e9421df7e1e6ccd4c936bd4b9f9dcec49eb","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        sql.Column(\u0027name\u0027,"},{"line_number":36,"context_line":"                   sql.Unicode(60),"},{"line_number":37,"context_line":"                   nullable\u003dFalse),"},{"line_number":38,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":39,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":40,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":41,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":22,"id":"ff346bd7_51330ef7","line":38,"updated":"2017-07-26 15:27:17.000000000","message":"We have a uniqueness constraint, but we also have an `id` column. Just to clarify, the `id` column is required in order to support case sensitive tags, right?","commit_id":"dc3d0407ffbdad6fac1f0c12bc7f89d75d5eb589"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"f4b3beeb0120d3447511300430d55b1819766303","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        sql.Column(\u0027name\u0027,"},{"line_number":36,"context_line":"                   sql.Unicode(60),"},{"line_number":37,"context_line":"                   nullable\u003dFalse),"},{"line_number":38,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":39,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":40,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":41,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":22,"id":"ff346bd7_3cee21b4","line":38,"in_reply_to":"ff346bd7_51330ef7","updated":"2017-07-26 16:03:53.000000000","message":"No the id column was added back when this was rebased, it should be removed.","commit_id":"dc3d0407ffbdad6fac1f0c12bc7f89d75d5eb589"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"5be52f49091ccabb0e33443b63ab21dd9bda11d3","unresolved":false,"context_lines":[{"line_number":25,"context_line":"        \u0027project_tag\u0027,"},{"line_number":26,"context_line":"        meta,"},{"line_number":27,"context_line":"        sql.Column(\u0027id\u0027,"},{"line_number":28,"context_line":"                   sql.Integer,"},{"line_number":29,"context_line":"                   primary_key\u003dTrue,"},{"line_number":30,"context_line":"                   autoincrement\u003dTrue),"},{"line_number":31,"context_line":"        sql.Column(\u0027project_id\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff346bd7_4f7c5b1e","line":28,"updated":"2017-07-27 15:21:58.000000000","message":"Looks like id still needs to be dropped.","commit_id":"6e9b790da1a86465aaef665b9504c39ac1c05efd"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"8ad3d289e85e32277d079437fae1fefde862c2b3","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   nullable\u003dFalse,"},{"line_number":38,"context_line":"                   primary_key\u003dTrue),"},{"line_number":39,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":40,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":41,"context_line":"    )"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    project_tags_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ff346bd7_dbd48d22","line":40,"updated":"2017-07-27 17:06:42.000000000","message":"This is missing the uniqueness constraint","commit_id":"53d4fbb1da87f5d6d903c5c4497ff89b47c3607c"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"ab9d5157d83ecc63586e0ce7ac9c1728f0650949","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   nullable\u003dFalse,"},{"line_number":38,"context_line":"                   primary_key\u003dTrue),"},{"line_number":39,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":40,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":41,"context_line":"    )"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    project_tags_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ff346bd7_f6ed23b7","line":40,"in_reply_to":"ff346bd7_7b480186","updated":"2017-07-27 18:59:38.000000000","message":"The project_id and name together should both be a unique primary key.","commit_id":"53d4fbb1da87f5d6d903c5c4497ff89b47c3607c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"99c085321224d6f15196aa3848769156fe495e8e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"                   nullable\u003dFalse,"},{"line_number":38,"context_line":"                   primary_key\u003dTrue),"},{"line_number":39,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":40,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":41,"context_line":"    )"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    project_tags_table.create(migrate_engine, checkfirst\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":26,"id":"ff346bd7_7b480186","line":40,"in_reply_to":"ff346bd7_dbd48d22","updated":"2017-07-27 17:22:07.000000000","message":"Doesn\u0027t the fact of setting PK above already inherits uniqueness in those attributes?\n\nEven if that\u0027s true, it wouldn\u0027t hurt to set it explicitly.","commit_id":"53d4fbb1da87f5d6d903c5c4497ff89b47c3607c"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"8cf57bb54b381e9229f445aac5b84de32242c7ac","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        meta,"},{"line_number":30,"context_line":"        sql.Column(\u0027project_id\u0027,"},{"line_number":31,"context_line":"                   sql.String(64),"},{"line_number":32,"context_line":"                   sql.ForeignKey(project_table.c.id, ondelete\u003d\u0027CASCADE\u0027),"},{"line_number":33,"context_line":"                   nullable\u003dFalse,"},{"line_number":34,"context_line":"                   primary_key\u003dTrue),"},{"line_number":35,"context_line":"        sql.Column(\u0027name\u0027,"}],"source_content_type":"text/x-python","patch_set":29,"id":"ff346bd7_6915c9e4","line":32,"range":{"start_line":32,"start_character":19,"end_line":32,"end_character":74},"updated":"2017-07-28 01:28:28.000000000","message":"nice","commit_id":"ba9a4e37d47b34cfcd9404888347ab6b6be1a3f3"}],"keystone/common/sql/expand_repo/versions/025_expand_add_project_tags_table.py":[{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"85be64718604a0ca630bcc75844e8fc208e25fb2","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    project_table \u003d sql.Table(\u0027project\u0027, meta, autoload\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    # NOTE(lamt) To allow tag name to be case sensitive for MySQL, the \u0027name\u0027x"},{"line_number":24,"context_line":"    # column needs to use collation, which is incompatible with Postgresql."},{"line_number":25,"context_line":"    # Using unicode to mirror nova\u0027s server tag:"},{"line_number":26,"context_line":"    # https://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/models.py"}],"source_content_type":"text/x-python","patch_set":38,"id":"7f287b81_e64726bc","line":23,"range":{"start_line":23,"start_character":77,"end_line":23,"end_character":78},"updated":"2017-09-04 13:49:31.000000000","message":"(nit) typo","commit_id":"a65caf8e6a5e084f488ac870b8770cf2928e3a77"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"8dad3c09f0d9d2a201e301fc7727e7a165e52fba","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    project_table \u003d sql.Table(\u0027project\u0027, meta, autoload\u003dTrue)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"    # NOTE(lamt) To allow tag name to be case sensitive for MySQL, the \u0027name\u0027x"},{"line_number":24,"context_line":"    # column needs to use collation, which is incompatible with Postgresql."},{"line_number":25,"context_line":"    # Using unicode to mirror nova\u0027s server tag:"},{"line_number":26,"context_line":"    # https://github.com/openstack/nova/blob/master/nova/db/sqlalchemy/models.py"}],"source_content_type":"text/x-python","patch_set":38,"id":"7f287b81_9d3728b1","line":23,"range":{"start_line":23,"start_character":77,"end_line":23,"end_character":78},"in_reply_to":"7f287b81_e64726bc","updated":"2017-09-07 21:22:49.000000000","message":"Done","commit_id":"a65caf8e6a5e084f488ac870b8770cf2928e3a77"}],"keystone/common/sql/expand_repo/versions/030_expand_add_project_tags_table.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f7f0352dd2cece187bb14296a311d3f879eb5d67","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                   sql.Unicode(255),"},{"line_number":37,"context_line":"                   nullable\u003dFalse,"},{"line_number":38,"context_line":"                   primary_key\u003dTrue),"},{"line_number":39,"context_line":"        sql.UniqueConstraint(\u0027project_id\u0027, \u0027name\u0027),"},{"line_number":40,"context_line":"        mysql_engine\u003d\u0027InnoDB\u0027,"},{"line_number":41,"context_line":"        mysql_charset\u003d\u0027utf8\u0027"},{"line_number":42,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":42,"id":"7f515b1d_e328b397","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":51},"updated":"2017-09-28 20:26:25.000000000","message":"Nice - this seems cleaner than having a `id` attribute that we\u0027ll never use.","commit_id":"3125c35d17da960ad61eaf1ab9bfac67ccb19e5d"}],"keystone/tests/unit/test_sql_upgrade.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b69663ebe9e606b739a9bbe48811a87c67efcc3f","unresolved":false,"context_lines":[{"line_number":2349,"context_line":"        self.contract(15)"},{"line_number":2350,"context_line":""},{"line_number":2351,"context_line":"        user_option \u003d \u0027user_option\u0027"},{"line_number":2352,"context_line":"        self.assertTableDoesNotExist(user_option)"},{"line_number":2353,"context_line":"        self.expand(16)"},{"line_number":2354,"context_line":"        self.migrate(16)"},{"line_number":2355,"context_line":"        self.contract(16)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f1a1f67_ca2bb792","side":"PARENT","line":2352,"updated":"2017-07-17 20:19:33.000000000","message":"Could do an assertion like this to make it clear we\u0027re checking for the presence of the table before *and* after the migrations.","commit_id":"33b0ec1397983d8daf1d4bb24abb777bc733520b"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"539a45469a15674a11bbb635b1c204d0dee20725","unresolved":false,"context_lines":[{"line_number":2349,"context_line":"        self.contract(15)"},{"line_number":2350,"context_line":""},{"line_number":2351,"context_line":"        user_option \u003d \u0027user_option\u0027"},{"line_number":2352,"context_line":"        self.assertTableDoesNotExist(user_option)"},{"line_number":2353,"context_line":"        self.expand(16)"},{"line_number":2354,"context_line":"        self.migrate(16)"},{"line_number":2355,"context_line":"        self.contract(16)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1f1a1f67_d6323ef2","side":"PARENT","line":2352,"in_reply_to":"1f1a1f67_ca2bb792","updated":"2017-07-17 22:20:56.000000000","message":"Done","commit_id":"33b0ec1397983d8daf1d4bb24abb777bc733520b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"798363e830b1f19f6efd207478a0a13f6dca840b","unresolved":false,"context_lines":[{"line_number":2370,"context_line":""},{"line_number":2371,"context_line":"        self.assertTableExists(table_name)"},{"line_number":2372,"context_line":"        self.assertTableColumns(table_name,"},{"line_number":2373,"context_line":"                                [\u0027id\u0027, \u0027project_id\u0027, \u0027name\u0027])"},{"line_number":2374,"context_line":""},{"line_number":2375,"context_line":""},{"line_number":2376,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1f1a1f67_3809e630","line":2373,"updated":"2017-07-20 19:13:51.000000000","message":"This should also probably test the foreign key constrain with project name some where.\n\n  - create a project in the database\n  - create some tags for that project\n  - delete the project\n  - assert the tags were also removed","commit_id":"e343e59a823b0cc096743f4b1fd76fc60fd5b720"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"bc225e9421df7e1e6ccd4c936bd4b9f9dcec49eb","unresolved":false,"context_lines":[{"line_number":2386,"context_line":""},{"line_number":2387,"context_line":"        project \u003d {"},{"line_number":2388,"context_line":"            \u0027id\u0027: project_id,"},{"line_number":2389,"context_line":"            \u0027name\u0027: project_id,"},{"line_number":2390,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":2391,"context_line":"            \u0027domain_id\u0027: resource_base.NULL_DOMAIN_ID,"},{"line_number":2392,"context_line":"            \u0027is_domain\u0027: False"}],"source_content_type":"text/x-python","patch_set":22,"id":"ff346bd7_b6ba306b","line":2389,"updated":"2017-07-26 15:27:17.000000000","message":"nit: \n\n  \u0027name\u0027: uuid.uuid4().hex","commit_id":"dc3d0407ffbdad6fac1f0c12bc7f89d75d5eb589"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"abcb0ca0bbaef4d0352199982e254bdaf98ebf46","unresolved":false,"context_lines":[{"line_number":2386,"context_line":""},{"line_number":2387,"context_line":"        project \u003d {"},{"line_number":2388,"context_line":"            \u0027id\u0027: project_id,"},{"line_number":2389,"context_line":"            \u0027name\u0027: project_id,"},{"line_number":2390,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":2391,"context_line":"            \u0027domain_id\u0027: resource_base.NULL_DOMAIN_ID,"},{"line_number":2392,"context_line":"            \u0027is_domain\u0027: False"}],"source_content_type":"text/x-python","patch_set":22,"id":"ff346bd7_cc164056","line":2389,"in_reply_to":"ff346bd7_b6ba306b","updated":"2017-07-26 17:18:17.000000000","message":"Done","commit_id":"dc3d0407ffbdad6fac1f0c12bc7f89d75d5eb589"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fa6a1c921bfd46531e6549a43e335047a0f4262f","unresolved":false,"context_lines":[{"line_number":2399,"context_line":""},{"line_number":2400,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":2401,"context_line":"        self.insert_dict(session, \u0027project_tag\u0027, tag)"},{"line_number":2402,"context_line":""},{"line_number":2403,"context_line":"        tags_query \u003d session.query(tag_table).filter_by("},{"line_number":2404,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2405,"context_line":"        self.assertThat(tags_query, matchers.HasLength(1))"}],"source_content_type":"text/x-python","patch_set":28,"id":"ff346bd7_2c723a7c","line":2402,"updated":"2017-07-27 19:27:42.000000000","message":"We should also test the unique constraint. If we attempt to add the tag twice, we should expect an error since we create the Uniqueness constraint.\n\nIn addition to that - we can also test the FK bits here, too.","commit_id":"813b6f5811b87288cd94bdf612745f0e4bdf19b2"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"c900b35ca6f8563aaa66c98666b133883fbdd6ab","unresolved":false,"context_lines":[{"line_number":2399,"context_line":""},{"line_number":2400,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":2401,"context_line":"        self.insert_dict(session, \u0027project_tag\u0027, tag)"},{"line_number":2402,"context_line":""},{"line_number":2403,"context_line":"        tags_query \u003d session.query(tag_table).filter_by("},{"line_number":2404,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2405,"context_line":"        self.assertThat(tags_query, matchers.HasLength(1))"}],"source_content_type":"text/x-python","patch_set":28,"id":"df3967d1_14e17aff","line":2402,"in_reply_to":"ff346bd7_2c723a7c","updated":"2017-07-28 18:02:59.000000000","message":"Done","commit_id":"813b6f5811b87288cd94bdf612745f0e4bdf19b2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"fa6a1c921bfd46531e6549a43e335047a0f4262f","unresolved":false,"context_lines":[{"line_number":2412,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2413,"context_line":"        self.assertThat(tags_query, matchers.HasLength(0))"},{"line_number":2414,"context_line":""},{"line_number":2415,"context_line":"        session.close()"},{"line_number":2416,"context_line":""},{"line_number":2417,"context_line":""},{"line_number":2418,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"}],"source_content_type":"text/x-python","patch_set":28,"id":"ff346bd7_ac662ac0","line":2415,"updated":"2017-07-27 19:27:42.000000000","message":"Is this required? I don\u0027t see this in other tests","commit_id":"813b6f5811b87288cd94bdf612745f0e4bdf19b2"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"c900b35ca6f8563aaa66c98666b133883fbdd6ab","unresolved":false,"context_lines":[{"line_number":2412,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2413,"context_line":"        self.assertThat(tags_query, matchers.HasLength(0))"},{"line_number":2414,"context_line":""},{"line_number":2415,"context_line":"        session.close()"},{"line_number":2416,"context_line":""},{"line_number":2417,"context_line":""},{"line_number":2418,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"}],"source_content_type":"text/x-python","patch_set":28,"id":"ff346bd7_4e3a0b99","line":2415,"in_reply_to":"ff346bd7_ac662ac0","updated":"2017-07-28 18:02:59.000000000","message":"Probably not as we are not doing another upgrade during the test - but there are tests that has them at the end to clean up: https://github.com/openstack/keystone/blob/master/keystone/tests/unit/test_sql_upgrade.py#L724\n\nWill remove","commit_id":"813b6f5811b87288cd94bdf612745f0e4bdf19b2"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"6bb96f1c6870e83fc57c0f9fede264dc9bbe0c40","unresolved":false,"context_lines":[{"line_number":2412,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2413,"context_line":"        self.assertThat(tags_query, matchers.HasLength(0))"},{"line_number":2414,"context_line":""},{"line_number":2415,"context_line":"        session.close()"},{"line_number":2416,"context_line":""},{"line_number":2417,"context_line":""},{"line_number":2418,"context_line":"class MySQLOpportunisticFullMigration(FullMigration):"}],"source_content_type":"text/x-python","patch_set":29,"id":"ff346bd7_3a92694d","line":2415,"updated":"2017-07-27 21:27:22.000000000","message":"Comments from the previous patch set still apply.","commit_id":"ba9a4e37d47b34cfcd9404888347ab6b6be1a3f3"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"564567b79872b4fd891bf48caec254df39cf7c68","unresolved":false,"context_lines":[{"line_number":2355,"context_line":"        self.assertTableColumns(user_option,"},{"line_number":2356,"context_line":"                                [\u0027user_id\u0027, \u0027option_id\u0027, \u0027option_value\u0027])"},{"line_number":2357,"context_line":""},{"line_number":2358,"context_line":"    def test_migration_024_add_created_expires_at_int_columns_password(self):"},{"line_number":2359,"context_line":"        self.expand(23)"},{"line_number":2360,"context_line":"        self.migrate(23)"},{"line_number":2361,"context_line":"        self.contract(23)"}],"source_content_type":"text/x-python","patch_set":36,"id":"7f287b81_223a2be6","line":2358,"updated":"2017-08-30 03:34:39.000000000","message":"let\u0027s not make unrelated changes in this patch","commit_id":"f59df5e629b76ff6a56fea79b3dc2fdf20e083cb"},{"author":{"_account_id":20466,"name":"Tin Lam","email":"tin@lam.wtf","username":"tinlam"},"change_message_id":"4b243c34c2ad4f29cb1af3936614bc06e3e8f9f3","unresolved":false,"context_lines":[{"line_number":2355,"context_line":"        self.assertTableColumns(user_option,"},{"line_number":2356,"context_line":"                                [\u0027user_id\u0027, \u0027option_id\u0027, \u0027option_value\u0027])"},{"line_number":2357,"context_line":""},{"line_number":2358,"context_line":"    def test_migration_024_add_created_expires_at_int_columns_password(self):"},{"line_number":2359,"context_line":"        self.expand(23)"},{"line_number":2360,"context_line":"        self.migrate(23)"},{"line_number":2361,"context_line":"        self.contract(23)"}],"source_content_type":"text/x-python","patch_set":36,"id":"7f287b81_27a59a47","line":2358,"in_reply_to":"7f287b81_223a2be6","updated":"2017-08-30 05:57:40.000000000","message":"Done","commit_id":"f59df5e629b76ff6a56fea79b3dc2fdf20e083cb"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"85be64718604a0ca630bcc75844e8fc208e25fb2","unresolved":false,"context_lines":[{"line_number":2446,"context_line":"        tag_table \u003d sqlalchemy.Table("},{"line_number":2447,"context_line":"            \u0027project_tag\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2448,"context_line":""},{"line_number":2449,"context_line":"        session \u003d self.sessionmaker()"},{"line_number":2450,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2451,"context_line":""},{"line_number":2452,"context_line":"        project \u003d {"},{"line_number":2453,"context_line":"            \u0027id\u0027: project_id,"},{"line_number":2454,"context_line":"            \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2455,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":2456,"context_line":"            \u0027domain_id\u0027: resource_base.NULL_DOMAIN_ID,"},{"line_number":2457,"context_line":"            \u0027is_domain\u0027: False"},{"line_number":2458,"context_line":"        }"},{"line_number":2459,"context_line":""},{"line_number":2460,"context_line":"        tag \u003d {"},{"line_number":2461,"context_line":"            \u0027project_id\u0027: project_id,"},{"line_number":2462,"context_line":"            \u0027name\u0027: uuid.uuid4().hex"},{"line_number":2463,"context_line":"        }"},{"line_number":2464,"context_line":""},{"line_number":2465,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":2466,"context_line":"        self.insert_dict(session, \u0027project_tag\u0027, tag)"},{"line_number":2467,"context_line":""},{"line_number":2468,"context_line":"        tags_query \u003d session.query(tag_table).filter_by("},{"line_number":2469,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2470,"context_line":"        self.assertThat(tags_query, matchers.HasLength(1))"},{"line_number":2471,"context_line":""},{"line_number":2472,"context_line":"        session.execute("},{"line_number":2473,"context_line":"            project_table.delete().where(project_table.c.id \u003d\u003d project_id)"},{"line_number":2474,"context_line":"        )"},{"line_number":2475,"context_line":""},{"line_number":2476,"context_line":"        tags_query \u003d session.query(tag_table).filter_by("},{"line_number":2477,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2478,"context_line":"        self.assertThat(tags_query, matchers.HasLength(0))"},{"line_number":2479,"context_line":""},{"line_number":2480,"context_line":"        session.close()"},{"line_number":2481,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"7f287b81_e96259d8","line":2478,"range":{"start_line":2449,"start_character":0,"end_line":2478,"end_character":58},"updated":"2017-09-04 13:49:31.000000000","message":"what is this trying to exercise? the table contains only 1 row (for 1 project_id)","commit_id":"a65caf8e6a5e084f488ac870b8770cf2928e3a77"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"be26f85548ddf1e47f0bff3b6de7b84c9210bf1f","unresolved":false,"context_lines":[{"line_number":2446,"context_line":"        tag_table \u003d sqlalchemy.Table("},{"line_number":2447,"context_line":"            \u0027project_tag\u0027, self.metadata, autoload\u003dTrue)"},{"line_number":2448,"context_line":""},{"line_number":2449,"context_line":"        session \u003d self.sessionmaker()"},{"line_number":2450,"context_line":"        project_id \u003d uuid.uuid4().hex"},{"line_number":2451,"context_line":""},{"line_number":2452,"context_line":"        project \u003d {"},{"line_number":2453,"context_line":"            \u0027id\u0027: project_id,"},{"line_number":2454,"context_line":"            \u0027name\u0027: uuid.uuid4().hex,"},{"line_number":2455,"context_line":"            \u0027enabled\u0027: True,"},{"line_number":2456,"context_line":"            \u0027domain_id\u0027: resource_base.NULL_DOMAIN_ID,"},{"line_number":2457,"context_line":"            \u0027is_domain\u0027: False"},{"line_number":2458,"context_line":"        }"},{"line_number":2459,"context_line":""},{"line_number":2460,"context_line":"        tag \u003d {"},{"line_number":2461,"context_line":"            \u0027project_id\u0027: project_id,"},{"line_number":2462,"context_line":"            \u0027name\u0027: uuid.uuid4().hex"},{"line_number":2463,"context_line":"        }"},{"line_number":2464,"context_line":""},{"line_number":2465,"context_line":"        self.insert_dict(session, \u0027project\u0027, project)"},{"line_number":2466,"context_line":"        self.insert_dict(session, \u0027project_tag\u0027, tag)"},{"line_number":2467,"context_line":""},{"line_number":2468,"context_line":"        tags_query \u003d session.query(tag_table).filter_by("},{"line_number":2469,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2470,"context_line":"        self.assertThat(tags_query, matchers.HasLength(1))"},{"line_number":2471,"context_line":""},{"line_number":2472,"context_line":"        session.execute("},{"line_number":2473,"context_line":"            project_table.delete().where(project_table.c.id \u003d\u003d project_id)"},{"line_number":2474,"context_line":"        )"},{"line_number":2475,"context_line":""},{"line_number":2476,"context_line":"        tags_query \u003d session.query(tag_table).filter_by("},{"line_number":2477,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2478,"context_line":"        self.assertThat(tags_query, matchers.HasLength(0))"},{"line_number":2479,"context_line":""},{"line_number":2480,"context_line":"        session.close()"},{"line_number":2481,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"7f287b81_f5b7ca39","line":2478,"range":{"start_line":2449,"start_character":0,"end_line":2478,"end_character":58},"in_reply_to":"7f287b81_e96259d8","updated":"2017-09-04 16:50:21.000000000","message":"This is just testing that the migration for adding the tags table was successful and that we can add a tag, and then query it.","commit_id":"a65caf8e6a5e084f488ac870b8770cf2928e3a77"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"85be64718604a0ca630bcc75844e8fc208e25fb2","unresolved":false,"context_lines":[{"line_number":2476,"context_line":"        tags_query \u003d session.query(tag_table).filter_by("},{"line_number":2477,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2478,"context_line":"        self.assertThat(tags_query, matchers.HasLength(0))"},{"line_number":2479,"context_line":""},{"line_number":2480,"context_line":"        session.close()"},{"line_number":2481,"context_line":""},{"line_number":2482,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"7f287b81_09a925dc","line":2479,"updated":"2017-09-04 13:49:31.000000000","message":"I think it would be better to test the uniqueness/pk constraint.","commit_id":"a65caf8e6a5e084f488ac870b8770cf2928e3a77"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"8dad3c09f0d9d2a201e301fc7727e7a165e52fba","unresolved":false,"context_lines":[{"line_number":2476,"context_line":"        tags_query \u003d session.query(tag_table).filter_by("},{"line_number":2477,"context_line":"            project_id\u003dproject_id).all()"},{"line_number":2478,"context_line":"        self.assertThat(tags_query, matchers.HasLength(0))"},{"line_number":2479,"context_line":""},{"line_number":2480,"context_line":"        session.close()"},{"line_number":2481,"context_line":""},{"line_number":2482,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"7f287b81_7d3c7c92","line":2479,"in_reply_to":"7f287b81_09a925dc","updated":"2017-09-07 21:22:49.000000000","message":"Done","commit_id":"a65caf8e6a5e084f488ac870b8770cf2928e3a77"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"f7f0352dd2cece187bb14296a311d3f879eb5d67","unresolved":false,"context_lines":[{"line_number":2423,"context_line":""},{"line_number":2424,"context_line":"    def test_migration_030_expand_add_project_tags_table(self):"},{"line_number":2425,"context_line":"        if self.engine.name \u003d\u003d \u0027sqlite\u0027:"},{"line_number":2426,"context_line":"            self.skipTest(\u0027sqlite backend does not support foreign keys\u0027)"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        self.expand(29)"},{"line_number":2429,"context_line":"        self.migrate(29)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7f515b1d_1e3a08cb","line":2426,"range":{"start_line":2426,"start_character":11,"end_line":2426,"end_character":73},"updated":"2017-09-28 20:26:25.000000000","message":"We could isolate this into it\u0027s own test. We can have a test that runs against sqlite/mysql/postgresql that ensures the schema is correct and the table is added in migration 30. A separate test can be written specific to mysql/postgresql that ensures tags are removed when projects are deleted because of the FK (this test would be skipped with sqlite because it doesn\u0027t support FK - at least until https://review.openstack.org/#/c/126030/ ).","commit_id":"3125c35d17da960ad61eaf1ab9bfac67ccb19e5d"},{"author":{"_account_id":21420,"name":"Gage Hugo","email":"gagehugo@gmail.com","username":"ghugo"},"change_message_id":"96132a88ced740305b8a2107bc61df61d0756bc5","unresolved":false,"context_lines":[{"line_number":2423,"context_line":""},{"line_number":2424,"context_line":"    def test_migration_030_expand_add_project_tags_table(self):"},{"line_number":2425,"context_line":"        if self.engine.name \u003d\u003d \u0027sqlite\u0027:"},{"line_number":2426,"context_line":"            self.skipTest(\u0027sqlite backend does not support foreign keys\u0027)"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        self.expand(29)"},{"line_number":2429,"context_line":"        self.migrate(29)"}],"source_content_type":"text/x-python","patch_set":42,"id":"7f515b1d_76fe8e6b","line":2426,"range":{"start_line":2426,"start_character":11,"end_line":2426,"end_character":73},"in_reply_to":"7f515b1d_1e3a08cb","updated":"2017-10-02 19:57:17.000000000","message":"Done","commit_id":"3125c35d17da960ad61eaf1ab9bfac67ccb19e5d"}]}
