)]}'
{"doc/source/database_migrations.rst":[{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"987caf33a3b13da7d9fad1385e8aa9276f26bf3e","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    Revision ID: \u003cunique revision id\u003e"},{"line_number":67,"context_line":"    Revises: \u003cparent revision id\u003e"},{"line_number":68,"context_line":"    \"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    \u003cyour imports here\u003e"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a30ddce_4f30d3e8","line":68,"updated":"2017-03-09 18:16:43.000000000","message":"Create Date: \u003cdate format\u003e?\n\nAs per current alembic migration scripts?","commit_id":"595c19f79096a902f97e301cc166cd66d8b558d8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"e453e2f52f627470529b254ee044f31cf7852f02","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    Revision ID: \u003cunique revision id\u003e"},{"line_number":67,"context_line":"    Revises: \u003cparent revision id\u003e"},{"line_number":68,"context_line":"    \"\"\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    \u003cyour imports here\u003e"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a30ddce_f9a223fb","line":68,"in_reply_to":"9a30ddce_4f30d3e8","updated":"2017-03-10 00:53:32.000000000","message":"Create Date is not required. It is just something that Alembic generates but not required.","commit_id":"595c19f79096a902f97e301cc166cd66d8b558d8"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"987caf33a3b13da7d9fad1385e8aa9276f26bf3e","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    revision \u003d \u003cunique revision id\u003e"},{"line_number":73,"context_line":"    down_revision \u003d \u003cparent revision id\u003e"},{"line_number":74,"context_line":"    depends_on \u003d None"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def upgrade():"},{"line_number":77,"context_line":"        \u003cyour schema changes here\u003e"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a30ddce_6c2da5fd","line":74,"range":{"start_line":74,"start_character":17,"end_line":74,"end_character":21},"updated":"2017-03-09 18:16:43.000000000","message":"\u003cNone | release_expand\u003e?\nSince this is a generic example, in case of a contract situation, this might be give a wrong impression that depends_on should always be None.","commit_id":"595c19f79096a902f97e301cc166cd66d8b558d8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"e453e2f52f627470529b254ee044f31cf7852f02","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    revision \u003d \u003cunique revision id\u003e"},{"line_number":73,"context_line":"    down_revision \u003d \u003cparent revision id\u003e"},{"line_number":74,"context_line":"    depends_on \u003d None"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def upgrade():"},{"line_number":77,"context_line":"        \u003cyour schema changes here\u003e"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a30ddce_7960f3cf","line":74,"range":{"start_line":74,"start_character":17,"end_line":74,"end_character":21},"in_reply_to":"9a30ddce_6c2da5fd","updated":"2017-03-10 00:53:32.000000000","message":"Good catch. I forgot add the dependency information for contract migrations.","commit_id":"595c19f79096a902f97e301cc166cd66d8b558d8"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"987caf33a3b13da7d9fad1385e8aa9276f26bf3e","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    Revision ID: foo02"},{"line_number":189,"context_line":"    Revises: foo01"},{"line_number":190,"context_line":"    \"\"\""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    revision \u003d foo02"},{"line_number":193,"context_line":"    down_revision \u003d foo01"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a30ddce_0c02693d","line":190,"updated":"2017-03-09 18:16:43.000000000","message":"What about \"Create Date\"?","commit_id":"595c19f79096a902f97e301cc166cd66d8b558d8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"e453e2f52f627470529b254ee044f31cf7852f02","unresolved":false,"context_lines":[{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    Revision ID: foo02"},{"line_number":189,"context_line":"    Revises: foo01"},{"line_number":190,"context_line":"    \"\"\""},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    revision \u003d foo02"},{"line_number":193,"context_line":"    down_revision \u003d foo01"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9a30ddce_19a8d7da","line":190,"in_reply_to":"9a30ddce_0c02693d","updated":"2017-03-10 00:53:32.000000000","message":"Same","commit_id":"595c19f79096a902f97e301cc166cd66d8b558d8"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1cc7e639e2f7e83477c65d6e2e28d2bda6e979fa","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    revision \u003d \u003cunique revision id\u003e"},{"line_number":73,"context_line":"    down_revision \u003d \u003cparent revision id\u003e"},{"line_number":74,"context_line":"    depends_on \u003d None"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def upgrade():"},{"line_number":77,"context_line":"        \u003cyour schema changes here\u003e"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9a30ddce_f49926c5","line":75,"updated":"2017-03-11 00:08:41.000000000","message":"May be reference to the section where you have explained about Depends-On?","commit_id":"57e02a4e5ddd91a18664463fc767dd4d83c9b7c9"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"92137b2a7854ce5bba643c69580d95447f2a6058","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    revision \u003d \u003cunique revision id\u003e"},{"line_number":73,"context_line":"    down_revision \u003d \u003cparent revision id\u003e"},{"line_number":74,"context_line":"    depends_on \u003d None"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def upgrade():"},{"line_number":77,"context_line":"        \u003cyour schema changes here\u003e"},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a25e98e_8d7422fe","line":75,"in_reply_to":"9a30ddce_f49926c5","updated":"2017-03-13 21:15:20.000000000","message":"Done","commit_id":"57e02a4e5ddd91a18664463fc767dd4d83c9b7c9"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1cc7e639e2f7e83477c65d6e2e28d2bda6e979fa","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"  The very first migration, ``liberty`` in our case, would have"},{"line_number":117,"context_line":"  ``down_revision`` set to ``None``. All other migrations must point to the"},{"line_number":118,"context_line":"  last migration in the sequence at the time of writing the migration."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"  For example, Glance has two migrations in Mitaka, namely, ``mitaka01``"},{"line_number":121,"context_line":"  and ``mitaka02``. The migration sequence for Mitaka should look like:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"9a30ddce_1153223a","line":118,"range":{"start_line":118,"start_character":2,"end_line":118,"end_character":6},"updated":"2017-03-11 00:08:41.000000000","message":"s/last/previous","commit_id":"57e02a4e5ddd91a18664463fc767dd4d83c9b7c9"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"643237bc5187822e4b2b5390aaa81927e7fb5f9b","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"  The very first migration, ``liberty`` in our case, would have"},{"line_number":117,"context_line":"  ``down_revision`` set to ``None``. All other migrations must point to the"},{"line_number":118,"context_line":"  last migration in the sequence at the time of writing the migration."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"  For example, Glance has two migrations in Mitaka, namely, ``mitaka01``"},{"line_number":121,"context_line":"  and ``mitaka02``. The migration sequence for Mitaka should look like:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a25e98e_4d86aaba","line":118,"range":{"start_line":118,"start_character":2,"end_line":118,"end_character":6},"in_reply_to":"7a25e98e_2d6dee32","updated":"2017-03-13 21:17:40.000000000","message":"Thanks Hemanth. \"last\" works. :)","commit_id":"57e02a4e5ddd91a18664463fc767dd4d83c9b7c9"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"92137b2a7854ce5bba643c69580d95447f2a6058","unresolved":false,"context_lines":[{"line_number":115,"context_line":""},{"line_number":116,"context_line":"  The very first migration, ``liberty`` in our case, would have"},{"line_number":117,"context_line":"  ``down_revision`` set to ``None``. All other migrations must point to the"},{"line_number":118,"context_line":"  last migration in the sequence at the time of writing the migration."},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"  For example, Glance has two migrations in Mitaka, namely, ``mitaka01``"},{"line_number":121,"context_line":"  and ``mitaka02``. The migration sequence for Mitaka should look like:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"7a25e98e_2d6dee32","line":118,"range":{"start_line":118,"start_character":2,"end_line":118,"end_character":6},"in_reply_to":"9a30ddce_1153223a","updated":"2017-03-13 21:15:20.000000000","message":"Think last is more appropriate because if you are writing ocata_expand02, ocata_expand01 would be the last migration at that point, right?\nGenerally, all migrations would link to their previous ones. But, I\u0027m trying to say that when you are writing a migration you should always link to the last migration in the sequence at that point. Not clear?","commit_id":"57e02a4e5ddd91a18664463fc767dd4d83c9b7c9"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"f9b5595e6e51c5ffeca6ddbd92aa80224c9b71bc","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Copyright 2017 OpenStack Foundation"},{"line_number":3,"context_line":"      All Rights Reserved."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_6fb99c2e","line":2,"updated":"2017-03-16 23:08:20.000000000","message":"is this correct? thought we were not supposed to add copyright for foundation","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Copyright 2017 OpenStack Foundation"},{"line_number":3,"context_line":"      All Rights Reserved."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_2795a9dd","line":2,"in_reply_to":"1a1ced50_4ebba2e5","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":1,"context_line":".."},{"line_number":2,"context_line":"      Copyright 2017 OpenStack Foundation"},{"line_number":3,"context_line":"      All Rights Reserved."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"      Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_4ebba2e5","line":2,"in_reply_to":"1a1ced50_6fb99c2e","updated":"2017-03-20 19:02:43.000000000","message":"Only foundation employees can assert the Foundation copyright [0].  As far as I can tell from [1], the copyright statement is optional (if a dispute happens, the git history provides a record of authorship), but the Apache license is mandatory.\n\nSo I\u0027d say either make it copyright by your employer, or remove lines 2-3 and just leave the Apache license.  Probably depends on what your employer prefers.\n\n[0] https://wiki.openstack.org/wiki/LegalIssuesFAQ#OpenStack_Foundation_Copyright_Headers\n[1] https://wiki.openstack.org/wiki/LegalIssuesFAQ","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"f9b5595e6e51c5ffeca6ddbd92aa80224c9b71bc","unresolved":false,"context_lines":[{"line_number":24,"context_line":"for more information on zero-downtime upgrades in Glance and why a move to"},{"line_number":25,"context_line":"Alembic was deemed necessary."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Essentially, the erstwhile database migrations were always conceived as"},{"line_number":28,"context_line":"monoliths. That is, the idea of impacting schema and data changes at once with"},{"line_number":29,"context_line":"no special consideration for additive and/or contractive schema changes. The"},{"line_number":30,"context_line":"modern database migrations are more sensitive to the characteristics of changes"},{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_2f72447d","line":28,"range":{"start_line":27,"start_character":0,"end_line":28,"end_character":9},"updated":"2017-03-16 23:08:20.000000000","message":"That\u0027s a lot of vocab.","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":24,"context_line":"for more information on zero-downtime upgrades in Glance and why a move to"},{"line_number":25,"context_line":"Alembic was deemed necessary."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Essentially, the erstwhile database migrations were always conceived as"},{"line_number":28,"context_line":"monoliths. That is, the idea of impacting schema and data changes at once with"},{"line_number":29,"context_line":"no special consideration for additive and/or contractive schema changes. The"},{"line_number":30,"context_line":"modern database migrations are more sensitive to the characteristics of changes"},{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_ce279210","line":28,"range":{"start_line":27,"start_character":0,"end_line":28,"end_character":9},"in_reply_to":"1a1ced50_2f72447d","updated":"2017-03-20 19:02:43.000000000","message":"Maybe rewrite the first 2 sentences like this:\n\n\"Prior to Ocata, database migrations were conceived as monoliths.  Thus, they did not need to carefully distinguish and manage database schema expansions, data migrations, or database schema contractions.  The modern database migrations ...\"","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"for more information on zero-downtime upgrades in Glance and why a move to"},{"line_number":25,"context_line":"Alembic was deemed necessary."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Essentially, the erstwhile database migrations were always conceived as"},{"line_number":28,"context_line":"monoliths. That is, the idea of impacting schema and data changes at once with"},{"line_number":29,"context_line":"no special consideration for additive and/or contractive schema changes. The"},{"line_number":30,"context_line":"modern database migrations are more sensitive to the characteristics of changes"},{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_624eaf70","line":28,"range":{"start_line":27,"start_character":0,"end_line":28,"end_character":9},"in_reply_to":"1a1ced50_ce279210","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":28,"context_line":"monoliths. That is, the idea of impacting schema and data changes at once with"},{"line_number":29,"context_line":"no special consideration for additive and/or contractive schema changes. The"},{"line_number":30,"context_line":"modern database migrations are more sensitive to the characteristics of changes"},{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_4e4ba287","line":31,"range":{"start_line":31,"start_character":25,"end_line":31,"end_character":78},"updated":"2017-03-20 19:02:43.000000000","message":"Maybe replace with\n\n\"and thus we clearly identify three phases of a database migration: (1) expand, (2) migrate, and (3) contract.  A developer modifying the Glance database must supply a script for each of these phases.\"","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":28,"context_line":"monoliths. That is, the idea of impacting schema and data changes at once with"},{"line_number":29,"context_line":"no special consideration for additive and/or contractive schema changes. The"},{"line_number":30,"context_line":"modern database migrations are more sensitive to the characteristics of changes"},{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_82780b91","line":31,"range":{"start_line":31,"start_character":25,"end_line":31,"end_character":78},"in_reply_to":"1a1ced50_4e4ba287","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"f9b5595e6e51c5ffeca6ddbd92aa80224c9b71bc","unresolved":false,"context_lines":[{"line_number":30,"context_line":"modern database migrations are more sensitive to the characteristics of changes"},{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"},{"line_number":35,"context_line":"should be seen as the minimal set of schema changes required by the new"},{"line_number":36,"context_line":"services that can be applied while the old services are still running. Data"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_82694f8e","line":33,"updated":"2017-03-16 23:08:20.000000000","message":"recommend demarking or separating the Expand, Migration, and Contract blocks of this paragraph to make it easier on the eye","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":30,"context_line":"modern database migrations are more sensitive to the characteristics of changes"},{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"},{"line_number":35,"context_line":"should be seen as the minimal set of schema changes required by the new"},{"line_number":36,"context_line":"services that can be applied while the old services are still running. Data"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_82ed6b27","line":33,"in_reply_to":"1a1ced50_6e35bef5","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":30,"context_line":"modern database migrations are more sensitive to the characteristics of changes"},{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"},{"line_number":35,"context_line":"should be seen as the minimal set of schema changes required by the new"},{"line_number":36,"context_line":"services that can be applied while the old services are still running. Data"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_6e35bef5","line":33,"in_reply_to":"1a1ced50_82694f8e","updated":"2017-03-20 19:02:43.000000000","message":"I agree with Steve, that would make it easier to read.  You could mark it up as a RST definition list.\n\nMaybe preface the list with something like:\n\n\"Here\u0027s a quick reminder of what each phase entails.  For more information, see [GSPEC1]_.","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"f9b5595e6e51c5ffeca6ddbd92aa80224c9b71bc","unresolved":false,"context_lines":[{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"},{"line_number":35,"context_line":"should be seen as the minimal set of schema changes required by the new"},{"line_number":36,"context_line":"services that can be applied while the old services are still running. Data"},{"line_number":37,"context_line":"migrations MUST NOT attempt any schema changes and only move existing data"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_421d970e","line":34,"range":{"start_line":34,"start_character":59,"end_line":34,"end_character":60},"updated":"2017-03-16 23:08:20.000000000","message":"Consider adding something to this effect:\n\nThe presence of a data migration suggests that there should be a trigger for this purpose.","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"f9b5595e6e51c5ffeca6ddbd92aa80224c9b71bc","unresolved":false,"context_lines":[{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"},{"line_number":35,"context_line":"should be seen as the minimal set of schema changes required by the new"},{"line_number":36,"context_line":"services that can be applied while the old services are still running. Data"},{"line_number":37,"context_line":"migrations MUST NOT attempt any schema changes and only move existing data"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_02b0fff3","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":17},"updated":"2017-03-16 23:08:20.000000000","message":"perhaps\n\ntemporary database triggers","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"},{"line_number":35,"context_line":"should be seen as the minimal set of schema changes required by the new"},{"line_number":36,"context_line":"services that can be applied while the old services are still running. Data"},{"line_number":37,"context_line":"migrations MUST NOT attempt any schema changes and only move existing data"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_a2cb47a4","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":17},"in_reply_to":"1a1ced50_02b0fff3","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"being attempted and thus classified as expand, migrate and contract migrations."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expand migrations MUST strictly be additive in nature and optionally include"},{"line_number":34,"context_line":"database triggers that keep the old and new columns in sync. Expand migrations"},{"line_number":35,"context_line":"should be seen as the minimal set of schema changes required by the new"},{"line_number":36,"context_line":"services that can be applied while the old services are still running. Data"},{"line_number":37,"context_line":"migrations MUST NOT attempt any schema changes and only move existing data"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_3d48565b","line":34,"range":{"start_line":34,"start_character":59,"end_line":34,"end_character":60},"in_reply_to":"1a1ced50_421d970e","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"f9b5595e6e51c5ffeca6ddbd92aa80224c9b71bc","unresolved":false,"context_lines":[{"line_number":39,"context_line":"tables and/or columns introduced by the expand migrations. Contract migrations"},{"line_number":40,"context_line":"usually include the remaining schema changes required by the new services that"},{"line_number":41,"context_line":"couldn\u0027t be applied during expand phase due to their incompatible nature with"},{"line_number":42,"context_line":"the old services."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Alembic Migrations"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_a2a00ba7","line":42,"range":{"start_line":42,"start_character":16,"end_line":42,"end_character":17},"updated":"2017-03-16 23:08:20.000000000","message":"Consider including mention of the removal of triggers.","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"tables and/or columns introduced by the expand migrations. Contract migrations"},{"line_number":40,"context_line":"usually include the remaining schema changes required by the new services that"},{"line_number":41,"context_line":"couldn\u0027t be applied during expand phase due to their incompatible nature with"},{"line_number":42,"context_line":"the old services."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"Alembic Migrations"},{"line_number":45,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_823bab9b","line":42,"range":{"start_line":42,"start_character":16,"end_line":42,"end_character":17},"in_reply_to":"1a1ced50_a2a00ba7","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":50,"context_line":"Here are some things to keep in mind while writing Glance migrations. Let\u0027s"},{"line_number":51,"context_line":"first look at schema migrations."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Schema (Expand/Contract) Migrations"},{"line_number":54,"context_line":"-----------------------------------"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"* All Glance schema migrations must reside in"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_accb3ea4","line":53,"updated":"2017-03-20 19:02:43.000000000","message":"Maybe,\n\nSchema Migrations (Expand/Contract)","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"Here are some things to keep in mind while writing Glance migrations. Let\u0027s"},{"line_number":51,"context_line":"first look at schema migrations."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Schema (Expand/Contract) Migrations"},{"line_number":54,"context_line":"-----------------------------------"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"* All Glance schema migrations must reside in"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_c22a032c","line":53,"in_reply_to":"1a1ced50_accb3ea4","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":56,"context_line":"* All Glance schema migrations must reside in"},{"line_number":57,"context_line":"  ``glance.db.sqlalchemy.alembic_migrations.versions`` package"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* Every Glance schema migration should be a python module with the following"},{"line_number":60,"context_line":"  structure"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"  .. code::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_cc45da17","line":59,"range":{"start_line":59,"start_character":32,"end_line":59,"end_character":38},"updated":"2017-03-20 19:02:43.000000000","message":"must","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":56,"context_line":"* All Glance schema migrations must reside in"},{"line_number":57,"context_line":"  ``glance.db.sqlalchemy.alembic_migrations.versions`` package"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"* Every Glance schema migration should be a python module with the following"},{"line_number":60,"context_line":"  structure"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"  .. code::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_021dfb0e","line":59,"range":{"start_line":59,"start_character":32,"end_line":59,"end_character":38},"in_reply_to":"1a1ced50_cc45da17","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"f9b5595e6e51c5ffeca6ddbd92aa80224c9b71bc","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"  .. code::"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    \u003crelease name\u003e_\u003cexpand/contract\u003e\u003ctwo-digit sequence number per release\u003e"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"  Example:"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_1b878610","line":95,"range":{"start_line":95,"start_character":19,"end_line":95,"end_character":36},"updated":"2017-03-16 23:08:20.000000000","message":"these are string match options, so we should probably put them in [] instead of \u003c\u003e as that is the well understood convention","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"  .. code::"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    \u003crelease name\u003e_\u003cexpand/contract\u003e\u003ctwo-digit sequence number per release\u003e"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"  Example:"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_a2b507ef","line":95,"range":{"start_line":95,"start_character":19,"end_line":95,"end_character":36},"in_reply_to":"1a1ced50_1b878610","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"  .. code::"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    \u003crelease name\u003e_\u003cexpand/contract\u003e\u003ctwo-digit sequence number per release\u003e"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"  Example:"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_2c4d8e6c","line":95,"range":{"start_line":95,"start_character":19,"end_line":95,"end_character":36},"in_reply_to":"1a1ced50_1b878610","updated":"2017-03-20 19:02:43.000000000","message":"agree, and change the \u0027/\u0027 to a \u0027|\u0027\n\nThe examples that follow help clarify the expression.","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":106,"context_line":"  migration sequence. While the ``\u003crelease name\u003e`` mentions the release a"},{"line_number":107,"context_line":"  migration belongs to, the ``\u003ctwo-digit sequence number per release\u003e`` helps"},{"line_number":108,"context_line":"  identify the order of migrations within each release. For modern migrations,"},{"line_number":109,"context_line":"  the ``\u003cexpand/contract\u003e`` part of the revision id helps identify the"},{"line_number":110,"context_line":"  revision branch a migration belongs to."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* The ``down_revision`` identifier MUST be specified for all Alembic migration"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_8c3042a0","line":109,"range":{"start_line":109,"start_character":8,"end_line":109,"end_character":25},"updated":"2017-03-20 19:02:43.000000000","message":"[expand|contract]","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":106,"context_line":"  migration sequence. While the ``\u003crelease name\u003e`` mentions the release a"},{"line_number":107,"context_line":"  migration belongs to, the ``\u003ctwo-digit sequence number per release\u003e`` helps"},{"line_number":108,"context_line":"  identify the order of migrations within each release. For modern migrations,"},{"line_number":109,"context_line":"  the ``\u003cexpand/contract\u003e`` part of the revision id helps identify the"},{"line_number":110,"context_line":"  revision branch a migration belongs to."},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* The ``down_revision`` identifier MUST be specified for all Alembic migration"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_42c53359","line":109,"range":{"start_line":109,"start_character":8,"end_line":109,"end_character":25},"in_reply_to":"1a1ced50_8c3042a0","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* The ``down_revision`` identifier MUST be specified for all Alembic migration"},{"line_number":113,"context_line":"  scripts. It points to the previous migration (or ``revision`` in Alembic"},{"line_number":114,"context_line":"  lingo) on which the current migration is based on. This essentially"},{"line_number":115,"context_line":"  establishes a migration sequence very much a like a singly linked list would"},{"line_number":116,"context_line":"  (except that we use a ``previous`` link here instead of the more traditional"},{"line_number":117,"context_line":"  ``next`` link.)"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_8cbe82d2","line":114,"range":{"start_line":114,"start_character":48,"end_line":114,"end_character":51},"updated":"2017-03-20 19:02:43.000000000","message":"don\u0027t need this \"on\", you caught it with the \"on which\".  (Or, you could drop the earlier \"on\" and leave this one.  Your choice.)","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":111,"context_line":""},{"line_number":112,"context_line":"* The ``down_revision`` identifier MUST be specified for all Alembic migration"},{"line_number":113,"context_line":"  scripts. It points to the previous migration (or ``revision`` in Alembic"},{"line_number":114,"context_line":"  lingo) on which the current migration is based on. This essentially"},{"line_number":115,"context_line":"  establishes a migration sequence very much a like a singly linked list would"},{"line_number":116,"context_line":"  (except that we use a ``previous`` link here instead of the more traditional"},{"line_number":117,"context_line":"  ``next`` link.)"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_c2af6392","line":114,"range":{"start_line":114,"start_character":48,"end_line":114,"end_character":51},"in_reply_to":"1a1ced50_8cbe82d2","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":182,"context_line":"  not possible."},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"  For example, the Community Images migration in Ocata includes the"},{"line_number":185,"context_line":"  experimental E-M-C migrations. The expand migrations is ``ocata_expand01``"},{"line_number":186,"context_line":"  and the contract migration is ``ocata_contract01``. The dependency is"},{"line_number":187,"context_line":"  established as below."},{"line_number":188,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_cc879ad5","line":185,"range":{"start_line":185,"start_character":53,"end_line":185,"end_character":54},"updated":"2017-03-20 19:02:43.000000000","message":"s/s//","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":182,"context_line":"  not possible."},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"  For example, the Community Images migration in Ocata includes the"},{"line_number":185,"context_line":"  experimental E-M-C migrations. The expand migrations is ``ocata_expand01``"},{"line_number":186,"context_line":"  and the contract migration is ``ocata_contract01``. The dependency is"},{"line_number":187,"context_line":"  established as below."},{"line_number":188,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_4273734d","line":185,"range":{"start_line":185,"start_character":53,"end_line":185,"end_character":54},"in_reply_to":"1a1ced50_cc879ad5","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"f9b5595e6e51c5ffeca6ddbd92aa80224c9b71bc","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    down_revision \u003d \u0027mitaka02\u0027"},{"line_number":193,"context_line":"    depends_on \u003d \u0027ocata_expand01\u0027"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"  Every contract migration in Glance MUST depend on its corresponding expand"},{"line_number":196,"context_line":"  migration. Thus, the current Glance migration sequence looks as shown below:"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"  .. code::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_b65da9ee","line":195,"updated":"2017-03-16 23:08:20.000000000","message":"somewhat unrelated but we need to add a custom Hacking check / test for this someday.","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    down_revision \u003d \u0027mitaka02\u0027"},{"line_number":193,"context_line":"    depends_on \u003d \u0027ocata_expand01\u0027"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"  Every contract migration in Glance MUST depend on its corresponding expand"},{"line_number":196,"context_line":"  migration. Thus, the current Glance migration sequence looks as shown below:"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"  .. code::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_c29da35a","line":195,"in_reply_to":"1a1ced50_b65da9ee","updated":"2017-03-20 19:41:57.000000000","message":"+1","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":225,"context_line":"  ``glance.db.sqlalchemy.alembic_migrations.data_migrations`` package."},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"* The data migrations themselves are not Alembic migration scripts. And, hence"},{"line_number":228,"context_line":"  they don\u0027t a unique revision id. However, they must adhere to a similar"},{"line_number":229,"context_line":"  naming convention discussed above. That is,"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"  .. code::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_4c4baab0","line":228,"range":{"start_line":228,"start_character":7,"end_line":228,"end_character":14},"updated":"2017-03-20 19:02:43.000000000","message":"\"don\u0027t require a\"","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":225,"context_line":"  ``glance.db.sqlalchemy.alembic_migrations.data_migrations`` package."},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"* The data migrations themselves are not Alembic migration scripts. And, hence"},{"line_number":228,"context_line":"  they don\u0027t a unique revision id. However, they must adhere to a similar"},{"line_number":229,"context_line":"  naming convention discussed above. That is,"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"  .. code::"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_a2b187e3","line":228,"range":{"start_line":228,"start_character":7,"end_line":228,"end_character":14},"in_reply_to":"1a1ced50_4c4baab0","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":256,"context_line":"NOTES"},{"line_number":257,"context_line":"-----"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"* Starting Ocata, Glance needs every database migration to include both"},{"line_number":260,"context_line":"  monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some"},{"line_number":261,"context_line":"  point in Pike, E-M-C migrations would be made default. At that point, it"},{"line_number":262,"context_line":"  would be no longer required to include monolithic migration scripts"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_8cf2026e","line":259,"range":{"start_line":259,"start_character":10,"end_line":259,"end_character":11},"updated":"2017-03-20 19:02:43.000000000","message":"\"with\" or \"in\"","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":256,"context_line":"NOTES"},{"line_number":257,"context_line":"-----"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"* Starting Ocata, Glance needs every database migration to include both"},{"line_number":260,"context_line":"  monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some"},{"line_number":261,"context_line":"  point in Pike, E-M-C migrations would be made default. At that point, it"},{"line_number":262,"context_line":"  would be no longer required to include monolithic migration scripts"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_e2cb7f51","line":259,"range":{"start_line":259,"start_character":10,"end_line":259,"end_character":11},"in_reply_to":"1a1ced50_8cf2026e","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":258,"context_line":""},{"line_number":259,"context_line":"* Starting Ocata, Glance needs every database migration to include both"},{"line_number":260,"context_line":"  monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some"},{"line_number":261,"context_line":"  point in Pike, E-M-C migrations would be made default. At that point, it"},{"line_number":262,"context_line":"  would be no longer required to include monolithic migration scripts"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_2cfe6e37","line":261,"range":{"start_line":261,"start_character":34,"end_line":261,"end_character":39},"updated":"2017-03-20 19:02:43.000000000","message":"will","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":258,"context_line":""},{"line_number":259,"context_line":"* Starting Ocata, Glance needs every database migration to include both"},{"line_number":260,"context_line":"  monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some"},{"line_number":261,"context_line":"  point in Pike, E-M-C migrations would be made default. At that point, it"},{"line_number":262,"context_line":"  would be no longer required to include monolithic migration scripts"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_02c7bb45","line":261,"range":{"start_line":261,"start_character":34,"end_line":261,"end_character":39},"in_reply_to":"1a1ced50_2cfe6e37","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":259,"context_line":"* Starting Ocata, Glance needs every database migration to include both"},{"line_number":260,"context_line":"  monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some"},{"line_number":261,"context_line":"  point in Pike, E-M-C migrations would be made default. At that point, it"},{"line_number":262,"context_line":"  would be no longer required to include monolithic migration scripts"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":265,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_8cc042e2","line":262,"range":{"start_line":262,"start_character":68,"end_line":262,"end_character":69},"updated":"2017-03-20 19:02:43.000000000","message":"go ahead and add a period to this and the next paragraph (you\u0027ve already got one on the third)","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":259,"context_line":"* Starting Ocata, Glance needs every database migration to include both"},{"line_number":260,"context_line":"  monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some"},{"line_number":261,"context_line":"  point in Pike, E-M-C migrations would be made default. At that point, it"},{"line_number":262,"context_line":"  would be no longer required to include monolithic migration scripts"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":265,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_62deaf12","line":262,"range":{"start_line":262,"start_character":68,"end_line":262,"end_character":69},"in_reply_to":"1a1ced50_8cc042e2","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":268,"context_line":"  information on Alembic operations"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"* A given change may not necessarily have all expand, migrate and contract"},{"line_number":271,"context_line":"  operations. But, it is recommended that an empty/no-op migration script is"},{"line_number":272,"context_line":"  included. For instance, if a database migration is completely contractive in"},{"line_number":273,"context_line":"  nature, say removing a column, there won\u0027t be a need for expand and migrate"},{"line_number":274,"context_line":"  operations. But, including an empty expand and migrate scripts will make it"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_2c5aee4f","line":271,"range":{"start_line":271,"start_character":45,"end_line":271,"end_character":56},"updated":"2017-03-20 19:02:43.000000000","message":"Let\u0027s call it no-op, since a correctly named empty file will not work.","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":268,"context_line":"  information on Alembic operations"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"* A given change may not necessarily have all expand, migrate and contract"},{"line_number":271,"context_line":"  operations. But, it is recommended that an empty/no-op migration script is"},{"line_number":272,"context_line":"  included. For instance, if a database migration is completely contractive in"},{"line_number":273,"context_line":"  nature, say removing a column, there won\u0027t be a need for expand and migrate"},{"line_number":274,"context_line":"  operations. But, including an empty expand and migrate scripts will make it"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_02cedb59","line":271,"range":{"start_line":271,"start_character":45,"end_line":271,"end_character":56},"in_reply_to":"1a1ced50_2c5aee4f","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":271,"context_line":"  operations. But, it is recommended that an empty/no-op migration script is"},{"line_number":272,"context_line":"  included. For instance, if a database migration is completely contractive in"},{"line_number":273,"context_line":"  nature, say removing a column, there won\u0027t be a need for expand and migrate"},{"line_number":274,"context_line":"  operations. But, including an empty expand and migrate scripts will make it"},{"line_number":275,"context_line":"  explicit and also preserve the one-to-one correspondence between expand,"},{"line_number":276,"context_line":"  migrate and contract scripts. Sample empty expand/contract and migrate"},{"line_number":277,"context_line":"  scripts are shown below."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_a7ac39a1","line":274,"range":{"start_line":274,"start_character":29,"end_line":274,"end_character":37},"updated":"2017-03-20 19:02:43.000000000","message":"s/an empty/no-op/","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":271,"context_line":"  operations. But, it is recommended that an empty/no-op migration script is"},{"line_number":272,"context_line":"  included. For instance, if a database migration is completely contractive in"},{"line_number":273,"context_line":"  nature, say removing a column, there won\u0027t be a need for expand and migrate"},{"line_number":274,"context_line":"  operations. But, including an empty expand and migrate scripts will make it"},{"line_number":275,"context_line":"  explicit and also preserve the one-to-one correspondence between expand,"},{"line_number":276,"context_line":"  migrate and contract scripts. Sample empty expand/contract and migrate"},{"line_number":277,"context_line":"  scripts are shown below."}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_42d8d31d","line":274,"range":{"start_line":274,"start_character":29,"end_line":274,"end_character":37},"in_reply_to":"1a1ced50_a7ac39a1","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":273,"context_line":"  nature, say removing a column, there won\u0027t be a need for expand and migrate"},{"line_number":274,"context_line":"  operations. But, including an empty expand and migrate scripts will make it"},{"line_number":275,"context_line":"  explicit and also preserve the one-to-one correspondence between expand,"},{"line_number":276,"context_line":"  migrate and contract scripts. Sample empty expand/contract and migrate"},{"line_number":277,"context_line":"  scripts are shown below."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"  Empty expand/contract Alembic migration:"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_c7869512","line":276,"range":{"start_line":276,"start_character":30,"end_line":276,"end_character":32},"updated":"2017-03-20 19:02:43.000000000","message":"I think it should also keep the dependency specifications easier?","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":274,"context_line":"  operations. But, including an empty expand and migrate scripts will make it"},{"line_number":275,"context_line":"  explicit and also preserve the one-to-one correspondence between expand,"},{"line_number":276,"context_line":"  migrate and contract scripts. Sample empty expand/contract and migrate"},{"line_number":277,"context_line":"  scripts are shown below."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"  Empty expand/contract Alembic migration:"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_67bb21e6","line":277,"updated":"2017-03-20 19:02:43.000000000","message":"Let\u0027s make this paragraph stronger.  Maybe change the first two sentences to this:\n\nA given database change may not require actions in each of the expand, migrate, contract phases, but nonetheless, we require a script for *each* phase for *every* change.  In the case where an action is not required, you can use a \"no-op\" script as described below.","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":274,"context_line":"  operations. But, including an empty expand and migrate scripts will make it"},{"line_number":275,"context_line":"  explicit and also preserve the one-to-one correspondence between expand,"},{"line_number":276,"context_line":"  migrate and contract scripts. Sample empty expand/contract and migrate"},{"line_number":277,"context_line":"  scripts are shown below."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"  Empty expand/contract Alembic migration:"},{"line_number":280,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_827d6be9","line":277,"in_reply_to":"1a1ced50_67bb21e6","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":276,"context_line":"  migrate and contract scripts. Sample empty expand/contract and migrate"},{"line_number":277,"context_line":"  scripts are shown below."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"  Empty expand/contract Alembic migration:"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"  .. code::"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_ec2616cd","line":279,"range":{"start_line":279,"start_character":2,"end_line":279,"end_character":7},"updated":"2017-03-20 19:02:43.000000000","message":"s/Empty/A no-op/","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":276,"context_line":"  migrate and contract scripts. Sample empty expand/contract and migrate"},{"line_number":277,"context_line":"  scripts are shown below."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"  Empty expand/contract Alembic migration:"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"  .. code::"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_07226db9","line":279,"range":{"start_line":279,"start_character":2,"end_line":279,"end_character":7},"in_reply_to":"1a1ced50_ec2616cd","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":293,"context_line":"    def upgrade():"},{"line_number":294,"context_line":"        pass"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"  Empty migrate script:"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"  .. code::"},{"line_number":299,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_2c082e2c","line":296,"range":{"start_line":296,"start_character":2,"end_line":296,"end_character":7},"updated":"2017-03-20 19:02:43.000000000","message":"s/Empty/A no-op/","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":293,"context_line":"    def upgrade():"},{"line_number":294,"context_line":"        pass"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"  Empty migrate script:"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"  .. code::"},{"line_number":299,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_e72631cd","line":296,"range":{"start_line":296,"start_character":2,"end_line":296,"end_character":7},"in_reply_to":"1a1ced50_2c082e2c","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c8e75483dad6ab020024b2931fd8472ec7abee52","unresolved":false,"context_lines":[{"line_number":306,"context_line":"    def migrate(engine):"},{"line_number":307,"context_line":"        return 0"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"References"},{"line_number":310,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":311,"context_line":".. [GSPEC1] `Database Strategy for Zero-downtime Upgrades in Glance"},{"line_number":312,"context_line":"            \u003chttps://specs.openstack.org/openstack/glance-specs/specs/ocata/implemented/glance/alembic-migrations.html\u003e`_"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_11dd4b0e","line":309,"updated":"2017-03-20 19:02:43.000000000","message":"I think the titles and references are switched for the first two references?  Also, the title of GSPEC1 is actually \"Database strategy for rolling upgrades\"","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"0036cb04e39a8fb5bf981890b6575c8f21f81a6c","unresolved":false,"context_lines":[{"line_number":306,"context_line":"    def migrate(engine):"},{"line_number":307,"context_line":"        return 0"},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"References"},{"line_number":310,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":311,"context_line":".. [GSPEC1] `Database Strategy for Zero-downtime Upgrades in Glance"},{"line_number":312,"context_line":"            \u003chttps://specs.openstack.org/openstack/glance-specs/specs/ocata/implemented/glance/alembic-migrations.html\u003e`_"}],"source_content_type":"text/x-rst","patch_set":3,"id":"1a1ced50_82cbab1d","line":309,"in_reply_to":"1a1ced50_11dd4b0e","updated":"2017-03-20 19:41:57.000000000","message":"Done","commit_id":"d374939a1a3a32b1ef5788fd651c0fdfb7b55ab8"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2abd40ee5c4a39746b1d07c2fde96bc4ff172f08","unresolved":false,"context_lines":[{"line_number":95,"context_line":"* The ``revision`` identifier is a unique revision id for every migration."},{"line_number":96,"context_line":"  It must confirm to one of the following naming schemes."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"  All monolith migrations must confirm to:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"  .. code::"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a1ced50_e191bc53","line":98,"range":{"start_line":98,"start_character":31,"end_line":98,"end_character":38},"updated":"2017-03-20 20:23:25.000000000","message":"s/confirm/conform/","commit_id":"3d47902f99853a2b847f557c0ce0b41a143e0399"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"08d4674e80c033e3741559e29aa4c3302063f3ab","unresolved":false,"context_lines":[{"line_number":95,"context_line":"* The ``revision`` identifier is a unique revision id for every migration."},{"line_number":96,"context_line":"  It must confirm to one of the following naming schemes."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"  All monolith migrations must confirm to:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"  .. code::"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a1ced50_0d31a2ec","line":98,"range":{"start_line":98,"start_character":31,"end_line":98,"end_character":38},"in_reply_to":"1a1ced50_e191bc53","updated":"2017-03-21 01:42:12.000000000","message":"Boo. That\u0027s a bad one.","commit_id":"3d47902f99853a2b847f557c0ce0b41a143e0399"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2abd40ee5c4a39746b1d07c2fde96bc4ff172f08","unresolved":false,"context_lines":[{"line_number":287,"context_line":"  migrate, contract phases, but nonetheless, we require a script for *each*"},{"line_number":288,"context_line":"  phase for *every* change.  In the case where an action is not required, you"},{"line_number":289,"context_line":"  can use a \"no-op\" script as described below."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"  A no-op expand/contract Alembic migration:"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"  .. code::"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a1ced50_818488d4","line":290,"updated":"2017-03-20 20:23:25.000000000","message":"I didn\u0027t mean to imply that you should drop the stuff following \"For instance, \" in PS3.  It\u0027s probably worth mentioning at least that this will help reviewers by keeping a one-to-one correspondence, and in the same way, it will help people writing other migrations in the same cycle.","commit_id":"3d47902f99853a2b847f557c0ce0b41a143e0399"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"08d4674e80c033e3741559e29aa4c3302063f3ab","unresolved":false,"context_lines":[{"line_number":287,"context_line":"  migrate, contract phases, but nonetheless, we require a script for *each*"},{"line_number":288,"context_line":"  phase for *every* change.  In the case where an action is not required, you"},{"line_number":289,"context_line":"  can use a \"no-op\" script as described below."},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"  A no-op expand/contract Alembic migration:"},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"  .. code::"}],"source_content_type":"text/x-rst","patch_set":4,"id":"1a1ced50_4d78fa8f","line":290,"in_reply_to":"1a1ced50_818488d4","updated":"2017-03-21 01:42:12.000000000","message":"Ah, got it.","commit_id":"3d47902f99853a2b847f557c0ce0b41a143e0399"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":33,"context_line":"For more information, see [GSPEC1]_."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Expand"},{"line_number":36,"context_line":"  Expand migrations MUST strictly be additive in nature. Expand migrations"},{"line_number":37,"context_line":"  should be seen as the minimal set of schema changes required by the new"},{"line_number":38,"context_line":"  services that can be applied while the old services are still running."},{"line_number":39,"context_line":"  Expand migrations should optionally include temporary database triggers that"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_e60a7c89","line":36,"range":{"start_line":36,"start_character":2,"end_line":36,"end_character":55},"updated":"2017-03-21 20:38:33.000000000","message":"One exception is constraint removal when needed to allow triggers to work properly.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"eb1d11d7c2f0848678efed166b792019c4ed92a3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"For more information, see [GSPEC1]_."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Expand"},{"line_number":36,"context_line":"  Expand migrations MUST strictly be additive in nature. Expand migrations"},{"line_number":37,"context_line":"  should be seen as the minimal set of schema changes required by the new"},{"line_number":38,"context_line":"  services that can be applied while the old services are still running."},{"line_number":39,"context_line":"  Expand migrations should optionally include temporary database triggers that"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_60bcaf06","line":36,"range":{"start_line":36,"start_character":2,"end_line":36,"end_character":55},"in_reply_to":"1a1ced50_51d30804","updated":"2017-03-21 21:39:20.000000000","message":"I\u0027m thinking specifically when we had to remove the not null constraint on the is_public column for the community images visibility migrations: https://github.com/openstack/glance/blob/master/glance/db/sqlalchemy/alembic_migrations/versions/ocata_expand01_add_visibility.py#L142","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"For more information, see [GSPEC1]_."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Expand"},{"line_number":36,"context_line":"  Expand migrations MUST strictly be additive in nature. Expand migrations"},{"line_number":37,"context_line":"  should be seen as the minimal set of schema changes required by the new"},{"line_number":38,"context_line":"  services that can be applied while the old services are still running."},{"line_number":39,"context_line":"  Expand migrations should optionally include temporary database triggers that"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_51d30804","line":36,"range":{"start_line":36,"start_character":2,"end_line":36,"end_character":55},"in_reply_to":"1a1ced50_e60a7c89","updated":"2017-03-21 21:16:39.000000000","message":"Are you talking about removing constraints from newly added columns/tables? If so, we don\u0027t have to see them as contractive changes. We are just not adding constraints/defaults initially.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":59,"context_line":"written for Alembic. All existing Glance migrations have been ported to work"},{"line_number":60,"context_line":"with Alembic. All Glance Alembic migrations can be found here [GMIGS1]_."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Here are some things to keep in mind while writing Glance migrations. Let\u0027s"},{"line_number":63,"context_line":"first look at schema migrations."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Schema Migrations (Expand/Contract)"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_a64404b7","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":68},"updated":"2017-03-21 20:38:33.000000000","message":"Don\u0027t feel that this sentence is necessary.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":59,"context_line":"written for Alembic. All existing Glance migrations have been ported to work"},{"line_number":60,"context_line":"with Alembic. All Glance Alembic migrations can be found here [GMIGS1]_."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"Here are some things to keep in mind while writing Glance migrations. Let\u0027s"},{"line_number":63,"context_line":"first look at schema migrations."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"Schema Migrations (Expand/Contract)"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_d105387a","line":62,"range":{"start_line":62,"start_character":0,"end_line":62,"end_character":68},"in_reply_to":"1a1ced50_a64404b7","updated":"2017-03-21 21:16:39.000000000","message":"Done","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    revision \u003d \u003cunique revision id\u003e"},{"line_number":85,"context_line":"    down_revision \u003d \u003cparent revision id\u003e"},{"line_number":86,"context_line":"    depends_on \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def upgrade():"},{"line_number":89,"context_line":"        \u003cyour schema changes here\u003e"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_867548fb","line":86,"range":{"start_line":86,"start_character":17,"end_line":86,"end_character":21},"updated":"2017-03-21 20:38:33.000000000","message":"s/None/\u003coptional revision dependency or None\u003e","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    revision \u003d \u003cunique revision id\u003e"},{"line_number":85,"context_line":"    down_revision \u003d \u003cparent revision id\u003e"},{"line_number":86,"context_line":"    depends_on \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def upgrade():"},{"line_number":89,"context_line":"        \u003cyour schema changes here\u003e"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_71f7248b","line":86,"range":{"start_line":86,"start_character":17,"end_line":86,"end_character":21},"in_reply_to":"1a1ced50_867548fb","updated":"2017-03-21 21:16:39.000000000","message":"Done","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":95,"context_line":"* The ``revision`` identifier is a unique revision id for every migration."},{"line_number":96,"context_line":"  It must conform to one of the following naming schemes."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"  All monolith migrations must conform to:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"  .. code::"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_c6ef4085","line":98,"range":{"start_line":98,"start_character":2,"end_line":98,"end_character":42},"updated":"2017-03-21 20:38:33.000000000","message":"Will there be any monolith migrations going forward? If not, perhaps it\u0027s better to say something like: \"All prior monolith revision naming schemes have conformed to:\"","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"eb1d11d7c2f0848678efed166b792019c4ed92a3","unresolved":false,"context_lines":[{"line_number":95,"context_line":"* The ``revision`` identifier is a unique revision id for every migration."},{"line_number":96,"context_line":"  It must conform to one of the following naming schemes."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"  All monolith migrations must conform to:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"  .. code::"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_005bfbf6","line":98,"range":{"start_line":98,"start_character":2,"end_line":98,"end_character":42},"in_reply_to":"1a1ced50_8c6007d1","updated":"2017-03-21 21:39:20.000000000","message":"I don\u0027t feel too strongly about it, so ok.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":95,"context_line":"* The ``revision`` identifier is a unique revision id for every migration."},{"line_number":96,"context_line":"  It must conform to one of the following naming schemes."},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"  All monolith migrations must conform to:"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"  .. code::"},{"line_number":101,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_8c6007d1","line":98,"range":{"start_line":98,"start_character":2,"end_line":98,"end_character":42},"in_reply_to":"1a1ced50_c6ef4085","updated":"2017-03-21 21:16:39.000000000","message":"Monolith migrations would be needed until we make EMC migrations default. So, keep as-is?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"0eed11cb1f97513ec328995d0b39a5fd185b87aa","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    ^"},{"line_number":149,"context_line":"                    |"},{"line_number":150,"context_line":"                    |"},{"line_number":151,"context_line":"                 mitaka02"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* The ``depends_on`` identifier helps establish dependencies between two"},{"line_number":154,"context_line":"  migrations. If a migration ``X`` depends on running  migration ``Y`` first,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_a2895977","line":151,"updated":"2017-03-21 16:33:31.000000000","message":"I think it would be useful here to give an example, something like:\n\n* Suppose you were adding one more migration to Mitaka.  You\u0027d name this migration \u0027mitaka03\u0027 and the down-revision value would be \u0027mitaka02\u0027.  Your expand script would be named \u0027mitaka_expand03_description.py\u0027 and it would contain the down_revision value \u0027mitaka_expand02\u0027.  Likewise, your contract script would contain the down-revision value \u0027mitaka_contract02\u0027.\n\n* Suppose that \u0027mitaka02\u0027 was the final migration in Mitaka, and you are adding the first Newton migration.  Then you\u0027d name your migration \u0027newton01\u0027 and the down-revision value would be \u0027mitaka02\u0027.  Your expand script would be named \u0027newton_expand01_description.py\u0027 and it would contain the down_revision value \u0027mitaka_expand02\u0027.  Likewise, your contract script would contain the down-revision value \u0027mitaka_contract02\u0027.\n\n(Or is that too much detail?)","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"2f0c3fabcec8833dce7fefbf4c1c62ffbec45f0c","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    ^"},{"line_number":149,"context_line":"                    |"},{"line_number":150,"context_line":"                    |"},{"line_number":151,"context_line":"                 mitaka02"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* The ``depends_on`` identifier helps establish dependencies between two"},{"line_number":154,"context_line":"  migrations. If a migration ``X`` depends on running  migration ``Y`` first,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_464d103d","line":151,"in_reply_to":"1a1ced50_9aecbdf4","updated":"2017-03-21 20:08:10.000000000","message":"the \"Dependency Between Contract and Expand Migrations\" header could precede the discussion of down_revision and depends_on and the discussion can focus on the Pike revisions to illustrate both of these. That might make things clearer for cross-release concerns. Unfortunately discussing these for mikata and earlier is a trivial/toy example.\n\nMaybe add a pike12 to a hypothetical pike11 and then add a queens01 migration if that is very important, but I think the existing Ocata and Pike migrations means we don\u0027t really need to go hypothetical.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"2261cb09e8fb55d672d8a9d3a3cb5a273997618f","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    ^"},{"line_number":149,"context_line":"                    |"},{"line_number":150,"context_line":"                    |"},{"line_number":151,"context_line":"                 mitaka02"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* The ``depends_on`` identifier helps establish dependencies between two"},{"line_number":154,"context_line":"  migrations. If a migration ``X`` depends on running  migration ``Y`` first,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_f1d6b44d","line":151,"in_reply_to":"1a1ced50_a2895977","updated":"2017-03-21 20:34:00.000000000","message":"I don\u0027t mind adding an example but between this doc and existing migrations, I think we have sufficient help. I\u0027m sure folks will look up existing migrations even after reading this doc. So, I\u0027m thinking additional detail isn\u0027t necessary. But, I\u0027m open.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"3f944e1a81195e7e80a188f1fb4a951241713165","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    ^"},{"line_number":149,"context_line":"                    |"},{"line_number":150,"context_line":"                    |"},{"line_number":151,"context_line":"                 mitaka02"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* The ``depends_on`` identifier helps establish dependencies between two"},{"line_number":154,"context_line":"  migrations. If a migration ``X`` depends on running  migration ``Y`` first,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_d72c509b","line":151,"in_reply_to":"1a1ced50_a2895977","updated":"2017-03-21 18:00:18.000000000","message":"I think this is really confusing as a suggestion because Mitaka is not EMC-able. Unless we are talking about Ocata it doesn\u0027t make sense.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"e86a358844146a1669aadacaec5b627953cb958f","unresolved":false,"context_lines":[{"line_number":148,"context_line":"                    ^"},{"line_number":149,"context_line":"                    |"},{"line_number":150,"context_line":"                    |"},{"line_number":151,"context_line":"                 mitaka02"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"* The ``depends_on`` identifier helps establish dependencies between two"},{"line_number":154,"context_line":"  migrations. If a migration ``X`` depends on running  migration ``Y`` first,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_9aecbdf4","line":151,"in_reply_to":"1a1ced50_d72c509b","updated":"2017-03-21 18:29:20.000000000","message":"Well, nobody is going to be writing migrations for mitaka, newton, or ocata ... so the point is just (1) how you determine the down_revision within a cycle, and (2) how you determine the down_revision across cycles.  We could just use fake names here, I guess.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    down_revision \u003d \u0027W\u0027"},{"line_number":162,"context_line":"    depends_on \u003d \u0027Y\u0027"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"  Naturally, every migration depends on the migrations ahead of it in the"},{"line_number":165,"context_line":"  migration sequence. Hence, in a typical branch-less migration sequence,"},{"line_number":166,"context_line":"  ``depends_on`` is of limited use. However, this could be useful for"},{"line_number":167,"context_line":"  migration sequences with branches. We\u0027ll see more about this in the next"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_063958f2","line":164,"range":{"start_line":164,"start_character":55,"end_line":164,"end_character":66},"updated":"2017-03-21 20:38:33.000000000","message":"Maybe: s/ahead of it/preceding it/ ?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    down_revision \u003d \u0027W\u0027"},{"line_number":162,"context_line":"    depends_on \u003d \u0027Y\u0027"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"  Naturally, every migration depends on the migrations ahead of it in the"},{"line_number":165,"context_line":"  migration sequence. Hence, in a typical branch-less migration sequence,"},{"line_number":166,"context_line":"  ``depends_on`` is of limited use. However, this could be useful for"},{"line_number":167,"context_line":"  migration sequences with branches. We\u0027ll see more about this in the next"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_2ca8f3da","line":164,"range":{"start_line":164,"start_character":55,"end_line":164,"end_character":66},"in_reply_to":"1a1ced50_063958f2","updated":"2017-03-21 21:16:39.000000000","message":"Done","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    depends_on \u003d \u0027Y\u0027"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"  Naturally, every migration depends on the migrations ahead of it in the"},{"line_number":165,"context_line":"  migration sequence. Hence, in a typical branch-less migration sequence,"},{"line_number":166,"context_line":"  ``depends_on`` is of limited use. However, this could be useful for"},{"line_number":167,"context_line":"  migration sequences with branches. We\u0027ll see more about this in the next"},{"line_number":168,"context_line":"  section."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"* All schema migration scripts must adhere to the naming convention"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_b118bc76","line":167,"range":{"start_line":165,"start_character":23,"end_line":167,"end_character":36},"updated":"2017-03-21 20:38:33.000000000","message":"It looks like branches are mentioned here for the first time without being defined (aside for a quick mention on line 125). This could be confusing, not sure.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"eb1d11d7c2f0848678efed166b792019c4ed92a3","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    depends_on \u003d \u0027Y\u0027"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"  Naturally, every migration depends on the migrations ahead of it in the"},{"line_number":165,"context_line":"  migration sequence. Hence, in a typical branch-less migration sequence,"},{"line_number":166,"context_line":"  ``depends_on`` is of limited use. However, this could be useful for"},{"line_number":167,"context_line":"  migration sequences with branches. We\u0027ll see more about this in the next"},{"line_number":168,"context_line":"  section."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"* All schema migration scripts must adhere to the naming convention"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_80fe0bac","line":167,"range":{"start_line":165,"start_character":23,"end_line":167,"end_character":36},"in_reply_to":"1a1ced50_6cdcab73","updated":"2017-03-21 21:39:20.000000000","message":"Sure, it\u0027ll be a good test case.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":162,"context_line":"    depends_on \u003d \u0027Y\u0027"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"  Naturally, every migration depends on the migrations ahead of it in the"},{"line_number":165,"context_line":"  migration sequence. Hence, in a typical branch-less migration sequence,"},{"line_number":166,"context_line":"  ``depends_on`` is of limited use. However, this could be useful for"},{"line_number":167,"context_line":"  migration sequences with branches. We\u0027ll see more about this in the next"},{"line_number":168,"context_line":"  section."},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"* All schema migration scripts must adhere to the naming convention"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_6cdcab73","line":167,"range":{"start_line":165,"start_character":23,"end_line":167,"end_character":36},"in_reply_to":"1a1ced50_b118bc76","updated":"2017-03-21 21:16:39.000000000","message":"Yes, possibly confusing. I did think about mentioning branching but then I\u0027m getting into Alembic specifics and it may soon take off on a different tangent. \n\nBrian is going to have someone who is about to write a migration take a look at this. Let\u0027s see what he/she thinks. We take it from there?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":191,"context_line":"  the ``expand`` branch contains only the expand migrations and the"},{"line_number":192,"context_line":"  ``contract`` branch contains only the contract migrations. As per the"},{"line_number":193,"context_line":"  zero-downtime migration strategy, the expand migrations are run first"},{"line_number":194,"context_line":"  followed by contract migrations. To establish this dependency, we make the"},{"line_number":195,"context_line":"  contract migrations explicitly depend on their corresponding expand"},{"line_number":196,"context_line":"  migrations. Thus, running contract migrations without running expansions is"},{"line_number":197,"context_line":"  not possible."}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_31a84cdb","line":194,"range":{"start_line":194,"start_character":2,"end_line":194,"end_character":33},"updated":"2017-03-21 20:38:33.000000000","message":"Should there be a mention here of a data migration step between expand and contract? Or will that confuse the reader. Perhaps in parentheses?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"eb1d11d7c2f0848678efed166b792019c4ed92a3","unresolved":false,"context_lines":[{"line_number":191,"context_line":"  the ``expand`` branch contains only the expand migrations and the"},{"line_number":192,"context_line":"  ``contract`` branch contains only the contract migrations. As per the"},{"line_number":193,"context_line":"  zero-downtime migration strategy, the expand migrations are run first"},{"line_number":194,"context_line":"  followed by contract migrations. To establish this dependency, we make the"},{"line_number":195,"context_line":"  contract migrations explicitly depend on their corresponding expand"},{"line_number":196,"context_line":"  migrations. Thus, running contract migrations without running expansions is"},{"line_number":197,"context_line":"  not possible."}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_a0d4e71f","line":194,"range":{"start_line":194,"start_character":2,"end_line":194,"end_character":33},"in_reply_to":"1a1ced50_2ccd53b7","updated":"2017-03-21 21:39:20.000000000","message":"I did think that mentioning it might potentially add confusion, but wanted to hear your opinion. I think we\u0027re in agreement.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":191,"context_line":"  the ``expand`` branch contains only the expand migrations and the"},{"line_number":192,"context_line":"  ``contract`` branch contains only the contract migrations. As per the"},{"line_number":193,"context_line":"  zero-downtime migration strategy, the expand migrations are run first"},{"line_number":194,"context_line":"  followed by contract migrations. To establish this dependency, we make the"},{"line_number":195,"context_line":"  contract migrations explicitly depend on their corresponding expand"},{"line_number":196,"context_line":"  migrations. Thus, running contract migrations without running expansions is"},{"line_number":197,"context_line":"  not possible."}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_2ccd53b7","line":194,"range":{"start_line":194,"start_character":2,"end_line":194,"end_character":33},"in_reply_to":"1a1ced50_31a84cdb","updated":"2017-03-21 21:16:39.000000000","message":"I avoided that because data migrations are not Alembic migration scripts per se. Since we are taking about dependency between migrations here, not necessarily procedural dependency which we establish in the CLI, it maybe confusing.\n\nWhat do you think?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":241,"context_line":"  ``glance.db.sqlalchemy.alembic_migrations.data_migrations`` package."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"* The data migrations themselves are not Alembic migration scripts. And, hence"},{"line_number":244,"context_line":"  they don\u0027t require a unique revision id. However, they must adhere to a"},{"line_number":245,"context_line":"  similar naming convention discussed above. That is,"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"  .. code::"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_b1e27c2d","line":245,"range":{"start_line":244,"start_character":43,"end_line":245,"end_character":44},"updated":"2017-03-21 20:38:33.000000000","message":"for the purpose of consistency and continuity.\ns/That is,/That is:/","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":241,"context_line":"  ``glance.db.sqlalchemy.alembic_migrations.data_migrations`` package."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"* The data migrations themselves are not Alembic migration scripts. And, hence"},{"line_number":244,"context_line":"  they don\u0027t require a unique revision id. However, they must adhere to a"},{"line_number":245,"context_line":"  similar naming convention discussed above. That is,"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"  .. code::"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_ec325ba6","line":245,"range":{"start_line":244,"start_character":43,"end_line":245,"end_character":44},"in_reply_to":"1a1ced50_b1e27c2d","updated":"2017-03-21 21:16:39.000000000","message":"Done","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    Data Migration: ocata_migrate01_community_images.py"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"* All data migrations modules must adhere to the following structure"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"  .. code::"},{"line_number":260,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_b1b99c17","line":257,"range":{"start_line":257,"start_character":59,"end_line":257,"end_character":68},"updated":"2017-03-21 20:38:33.000000000","message":"s/structure/structure:/","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":254,"context_line":""},{"line_number":255,"context_line":"    Data Migration: ocata_migrate01_community_images.py"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"* All data migrations modules must adhere to the following structure"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"  .. code::"},{"line_number":260,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_4c228f53","line":257,"range":{"start_line":257,"start_character":59,"end_line":257,"end_character":68},"in_reply_to":"1a1ced50_b1b99c17","updated":"2017-03-21 21:16:39.000000000","message":"Done","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":272,"context_line":"NOTES"},{"line_number":273,"context_line":"-----"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"* Starting in Ocata, Glance needs every database migration to include both"},{"line_number":276,"context_line":"  monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some"},{"line_number":277,"context_line":"  point in Pike, E-M-C migrations will be made default. At that point, it"},{"line_number":278,"context_line":"  would be no longer required to include monolithic migration script."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":281,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_d10618cd","line":278,"range":{"start_line":275,"start_character":2,"end_line":278,"end_character":69},"updated":"2017-03-21 20:38:33.000000000","message":"I feel we should de-emphasize monolithic migrations. Perhaps only keep the last sentence?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":272,"context_line":"NOTES"},{"line_number":273,"context_line":"-----"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"* Starting in Ocata, Glance needs every database migration to include both"},{"line_number":276,"context_line":"  monolithic and Expand-Migrate-Contract (E-M-C) style migrations. At some"},{"line_number":277,"context_line":"  point in Pike, E-M-C migrations will be made default. At that point, it"},{"line_number":278,"context_line":"  would be no longer required to include monolithic migration script."},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":281,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_4cd0cf1f","line":278,"range":{"start_line":275,"start_character":2,"end_line":278,"end_character":69},"in_reply_to":"1a1ced50_d10618cd","updated":"2017-03-21 21:16:39.000000000","message":"I understand where you are coming from. Since we still rely on monolith migrations, I thought it was important to mention that we need both sets of migrations to be included.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":281,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"},{"line_number":282,"context_line":"  well provided the structural differences above are taken care of. Moreover,"},{"line_number":283,"context_line":"  it maybe easier to do certain operations with Alembic. Refer to [ALMBC]_ for"},{"line_number":284,"context_line":"  information on Alembic operations."},{"line_number":285,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_31292c38","line":282,"range":{"start_line":282,"start_character":20,"end_line":282,"end_character":48},"updated":"2017-03-21 20:38:33.000000000","message":"What \"structural differences\" are being referenced here?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":281,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"},{"line_number":282,"context_line":"  well provided the structural differences above are taken care of. Moreover,"},{"line_number":283,"context_line":"  it maybe easier to do certain operations with Alembic. Refer to [ALMBC]_ for"},{"line_number":284,"context_line":"  information on Alembic operations."},{"line_number":285,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_cc891f28","line":282,"range":{"start_line":282,"start_character":20,"end_line":282,"end_character":48},"in_reply_to":"1a1ced50_31292c38","updated":"2017-03-21 21:16:39.000000000","message":"Like revision, down_revision and depends_on.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"eb1d11d7c2f0848678efed166b792019c4ed92a3","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":281,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"},{"line_number":282,"context_line":"  well provided the structural differences above are taken care of. Moreover,"},{"line_number":283,"context_line":"  it maybe easier to do certain operations with Alembic. Refer to [ALMBC]_ for"},{"line_number":284,"context_line":"  information on Alembic operations."},{"line_number":285,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_20e9d7e6","line":282,"range":{"start_line":282,"start_character":20,"end_line":282,"end_character":48},"in_reply_to":"1a1ced50_cc891f28","updated":"2017-03-21 21:39:20.000000000","message":"Maybe spell them out then?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":280,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":281,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"},{"line_number":282,"context_line":"  well provided the structural differences above are taken care of. Moreover,"},{"line_number":283,"context_line":"  it maybe easier to do certain operations with Alembic. Refer to [ALMBC]_ for"},{"line_number":284,"context_line":"  information on Alembic operations."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"* A given database change may not require actions in each of the expand,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_31e04cfa","line":283,"range":{"start_line":283,"start_character":24,"end_line":283,"end_character":55},"updated":"2017-03-21 20:38:33.000000000","message":"e.g. automatically creating schema migration scripts based on the ORM.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":280,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":281,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"},{"line_number":282,"context_line":"  well provided the structural differences above are taken care of. Moreover,"},{"line_number":283,"context_line":"  it maybe easier to do certain operations with Alembic. Refer to [ALMBC]_ for"},{"line_number":284,"context_line":"  information on Alembic operations."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"* A given database change may not require actions in each of the expand,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_ccb75fd6","line":283,"range":{"start_line":283,"start_character":24,"end_line":283,"end_character":55},"in_reply_to":"1a1ced50_31e04cfa","updated":"2017-03-21 21:16:39.000000000","message":"That\u0027s a CLI capability we don\u0027t yet support. But, yes, you are right. You want me to mention that here?","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"eb1d11d7c2f0848678efed166b792019c4ed92a3","unresolved":false,"context_lines":[{"line_number":280,"context_line":"* Alembic is a database migration engine written for SQLAlchemy. So, any"},{"line_number":281,"context_line":"  migration script written for SQLAlchemy Migrate should work with Alembic as"},{"line_number":282,"context_line":"  well provided the structural differences above are taken care of. Moreover,"},{"line_number":283,"context_line":"  it maybe easier to do certain operations with Alembic. Refer to [ALMBC]_ for"},{"line_number":284,"context_line":"  information on Alembic operations."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"* A given database change may not require actions in each of the expand,"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_80c36b56","line":283,"range":{"start_line":283,"start_character":24,"end_line":283,"end_character":55},"in_reply_to":"1a1ced50_ccb75fd6","updated":"2017-03-21 21:39:20.000000000","message":"Since this is more developer information rather than operator, I think yes, we could mention that here.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":22448,"name":"Alexander Bashmakov","email":"abashmak@yahoo.com","username":"abashmak"},"change_message_id":"ebbefa6c7407a46a14370c4da045fb9175a647f5","unresolved":false,"context_lines":[{"line_number":283,"context_line":"  it maybe easier to do certain operations with Alembic. Refer to [ALMBC]_ for"},{"line_number":284,"context_line":"  information on Alembic operations."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"* A given database change may not require actions in each of the expand,"},{"line_number":287,"context_line":"  migrate, contract phases, but nonetheless, we require a script for *each*"},{"line_number":288,"context_line":"  phase for *every* change.  In the case where an action is not required, a"},{"line_number":289,"context_line":"  ``no-op`` script, described below, MUST be used."}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_91ef40e8","line":286,"range":{"start_line":286,"start_character":53,"end_line":286,"end_character":57},"updated":"2017-03-21 20:38:33.000000000","message":"s/each/all/","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"ee14ec84e09ce3de4aaab35cba76cb2b47f0edb1","unresolved":false,"context_lines":[{"line_number":283,"context_line":"  it maybe easier to do certain operations with Alembic. Refer to [ALMBC]_ for"},{"line_number":284,"context_line":"  information on Alembic operations."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"* A given database change may not require actions in each of the expand,"},{"line_number":287,"context_line":"  migrate, contract phases, but nonetheless, we require a script for *each*"},{"line_number":288,"context_line":"  phase for *every* change.  In the case where an action is not required, a"},{"line_number":289,"context_line":"  ``no-op`` script, described below, MUST be used."}],"source_content_type":"text/x-rst","patch_set":5,"id":"1a1ced50_4cfa8f76","line":286,"range":{"start_line":286,"start_character":53,"end_line":286,"end_character":57},"in_reply_to":"1a1ced50_91ef40e8","updated":"2017-03-21 21:16:39.000000000","message":"Hmmm, each sounds more appropriate to me. Let\u0027s see what others say.","commit_id":"3cafd516f9f8d4d4e05dee572a89a74a092dc97d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"8bd020f6b09ed250d1c41ad804e6b720faa9ec75","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Migrate as the database migration engine. Moving to Alembic is particularly"},{"line_number":20,"context_line":"motivated by the zero-downtime upgrade work. Refer to [GSPEC1]_ and [GSPEC2]_"},{"line_number":21,"context_line":"for more information on zero-downtime upgrades in Glance and why a move to"},{"line_number":22,"context_line":"Alembic was deemed necessary."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Prior to Ocata, database migrations were conceived as monoliths.  Thus, they"},{"line_number":25,"context_line":"did not need to carefully distinguish and manage database schema expansions,"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a1ced50_7ac7aa63","line":22,"updated":"2017-03-23 12:55:51.000000000","message":"I think we should add a note here saying:\n\nStop right now and go read [GSPEC1]_ and [GSPEC2]_ if you haven\u0027t done so already.  Those documents explain the strategy Glance has approved for database migrations, and we expect you to be familiar with them in what follows.  This document focuses on the \"how\", but unless you understand the \"what\" and \"why\", you\u0027ll be wasting your time reading this document.","commit_id":"ad727c2fc10484badb5b04a82a186852cafd2f0b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"8bd020f6b09ed250d1c41ad804e6b720faa9ec75","unresolved":false,"context_lines":[{"line_number":33,"context_line":"For more information, see [GSPEC1]_."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Expand"},{"line_number":36,"context_line":"  Expand migrations MUST strictly be additive in nature. Expand migrations"},{"line_number":37,"context_line":"  should be seen as the minimal set of schema changes required by the new"},{"line_number":38,"context_line":"  services that can be applied while the old services are still running."},{"line_number":39,"context_line":"  Expand migrations should optionally include temporary database triggers that"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a1ced50_7a196a21","line":36,"range":{"start_line":36,"start_character":2,"end_line":36,"end_character":55},"updated":"2017-03-23 12:55:51.000000000","message":"Alex makes a good point about this on PS5 (about removing the null constraint on is_public in ocata_expand01).  This issue is addressed in the spec, but I had to scroll through twice to find it:\n\nhttps://git.openstack.org/cgit/openstack/glance-specs/tree/specs/ocata/implemented/glance/database-strategy-for-rolling-upgrades.rst#n118\n\nI don\u0027t know whether we want to call it out here or not.  It\u0027s useful to have a pointer to where this happened in the code (which we didn\u0027t have at the time the spec was written), so I\u0027m inclined to say add it.  (We don\u0027t have to have a link directly to the line, we could just say this happened in ocata_expand01 and let the interested reader go look, but I think it\u0027s worth pointing out).","commit_id":"ad727c2fc10484badb5b04a82a186852cafd2f0b"}]}
