)]}'
{"manila/db/migrations/alembic/versions/e8ea58723178_remove_host_from_driver_private_data.py":[{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"18b2d497cd197124fe1928245fe0e218ff92d65b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                COLUMN_NAME,"},{"line_number":54,"context_line":"                sql.String(255),"},{"line_number":55,"context_line":"                nullable\u003dFalse,"},{"line_number":56,"context_line":"                primary_key\u003dTrue,"},{"line_number":57,"context_line":"                default\u003dDEFAULT_HOST,"},{"line_number":58,"context_line":"            ),"},{"line_number":59,"context_line":"        )"},{"line_number":60,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_83be37fd","line":57,"range":{"start_line":56,"start_character":16,"end_line":57,"end_character":37},"updated":"2016-07-11 07:05:56.000000000","message":"As I tested downgrade in mysql, somehow these constraints are ignored by sqlalchemy. The newly added \"host\" fields are set to \u0027\u0027 and not primary key.\n\nAny suggestions?","commit_id":"7d211ebcc7f8ca4bd0372bf77c55c46c0d72ae1a"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"d324b93aab3f8ff13cd593796d0723f451a8e90c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                COLUMN_NAME,"},{"line_number":54,"context_line":"                sql.String(255),"},{"line_number":55,"context_line":"                nullable\u003dFalse,"},{"line_number":56,"context_line":"                primary_key\u003dTrue,"},{"line_number":57,"context_line":"                default\u003dDEFAULT_HOST,"},{"line_number":58,"context_line":"            ),"},{"line_number":59,"context_line":"        )"},{"line_number":60,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":5,"id":"1aa78d24_71068322","line":57,"range":{"start_line":56,"start_character":16,"end_line":57,"end_character":37},"updated":"2016-07-15 02:33:19.000000000","message":"I don\u0027t understand how the primary key can be the same default always. I\u0027ve only ever used default with some sort of random string/uuid i generate...","commit_id":"6793ab4582a286699b5ab2d1d0cd1538267c7f0f"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"859f0b89c0c95acb896efa80d66b312214d94b09","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                COLUMN_NAME,"},{"line_number":54,"context_line":"                sql.String(255),"},{"line_number":55,"context_line":"                nullable\u003dFalse,"},{"line_number":56,"context_line":"                primary_key\u003dTrue,"},{"line_number":57,"context_line":"                default\u003dDEFAULT_HOST,"},{"line_number":58,"context_line":"            ),"},{"line_number":59,"context_line":"        )"},{"line_number":60,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":5,"id":"fad55976_9e8d3f7e","line":57,"range":{"start_line":56,"start_character":16,"end_line":57,"end_character":37},"in_reply_to":"1aa78d24_305062d4","updated":"2016-07-15 21:01:12.000000000","message":"Fixed.","commit_id":"6793ab4582a286699b5ab2d1d0cd1538267c7f0f"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"3a62e4df861d17760b45c9d87d796f9d9dede90e","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                COLUMN_NAME,"},{"line_number":54,"context_line":"                sql.String(255),"},{"line_number":55,"context_line":"                nullable\u003dFalse,"},{"line_number":56,"context_line":"                primary_key\u003dTrue,"},{"line_number":57,"context_line":"                default\u003dDEFAULT_HOST,"},{"line_number":58,"context_line":"            ),"},{"line_number":59,"context_line":"        )"},{"line_number":60,"context_line":"    except Exception:"}],"source_content_type":"text/x-python","patch_set":5,"id":"1aa78d24_305062d4","line":57,"range":{"start_line":56,"start_character":16,"end_line":57,"end_character":37},"in_reply_to":"1aa78d24_71068322","updated":"2016-07-15 11:49:20.000000000","message":"Goutham, if you look at [1], you will see that it is part of composite primary key. Redundant part of it.\n\n[1] https://review.openstack.org/#/c/339592/5/manila/db/sqlalchemy/models.py","commit_id":"6793ab4582a286699b5ab2d1d0cd1538267c7f0f"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"ca0130a7012fb3836fb023565d1a1e931297c782","unresolved":false,"context_lines":[{"line_number":31,"context_line":"import sqlalchemy as sql"},{"line_number":32,"context_line":"from sqlalchemy.engine import reflection as sql_reflex"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from manila import exception"},{"line_number":35,"context_line":"from manila.db.migrations import utils"},{"line_number":36,"context_line":"from manila.i18n import _, _LE"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fad55976_32425811","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":28},"updated":"2016-07-16 04:29:46.000000000","message":"\u0027exception\u0027 imported but unused","commit_id":"0bb3949f671b96f0367acbeff747a0ee77c44f02"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"df88bbc438e60a2e10158ccfd6acc5f288cbb092","unresolved":false,"context_lines":[{"line_number":31,"context_line":"import sqlalchemy as sql"},{"line_number":32,"context_line":"from sqlalchemy.engine import reflection as sql_reflex"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from manila import exception"},{"line_number":35,"context_line":"from manila.db.migrations import utils"},{"line_number":36,"context_line":"from manila.i18n import _, _LE"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"fad55976_8b5e4674","line":34,"range":{"start_line":34,"start_character":0,"end_line":34,"end_character":28},"in_reply_to":"fad55976_32425811","updated":"2016-07-16 14:13:34.000000000","message":"Done.","commit_id":"0bb3949f671b96f0367acbeff747a0ee77c44f02"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"ca0130a7012fb3836fb023565d1a1e931297c782","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from sqlalchemy.engine import reflection as sql_reflex"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from manila import exception"},{"line_number":35,"context_line":"from manila.db.migrations import utils"},{"line_number":36,"context_line":"from manila.i18n import _, _LE"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d log.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fad55976_d22e5cf9","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":38},"updated":"2016-07-16 04:29:46.000000000","message":"imports not in alphabetical order (manila.exception, manila.db.migrations.utils)","commit_id":"0bb3949f671b96f0367acbeff747a0ee77c44f02"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"df88bbc438e60a2e10158ccfd6acc5f288cbb092","unresolved":false,"context_lines":[{"line_number":32,"context_line":"from sqlalchemy.engine import reflection as sql_reflex"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"from manila import exception"},{"line_number":35,"context_line":"from manila.db.migrations import utils"},{"line_number":36,"context_line":"from manila.i18n import _, _LE"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"LOG \u003d log.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fad55976_eb554250","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":38},"in_reply_to":"fad55976_d22e5cf9","updated":"2016-07-16 14:13:34.000000000","message":"Done.","commit_id":"0bb3949f671b96f0367acbeff747a0ee77c44f02"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"dad72afd432573663c2d8fae3ab4a2a4d192825b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        LOG.error(_LE(\"Column \u0027%s\u0027 could not be added\"), COLUMN_HOST)"},{"line_number":64,"context_line":"        raise"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    # Note(accelazh): As I tested, setting defalut value in"},{"line_number":67,"context_line":"    # op.add_column with default\u003dxxx doesn\u0027t have effect. So I"},{"line_number":68,"context_line":"    # have to set the default value and nullable separately."},{"line_number":69,"context_line":"    try:"},{"line_number":70,"context_line":"        connection \u003d op.get_bind()"},{"line_number":71,"context_line":"        table \u003d utils.load_table(TABLE_NAME, connection)"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_e329809c","line":68,"range":{"start_line":66,"start_character":3,"end_line":68,"end_character":60},"updated":"2016-07-21 12:49:26.000000000","message":"Default value is applied for new DB record. But below you update existing. So, this comment should be removed.","commit_id":"0435aa30bcdf83bd42d12b8d161b7cff98489de2"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"dad72afd432573663c2d8fae3ab4a2a4d192825b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        LOG.error(_LE(\"Could not set column \u0027%s\u0027 not null\"), COLUMN_HOST)"},{"line_number":84,"context_line":"        raise"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    # Note(accelazh): To add columne \u0027host\u0027 to primary key, I need to"},{"line_number":87,"context_line":"    # drop them then recreate them. In sqlalchemy AFAIK there is no well"},{"line_number":88,"context_line":"    # supported API, so I have to issue the raw SQLs."},{"line_number":89,"context_line":"    try:"},{"line_number":90,"context_line":"        migrate_engine \u003d op.get_bind().engine"},{"line_number":91,"context_line":"        if migrate_engine.name \u003d\u003d \"mysql\":"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_83e7e4aa","line":88,"range":{"start_line":86,"start_character":4,"end_line":88,"end_character":53},"updated":"2016-07-21 12:49:26.000000000","message":"Actually, you can create new table and copy data from old to new. BUT, host was always redundant even for constraint. I do not see any reason to just skip it.","commit_id":"0435aa30bcdf83bd42d12b8d161b7cff98489de2"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"dad72afd432573663c2d8fae3ab4a2a4d192825b","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    # supported API, so I have to issue the raw SQLs."},{"line_number":89,"context_line":"    try:"},{"line_number":90,"context_line":"        migrate_engine \u003d op.get_bind().engine"},{"line_number":91,"context_line":"        if migrate_engine.name \u003d\u003d \"mysql\":"},{"line_number":92,"context_line":"            op.execute("},{"line_number":93,"context_line":"                (\"ALTER TABLE `%(table_name)s` DROP PRIMARY KEY, \""},{"line_number":94,"context_line":"                 \"ADD PRIMARY KEY (`%(col_host)s`, `%(col_entity)s`, \""},{"line_number":95,"context_line":"                 \"`%(col_key)s`)\") % {"},{"line_number":96,"context_line":"                    \u0027table_name\u0027: TABLE_NAME,"},{"line_number":97,"context_line":"                    \u0027col_host\u0027: COLUMN_HOST,"},{"line_number":98,"context_line":"                    \u0027col_entity\u0027: COLUMN_ENTITY,"},{"line_number":99,"context_line":"                    \u0027col_key\u0027: COLUMN_KEY"},{"line_number":100,"context_line":"                })"},{"line_number":101,"context_line":"        elif migrate_engine.name \u003d\u003d \"postgresql\":"},{"line_number":102,"context_line":"            # Note(accelazh): Somehow it is possible that table"},{"line_number":103,"context_line":"            # drivers_private_data doesn\u0027t have primary key. So"},{"line_number":104,"context_line":"            # we need to test its existance before we go"},{"line_number":105,"context_line":"            insp \u003d sql_reflex.Inspector.from_engine(migrate_engine)"},{"line_number":106,"context_line":"            table_indexes \u003d insp.get_indexes(\"drivers_private_data\")"},{"line_number":107,"context_line":"            primary_key_name \u003d TABLE_NAME + \u0027_pkey\u0027"},{"line_number":108,"context_line":"            if primary_key_name in table_indexes:"},{"line_number":109,"context_line":"                op.execute("},{"line_number":110,"context_line":"                    (\"ALTER TABLE \\\"%(table_name)s\\\" DROP CONSTRAINT \""},{"line_number":111,"context_line":"                     \"\\\"%(table_name)s_pkey\\\"\") % {"},{"line_number":112,"context_line":"                        \u0027table_name\u0027: TABLE_NAME,"},{"line_number":113,"context_line":"                    })"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            op.execute("},{"line_number":116,"context_line":"                (\"ALTER TABLE \\\"%(table_name)s\\\" \""},{"line_number":117,"context_line":"                 \"ADD PRIMARY KEY (\\\"%(col_host)s\\\", \""},{"line_number":118,"context_line":"                 \"\\\"%(col_entity)s\\\", \\\"%(col_key)s\\\")\") % {"},{"line_number":119,"context_line":"                    \u0027table_name\u0027: TABLE_NAME,"},{"line_number":120,"context_line":"                    \u0027col_host\u0027: COLUMN_HOST,"},{"line_number":121,"context_line":"                    \u0027col_entity\u0027: COLUMN_ENTITY,"},{"line_number":122,"context_line":"                    \u0027col_key\u0027: COLUMN_KEY"},{"line_number":123,"context_line":"                })"},{"line_number":124,"context_line":"        else:"},{"line_number":125,"context_line":"            msg \u003d _(\"Unsupported database engine %(engine)s.\""},{"line_number":126,"context_line":"                    \"Could not add column \u0027%(column)s\u0027 to primary key\") % {"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_432e8cfb","line":123,"range":{"start_line":91,"start_character":8,"end_line":123,"end_character":18},"updated":"2016-07-21 12:49:26.000000000","message":"Explicit SQL code should not be used at all. Moreover, sqlalchemy supports more than these two dialects.","commit_id":"0435aa30bcdf83bd42d12b8d161b7cff98489de2"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"dad72afd432573663c2d8fae3ab4a2a4d192825b","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                    \u0027col_entity\u0027: COLUMN_ENTITY,"},{"line_number":122,"context_line":"                    \u0027col_key\u0027: COLUMN_KEY"},{"line_number":123,"context_line":"                })"},{"line_number":124,"context_line":"        else:"},{"line_number":125,"context_line":"            msg \u003d _(\"Unsupported database engine %(engine)s.\""},{"line_number":126,"context_line":"                    \"Could not add column \u0027%(column)s\u0027 to primary key\") % {"},{"line_number":127,"context_line":"                        \u0027engine\u0027: migrate_engine.name,"},{"line_number":128,"context_line":"                        \u0027column\u0027: COLUMN_HOST}"},{"line_number":129,"context_line":"            LOG.error(msg)"},{"line_number":130,"context_line":"            raise oslo_db.exception.DBError(msg\u003dmsg)"},{"line_number":131,"context_line":"    except Exception:"},{"line_number":132,"context_line":"        LOG.error(_LE(\"Could not add column \u0027%s\u0027 to primary key\"),"},{"line_number":133,"context_line":"                  COLUMN_HOST)"},{"line_number":134,"context_line":"        raise"}],"source_content_type":"text/x-python","patch_set":7,"id":"dada55a8_fee63742","line":134,"range":{"start_line":124,"start_character":8,"end_line":134,"end_character":13},"updated":"2016-07-21 12:49:26.000000000","message":"Here you raise exception and then catch it right away logging problem twice. I would say it should be changed, but considering comment above, raise of exception will just go away.","commit_id":"0435aa30bcdf83bd42d12b8d161b7cff98489de2"}],"manila/db/sqlalchemy/models.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"79feebce09ce83ef36fd31911df8f7581aa53021","unresolved":false,"context_lines":[{"line_number":873,"context_line":""},{"line_number":874,"context_line":"class DriverPrivateData(BASE, ManilaBase):"},{"line_number":875,"context_line":"    \"\"\"Represents a private data as key-value pairs for a driver.\"\"\""},{"line_number":876,"context_line":"    __tablename__ \u003d \u0027drivers_private_data\u0027"},{"line_number":877,"context_line":"    entity_uuid \u003d Column(String(36), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":878,"context_line":"    key \u003d Column(String(255), nullable\u003dFalse, primary_key\u003dTrue)"},{"line_number":879,"context_line":"    value \u003d Column(String(1023), nullable\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_0e3582f6","line":876,"updated":"2016-07-08 14:58:48.000000000","message":"If you update model, then you need to create DB migration file with appropriate script that does the same for environment.","commit_id":"08de6404afdbadd3078fb3978537b0406878f986"}],"manila/share/drivers_private_data.py":[{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"ca0130a7012fb3836fb023565d1a1e931297c782","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self, context, backend_host):"},{"line_number":45,"context_line":"        # Backend shouldn\u0027t access data stored by another backend"},{"line_number":46,"context_line":"        self.backend_host \u003d backend_host"},{"line_number":47,"context_line":"        self.context \u003d context"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"fad55976_aa9ff201","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":40},"updated":"2016-07-16 04:29:46.000000000","message":"Does this need to be removed, when the self.backend_host has been removed in SqlStorageDriver class.","commit_id":"0bb3949f671b96f0367acbeff747a0ee77c44f02"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"ca0130a7012fb3836fb023565d1a1e931297c782","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        :param storage: None or inheritor of StorageDriver abstract class"},{"line_number":106,"context_line":"        :param config_group: Optional -- Config group used for loading settings"},{"line_number":107,"context_line":"        :param context: Optional -- Current context"},{"line_number":108,"context_line":"        :param backend_host: Optional -- Driver host"},{"line_number":109,"context_line":"        \"\"\""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        config_group_name \u003d kwargs.get(\u0027config_group\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fad55976_e5411b3b","line":108,"range":{"start_line":108,"start_character":9,"end_line":108,"end_character":52},"updated":"2016-07-16 04:29:46.000000000","message":"Does this need to be removed, when the \"host\" field in driver private data is not used and no longer needed.","commit_id":"0bb3949f671b96f0367acbeff747a0ee77c44f02"},{"author":{"_account_id":13900,"name":"Accela Zhao","email":"accelazh@gmail.com","username":"accelazh"},"change_message_id":"df88bbc438e60a2e10158ccfd6acc5f288cbb092","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        :param storage: None or inheritor of StorageDriver abstract class"},{"line_number":106,"context_line":"        :param config_group: Optional -- Config group used for loading settings"},{"line_number":107,"context_line":"        :param context: Optional -- Current context"},{"line_number":108,"context_line":"        :param backend_host: Optional -- Driver host"},{"line_number":109,"context_line":"        \"\"\""},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        config_group_name \u003d kwargs.get(\u0027config_group\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"fad55976_ab0d0a92","line":108,"range":{"start_line":108,"start_character":9,"end_line":108,"end_character":52},"in_reply_to":"fad55976_e5411b3b","updated":"2016-07-16 14:13:34.000000000","message":"Good catch. But see #L116, \u0027backend_host\u0027 is still a parameter from kwargs. Currently I prefer not to remove it.","commit_id":"0bb3949f671b96f0367acbeff747a0ee77c44f02"}]}
