)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The first patch in a series that adds rolling upgrade support."},{"line_number":10,"context_line":"The migration process will be controlled by set of status"},{"line_number":11,"context_line":"flags stroed in their own table. Before we actually add the"},{"line_number":12,"context_line":"migration code, we create the table."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partially implements: blueprint manage-migration"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"bacf61ea_7c8cfad9","line":11,"range":{"start_line":11,"start_character":6,"end_line":11,"end_character":12},"updated":"2016-08-02 03:25:19.000000000","message":"stored","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The first patch in a series that adds rolling upgrade support."},{"line_number":10,"context_line":"The migration process will be controlled by set of status"},{"line_number":11,"context_line":"flags stroed in their own table. Before we actually add the"},{"line_number":12,"context_line":"migration code, we create the table."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partially implements: blueprint manage-migration"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"bacf61ea_b7da0415","line":11,"range":{"start_line":11,"start_character":6,"end_line":11,"end_character":12},"in_reply_to":"bacf61ea_7c8cfad9","updated":"2016-08-02 08:25:12.000000000","message":"Done","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"}],"keystone/common/sql/migrate_repo/versions/108_add_migration_phase_table.py":[{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"10ac27bff171f43ab3c954efe11c84687bf96e18","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    mirgation_phase_table \u003d sql.Table("},{"line_number":21,"context_line":"        \u0027migration_phase\u0027,"},{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027status\u0027, sql.String(64), primary_key\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_447131e0","line":20,"range":{"start_line":20,"start_character":4,"end_line":20,"end_character":13},"updated":"2016-08-02 18:36:39.000000000","message":"migration","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fe7d500235e54800df8927657ad9600b820dc24b","unresolved":false,"context_lines":[{"line_number":17,"context_line":"    meta \u003d sql.MetaData()"},{"line_number":18,"context_line":"    meta.bind \u003d migrate_engine"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    mirgation_phase_table \u003d sql.Table("},{"line_number":21,"context_line":"        \u0027migration_phase\u0027,"},{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027status\u0027, sql.String(64), primary_key\u003dTrue, nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_984ea8bf","line":20,"range":{"start_line":20,"start_character":4,"end_line":20,"end_character":13},"in_reply_to":"bacf61ea_447131e0","updated":"2016-08-03 21:41:41.000000000","message":"oops","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c71debb429063a9b0711ee45d153b4bafbeec1b3","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    mirgation_phase_table \u003d sql.Table("},{"line_number":21,"context_line":"        \u0027migration_phase\u0027,"},{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027status\u0027, sql.String(64), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":24,"context_line":"        sql.Column(\u0027current_version\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027migrating_to_version\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027current_phase\u0027, sql.String(64), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_17abac1f","line":23,"range":{"start_line":23,"start_character":8,"end_line":23,"end_character":79},"updated":"2016-08-03 19:25:24.000000000","message":"How is the status the primary key?  Won\u0027t this have values like rolling-upgrade-complete and won\u0027t their be multiple rows?  Wouldn\u0027t this need to be a composite key in that case?  Or are you only expecting a single row?","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fe7d500235e54800df8927657ad9600b820dc24b","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    mirgation_phase_table \u003d sql.Table("},{"line_number":21,"context_line":"        \u0027migration_phase\u0027,"},{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027status\u0027, sql.String(64), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":24,"context_line":"        sql.Column(\u0027current_version\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027migrating_to_version\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027current_phase\u0027, sql.String(64), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_78e01497","line":23,"range":{"start_line":23,"start_character":8,"end_line":23,"end_character":79},"in_reply_to":"bacf61ea_17abac1f","updated":"2016-08-03 21:41:41.000000000","message":"so there is only one row...the actual phase we are in is stated in the \"current_phase\" column.  Maybe \u0027status\u0027 was a bad name for it....wanted it to be extensible in case in the future we wanted to store types of status, or perhaps keep records of previous attempts etc.","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"}],"keystone/common/sql/migrate_repo/versions/109_add_migration_phase_table.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"df6d76de2f70cd463200a06c51e8681d57e1a261","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    migration_phase_table \u003d sql.Table("},{"line_number":21,"context_line":"        \u0027migrate_phase\u0027,"},{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027status\u0027, sql.String(64), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":24,"context_line":"        sql.Column(\u0027current_version\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027migrating_to_version\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027current_phase\u0027, sql.String(64), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_f983dc53","line":23,"range":{"start_line":23,"start_character":63,"end_line":23,"end_character":77},"updated":"2016-08-07 08:03:05.000000000","message":"primary key doesn\u0027t imply it\u0027s non-nullable?","commit_id":"51e0e3bfd1f7f76f39ca7dbe209cfa88a10b96bd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bf60b28fc21ffc690e946e0e43d9c06106d093da","unresolved":false,"context_lines":[{"line_number":20,"context_line":"    migration_phase_table \u003d sql.Table("},{"line_number":21,"context_line":"        \u0027migrate_phase\u0027,"},{"line_number":22,"context_line":"        meta,"},{"line_number":23,"context_line":"        sql.Column(\u0027status\u0027, sql.String(64), primary_key\u003dTrue, nullable\u003dFalse),"},{"line_number":24,"context_line":"        sql.Column(\u0027current_version\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":25,"context_line":"        sql.Column(\u0027migrating_to_version\u0027, sql.String(64), nullable\u003dFalse),"},{"line_number":26,"context_line":"        sql.Column(\u0027current_phase\u0027, sql.String(64), nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_5f7c6620","line":23,"range":{"start_line":23,"start_character":63,"end_line":23,"end_character":77},"in_reply_to":"bacf61ea_f983dc53","updated":"2016-08-08 12:52:43.000000000","message":"yep, it does, will remove :-)","commit_id":"51e0e3bfd1f7f76f39ca7dbe209cfa88a10b96bd"}],"keystone/common/sql/migration_phase_sql.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_f9c91c27","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":37},"updated":"2016-08-02 03:25:19.000000000","message":"pls update this.","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2012 OpenStack Foundation"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_578748b4","line":1,"range":{"start_line":1,"start_character":2,"end_line":1,"end_character":37},"in_reply_to":"bacf61ea_f9c91c27","updated":"2016-08-02 08:25:12.000000000","message":"Done","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":20,"context_line":"PHASE_STATUS_KEY \u003d \u0027Status\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class MigratonPhaseModel(sql.ModelBase, sql.DictBase):"},{"line_number":24,"context_line":"    __tablename__ \u003d \u0027migration_phase\u0027"},{"line_number":25,"context_line":"    attributes \u003d [\u0027current_version\u0027, \u0027migrating_to_version\u0027, \u0027current_phase\u0027]"},{"line_number":26,"context_line":"    status \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_9c456e44","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":14},"updated":"2016-08-02 03:25:19.000000000","message":"Migration","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":20,"context_line":"PHASE_STATUS_KEY \u003d \u0027Status\u0027"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class MigratonPhaseModel(sql.ModelBase, sql.DictBase):"},{"line_number":24,"context_line":"    __tablename__ \u003d \u0027migration_phase\u0027"},{"line_number":25,"context_line":"    attributes \u003d [\u0027current_version\u0027, \u0027migrating_to_version\u0027, \u0027current_phase\u0027]"},{"line_number":26,"context_line":"    status \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_d73178a3","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":14},"in_reply_to":"bacf61ea_9c456e44","updated":"2016-08-02 08:25:12.000000000","message":"Done","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class MigratonPhaseModel(sql.ModelBase, sql.DictBase):"},{"line_number":24,"context_line":"    __tablename__ \u003d \u0027migration_phase\u0027"},{"line_number":25,"context_line":"    attributes \u003d [\u0027current_version\u0027, \u0027migrating_to_version\u0027, \u0027current_phase\u0027]"},{"line_number":26,"context_line":"    status \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":27,"context_line":"    current_version \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":28,"context_line":"    migrating_to_version \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":29,"context_line":"    current_phase \u003d sql.Column(sql.String(64), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_9ca72ea6","line":26,"range":{"start_line":26,"start_character":4,"end_line":26,"end_character":10},"updated":"2016-08-02 03:25:19.000000000","message":"I think there is no need for this column if only one row status is in place, just cannot figure out when multi-status is needed for migrating on one node.","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":23,"context_line":"class MigratonPhaseModel(sql.ModelBase, sql.DictBase):"},{"line_number":24,"context_line":"    __tablename__ \u003d \u0027migration_phase\u0027"},{"line_number":25,"context_line":"    attributes \u003d [\u0027current_version\u0027, \u0027migrating_to_version\u0027, \u0027current_phase\u0027]"},{"line_number":26,"context_line":"    status \u003d sql.Column(sql.String(64), primary_key\u003dTrue)"},{"line_number":27,"context_line":"    current_version \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":28,"context_line":"    migrating_to_version \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":29,"context_line":"    current_phase \u003d sql.Column(sql.String(64), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_57e58806","line":26,"range":{"start_line":26,"start_character":4,"end_line":26,"end_character":10},"in_reply_to":"bacf61ea_9ca72ea6","updated":"2016-08-02 08:25:12.000000000","message":"So I was erring on the side of caution and not wanting to have to migrate the scheme of the table we are using to control migrations at a later date!!","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    current_phase \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @classmethod"},{"line_number":32,"context_line":"    def from_dict(cls, d):"},{"line_number":33,"context_line":"        new_d \u003d d.copy()"},{"line_number":34,"context_line":"        return cls(**new_d)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def to_dict(self):"},{"line_number":37,"context_line":"        \"\"\"Return the model\u0027s attributes as a dictionary."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        Don\u0027t let the internal \u0027Status\u0027 key escape."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        d \u003d {}"},{"line_number":43,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":44,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":45,"context_line":"        return d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigratonPhase(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_79288c9a","line":45,"range":{"start_line":32,"start_character":0,"end_line":45,"end_character":16},"updated":"2016-08-02 03:25:19.000000000","message":"Why not just use the method from class DictBase?","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    current_phase \u003d sql.Column(sql.String(64), nullable\u003dFalse)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    @classmethod"},{"line_number":32,"context_line":"    def from_dict(cls, d):"},{"line_number":33,"context_line":"        new_d \u003d d.copy()"},{"line_number":34,"context_line":"        return cls(**new_d)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def to_dict(self):"},{"line_number":37,"context_line":"        \"\"\"Return the model\u0027s attributes as a dictionary."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        Don\u0027t let the internal \u0027Status\u0027 key escape."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        d \u003d {}"},{"line_number":43,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":44,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":45,"context_line":"        return d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigratonPhase(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_f7a3dcaf","line":45,"range":{"start_line":32,"start_character":0,"end_line":45,"end_character":16},"in_reply_to":"bacf61ea_79288c9a","updated":"2016-08-02 08:25:12.000000000","message":"The one in DictBase assumes you have the \u0027extra\u0027 column","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        return d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigratonPhase(object):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027migration_status\u0027)"},{"line_number":51,"context_line":"    def create_migration_status(self, values):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_1c705ea3","line":48,"range":{"start_line":48,"start_character":6,"end_line":48,"end_character":14},"updated":"2016-08-02 03:25:19.000000000","message":"Migration","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        return d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigratonPhase(object):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027migration_status\u0027)"},{"line_number":51,"context_line":"    def create_migration_status(self, values):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_77988c78","line":48,"range":{"start_line":48,"start_character":6,"end_line":48,"end_character":14},"in_reply_to":"bacf61ea_1c705ea3","updated":"2016-08-02 08:25:12.000000000","message":"Done","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigratonPhase(object):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027migration_status\u0027)"},{"line_number":51,"context_line":"    def create_migration_status(self, values):"},{"line_number":52,"context_line":"        with sql.session_for_write() as session:"},{"line_number":53,"context_line":"            ref \u003d MigratonPhaseModel.from_dict(values)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_7cc7da95","line":50,"range":{"start_line":50,"start_character":41,"end_line":50,"end_character":57},"updated":"2016-08-02 03:25:19.000000000","message":"migration_status or migration_phase?","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigratonPhase(object):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027migration_status\u0027)"},{"line_number":51,"context_line":"    def create_migration_status(self, values):"},{"line_number":52,"context_line":"        with sql.session_for_write() as session:"},{"line_number":53,"context_line":"            ref \u003d MigratonPhaseModel.from_dict(values)"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_9770a041","line":50,"range":{"start_line":50,"start_character":41,"end_line":50,"end_character":57},"in_reply_to":"bacf61ea_7cc7da95","updated":"2016-08-02 08:25:12.000000000","message":"well, it\u0027s the row that has clashed. In any case, this never escapes to the user.","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027migration_status\u0027)"},{"line_number":51,"context_line":"    def create_migration_status(self, values):"},{"line_number":52,"context_line":"        with sql.session_for_write() as session:"},{"line_number":53,"context_line":"            ref \u003d MigratonPhaseModel.from_dict(values)"},{"line_number":54,"context_line":"            ref.status \u003d PHASE_STATUS_KEY"},{"line_number":55,"context_line":"            session.add(ref)"},{"line_number":56,"context_line":"            return ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_dc79a694","line":53,"range":{"start_line":53,"start_character":18,"end_line":53,"end_character":26},"updated":"2016-08-02 03:25:19.000000000","message":"Migration","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027migration_status\u0027)"},{"line_number":51,"context_line":"    def create_migration_status(self, values):"},{"line_number":52,"context_line":"        with sql.session_for_write() as session:"},{"line_number":53,"context_line":"            ref \u003d MigratonPhaseModel.from_dict(values)"},{"line_number":54,"context_line":"            ref.status \u003d PHASE_STATUS_KEY"},{"line_number":55,"context_line":"            session.add(ref)"},{"line_number":56,"context_line":"            return ref.to_dict()"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_f7911c48","line":53,"range":{"start_line":53,"start_character":18,"end_line":53,"end_character":26},"in_reply_to":"bacf61ea_dc79a694","updated":"2016-08-02 08:25:12.000000000","message":"Done","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_migration_status(self):"},{"line_number":59,"context_line":"        with sql.session_for_read() as session:"},{"line_number":60,"context_line":"            ref \u003d session.query(MigratonPhaseModel).get(PHASE_STATUS_KEY)"},{"line_number":61,"context_line":"            return ref.to_dict()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def update_migration_status(self, values):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_fc2d8afe","line":60,"range":{"start_line":60,"start_character":12,"end_line":60,"end_character":73},"updated":"2016-08-02 03:25:19.000000000","message":"what happens if there is not status in the DB? maybe raise an exception here?","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def get_migration_status(self):"},{"line_number":59,"context_line":"        with sql.session_for_read() as session:"},{"line_number":60,"context_line":"            ref \u003d session.query(MigratonPhaseModel).get(PHASE_STATUS_KEY)"},{"line_number":61,"context_line":"            return ref.to_dict()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def update_migration_status(self, values):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_17a15046","line":60,"range":{"start_line":60,"start_character":12,"end_line":60,"end_character":73},"in_reply_to":"bacf61ea_fc2d8afe","updated":"2016-08-02 08:25:12.000000000","message":"Done","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":77,"context_line":"    # currently only use a single row in the table, which is created on the"},{"line_number":78,"context_line":"    # first ever migration and never needs to be remove."}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_5ce5b606","line":78,"range":{"start_line":78,"start_character":49,"end_line":78,"end_character":55},"updated":"2016-08-02 03:25:19.000000000","message":"removed","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":77,"context_line":"    # currently only use a single row in the table, which is created on the"},{"line_number":78,"context_line":"    # first ever migration and never needs to be remove."}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_97bee0ab","line":78,"range":{"start_line":78,"start_character":49,"end_line":78,"end_character":55},"in_reply_to":"bacf61ea_5ce5b606","updated":"2016-08-02 08:25:12.000000000","message":"Done","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c71debb429063a9b0711ee45d153b4bafbeec1b3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        new_d \u003d d.copy()"},{"line_number":34,"context_line":"        return cls(**new_d)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def to_dict(self):"},{"line_number":37,"context_line":"        \"\"\"Return the model\u0027s attributes as a dictionary."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        Don\u0027t let the internal \u0027Status\u0027 key escape."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        d \u003d {}"},{"line_number":43,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":44,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":45,"context_line":"        return d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigrationPhase(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_898b0468","line":45,"range":{"start_line":36,"start_character":4,"end_line":45,"end_character":16},"updated":"2016-08-03 19:25:24.000000000","message":"Why not use base to_dict (include_extra_dict\u003dFalse):\nhttps://github.com/openstack/keystone/blob/master/keystone/common/sql/core.py#L133","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fe7d500235e54800df8927657ad9600b820dc24b","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        new_d \u003d d.copy()"},{"line_number":34,"context_line":"        return cls(**new_d)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def to_dict(self):"},{"line_number":37,"context_line":"        \"\"\"Return the model\u0027s attributes as a dictionary."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        Don\u0027t let the internal \u0027Status\u0027 key escape."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        d \u003d {}"},{"line_number":43,"context_line":"        for attr in self.__class__.attributes:"},{"line_number":44,"context_line":"            d[attr] \u003d getattr(self, attr)"},{"line_number":45,"context_line":"        return d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigrationPhase(object):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_18b6388a","line":45,"range":{"start_line":36,"start_character":4,"end_line":45,"end_character":16},"in_reply_to":"bacf61ea_898b0468","updated":"2016-08-03 21:41:41.000000000","message":"..because that still blows up on the first line if you have no extra column","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c71debb429063a9b0711ee45d153b4bafbeec1b3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        return d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigrationPhase(object):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027migration_status\u0027)"},{"line_number":51,"context_line":"    def create_migration_status(self, values):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_e95f2073","line":48,"range":{"start_line":48,"start_character":6,"end_line":48,"end_character":20},"updated":"2016-08-03 19:25:24.000000000","message":"What about delete?","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fe7d500235e54800df8927657ad9600b820dc24b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        return d"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class MigrationPhase(object):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @sql.handle_conflicts(conflict_type\u003d\u0027migration_status\u0027)"},{"line_number":51,"context_line":"    def create_migration_status(self, values):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_38ab3c20","line":48,"range":{"start_line":48,"start_character":6,"end_line":48,"end_character":20},"in_reply_to":"bacf61ea_e95f2073","updated":"2016-08-03 21:41:41.000000000","message":"see comment at end","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c71debb429063a9b0711ee45d153b4bafbeec1b3","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def create_migration_status(self, values):"},{"line_number":52,"context_line":"        with sql.session_for_write() as session:"},{"line_number":53,"context_line":"            ref \u003d MigrationPhaseModel.from_dict(values)"},{"line_number":54,"context_line":"            ref.status \u003d PHASE_STATUS_KEY"},{"line_number":55,"context_line":"            session.add(ref)"},{"line_number":56,"context_line":"            return ref.to_dict()"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_49462c22","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":41},"updated":"2016-08-03 19:25:24.000000000","message":"Why are you setting the status here?","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fe7d500235e54800df8927657ad9600b820dc24b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def create_migration_status(self, values):"},{"line_number":52,"context_line":"        with sql.session_for_write() as session:"},{"line_number":53,"context_line":"            ref \u003d MigrationPhaseModel.from_dict(values)"},{"line_number":54,"context_line":"            ref.status \u003d PHASE_STATUS_KEY"},{"line_number":55,"context_line":"            session.add(ref)"},{"line_number":56,"context_line":"            return ref.to_dict()"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_78a5b445","line":54,"range":{"start_line":54,"start_character":12,"end_line":54,"end_character":41},"in_reply_to":"bacf61ea_49462c22","updated":"2016-08-03 21:41:41.000000000","message":"there is only one row, this isn\u0027t the phase status","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c71debb429063a9b0711ee45d153b4bafbeec1b3","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            return ref.to_dict()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _get_migration_status(self, session):"},{"line_number":59,"context_line":"        ref \u003d session.query(MigrationPhaseModel).get(PHASE_STATUS_KEY)"},{"line_number":60,"context_line":"        if not ref:"},{"line_number":61,"context_line":"            raise exception.NotFound(target\u003d\u0027migration_status\u0027)"},{"line_number":62,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_a96c089d","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":70},"updated":"2016-08-03 19:25:24.000000000","message":"So it looks like you are always only expecting one row here, why is that?","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fe7d500235e54800df8927657ad9600b820dc24b","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            return ref.to_dict()"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _get_migration_status(self, session):"},{"line_number":59,"context_line":"        ref \u003d session.query(MigrationPhaseModel).get(PHASE_STATUS_KEY)"},{"line_number":60,"context_line":"        if not ref:"},{"line_number":61,"context_line":"            raise exception.NotFound(target\u003d\u0027migration_status\u0027)"},{"line_number":62,"context_line":"        return ref"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_b8656c1e","line":59,"range":{"start_line":59,"start_character":8,"end_line":59,"end_character":70},"in_reply_to":"bacf61ea_a96c089d","updated":"2016-08-03 21:41:41.000000000","message":"yes, only one row","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"c71debb429063a9b0711ee45d153b4bafbeec1b3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            ref \u003d self._get_migration_status(session)"},{"line_number":67,"context_line":"            return ref.to_dict()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def update_migration_status(self, values):"},{"line_number":70,"context_line":"        with sql.session_for_write() as session:"},{"line_number":71,"context_line":"            ref \u003d self._get_migration_status(session)"},{"line_number":72,"context_line":"            old_dict \u003d ref.to_dict()"},{"line_number":73,"context_line":"            for k in values:"},{"line_number":74,"context_line":"                old_dict[k] \u003d values[k]"},{"line_number":75,"context_line":"            new_phase_status \u003d MigrationPhaseModel.from_dict(old_dict)"},{"line_number":76,"context_line":"            for attr in MigrationPhaseModel.attributes:"},{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_69d170fb","line":78,"range":{"start_line":69,"start_character":4,"end_line":78,"end_character":32},"updated":"2016-08-03 19:25:24.000000000","message":"If only a single row, won\u0027t you only be updating the current_phase column? And if so, couldn\u0027t this be simplified to:\nhttp://paste.openstack.org/show/547836/","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"fa686ab339b479808a4cc2e85baca49ace5ab8bd","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            ref \u003d self._get_migration_status(session)"},{"line_number":67,"context_line":"            return ref.to_dict()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def update_migration_status(self, values):"},{"line_number":70,"context_line":"        with sql.session_for_write() as session:"},{"line_number":71,"context_line":"            ref \u003d self._get_migration_status(session)"},{"line_number":72,"context_line":"            old_dict \u003d ref.to_dict()"},{"line_number":73,"context_line":"            for k in values:"},{"line_number":74,"context_line":"                old_dict[k] \u003d values[k]"},{"line_number":75,"context_line":"            new_phase_status \u003d MigrationPhaseModel.from_dict(old_dict)"},{"line_number":76,"context_line":"            for attr in MigrationPhaseModel.attributes:"},{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_b201046d","line":78,"range":{"start_line":69,"start_character":4,"end_line":78,"end_character":32},"in_reply_to":"bacf61ea_585ef045","updated":"2016-08-04 00:29:14.000000000","message":"Yeah, but won\u0027t columns like the current_version only get set during create and not be updated. Or, are you suggesting for every migration, we would update these fields?","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"fe7d500235e54800df8927657ad9600b820dc24b","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            ref \u003d self._get_migration_status(session)"},{"line_number":67,"context_line":"            return ref.to_dict()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def update_migration_status(self, values):"},{"line_number":70,"context_line":"        with sql.session_for_write() as session:"},{"line_number":71,"context_line":"            ref \u003d self._get_migration_status(session)"},{"line_number":72,"context_line":"            old_dict \u003d ref.to_dict()"},{"line_number":73,"context_line":"            for k in values:"},{"line_number":74,"context_line":"                old_dict[k] \u003d values[k]"},{"line_number":75,"context_line":"            new_phase_status \u003d MigrationPhaseModel.from_dict(old_dict)"},{"line_number":76,"context_line":"            for attr in MigrationPhaseModel.attributes:"},{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_585ef045","line":78,"range":{"start_line":69,"start_character":4,"end_line":78,"end_character":32},"in_reply_to":"bacf61ea_69d170fb","updated":"2016-08-03 21:41:41.000000000","message":"because there is more than just the current_phase in the row, e.g. current_version etc.","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"2d510d544b06b9b51d10a1cb76ff5bbb5d977c18","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            ref \u003d self._get_migration_status(session)"},{"line_number":67,"context_line":"            return ref.to_dict()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def update_migration_status(self, values):"},{"line_number":70,"context_line":"        with sql.session_for_write() as session:"},{"line_number":71,"context_line":"            ref \u003d self._get_migration_status(session)"},{"line_number":72,"context_line":"            old_dict \u003d ref.to_dict()"},{"line_number":73,"context_line":"            for k in values:"},{"line_number":74,"context_line":"                old_dict[k] \u003d values[k]"},{"line_number":75,"context_line":"            new_phase_status \u003d MigrationPhaseModel.from_dict(old_dict)"},{"line_number":76,"context_line":"            for attr in MigrationPhaseModel.attributes:"},{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"}],"source_content_type":"text/x-python","patch_set":2,"id":"bacf61ea_221c9bc0","line":78,"range":{"start_line":69,"start_character":4,"end_line":78,"end_character":32},"in_reply_to":"bacf61ea_b201046d","updated":"2016-08-04 06:44:19.000000000","message":"yes, they\u0027ll be re-writen the next time an upgrade is done....","commit_id":"dc28076a3d9e25155c04ee3f42bd699b54a97063"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"5503c2ea914740d1133f993d41047f1b2ccaec1e","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"},{"line_number":82,"context_line":"    # first ever migration and never needs to be removed."}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_73701cdd","line":82,"range":{"start_line":80,"start_character":4,"end_line":82,"end_character":57},"updated":"2016-08-04 10:08:24.000000000","message":"But doesn\u0027t this mean, that you will always need to check if it is the first ever migration and then decide whether to create or update. So something like: \nhttp://paste.openstack.org/show/548251/\n\nInstead, you could just:\ndelete()\nref \u003d create()","commit_id":"c418e825d333a33641bc5e7853893095a2ac250f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"35298dc5be8ef7e9ead7de2ab6747eef22f6b7ec","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"},{"line_number":82,"context_line":"    # first ever migration and never needs to be removed."}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_32bcd0ba","line":82,"range":{"start_line":80,"start_character":4,"end_line":82,"end_character":57},"in_reply_to":"bacf61ea_1e9b9d19","updated":"2016-08-04 14:29:14.000000000","message":"consider that there will be many different processes reading the table at the same time. We can\u0027t have a process seeing no row in the table.","commit_id":"c418e825d333a33641bc5e7853893095a2ac250f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"f25c4582706bd39122ec13142815cc9d0efcb59b","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"},{"line_number":82,"context_line":"    # first ever migration and never needs to be removed."}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_e9d24aff","line":82,"range":{"start_line":80,"start_character":4,"end_line":82,"end_character":57},"in_reply_to":"bacf61ea_32bcd0ba","updated":"2016-08-04 16:32:47.000000000","message":"The row is created by the first keystone node that is upgraded to Newton, when keystone-mange is run on that node. If we are concerned about other nodes being rebooted before this (with upgrade code) - they could just ignore it. Alternatively (and actually this was in the first version I wrote) I create the row when the table is created in the migration script.","commit_id":"c418e825d333a33641bc5e7853893095a2ac250f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"176b593f56e4c5f1799f55712ee0c8d95ac75bf8","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"},{"line_number":82,"context_line":"    # first ever migration and never needs to be removed."}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_7e3e198c","line":82,"range":{"start_line":80,"start_character":4,"end_line":82,"end_character":57},"in_reply_to":"bacf61ea_73701cdd","updated":"2016-08-04 13:20:05.000000000","message":"have a look in the follow on patch....this is where we use it....:\nhttps://review.openstack.org/#/c/349716/4/keystone/common/sql/migration_helpers.py","commit_id":"c418e825d333a33641bc5e7853893095a2ac250f"},{"author":{"_account_id":18338,"name":"Ron De Rose","email":"ronald.de.rose@intel.com","username":"derosenet"},"change_message_id":"db35fa6af78d539552fbf2f3d14906eaadae43ad","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                setattr(ref, attr, getattr(new_phase_status, attr))"},{"line_number":78,"context_line":"            return ref.to_dict()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    # NOTE(henry-nash): There is no need to support List or Delete since we"},{"line_number":81,"context_line":"    # currently only use a single row in the table, which is created on the"},{"line_number":82,"context_line":"    # first ever migration and never needs to be removed."}],"source_content_type":"text/x-python","patch_set":3,"id":"bacf61ea_1e9b9d19","line":82,"range":{"start_line":80,"start_character":4,"end_line":82,"end_character":57},"in_reply_to":"bacf61ea_7e3e198c","updated":"2016-08-04 13:30:41.000000000","message":"try to update if exception, create.  interesting approach...  many ways to skin a cat :)","commit_id":"c418e825d333a33641bc5e7853893095a2ac250f"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"df6d76de2f70cd463200a06c51e8681d57e1a261","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def to_dict(self):"},{"line_number":37,"context_line":"        \"\"\"Return the model\u0027s attributes as a dictionary."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        Don\u0027t let the internal \u0027Status\u0027 key escape."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        d \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"bacf61ea_19f4f0ee","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":51},"updated":"2016-08-07 08:03:05.000000000","message":"Do you mean don\u0027t let the internal `Status` return back?","commit_id":"51e0e3bfd1f7f76f39ca7dbe209cfa88a10b96bd"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bf60b28fc21ffc690e946e0e43d9c06106d093da","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def to_dict(self):"},{"line_number":37,"context_line":"        \"\"\"Return the model\u0027s attributes as a dictionary."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"        Don\u0027t let the internal \u0027Status\u0027 key escape."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        \"\"\""},{"line_number":42,"context_line":"        d \u003d {}"}],"source_content_type":"text/x-python","patch_set":4,"id":"9ad45d7e_bfbac2be","line":39,"range":{"start_line":39,"start_character":8,"end_line":39,"end_character":51},"in_reply_to":"bacf61ea_19f4f0ee","updated":"2016-08-08 12:52:43.000000000","message":"yes, will clarify","commit_id":"51e0e3bfd1f7f76f39ca7dbe209cfa88a10b96bd"}],"keystone/tests/unit/common/test_migration_phase_sql.py":[{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super(SqlTests, self).setUp()"},{"line_number":27,"context_line":"        self.useFixture(database.Database())"},{"line_number":28,"context_line":"        self.load_backends()"},{"line_number":29,"context_line":"        self.migration_phase \u003d migration_phase_sql.MigratonPhase()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def config_files(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_dccc0637","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":28},"updated":"2016-08-02 03:25:19.000000000","message":"any need to load backends here? looks like no api calls from anywhere.","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"ee0398add81ce19ffc143a0dc4da6e7e5b0f1434","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super(SqlTests, self).setUp()"},{"line_number":27,"context_line":"        self.useFixture(database.Database())"},{"line_number":28,"context_line":"        self.load_backends()"},{"line_number":29,"context_line":"        self.migration_phase \u003d migration_phase_sql.MigratonPhase()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def config_files(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_17e950b7","line":28,"range":{"start_line":28,"start_character":8,"end_line":28,"end_character":28},"in_reply_to":"bacf61ea_dccc0637","updated":"2016-08-02 08:25:12.000000000","message":"Done","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":13063,"name":"WEI CHEN","email":"dave.jungler@gmail.com","username":"wei.d.chen"},"change_message_id":"8911206cf0de7daff6f93d53f452d87d44741d0d","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        config_files.append(unit.dirs.tests_conf(\u0027backend_sql.conf\u0027))"},{"line_number":34,"context_line":"        return config_files"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    def test_crud_phase(self):"},{"line_number":37,"context_line":"        phase \u003d {\u0027current_version\u0027: uuid.uuid4().hex,"},{"line_number":38,"context_line":"                 \u0027migrating_to_version\u0027: uuid.uuid4().hex,"},{"line_number":39,"context_line":"                 \u0027current_phase\u0027: uuid.uuid4().hex}"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_1c0e9e8b","line":36,"range":{"start_line":36,"start_character":16,"end_line":36,"end_character":17},"updated":"2016-08-02 03:25:19.000000000","message":"no delete actually, fine as it is.","commit_id":"dcf23cc63ef498354fd5c1046f23ffdf42d607f0"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"81dd8e5d14c70b2ebd11b61b6dbb4d56dd166c0e","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystone.tests.unit.ksfixtures import database"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class SqlTests(unit.SQLDriverOverrides, unit.TestCase):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super(SqlTests, self).setUp()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_e506631f","line":23,"updated":"2016-08-08 17:22:18.000000000","message":"I don\u0027t think it matters technically since there isn\u0027t a namespace collision, but there is already a class named SqlTests, might be nice for this class to have a more unique name: http://git.openstack.org/cgit/openstack/keystone/tree/keystone/tests/unit/test_backend_sql.py#n49","commit_id":"e30c57c480330c980fb19649f7fcb24b68da894f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"18b7698bb0801e1f739c3e9aebfe24a074208ade","unresolved":false,"context_lines":[{"line_number":20,"context_line":"from keystone.tests.unit.ksfixtures import database"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class SqlTests(unit.SQLDriverOverrides, unit.TestCase):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def setUp(self):"},{"line_number":26,"context_line":"        super(SqlTests, self).setUp()"}],"source_content_type":"text/x-python","patch_set":5,"id":"9ad45d7e_91afe5e2","line":23,"in_reply_to":"9ad45d7e_e506631f","updated":"2016-08-08 17:23:31.000000000","message":"fair comment, I\u0027ll update.","commit_id":"e30c57c480330c980fb19649f7fcb24b68da894f"}]}
