)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"c4866a2936a073453c3933a4f825c6516f763833","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Future incompatible changes in sqlalchemy models, like removing,"},{"line_number":10,"context_line":"renaming columns and tables can break rolling upgrades (upgrades when"},{"line_number":11,"context_line":"Keystone services are run at different versions simultaneously). This"},{"line_number":12,"context_line":"patch bans chema changes which cause incompatibilities - specifically"},{"line_number":13,"context_line":"drops and alters."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"After this test is merged, we can be sure that schema migrations can"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"fa80f949_0b803c8a","line":12,"updated":"2015-11-06 13:58:07.000000000","message":"s/bans chema/ban schema","commit_id":"818d64741efd4c55c4c682bd8742019bbe4e1056"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"d3f944963714bd288762d212dc594a5cacc95ffe","unresolved":false,"context_lines":[{"line_number":16,"context_line":"schema migrations can be done online, allowing for rolling upgrades."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Closes-Bug: #1509944"},{"line_number":19,"context_line":"Implements: bp online-schema-migration"},{"line_number":20,"context_line":"Change-Id: I080cba842adfd0be5d14a51a5ada1ae2ea62863b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ba8a016a_a812e156","line":19,"updated":"2015-11-20 15:32:48.000000000","message":"I think this could be changed to `Partially-Implements` because we will still need documentation around this.","commit_id":"663bf46d66c4c4d23a78666932fe16df3ad4405b"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"541c5e4d9c97eb06b59a89c928555268b19f897f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Unit test for checking cross-version migrations compatibility"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Future incompatible changes in sqlalchemy models, like removing,"},{"line_number":10,"context_line":"renaming columns and tables can break rolling upgrades (upgrades when"},{"line_number":11,"context_line":"Keystone services are run at different versions simultaneously). This"},{"line_number":12,"context_line":"patch bans schema changes which cause incompatibilities - specifically"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"fa69d971_9492a956","line":9,"updated":"2015-12-29 22:41:03.000000000","message":"suggest change \"sqlalchemy models\" to \"database schema\". sqlalchemy models are an implementation detail.","commit_id":"39550718422200b67e98ce71308ac323bf870e93"}],"keystone/tests/unit/test_sql_banned_operations.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"426c41eea24a17bfaff62d83e01af87f87eada02","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2013 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_2b1660f1","line":1,"updated":"2015-11-06 13:57:16.000000000","message":"Does this correct?","commit_id":"818d64741efd4c55c4c682bd8742019bbe4e1056"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"426c41eea24a17bfaff62d83e01af87f87eada02","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import fixtures"},{"line_number":17,"context_line":"import os"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from migrate.versioning import repository"},{"line_number":20,"context_line":"from oslo_db.sqlalchemy import test_base"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa80f949_6bcea883","line":17,"updated":"2015-11-06 13:57:16.000000000","message":"change this to:\n\n import os (sys lib)\n\n import fixtures (third party lib)\n from migrate.versioning import repository\n ...","commit_id":"818d64741efd4c55c4c682bd8742019bbe4e1056"},{"author":{"_account_id":17860,"name":"Samuel de Medeiros Queiroz","email":"samueldmq@gmail.com","username":"samueldmq"},"change_message_id":"1e988b040d68f666630eda54d975683c059642f5","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @staticmethod"},{"line_number":40,"context_line":"    def _explode(resource, op):"},{"line_number":41,"context_line":"        print(\u0027%s.%s()\u0027 % (resource, op))"},{"line_number":42,"context_line":"        raise DBNotAllowed("},{"line_number":43,"context_line":"            \u0027Operation %s.%s() is not allowed in a database migration\u0027 % ("},{"line_number":44,"context_line":"                resource, op))"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_86a03892","line":41,"updated":"2015-11-07 02:35:50.000000000","message":"Was this for debugging purposes ?","commit_id":"818d64741efd4c55c4c682bd8742019bbe4e1056"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2f268d07fe8e37fe292fefaa3c4734c30caf9833","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    @staticmethod"},{"line_number":40,"context_line":"    def _explode(resource, op):"},{"line_number":41,"context_line":"        print(\u0027%s.%s()\u0027 % (resource, op))"},{"line_number":42,"context_line":"        raise DBNotAllowed("},{"line_number":43,"context_line":"            \u0027Operation %s.%s() is not allowed in a database migration\u0027 % ("},{"line_number":44,"context_line":"                resource, op))"}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_1db0e442","line":41,"in_reply_to":"da85f559_86a03892","updated":"2015-11-09 15:41:41.000000000","message":"++ use logging","commit_id":"818d64741efd4c55c4c682bd8742019bbe4e1056"},{"author":{"_account_id":8978,"name":"Marek Denis","email":"marek.denis+openstack@gmail.com","username":"marek-denis"},"change_message_id":"2f268d07fe8e37fe292fefaa3c4734c30caf9833","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        exceptions \u003d ["},{"line_number":108,"context_line":"            67,  # drop index (example)"},{"line_number":109,"context_line":"        ]"},{"line_number":110,"context_line":"        # Reviewers: DO NOT ALLOW THINGS TO BE ADDED HERE"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # NOTE(xek): We start requiring things be additive in"},{"line_number":113,"context_line":"        # Mitaka, so ignore all migrations before that point."}],"source_content_type":"text/x-python","patch_set":3,"id":"da85f559_3d6608ee","line":110,"updated":"2015-11-09 15:41:41.000000000","message":"a NOTE would be more appropriate.","commit_id":"818d64741efd4c55c4c682bd8742019bbe4e1056"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2c1fdb2aa38a5ab1706a02bf1f7b803fd2192f2a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        # NOTE(xek): This is a list of migrations where we allow dropping"},{"line_number":103,"context_line":"        # things. The rules for adding exceptions are very specific:"},{"line_number":104,"context_line":"        #   1) migrations which don\u0027t cause incompatibilities are allowed"},{"line_number":105,"context_line":"        #      f.ex. dropping an index or constraint"},{"line_number":106,"context_line":"        #   2) migrations removing structures not used in the previous version"},{"line_number":107,"context_line":"        #      are allowed (we keep compatibility between releases), ex.:"},{"line_number":108,"context_line":"        #        a) feature is deprecated in Kilo"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba8a016a_65f18295","line":105,"updated":"2015-11-20 15:31:42.000000000","message":"for example*","commit_id":"663bf46d66c4c4d23a78666932fe16df3ad4405b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2c1fdb2aa38a5ab1706a02bf1f7b803fd2192f2a","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        #        c) table can be dropped only after liberty i.e. in Mitaka"},{"line_number":111,"context_line":"        #   3) any other changes which don\u0027t pass this test are disallowed"},{"line_number":112,"context_line":"        exceptions \u003d ["},{"line_number":113,"context_line":"            67,  # drop index (example)"},{"line_number":114,"context_line":"        ]"},{"line_number":115,"context_line":"        # NOTE(xek): Reviewers: DO NOT ALLOW THINGS TO BE ADDED HERE"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba8a016a_654d02c4","line":113,"updated":"2015-11-20 15:31:42.000000000","message":"The MITAKA_START variable is set to 81, mean that this won\u0027t be caught anyway, right?","commit_id":"663bf46d66c4c4d23a78666932fe16df3ad4405b"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"d6c67381d0be02a92fb9ccf7e1b06b0de0f3127b","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        #        c) table can be dropped only after liberty i.e. in Mitaka"},{"line_number":111,"context_line":"        #   3) any other changes which don\u0027t pass this test are disallowed"},{"line_number":112,"context_line":"        exceptions \u003d ["},{"line_number":113,"context_line":"            67,  # drop index (example)"},{"line_number":114,"context_line":"        ]"},{"line_number":115,"context_line":"        # NOTE(xek): Reviewers: DO NOT ALLOW THINGS TO BE ADDED HERE"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_761f586c","line":113,"in_reply_to":"ba8a016a_654d02c4","updated":"2015-11-27 10:02:52.000000000","message":"yes","commit_id":"663bf46d66c4c4d23a78666932fe16df3ad4405b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2c1fdb2aa38a5ab1706a02bf1f7b803fd2192f2a","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        exceptions \u003d ["},{"line_number":113,"context_line":"            67,  # drop index (example)"},{"line_number":114,"context_line":"        ]"},{"line_number":115,"context_line":"        # NOTE(xek): Reviewers: DO NOT ALLOW THINGS TO BE ADDED HERE"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # NOTE(xek): We start requiring things be additive in Mitaka,"},{"line_number":118,"context_line":"        # so ignore all migrations before that point."}],"source_content_type":"text/x-python","patch_set":6,"id":"ba8a016a_25785af8","line":115,"updated":"2015-11-20 15:31:42.000000000","message":"you mean to the exceptions list? \n\nSuggest moving this comment *into* the exception list so that it is more descriptive and explicit.","commit_id":"663bf46d66c4c4d23a78666932fe16df3ad4405b"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"d6c67381d0be02a92fb9ccf7e1b06b0de0f3127b","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        exceptions \u003d ["},{"line_number":113,"context_line":"            67,  # drop index (example)"},{"line_number":114,"context_line":"        ]"},{"line_number":115,"context_line":"        # NOTE(xek): Reviewers: DO NOT ALLOW THINGS TO BE ADDED HERE"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"        # NOTE(xek): We start requiring things be additive in Mitaka,"},{"line_number":118,"context_line":"        # so ignore all migrations before that point."}],"source_content_type":"text/x-python","patch_set":6,"id":"9a8ffd7b_8132b8f0","line":115,"in_reply_to":"ba8a016a_25785af8","updated":"2015-11-27 10:02:52.000000000","message":"Yes. This was the wording used by Dan Smith, I think I will add a link to documentation, and instruct others to not allow things to be added here before reading the documentation.","commit_id":"663bf46d66c4c4d23a78666932fe16df3ad4405b"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2c1fdb2aa38a5ab1706a02bf1f7b803fd2192f2a","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            banned \u003d [\u0027Table\u0027, \u0027Column\u0027]"},{"line_number":123,"context_line":"        else:"},{"line_number":124,"context_line":"            banned \u003d None"},{"line_number":125,"context_line":"        with BannedDBSchemaOperations(banned):"},{"line_number":126,"context_line":"            super(KeystoneMigrationsCheckers,"},{"line_number":127,"context_line":"                  self).migrate_up(version, with_data)"},{"line_number":128,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba8a016a_65fbc248","line":125,"updated":"2015-11-20 15:31:42.000000000","message":"nit: I suggest passing `banned` as a kwarg since it is defined as one in the method signature.","commit_id":"663bf46d66c4c4d23a78666932fe16df3ad4405b"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"d62dcedd8d67698c7b886bc27c7e8ddb415f6383","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        #"},{"line_number":121,"context_line":"        # 3) Any other changes which don\u0027t pass this test are disallowed."},{"line_number":122,"context_line":"        #"},{"line_number":123,"context_line":"        # TODO(xek): Link to documentation."},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        exceptions \u003d ["},{"line_number":126,"context_line":"            # NOTE(xek): Reviewers: DO NOT ALLOW THINGS TO BE ADDED HERE"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a710552_7c3cc52f","line":123,"updated":"2015-12-14 19:02:37.000000000","message":":)","commit_id":"bcef740c24e249186449c311fac22de30fa2de43"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"541c5e4d9c97eb06b59a89c928555268b19f897f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_5473d14d","line":1,"updated":"2015-12-29 22:41:03.000000000","message":"remove the copyright unless you work for the openstack foundation.","commit_id":"39550718422200b67e98ce71308ac323bf870e93"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"541c5e4d9c97eb06b59a89c928555268b19f897f","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def setUp(self):"},{"line_number":46,"context_line":"        super(BannedDBSchemaOperations, self).setUp()"},{"line_number":47,"context_line":"        for thing in self._banned_resources:"},{"line_number":48,"context_line":"            self.useFixture(fixtures.MonkeyPatch("},{"line_number":49,"context_line":"                \u0027sqlalchemy.%s.drop\u0027 % thing,"},{"line_number":50,"context_line":"                lambda *a, **k: self._explode(thing, \u0027drop\u0027)))"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_34497dd1","line":47,"range":{"start_line":47,"start_character":12,"end_line":47,"end_character":17},"updated":"2015-12-29 22:41:03.000000000","message":"suggest change \"thing\" to \"resource\".","commit_id":"39550718422200b67e98ce71308ac323bf870e93"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"541c5e4d9c97eb06b59a89c928555268b19f897f","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class TestBannedDBSchemaOperations(testtools.TestCase):"},{"line_number":57,"context_line":"    def test_column(self):"},{"line_number":58,"context_line":"        column \u003d sqlalchemy.Column()"},{"line_number":59,"context_line":"        with BannedDBSchemaOperations([\u0027Column\u0027]):"},{"line_number":60,"context_line":"            self.assertRaises(DBNotAllowed, column.drop)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_d487c1d5","line":57,"updated":"2015-12-29 22:41:03.000000000","message":"add a comment what this test is for.","commit_id":"39550718422200b67e98ce71308ac323bf870e93"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"541c5e4d9c97eb06b59a89c928555268b19f897f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"class TestBannedDBSchemaOperations(testtools.TestCase):"},{"line_number":57,"context_line":"    def test_column(self):"},{"line_number":58,"context_line":"        column \u003d sqlalchemy.Column()"},{"line_number":59,"context_line":"        with BannedDBSchemaOperations([\u0027Column\u0027]):"},{"line_number":60,"context_line":"            self.assertRaises(DBNotAllowed, column.drop)"},{"line_number":61,"context_line":"            self.assertRaises(DBNotAllowed, column.alter)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_7454d553","line":59,"updated":"2015-12-29 22:41:03.000000000","message":"suggest give a name to the [\u0027Column\u0027] magic value so that readers know what it is (banned_resources)\n\nsame comment applies at line 65.","commit_id":"39550718422200b67e98ce71308ac323bf870e93"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"541c5e4d9c97eb06b59a89c928555268b19f897f","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            self.assertRaises(DBNotAllowed, column.drop)"},{"line_number":61,"context_line":"            self.assertRaises(DBNotAllowed, column.alter)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_table(self):"},{"line_number":64,"context_line":"        table \u003d sqlalchemy.Table()"},{"line_number":65,"context_line":"        with BannedDBSchemaOperations([\u0027Table\u0027]):"},{"line_number":66,"context_line":"            self.assertRaises(DBNotAllowed, table.drop)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_34773d04","line":63,"updated":"2015-12-29 22:41:03.000000000","message":"add a comment what this test is for.","commit_id":"39550718422200b67e98ce71308ac323bf870e93"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"541c5e4d9c97eb06b59a89c928555268b19f897f","unresolved":false,"context_lines":[{"line_number":70,"context_line":"class KeystoneMigrationsCheckers(test_migrations.WalkVersionsMixin):"},{"line_number":71,"context_line":"    \"\"\"Walk over and test all sqlalchemy-migrate migrations.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    snake_walk \u003d False"},{"line_number":74,"context_line":"    downgrade \u003d False"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa69d971_1468f9f4","line":73,"updated":"2015-12-29 22:41:03.000000000","message":"suggest move these down to where they\u0027re used.","commit_id":"39550718422200b67e98ce71308ac323bf870e93"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2731971bac2914108cfbb126fe38631a75dd870f","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from keystone.common.sql import migrate_repo"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class DBNotAllowed(Exception):"},{"line_number":29,"context_line":"    pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_276d8898","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":18},"updated":"2016-01-21 16:21:44.000000000","message":"nit: DBOperationNotAllowed*\n\nThis could be addressed in a separate patch, just a readability thing.","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"7f2726235dce38191567aae5d327f81fbb8da04d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from keystone.common.sql import migrate_repo"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class DBNotAllowed(Exception):"},{"line_number":29,"context_line":"    pass"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_0b0aa221","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":18},"in_reply_to":"9a68dd71_276d8898","updated":"2016-01-22 11:09:07.000000000","message":"Done","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2731971bac2914108cfbb126fe38631a75dd870f","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class BannedDBSchemaOperations(fixtures.Fixture):"},{"line_number":33,"context_line":"    \"\"\"Ban some operations for migrations\"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, banned_resources\u003dNone):"},{"line_number":36,"context_line":"        super(BannedDBSchemaOperations, self).__init__()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_271b481d","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":44},"updated":"2016-01-21 16:21:44.000000000","message":"End this with a period to be consistent with the ones below.","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"7f2726235dce38191567aae5d327f81fbb8da04d","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class BannedDBSchemaOperations(fixtures.Fixture):"},{"line_number":33,"context_line":"    \"\"\"Ban some operations for migrations\"\"\""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def __init__(self, banned_resources\u003dNone):"},{"line_number":36,"context_line":"        super(BannedDBSchemaOperations, self).__init__()"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_cb148a45","line":33,"range":{"start_line":33,"start_character":4,"end_line":33,"end_character":44},"in_reply_to":"9a68dd71_271b481d","updated":"2016-01-22 11:09:07.000000000","message":"Done","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2731971bac2914108cfbb126fe38631a75dd870f","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class TestBannedDBSchemaOperations(testtools.TestCase):"},{"line_number":57,"context_line":"    \"\"\"Test the BannedDBSchemaOperations fixture\"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test_column(self):"},{"line_number":60,"context_line":"        \"\"\"Test column drops and alters raise DBNotAllowed\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_6721404d","line":57,"range":{"start_line":57,"start_character":4,"end_line":57,"end_character":51},"updated":"2016-01-21 16:21:44.000000000","message":"End this with a period to be consistent with the ones below.","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2731971bac2914108cfbb126fe38631a75dd870f","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    \"\"\"Test the BannedDBSchemaOperations fixture\"\"\""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def test_column(self):"},{"line_number":60,"context_line":"        \"\"\"Test column drops and alters raise DBNotAllowed\"\"\""},{"line_number":61,"context_line":"        column \u003d sqlalchemy.Column()"},{"line_number":62,"context_line":"        with BannedDBSchemaOperations(banned_resources\u003d[\u0027Column\u0027]):"},{"line_number":63,"context_line":"            self.assertRaises(DBNotAllowed, column.drop)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_07be44d4","line":60,"updated":"2016-01-21 16:21:44.000000000","message":"End this with a period to be consistent with the ones below.","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2731971bac2914108cfbb126fe38631a75dd870f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            self.assertRaises(DBNotAllowed, column.alter)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def test_table(self):"},{"line_number":67,"context_line":"        \"\"\"Test table drops and alters raise DBNotAllowed\"\"\""},{"line_number":68,"context_line":"        table \u003d sqlalchemy.Table()"},{"line_number":69,"context_line":"        with BannedDBSchemaOperations(banned_resources\u003d[\u0027Table\u0027]):"},{"line_number":70,"context_line":"            self.assertRaises(DBNotAllowed, table.drop)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_67cf0080","line":67,"updated":"2016-01-21 16:21:44.000000000","message":"End this with a period to be consistent with the ones below.","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2731971bac2914108cfbb126fe38631a75dd870f","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        Schema migrations can be done online, allowing for rolling upgrades."},{"line_number":102,"context_line":"        \"\"\""},{"line_number":103,"context_line":"        # NOTE(xek):"},{"line_number":104,"context_line":"        # This is a list of migrations where we allow dropping and altering"},{"line_number":105,"context_line":"        # things. The rules for adding exceptions are very specific:"},{"line_number":106,"context_line":"        #"},{"line_number":107,"context_line":"        # 1) Migrations which don\u0027t cause incompatibilities are allowed,"},{"line_number":108,"context_line":"        #    for example dropping an index or constraint."},{"line_number":109,"context_line":"        #"},{"line_number":110,"context_line":"        # 2) Migrations removing structures not used in the previous version"},{"line_number":111,"context_line":"        #    are allowed (we keep compatibility between releases), ex.:"},{"line_number":112,"context_line":"        #"},{"line_number":113,"context_line":"        #    a) feature is deprecated according to the deprecation policies"},{"line_number":114,"context_line":"        #       (release 1),"},{"line_number":115,"context_line":"        #"},{"line_number":116,"context_line":"        #    b) code supporting the feature is removed the following release"},{"line_number":117,"context_line":"        #       (release 2),"},{"line_number":118,"context_line":"        #"},{"line_number":119,"context_line":"        #    c) table can be dropped a release after the code has been removed"},{"line_number":120,"context_line":"        #       (i.e. in release 3)."},{"line_number":121,"context_line":"        #"},{"line_number":122,"context_line":"        # 3) Any other changes which don\u0027t pass this test are disallowed."},{"line_number":123,"context_line":"        #"},{"line_number":124,"context_line":"        # Please follow the guidelines outlined at:"},{"line_number":125,"context_line":"        # http://docs.openstack.org/developer/keystone/developing.html#online-migration"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        exceptions \u003d ["},{"line_number":128,"context_line":"            # NOTE(xek): Reviewers: DO NOT ALLOW THINGS TO BE ADDED HERE"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_c7b34ce8","line":125,"range":{"start_line":103,"start_character":8,"end_line":125,"end_character":87},"updated":"2016-01-21 16:21:44.000000000","message":"nit: this entire inline comment could be included in the docstring above.","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2731971bac2914108cfbb126fe38631a75dd870f","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        # http://docs.openstack.org/developer/keystone/developing.html#online-migration"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        exceptions \u003d ["},{"line_number":128,"context_line":"            # NOTE(xek): Reviewers: DO NOT ALLOW THINGS TO BE ADDED HERE"},{"line_number":129,"context_line":"        ]"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # NOTE(xek): We start requiring things be additive in Mitaka, so"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_47d75ced","line":128,"range":{"start_line":128,"start_character":12,"end_line":128,"end_character":72},"updated":"2016-01-21 16:21:44.000000000","message":"nit: do not allow things to be added here unless approved via an out of band process?","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"2731971bac2914108cfbb126fe38631a75dd870f","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        # NOTE(xek): We start requiring things be additive in Mitaka, so"},{"line_number":132,"context_line":"        # ignore all migrations before that point."},{"line_number":133,"context_line":"        MITAKA_START \u003d 81"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        if version \u003e\u003d MITAKA_START and version not in exceptions:"},{"line_number":136,"context_line":"            banned \u003d [\u0027Table\u0027, \u0027Column\u0027]"}],"source_content_type":"text/x-python","patch_set":13,"id":"9a68dd71_4773dc15","line":133,"range":{"start_line":133,"start_character":23,"end_line":133,"end_character":25},"updated":"2016-01-21 16:21:44.000000000","message":"Note that this will change the next time we have a migration collapse.","commit_id":"d692ea8e9c0bc4d88147e806557fcf9dec296334"}],"test-requirements.txt":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"426c41eea24a17bfaff62d83e01af87f87eada02","unresolved":false,"context_lines":[{"line_number":38,"context_line":"requests!\u003d2.8.0,\u003e\u003d2.5.2"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# For fixtures from oslo.db"},{"line_number":41,"context_line":"testresources\u003e\u003d0.2.4"}],"source_content_type":"text/plain","patch_set":3,"id":"fa80f949_2bd740ee","line":41,"updated":"2015-11-06 13:57:16.000000000","message":"where does this used?","commit_id":"818d64741efd4c55c4c682bd8742019bbe4e1056"},{"author":{"_account_id":14250,"name":"Grzegorz Grasza","email":"xek@redhat.com","username":"xek"},"change_message_id":"6be99c85de5e46e563323f922bce4934282dac96","unresolved":false,"context_lines":[{"line_number":38,"context_line":"requests!\u003d2.8.0,\u003e\u003d2.5.2"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# For fixtures from oslo.db"},{"line_number":41,"context_line":"testresources\u003e\u003d0.2.4"}],"source_content_type":"text/plain","patch_set":3,"id":"fa80f949_863f4186","line":41,"in_reply_to":"fa80f949_2bd740ee","updated":"2015-11-06 14:04:47.000000000","message":"It\u0027s used in\noslo_db/sqlalchemy/test_base.py\n\nwhich is imported by \ntest_sql_banned_operations.py","commit_id":"818d64741efd4c55c4c682bd8742019bbe4e1056"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"541c5e4d9c97eb06b59a89c928555268b19f897f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"requests!\u003d2.9.0,\u003e\u003d2.8.1"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# For fixtures from oslo.db"},{"line_number":42,"context_line":"testresources\u003e\u003d0.2.4"}],"source_content_type":"text/plain","patch_set":8,"id":"fa69d971_1436b903","line":42,"updated":"2015-12-29 22:41:03.000000000","message":"this should be oslo.db[fixtures] ?","commit_id":"39550718422200b67e98ce71308ac323bf870e93"}]}
