)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"f73c088064dcc465fe26fa772885616c1e404b44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"c1d13265_a03c25b1","updated":"2024-05-10 07:29:41.000000000","message":"Hello, I tested Trove could generate same database schema after appling this patch by the following procedure.\n\n1. On one host, start Trove without this patch by devstack and then dump the database schema.\n$ stack.sh\n$ mysqldump -uroot -ppassword --no-data trove \u003e ~/trove_schema.sql\n\n3. On another host, start Trove with this patch by devstack and dump the database schema.\n$ stack.sh\n$ mysqldump -uroot -ppassword --no-data trove \u003e ~/trove_schema_new.sql\n\n4. Compare the database schemas.\n$ diff -c trove_schema.sql trove_schema_new.sql \n\nHere is a result. An index order is different, but I do not think it affects Trove\u0027s behavior.\n\n```\n$ diff -c trove_schema.sql trove_schema_new.sql \n*** trove_schema.sql\t2024-05-10 16:12:22.709355164 +0900\n--- trove_schema_new.sql\t2024-05-10 16:13:29.553830477 +0900\n***************\n*** 150,157 ****\n    `configuration_id` varchar(36) DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    KEY `datastore_version_id` (`datastore_version_id`),\n-   KEY `clusters_tenant_id` (`tenant_id`),\n    KEY `clusters_deleted` (`deleted`),\n    KEY `configuration_id` (`configuration_id`),\n    CONSTRAINT `clusters_ibfk_1` FOREIGN KEY (`datastore_version_id`) REFERENCES `datastore_versions` (`id`),\n    CONSTRAINT `clusters_ibfk_2` FOREIGN KEY (`configuration_id`) REFERENCES `configurations` (`id`),\n--- 150,157 ----\n    `configuration_id` varchar(36) DEFAULT NULL,\n    PRIMARY KEY (`id`),\n    KEY `datastore_version_id` (`datastore_version_id`),\n    KEY `clusters_deleted` (`deleted`),\n+   KEY `clusters_tenant_id` (`tenant_id`),\n    KEY `configuration_id` (`configuration_id`),\n    CONSTRAINT `clusters_ibfk_1` FOREIGN KEY (`datastore_version_id`) REFERENCES `datastore_versions` (`id`),\n    CONSTRAINT `clusters_ibfk_2` FOREIGN KEY (`configuration_id`) REFERENCES `configurations` (`id`),\n***************\n*** 671,674 ****\n  /*!40101 SET COLLATION_CONNECTION\u003d@OLD_COLLATION_CONNECTION */;\n  /*!40111 SET SQL_NOTES\u003d@OLD_SQL_NOTES */;\n  \n! -- Dump completed on 2024-05-10 14:56:11\n--- 671,674 ----\n  /*!40101 SET COLLATION_CONNECTION\u003d@OLD_COLLATION_CONNECTION */;\n  /*!40111 SET SQL_NOTES\u003d@OLD_SQL_NOTES */;\n  \n! -- Dump completed on 2024-05-10 16:11:32\n````","commit_id":"4f1f5f678c7c15a8687e164bd48a699c3f058d14"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"1a60380e7fb6145214d9882e683b9847e081aae1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"bd3b0cb5_8c3844c3","updated":"2024-05-10 07:51:58.000000000","message":"Hi Wu and Bo, could you please check this patch? I think it is a necessary step that we migrate to SQLAlchemy-2.X to stop using sqlalchemy-migrate, which does not support SQLAlchemy-2.X.\n\nThanks in advance,\nHirotaka","commit_id":"4f1f5f678c7c15a8687e164bd48a699c3f058d14"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"abec2900a32db46798c1d7d28a0eaaec51b0a9af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"98d81676_8e9d7979","updated":"2024-05-10 14:05:39.000000000","message":"Hi, hirotaka, great work!! i will review soon. By the way, Do we need to cherry pick to stable/2024.01 branch? thanks","commit_id":"4f1f5f678c7c15a8687e164bd48a699c3f058d14"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"367ae2ea504c7ab56b54e2cb34ac597cbe7c6270","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"bd2678db_29a61d07","in_reply_to":"98d81676_8e9d7979","updated":"2024-05-11 06:38:20.000000000","message":"Hi Wu and Bo, Thanks for the comment! This patch can create the same database schema as the one generated by sqlalchemy-migrate, but I will do more tests to understand the this patch\u0027s behavior under the following situations.\n\n* Case1. When executing \"trove-manage db_sync\", what happens for existing data.\n* Case2. When executing \"trove-manage db_sync XXXXX\", what happens?","commit_id":"4f1f5f678c7c15a8687e164bd48a699c3f058d14"},{"author":{"_account_id":28691,"name":"Bo Tran","email":"ministry.96.nd@gmail.com","username":"ministry"},"change_message_id":"eb78f07d3ead77d0dcd3c70ee3ecd0325c0c03af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d76c575a_f86fdb9c","in_reply_to":"bd3b0cb5_8c3844c3","updated":"2024-05-10 08:23:16.000000000","message":"Hello, I will test this patch in the next week.","commit_id":"4f1f5f678c7c15a8687e164bd48a699c3f058d14"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"9b8dc51fd34a891c39fc9f6676091e10f6aff0fe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"7cfd8f6b_ca5abaa0","updated":"2024-05-18 08:33:02.000000000","message":"Hello Wu and Bo, I will update the patch in this weekend because I found another bug and tests failure😵. Thanks in advance, Hirotaka","commit_id":"dc3cb68e02c780b998ad2d0f3dee5b8e74cce41a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"fca0d11633fcd63a95b9731ca953e841c8823d18","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"bd2e2554_bfe6477a","in_reply_to":"7cfd8f6b_ca5abaa0","updated":"2024-05-20 03:22:51.000000000","message":"Hi, hirotaka, thanks for your hard work. I didn\u0027t start to review this yet.","commit_id":"dc3cb68e02c780b998ad2d0f3dee5b8e74cce41a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"00d491acd048389831ec5ad302e809c3dec7384b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"4c34cd84_0e1ca2f5","updated":"2024-05-24 10:27:21.000000000","message":"The following steps are intended for new OpenStack Trove users. \n\nFor existing users, I will test in this weekend, I think they simply need to execute `trove-manage db_sync` or `trove-manage db_upgrade xxx` after upgrading the OpenStack Trove package.\n\n## 1. applies the patch and run devstack\nLet\u0027s make a new trove environment using devstack[1]. Before starting \"stack.sh\", download trove source code and apply the patch to it.\n\n```\n$ cd ~/ \u0026\u0026 git clone https://opendev.org/openstack/trove.git\n$ cd ~/trove \u0026\u0026 git fetch https://review.opendev.org/openstack/trove refs/changes/61/918661/11 \u0026\u0026 git cherry-pick FETCH_HEAD\n```\n\nThen, make a local.conf and run `stack.sh`.\n```\n$ cd ~/ \u0026\u0026 git clone https://git.openstack.org/openstack-dev/devstack\n$ cd devstack \u0026\u0026 vi local.conf\n$ ./stack.sh\n```\n\n## 2. Create an instance\nAfter `stack.sh` is done, create a instance[2].\n\n```\n$ MYSQL_VERSION\u003d5.7.44\n$ openstack datastore version create ${MYSQL_VERSION} mysql mysql \"\" --image-tags trove,mysql --active --default --version-number ${MYSQL_VERSION}\n$ openstack database instance create mysql1 --flavor d2     --nic net-id\u003d$(openstack network list -f value -c ID --name private)     --datastore mysql --datastore-version ${MYSQL_VERSION} --datastore-version-number ${MYSQL_VERSION} --size 1\n$ openstack database instance list\n+--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------------------+-----------+------+------+\n| ID                                   | Name   | Datastore | Datastore Version | Status | Operating Status | Public | Addresses                                | Flavor ID | Size | Role |\n+--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------------------+-----------+------+------+\n| 804270f0-f703-4e09-9c1b-7277a9eeea53 | mysql1 | mysql     | 5.7.44            | ACTIVE | HEALTHY          | False  | [{\u0027address\u0027: \u002710.0.3.57\u0027, \u0027type\u0027:        | d2        |    1 |      |\n|                                      |        |           |                   |        |                  |        | \u0027private\u0027, \u0027network\u0027:                    |           |      |      |\n|                                      |        |           |                   |        |                  |        | \u002700498aea-a30a-4021-8298-62137e1a9bca\u0027}] |           |      |      |\n+--------------------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------------------+-----------+------+------+\n```\n\n## 3. update the schema using \"alembic\"\nLet\u0027s create a new revision[3]. The following example shows adding the `test_date` column to `instances` table schema.\n\n```\n$ cd ~/trove/trove/db/sqlalchemy/\n$ alembic revision -m \"update schema test\" \n  Generating /opt/stack/trove/trove/db/sqlalchemy/migrations/versions/fa0c71e77841_update_schema_test.py ...  done\n$ ALEMBIC_COMMIT_HASH\u003d$(alembic heads|awk \u0027{print $1}\u0027)\n$ perl -pi -e \"BEGIN{undef $/;} s|upgrade\\(\\) -\u003e None:\\n    pass\\n|upgrade\\(\\) -\u003e None:\\n    op.add_column(\u0027instances\u0027, sa.Column(\u0027test_date\u0027, sa.DateTime))\\n|smg\" migrations/versions/${ALEMBIC_COMMIT_HASH}_update_schema_test.py\n```\n\n## 4. apply the schema\nThen, run `db_sync` to apply the schema.\n\n```\n$ trove-manage db_sync\n2024-05-24 14:46:00.648 279709 INFO dbcounter [-] Registered counter for database trove\n2024-05-24 14:46:00.660 279709 INFO alembic.runtime.migration [-] Context impl MySQLImpl.\n2024-05-24 14:46:00.660 279709 INFO alembic.runtime.migration [-] Will assume non-transactional DDL.\n2024-05-24 14:46:00.661 279709 DEBUG dbcounter [-] [279709] Writer thread running stat_writer /usr/local/lib/python3.9/site-packages/dbcounter.py:102\n2024-05-24 14:46:00.665 279709 INFO alembic.runtime.migration [-] Running upgrade 5c68b4fb3cd1 -\u003e fa0c71e77841, update schema test\n2024-05-24 14:46:00.668 279709 DEBUG alembic.runtime.migration [-] update 5c68b4fb3cd1 to fa0c71e77841 update_to_step /usr/local/lib/python3.9/site-packages/alembic/runtime/migration.py:865\n```\n\nSome users may run `db_upgrade` with a version.\n\n```\n$ trove-manage db_upgrade --version head\n2024-05-24 17:06:42.462 156865 INFO dbcounter [-] Registered counter for database trove\n2024-05-24 17:06:42.473 156865 INFO alembic.runtime.migration [-] Context impl MySQLImpl.\n2024-05-24 17:06:42.473 156865 INFO alembic.runtime.migration [-] Will assume non-transactional DDL.\n2024-05-24 17:06:42.474 156865 DEBUG dbcounter [-] [156865] Writer thread running stat_writer /usr/local/lib/python3.9/site-packages/dbcounter.py:102\n```\n\nLastly, let\u0027s check the schema is applied.\n```\n$ mysqldump -uroot -ppassword --no-data trove|grep \u0027test_date\u0027\n  `test_date` datetime DEFAULT NULL,\n```\n\n---\n1: https://docs.openstack.org/trove/latest/install/install-devstack.html\n2: https://docs.openstack.org/trove/latest/user/create-db.html\n3: https://alembic.sqlalchemy.org/en/latest/tutorial.html#create-a-migration-script","commit_id":"f81a87a2de282fd6f1976d6a173f05d894de5e7d"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"fb60a0b3cba59e4e0c043e0f89b7e2004def56bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"729b454c_f1d0b67b","in_reply_to":"4c34cd84_0e1ca2f5","updated":"2024-05-29 05:16:18.000000000","message":"Hi hirotaka, The CI was failed. `sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (3822, \"Duplicate check constraint name \u0027CONSTRAINT_1\u0027.\")`\nas per: https://zuul.opendev.org/t/openstack/build/2e787d6ac7bc46b5a638c791f7484be3","commit_id":"f81a87a2de282fd6f1976d6a173f05d894de5e7d"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"5eec87cf_4f085871","updated":"2024-05-31 10:12:57.000000000","message":"Hi Wu, Thank you very much for the review!","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"096a3f53d27180d3d90cc6e90ac21e81585b8093","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"1b45fe34_7cf4d4bf","updated":"2024-05-22 05:45:12.000000000","message":"I updated the patch to drop support for sqlalchemy-migrate, because SQLAlchemy-2.0 does not have `sqlalchemy.databases` module so that test_migration_utils test cases fail. Here is an result of `tox -e py39` on Rocky-9.3 with SQLAlchemy-2.0.29.\n```\n{0} unittest.loader._FailedTest.trove.tests.unittests.db.test_migration_utils [0.000165s] ... FAILED\n\nCaptured traceback:\n~~~~~~~~~~~~~~~~~~~\n    ImportError: Failed to import test module: trove.tests.unittests.db.test_migration_utils\nTraceback (most recent call last):\n  File \"/usr/lib64/python3.9/unittest/loader.py\", line 436, in _find_test_path\n    module \u003d self._get_module_from_name(name)\n  File \"/usr/lib64/python3.9/unittest/loader.py\", line 377, in _get_module_from_name\n    __import__(name)\n  File \"/opt/stack/trove/trove/tests/unittests/db/test_migration_utils.py\", line 24, in \u003cmodule\u003e\n    from trove.db.sqlalchemy import utils as db_utils\n  File \"/opt/stack/trove/trove/db/sqlalchemy/utils.py\", line 16, in \u003cmodule\u003e\n    from migrate.changeset.constraint import ForeignKeyConstraint\n  File \"/opt/stack/trove/.tox/py3/lib/python3.9/site-packages/migrate/__init__.py\", line 11, in \u003cmodule\u003e\n    from migrate.changeset import *\n  File \"/opt/stack/trove/.tox/py3/lib/python3.9/site-packages/migrate/changeset/__init__.py\", line 21, in \u003cmodule\u003e\n    from migrate.changeset.schema import *\n  File \"/opt/stack/trove/.tox/py3/lib/python3.9/site-packages/migrate/changeset/schema.py\", line 20, in \u003cmodule\u003e\n    from migrate.changeset.databases.visitor import (get_engine_visitor,\n  File \"/opt/stack/trove/.tox/py3/lib/python3.9/site-packages/migrate/changeset/databases/visitor.py\", line 7, in \u003cmodule\u003e\n    from migrate.changeset.databases import (sqlite,\n  File \"/opt/stack/trove/.tox/py3/lib/python3.9/site-packages/migrate/changeset/databases/sqlite.py\", line 13, in \u003cmodule\u003e\n    from sqlalchemy.databases import sqlite as sa_base\nModuleNotFoundError: No module named \u0027sqlalchemy.databases\u0027\n```\n\nThanks,\nHirotaka","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"dd57d6995c4c0859642700bf656a53117925c30d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"a4accc43_b75bdd83","updated":"2024-05-29 09:24:42.000000000","message":"i\u0027ve tested this patch locally. and i have several concerns on this.\n\n1. after we switched to alembic, why don\u0027t we restructure the trove-manager script as the trove-manager doesn\u0027t work already?\n2. this patch only adds two reversion scripts, namely `init_trove_db.py` and `add_datastore_version_registry_extension.py`, In my local environment, after i ran alembic script, the trove database lost many tables such as: backup_strategy, quota_usages. etc.\n3. after we switch to alembic tools, we also need to clean the scripts in `migrate_repo` directory.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"3de4abc7_92775c01","in_reply_to":"a4accc43_b75bdd83","updated":"2024-05-29 16:43:14.000000000","message":"Sorry for my previous comment. I have figured the issue out.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"2b73f4bfa22d59b38028a38f0864cb7205d8141b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"3e6c2041_5efb0b0a","updated":"2024-06-04 06:25:43.000000000","message":"CI is still failed with `sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (3822, \"Duplicate check constraint name \u0027CONSTRAINT_1\u0027.\")`","commit_id":"6aec38d63d87fa2e2696003300ee87f5c7add834"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"685d46c14a71d1d0186601f4232addbe5e088594","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"91908771_781e0177","updated":"2024-06-11 12:29:16.000000000","message":"recheck mariaDB repo was fixed","commit_id":"45623c27bb063106dff0de680c5c53267ae47107"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"2c902f0fdda7cdee512aef5d3c75984587688cdc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"38d89239_189f50e4","updated":"2024-06-10 00:52:15.000000000","message":"recheck network Forbidden","commit_id":"45623c27bb063106dff0de680c5c53267ae47107"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"c4e055ffd1aa4d6cec2aa36e713d27957b756545","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"38ca41a3_b18f34fd","updated":"2024-06-12 15:14:01.000000000","message":"Hello Wu, Thanks for your great work! LGTM 😊\n\nI reviewed the patch and applied it for a existing Trove development environment, then confirmed that I successfully migrated the schema. For reference, here are the steps that I did.\n\n## 1. Check my environment before migration\n\n```\n$ git show\ncommit 7501804a9f321525e7f5e68f4c51ff5cbd45be70 (HEAD, origin/master, origin/HEAD, master)\nMerge: 3a69bd35 7d2ed80c\nAuthor: Zuul \u003czuul@review.opendev.org\u003e\nDate:   Mon May 20 03:35:38 2024 +0000\n\n    Merge \"reno: Update master for unmaintained/zed\"\n```\n```\n$ openstack database instance list\n+----------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------+-----------+------+------+\n| ID                         | Name   | Datastore | Datastore Version | Status | Operating Status | Public | Addresses                    | Flavor ID | Size | Role |\n+----------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------+-----------+------+------+\n| e3354a60-960d-42b9-a956-84 | mysql1 | mysql     | 5.7.44            | ACTIVE | HEALTHY          | False  | [{\u0027address\u0027: \u002710.0.3.8\u0027,     | d2        |    1 |      |\n| e448dc10b5                 |        |           |                   |        |                  |        | \u0027type\u0027: \u0027private\u0027,           |           |      |      |\n|                            |        |           |                   |        |                  |        | \u0027network\u0027: \u002721587a1f-be89-4d |           |      |      |\n|                            |        |           |                   |        |                  |        | c4-9361-d6a6fd898f7e\u0027}]      |           |      |      |\n+----------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------+-----------+------+------+\n```\n\n## 2. Apply the patch\n```\n$ cd ~/trove\n$ git fetch https://review.opendev.org/openstack/trove refs/changes/61/918661/20 \u0026\u0026 git checkout FETCH_HEAD\n$ git show|head -n 1\ncommit 999872554e3cf4c9fa8e42fa67e452f047a9a8d6\n```\n\n## 3. Migrate Trove database\n\nLet\u0027s check the docs and migrate the schema.\nhttps://docs.openstack.org/trove/latest/admin/upgrade.html#upgrade-trove-services\n```\n$ trove-manage --config-file /etc/trove/trove.conf db_upgrade\n2024-06-12 22:59:25.812 3437659 INFO dbcounter [-] Registered counter for database trove\n2024-06-12 22:59:25.828 3437659 DEBUG oslo_db.sqlalchemy.engines [-] MySQL server mode set to STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION _check_effective_sql_mode /usr/local/lib/python3.9/site-packages/oslo_db/sqlalchemy/engines.py:342\n2024-06-12 22:59:25.832 3437659 DEBUG dbcounter [-] [3437659] Writer thread running stat_writer /usr/local/lib/python3.9/site-packages/dbcounter.py:102\n2024-06-12 22:59:25.837 3437659 INFO alembic.runtime.migration [-] Context impl MySQLImpl.\n2024-06-12 22:59:25.837 3437659 INFO alembic.runtime.migration [-] Will assume non-transactional DDL.\n2024-06-12 22:59:25.839 3437659 INFO trove.db.sqlalchemy.api [-] The database is still under sqlalchemy-migrate control; fake applying the initial alembic migration\n2024-06-12 22:59:25.843 3437659 INFO trove.db.sqlalchemy.api [-] current version is 49\n2024-06-12 22:59:25.844 3437659 INFO dbcounter [-] Registered counter for database trove\n2024-06-12 22:59:25.848 3437659 INFO alembic.runtime.migration [-] Context impl MySQLImpl.\n2024-06-12 22:59:25.849 3437659 INFO alembic.runtime.migration [-] Will assume non-transactional DDL.\n2024-06-12 22:59:25.849 3437659 DEBUG dbcounter [-] [3437659] Writer thread running stat_writer /usr/local/lib/python3.9/site-packages/dbcounter.py:102\n2024-06-12 22:59:25.863 3437659 INFO alembic.runtime.migration [-] Running stamp_revision  -\u003e 5c68b4fb3cd1\n2024-06-12 22:59:25.863 3437659 DEBUG alembic.runtime.migration [-] new branch insert 5c68b4fb3cd1 update_to_step /usr/local/lib/python3.9/site-packages/alembic/runtime/migration.py:830\n2024-06-12 22:59:25.866 3437659 INFO dbcounter [-] Registered counter for database trove\n2024-06-12 22:59:25.869 3437659 INFO alembic.runtime.migration [-] Context impl MySQLImpl.\n2024-06-12 22:59:25.870 3437659 INFO alembic.runtime.migration [-] Will assume non-transactional DDL.\n2024-06-12 22:59:25.870 3437659 DEBUG dbcounter [-] [3437659] Writer thread running stat_writer /usr/local/lib/python3.9/site-packages/dbcounter.py:102\n2024-06-12 22:59:25.873 3437659 INFO alembic.runtime.migration [-] Running upgrade 5c68b4fb3cd1 -\u003e cee1bcba3541, drop-migrate-version-table\n2024-06-12 22:59:25.883 3437659 DEBUG alembic.runtime.migration [-] update 5c68b4fb3cd1 to cee1bcba3541 update_to_step /usr/local/lib/python3.9/site-packages/alembic/runtime/migration.py:865\n```\n\n## 4. Restart the daemons and check the instance status again\n\n```\n$ sudo systemctl restart devstack@tr*\n$ sudo systemctl restart httpd\n$ openstack database instance list\n+----------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------+-----------+------+------+\n| ID                         | Name   | Datastore | Datastore Version | Status | Operating Status | Public | Addresses                    | Flavor ID | Size | Role |\n+----------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------+-----------+------+------+\n| e3354a60-960d-42b9-a956-84 | mysql1 | mysql     | 5.7.44            | ACTIVE | HEALTHY          | False  | [{\u0027address\u0027: \u002710.0.3.8\u0027,     | d2        |    1 |      |\n| e448dc10b5                 |        |           |                   |        |                  |        | \u0027type\u0027: \u0027private\u0027,           |           |      |      |\n|                            |        |           |                   |        |                  |        | \u0027network\u0027: \u002721587a1f-be89-4d |           |      |      |\n|                            |        |           |                   |        |                  |        | c4-9361-d6a6fd898f7e\u0027}]      |           |      |      |\n+----------------------------+--------+-----------+-------------------+--------+------------------+--------+------------------------------+-----------+------+------+\n```\n\nI also confirmed that I successfully added a new example schema using \"alembic\" and applied it by using `trove-manage db_sync`. :)","commit_id":"999872554e3cf4c9fa8e42fa67e452f047a9a8d6"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"a6843e53a64a11090fb211da396c3b3c5256efc6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"30250033_f1b82981","updated":"2024-06-12 13:03:32.000000000","message":"Hi Wu, Thanks a lot for the updates! I\u0027ll let you know soon after I review it.","commit_id":"999872554e3cf4c9fa8e42fa67e452f047a9a8d6"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"f9d24ea586aaa94ac0d1c139540e0360e6adb243","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"6d1fd419_53c70a6a","updated":"2024-06-12 12:27:12.000000000","message":"Hi， hirotaka, Let\u0027s review and merge this commit ASAP.","commit_id":"999872554e3cf4c9fa8e42fa67e452f047a9a8d6"}],"trove/db/sqlalchemy/migrations/versions/906cffda7b29_init_trove_db.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        Column(\u0027server_status\u0027, String(64)),"},{"line_number":63,"context_line":"        Column(\u0027deleted\u0027, Boolean()),"},{"line_number":64,"context_line":"        Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":65,"context_line":"        Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":66,"context_line":"        Column(\u0027configuration_id\u0027, String(36)),"},{"line_number":67,"context_line":"        Column(\u0027slave_of_id\u0027, String(36)),"},{"line_number":68,"context_line":"        Column(\u0027cluster_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"3c0d5c09_337727a5","line":65,"updated":"2024-05-29 16:43:14.000000000","message":"add `nullable\u003dTrue` in `043_instance_ds_version_nullable.py` and add `foreignkey` here ?","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        Column(\u0027server_status\u0027, String(64)),"},{"line_number":63,"context_line":"        Column(\u0027deleted\u0027, Boolean()),"},{"line_number":64,"context_line":"        Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":65,"context_line":"        Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":66,"context_line":"        Column(\u0027configuration_id\u0027, String(36)),"},{"line_number":67,"context_line":"        Column(\u0027slave_of_id\u0027, String(36)),"},{"line_number":68,"context_line":"        Column(\u0027cluster_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"de2cb406_cfcd9be4","line":65,"in_reply_to":"3c0d5c09_337727a5","updated":"2024-05-31 10:12:57.000000000","message":"There are 14 `nullable\u003dTrue` in `sqlalchemy/migrate_repo/versions`, but it\u0027s unclear to me whether or not to add `nullable\u003dTrue`... I don\u0027t add `nullable\u003dTrue` because if data to `datastore_version_id` column is not supplied to, it will have a `NULL`.\n\nSorry for confusing, Yes, we should add `foreignkey` here, but I moved the foreign key constraints in instances to latter part of the file just for my clarity. I will reconsider where I should place the foreign key statements.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"f2833eb1c91ce33c4586022e43a6fdc597279d13","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        Column(\u0027server_status\u0027, String(64)),"},{"line_number":63,"context_line":"        Column(\u0027deleted\u0027, Boolean()),"},{"line_number":64,"context_line":"        Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":65,"context_line":"        Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":66,"context_line":"        Column(\u0027configuration_id\u0027, String(36)),"},{"line_number":67,"context_line":"        Column(\u0027slave_of_id\u0027, String(36)),"},{"line_number":68,"context_line":"        Column(\u0027cluster_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"ede176b6_c3f07741","line":65,"in_reply_to":"de2cb406_cfcd9be4","updated":"2024-06-05 04:43:08.000000000","message":"Thanks, I added the foreignkey statement. Nullable statements are not fixed.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"c18dd476bde21b23c617c8ae0c9a3275823e8ada","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        Column(\u0027server_status\u0027, String(64)),"},{"line_number":63,"context_line":"        Column(\u0027deleted\u0027, Boolean()),"},{"line_number":64,"context_line":"        Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":65,"context_line":"        Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":66,"context_line":"        Column(\u0027configuration_id\u0027, String(36)),"},{"line_number":67,"context_line":"        Column(\u0027slave_of_id\u0027, String(36)),"},{"line_number":68,"context_line":"        Column(\u0027cluster_id\u0027, String(36)),"}],"source_content_type":"text/x-python","patch_set":11,"id":"0d8c9d22_0dfefbc3","line":65,"in_reply_to":"ede176b6_c3f07741","updated":"2024-06-05 06:10:39.000000000","message":"Thanks, I fixed previous columns nullable asis. Please see 432 line for the `instances` table schema.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":72,"context_line":"        Column(\u0027encrypted_key\u0027, String(255)),"},{"line_number":73,"context_line":"        Column(\u0027access\u0027, Text()),"},{"line_number":74,"context_line":"    )"},{"line_number":75,"context_line":"    op.create_index(\u0027datastore_version_id\u0027, \u0027instances\u0027,"},{"line_number":76,"context_line":"                    [\u0027datastore_version_id\u0027])"},{"line_number":77,"context_line":"    op.create_index(\u0027configuration_id\u0027, \u0027instances\u0027, [\u0027configuration_id\u0027])"},{"line_number":78,"context_line":"    op.create_index(\u0027instances_tenant_id\u0027, \u0027instances\u0027, [\u0027tenant_id\u0027])"},{"line_number":79,"context_line":"    op.create_index(\u0027instances_deleted\u0027, \u0027instances\u0027, [\u0027deleted\u0027])"},{"line_number":80,"context_line":"    op.create_index(\u0027slave_of_id\u0027, \u0027instances\u0027, [\u0027slave_of_id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"c00a76f7_c6b56388","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":74},"updated":"2024-05-29 16:43:14.000000000","message":"these index creation seems not to be exists in previous script?","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"b92f6f45657d297770f75aaecc773d44992eef96","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        Column(\u0027encrypted_key\u0027, String(255)),"},{"line_number":73,"context_line":"        Column(\u0027access\u0027, Text()),"},{"line_number":74,"context_line":"    )"},{"line_number":75,"context_line":"    op.create_index(\u0027datastore_version_id\u0027, \u0027instances\u0027,"},{"line_number":76,"context_line":"                    [\u0027datastore_version_id\u0027])"},{"line_number":77,"context_line":"    op.create_index(\u0027configuration_id\u0027, \u0027instances\u0027, [\u0027configuration_id\u0027])"},{"line_number":78,"context_line":"    op.create_index(\u0027instances_tenant_id\u0027, \u0027instances\u0027, [\u0027tenant_id\u0027])"},{"line_number":79,"context_line":"    op.create_index(\u0027instances_deleted\u0027, \u0027instances\u0027, [\u0027deleted\u0027])"},{"line_number":80,"context_line":"    op.create_index(\u0027slave_of_id\u0027, \u0027instances\u0027, [\u0027slave_of_id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"512dea32_986b99e4","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":74},"in_reply_to":"238e6b65_159628e0","updated":"2024-06-05 04:22:04.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":true,"context_lines":[{"line_number":72,"context_line":"        Column(\u0027encrypted_key\u0027, String(255)),"},{"line_number":73,"context_line":"        Column(\u0027access\u0027, Text()),"},{"line_number":74,"context_line":"    )"},{"line_number":75,"context_line":"    op.create_index(\u0027datastore_version_id\u0027, \u0027instances\u0027,"},{"line_number":76,"context_line":"                    [\u0027datastore_version_id\u0027])"},{"line_number":77,"context_line":"    op.create_index(\u0027configuration_id\u0027, \u0027instances\u0027, [\u0027configuration_id\u0027])"},{"line_number":78,"context_line":"    op.create_index(\u0027instances_tenant_id\u0027, \u0027instances\u0027, [\u0027tenant_id\u0027])"},{"line_number":79,"context_line":"    op.create_index(\u0027instances_deleted\u0027, \u0027instances\u0027, [\u0027deleted\u0027])"},{"line_number":80,"context_line":"    op.create_index(\u0027slave_of_id\u0027, \u0027instances\u0027, [\u0027slave_of_id\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"238e6b65_159628e0","line":77,"range":{"start_line":75,"start_character":0,"end_line":77,"end_character":74},"in_reply_to":"c00a76f7_c6b56388","updated":"2024-05-31 10:12:57.000000000","message":"Sorry for confusing. Yes you are right that they does not exist in previous script because I think they are automatically created when adding `FOREIGN KEY` constraints. I added here them explicitly just for my clarity to keep schema compatibility but I will check if I can add them implicitly as of previous script.\n\nHere is a previous version schema by `sqlalchemy-migrate` in my environment:\n```\nCREATE TABLE `instances` (\n  `id` varchar(36) NOT NULL,\n  `created` datetime DEFAULT NULL,\n  `updated` datetime DEFAULT NULL,\n  `name` varchar(255) DEFAULT NULL,\n  `hostname` varchar(255) DEFAULT NULL,\n  `compute_instance_id` varchar(36) DEFAULT NULL,\n  `task_id` int(11) DEFAULT NULL,\n  `task_description` varchar(255) DEFAULT NULL,\n  `task_start_time` datetime DEFAULT NULL,\n  `volume_id` varchar(36) DEFAULT NULL,\n  `flavor_id` varchar(255) DEFAULT NULL,\n  `volume_size` int(11) DEFAULT NULL,\n  `tenant_id` varchar(36) DEFAULT NULL,\n  `server_status` varchar(64) DEFAULT NULL,\n  `deleted` tinyint(1) DEFAULT NULL,\n  `deleted_at` datetime DEFAULT NULL,\n  `datastore_version_id` varchar(36) DEFAULT NULL,\n  `configuration_id` varchar(36) DEFAULT NULL,\n  `slave_of_id` varchar(36) DEFAULT NULL,\n  `cluster_id` varchar(36) DEFAULT NULL,\n  `shard_id` varchar(36) DEFAULT NULL,\n  `type` varchar(64) DEFAULT NULL,\n  `region_id` varchar(255) DEFAULT NULL,\n  `encrypted_key` varchar(255) DEFAULT NULL,\n  `access` text DEFAULT NULL,\n  PRIMARY KEY (`id`),\n  KEY `datastore_version_id` (`datastore_version_id`),\n  KEY `configuration_id` (`configuration_id`),\n  KEY `instances_tenant_id` (`tenant_id`),\n  KEY `instances_deleted` (`deleted`),\n  KEY `slave_of_id` (`slave_of_id`),\n  KEY `instances_cluster_id` (`cluster_id`),\n  CONSTRAINT `instances_ibfk_1` FOREIGN KEY (`datastore_version_id`) REFERENCES `datastore_versions` (`id`),\n  CONSTRAINT `instances_ibfk_2` FOREIGN KEY (`configuration_id`) REFERENCES `configurations` (`id`),\n  CONSTRAINT `instances_ibfk_3` FOREIGN KEY (`slave_of_id`) REFERENCES `instances` (`id`),\n  CONSTRAINT `instances_ibfk_4` FOREIGN KEY (`cluster_id`) REFERENCES `clusters` (`id`)\n) ENGINE\u003dInnoDB DEFAULT CHARSET\u003dutf8 COLLATE\u003dutf8_general_ci;\n```","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    op.create_index(\u0027configuration_id\u0027, \u0027instances\u0027, [\u0027configuration_id\u0027])"},{"line_number":78,"context_line":"    op.create_index(\u0027instances_tenant_id\u0027, \u0027instances\u0027, [\u0027tenant_id\u0027])"},{"line_number":79,"context_line":"    op.create_index(\u0027instances_deleted\u0027, \u0027instances\u0027, [\u0027deleted\u0027])"},{"line_number":80,"context_line":"    op.create_index(\u0027slave_of_id\u0027, \u0027instances\u0027, [\u0027slave_of_id\u0027])"},{"line_number":81,"context_line":"    op.create_index(\u0027instances_cluster_id\u0027, \u0027instances\u0027, [\u0027cluster_id\u0027])"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    \"\"\"002_service_images.py"}],"source_content_type":"text/x-python","patch_set":11,"id":"ba1f8d40_20c992be","line":80,"updated":"2024-05-29 16:43:14.000000000","message":"ditto.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"f2833eb1c91ce33c4586022e43a6fdc597279d13","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    op.create_index(\u0027configuration_id\u0027, \u0027instances\u0027, [\u0027configuration_id\u0027])"},{"line_number":78,"context_line":"    op.create_index(\u0027instances_tenant_id\u0027, \u0027instances\u0027, [\u0027tenant_id\u0027])"},{"line_number":79,"context_line":"    op.create_index(\u0027instances_deleted\u0027, \u0027instances\u0027, [\u0027deleted\u0027])"},{"line_number":80,"context_line":"    op.create_index(\u0027slave_of_id\u0027, \u0027instances\u0027, [\u0027slave_of_id\u0027])"},{"line_number":81,"context_line":"    op.create_index(\u0027instances_cluster_id\u0027, \u0027instances\u0027, [\u0027cluster_id\u0027])"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    \"\"\"002_service_images.py"}],"source_content_type":"text/x-python","patch_set":11,"id":"6342dce1_9514f207","line":80,"in_reply_to":"ba1f8d40_20c992be","updated":"2024-06-05 04:43:08.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":120,"context_line":"               unique\u003dTrue),"},{"line_number":121,"context_line":"        Column(\u0027guest_agent_version\u0027, String(255), index\u003dTrue),"},{"line_number":122,"context_line":"        Column(\u0027deleted\u0027, Boolean(), index\u003dTrue),"},{"line_number":123,"context_line":"        CheckConstraint(\"deleted in (0,1)\", name\u003d\"CONSTRAINT_1\"),"},{"line_number":124,"context_line":"        Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":125,"context_line":"        Column(\u0027updated_at\u0027, DateTime(), nullable\u003dFalse)"},{"line_number":126,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":11,"id":"1e437dfb_466a9336","line":123,"updated":"2024-05-29 16:43:14.000000000","message":"I think we can remove all the `CheckConstraint` in this file  as the Column is already bool type.\n\nif not remove it, we need to use a different name to solve the Duplicate error. `Duplicate check constraint name \u0027CONSTRAINT_1`","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":true,"context_lines":[{"line_number":120,"context_line":"               unique\u003dTrue),"},{"line_number":121,"context_line":"        Column(\u0027guest_agent_version\u0027, String(255), index\u003dTrue),"},{"line_number":122,"context_line":"        Column(\u0027deleted\u0027, Boolean(), index\u003dTrue),"},{"line_number":123,"context_line":"        CheckConstraint(\"deleted in (0,1)\", name\u003d\"CONSTRAINT_1\"),"},{"line_number":124,"context_line":"        Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":125,"context_line":"        Column(\u0027updated_at\u0027, DateTime(), nullable\u003dFalse)"},{"line_number":126,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":11,"id":"daf2c0c1_17cd8e55","line":123,"in_reply_to":"1e437dfb_466a9336","updated":"2024-05-31 10:12:57.000000000","message":"Thanks, That does not happen in my environment but I will confirm it. Keeping multiple `CONSTRAINT_1` itself may not be a problem because I found the same situation in a previous schema that is created by `sqlalchemy-migrate`.\n```\n$ mysqldump -uroot -ppassword --no-data trove | grep CONSTRAINT_1\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`enabled` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`enabled` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`restart_required` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`active` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`auto_apply` in (0,1)),\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n  CONSTRAINT `CONSTRAINT_1` CHECK (`deleted` in (0,1))\n```","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"2ebed0054413ef717bab954ebce3b8ea6e1a1018","unresolved":false,"context_lines":[{"line_number":120,"context_line":"               unique\u003dTrue),"},{"line_number":121,"context_line":"        Column(\u0027guest_agent_version\u0027, String(255), index\u003dTrue),"},{"line_number":122,"context_line":"        Column(\u0027deleted\u0027, Boolean(), index\u003dTrue),"},{"line_number":123,"context_line":"        CheckConstraint(\"deleted in (0,1)\", name\u003d\"CONSTRAINT_1\"),"},{"line_number":124,"context_line":"        Column(\u0027deleted_at\u0027, DateTime()),"},{"line_number":125,"context_line":"        Column(\u0027updated_at\u0027, DateTime(), nullable\u003dFalse)"},{"line_number":126,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":11,"id":"eef11181_e420acf6","line":123,"in_reply_to":"daf2c0c1_17cd8e55","updated":"2024-06-06 00:06:24.000000000","message":"Fixed.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":221,"context_line":"        # 022_add_backup_parent_id.py"},{"line_number":222,"context_line":"        Column(\u0027parent_id\u0027, String(36)),"},{"line_number":223,"context_line":"        # 029_add_backup_datastore.py"},{"line_number":224,"context_line":"        Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":225,"context_line":"    )"},{"line_number":226,"context_line":"    op.create_index(\u0027backups_instance_id\u0027, \u0027backups\u0027, [\u0027instance_id\u0027])"},{"line_number":227,"context_line":"    op.create_index(\u0027backups_deleted\u0027, \u0027backups\u0027, [\u0027deleted\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"707e16d9_573580a9","line":224,"updated":"2024-05-29 16:43:14.000000000","message":"miss `ForeignKey(\u0027datastore_versions.id\u0027)` here?","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":true,"context_lines":[{"line_number":221,"context_line":"        # 022_add_backup_parent_id.py"},{"line_number":222,"context_line":"        Column(\u0027parent_id\u0027, String(36)),"},{"line_number":223,"context_line":"        # 029_add_backup_datastore.py"},{"line_number":224,"context_line":"        Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":225,"context_line":"    )"},{"line_number":226,"context_line":"    op.create_index(\u0027backups_instance_id\u0027, \u0027backups\u0027, [\u0027instance_id\u0027])"},{"line_number":227,"context_line":"    op.create_index(\u0027backups_deleted\u0027, \u0027backups\u0027, [\u0027deleted\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"94825edc_603ca8b9","line":224,"in_reply_to":"707e16d9_573580a9","updated":"2024-05-31 10:12:57.000000000","message":"Sorry for confusing, I moved the foreign key constraints in instances to latter part of the file just for my clarity. I will reconsider where I should place the foreign key statements.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"b92f6f45657d297770f75aaecc773d44992eef96","unresolved":false,"context_lines":[{"line_number":221,"context_line":"        # 022_add_backup_parent_id.py"},{"line_number":222,"context_line":"        Column(\u0027parent_id\u0027, String(36)),"},{"line_number":223,"context_line":"        # 029_add_backup_datastore.py"},{"line_number":224,"context_line":"        Column(\u0027datastore_version_id\u0027, String(36)),"},{"line_number":225,"context_line":"    )"},{"line_number":226,"context_line":"    op.create_index(\u0027backups_instance_id\u0027, \u0027backups\u0027, [\u0027instance_id\u0027])"},{"line_number":227,"context_line":"    op.create_index(\u0027backups_deleted\u0027, \u0027backups\u0027, [\u0027deleted\u0027])"}],"source_content_type":"text/x-python","patch_set":11,"id":"0cd85cf2_cf63664d","line":224,"in_reply_to":"94825edc_603ca8b9","updated":"2024-06-05 04:22:04.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":225,"context_line":"    )"},{"line_number":226,"context_line":"    op.create_index(\u0027backups_instance_id\u0027, \u0027backups\u0027, [\u0027instance_id\u0027])"},{"line_number":227,"context_line":"    op.create_index(\u0027backups_deleted\u0027, \u0027backups\u0027, [\u0027deleted\u0027])"},{"line_number":228,"context_line":"    op.create_index(\u0027backups_datastore_version_id\u0027, \u0027backups\u0027,"},{"line_number":229,"context_line":"                    [\u0027datastore_version_id\u0027])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    \"\"\"013_add_security_group_artifacts.py"},{"line_number":232,"context_line":"    \"\"\""},{"line_number":233,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":11,"id":"3795e9f8_99f8c858","line":230,"range":{"start_line":228,"start_character":0,"end_line":230,"end_character":0},"updated":"2024-05-29 16:43:14.000000000","message":"Do we need `backups_datastore_version_id` index here?","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":true,"context_lines":[{"line_number":225,"context_line":"    )"},{"line_number":226,"context_line":"    op.create_index(\u0027backups_instance_id\u0027, \u0027backups\u0027, [\u0027instance_id\u0027])"},{"line_number":227,"context_line":"    op.create_index(\u0027backups_deleted\u0027, \u0027backups\u0027, [\u0027deleted\u0027])"},{"line_number":228,"context_line":"    op.create_index(\u0027backups_datastore_version_id\u0027, \u0027backups\u0027,"},{"line_number":229,"context_line":"                    [\u0027datastore_version_id\u0027])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    \"\"\"013_add_security_group_artifacts.py"},{"line_number":232,"context_line":"    \"\"\""},{"line_number":233,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":11,"id":"ea7d8392_d1f008fc","line":230,"range":{"start_line":228,"start_character":0,"end_line":230,"end_character":0},"in_reply_to":"3795e9f8_99f8c858","updated":"2024-05-31 10:12:57.000000000","message":"I think they are automatically created when adding `FOREIGN KEY` constraints. I added here them explicitly just for my clarity to keep schema compatibility but I will check if I can add them implicitly as of previous script.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"b92f6f45657d297770f75aaecc773d44992eef96","unresolved":false,"context_lines":[{"line_number":225,"context_line":"    )"},{"line_number":226,"context_line":"    op.create_index(\u0027backups_instance_id\u0027, \u0027backups\u0027, [\u0027instance_id\u0027])"},{"line_number":227,"context_line":"    op.create_index(\u0027backups_deleted\u0027, \u0027backups\u0027, [\u0027deleted\u0027])"},{"line_number":228,"context_line":"    op.create_index(\u0027backups_datastore_version_id\u0027, \u0027backups\u0027,"},{"line_number":229,"context_line":"                    [\u0027datastore_version_id\u0027])"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    \"\"\"013_add_security_group_artifacts.py"},{"line_number":232,"context_line":"    \"\"\""},{"line_number":233,"context_line":"    op.create_table("}],"source_content_type":"text/x-python","patch_set":11,"id":"e19463cc_0a45673a","line":230,"range":{"start_line":228,"start_character":0,"end_line":230,"end_character":0},"in_reply_to":"ea7d8392_d1f008fc","updated":"2024-06-05 04:22:04.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                         name\u003d\u0027ds_versions\u0027)"},{"line_number":326,"context_line":"    )"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    \"\"\"017_update_datastores.py"},{"line_number":329,"context_line":"    \"\"\""},{"line_number":330,"context_line":"    # updated the datastores and datastore_versions table schema."},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"484370b7_09f455ba","line":328,"updated":"2024-05-29 16:43:14.000000000","message":"In `017_update_datastores.py`, besides we add a manager column, we also add a function `migrate_datastore_manager` to set the default manager, but it\u0027s missing in this file","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":true,"context_lines":[{"line_number":325,"context_line":"                         name\u003d\u0027ds_versions\u0027)"},{"line_number":326,"context_line":"    )"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    \"\"\"017_update_datastores.py"},{"line_number":329,"context_line":"    \"\"\""},{"line_number":330,"context_line":"    # updated the datastores and datastore_versions table schema."},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"6424f5b2_0cbbf619","line":328,"in_reply_to":"484370b7_09f455ba","updated":"2024-05-31 10:12:57.000000000","message":"I think `migrate_datastore_manager` function is not needed if most of Trove users already migrated data from `datastore`.`manager` to `datastore_versions`.`manager`, but should we keep the function?  The function seems to be implemented in `OpenStack Havana` version.\nhttps://opendev.org/openstack/trove/commits/branch/master/trove/db/sqlalchemy/migrate_repo/versions/017_update_datastores.py","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"c4e055ffd1aa4d6cec2aa36e713d27957b756545","unresolved":false,"context_lines":[{"line_number":325,"context_line":"                         name\u003d\u0027ds_versions\u0027)"},{"line_number":326,"context_line":"    )"},{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    \"\"\"017_update_datastores.py"},{"line_number":329,"context_line":"    \"\"\""},{"line_number":330,"context_line":"    # updated the datastores and datastore_versions table schema."},{"line_number":331,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"38a7e713_a8d36742","line":328,"in_reply_to":"6424f5b2_0cbbf619","updated":"2024-06-12 15:14:01.000000000","message":"Done","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":333,"context_line":"    \"\"\""},{"line_number":334,"context_line":"    # updated the datastore_versions table schema"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    \"\"\"019_datastore_fix.py"},{"line_number":337,"context_line":"    \"\"\""},{"line_number":338,"context_line":"    # updated the datastore_versions table schema"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fd61a3ff_daa03674","line":336,"updated":"2024-05-29 16:43:14.000000000","message":"It seems like we don\u0027t implement the `019_datastore_fix.py` in this file. but i am not sure whether we still need this fix?","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"c4e055ffd1aa4d6cec2aa36e713d27957b756545","unresolved":false,"context_lines":[{"line_number":333,"context_line":"    \"\"\""},{"line_number":334,"context_line":"    # updated the datastore_versions table schema"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    \"\"\"019_datastore_fix.py"},{"line_number":337,"context_line":"    \"\"\""},{"line_number":338,"context_line":"    # updated the datastore_versions table schema"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"6e48bdfd_6f68a782","line":336,"in_reply_to":"1a0212af_9b60dd92","updated":"2024-06-12 15:14:01.000000000","message":"Done","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":true,"context_lines":[{"line_number":333,"context_line":"    \"\"\""},{"line_number":334,"context_line":"    # updated the datastore_versions table schema"},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"    \"\"\"019_datastore_fix.py"},{"line_number":337,"context_line":"    \"\"\""},{"line_number":338,"context_line":"    # updated the datastore_versions table schema"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a0212af_9b60dd92","line":336,"in_reply_to":"fd61a3ff_daa03674","updated":"2024-05-31 10:12:57.000000000","message":"I think most of Trove users in production does not need it because `019_datastore_fix.py` is necessary for users who are migrating from database versions prior to MySQL 5.6, which is EOL on 28 Feb 2021, or MariaDB 10.1, which is EOL on 17 Oct 2020.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":474,"context_line":"            [\u0027id\u0027]"},{"line_number":475,"context_line":"        )"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    op.create_index(\u0027clusters_datastore_version_id\u0027,"},{"line_number":478,"context_line":"                    \u0027clusters\u0027, [\u0027datastore_version_id\u0027])"},{"line_number":479,"context_line":"    op.create_index(\u0027clusters_deleted\u0027, \u0027clusters\u0027, [\u0027deleted\u0027])"},{"line_number":480,"context_line":"    op.create_index(\u0027clusters_tenant_id\u0027, \u0027clusters\u0027, [\u0027tenant_id\u0027])"},{"line_number":481,"context_line":"    op.create_index(\u0027clusters_configuration_id\u0027, \u0027clusters\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"47be4ac4_74fb5720","line":478,"range":{"start_line":477,"start_character":0,"end_line":478,"end_character":57},"updated":"2024-05-29 16:43:14.000000000","message":"do we need this index? usually, version_id should not be too big.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"dcb8a9dbd8c05e4125cb7cc5e48f8d0a156337d1","unresolved":true,"context_lines":[{"line_number":474,"context_line":"            [\u0027id\u0027]"},{"line_number":475,"context_line":"        )"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    op.create_index(\u0027clusters_datastore_version_id\u0027,"},{"line_number":478,"context_line":"                    \u0027clusters\u0027, [\u0027datastore_version_id\u0027])"},{"line_number":479,"context_line":"    op.create_index(\u0027clusters_deleted\u0027, \u0027clusters\u0027, [\u0027deleted\u0027])"},{"line_number":480,"context_line":"    op.create_index(\u0027clusters_tenant_id\u0027, \u0027clusters\u0027, [\u0027tenant_id\u0027])"},{"line_number":481,"context_line":"    op.create_index(\u0027clusters_configuration_id\u0027, \u0027clusters\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"5228d941_0ae8b244","line":478,"range":{"start_line":477,"start_character":0,"end_line":478,"end_character":57},"in_reply_to":"47be4ac4_74fb5720","updated":"2024-05-31 10:12:57.000000000","message":"I will reconsider the issue :P","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"f2833eb1c91ce33c4586022e43a6fdc597279d13","unresolved":false,"context_lines":[{"line_number":474,"context_line":"            [\u0027id\u0027]"},{"line_number":475,"context_line":"        )"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    op.create_index(\u0027clusters_datastore_version_id\u0027,"},{"line_number":478,"context_line":"                    \u0027clusters\u0027, [\u0027datastore_version_id\u0027])"},{"line_number":479,"context_line":"    op.create_index(\u0027clusters_deleted\u0027, \u0027clusters\u0027, [\u0027deleted\u0027])"},{"line_number":480,"context_line":"    op.create_index(\u0027clusters_tenant_id\u0027, \u0027clusters\u0027, [\u0027tenant_id\u0027])"},{"line_number":481,"context_line":"    op.create_index(\u0027clusters_configuration_id\u0027, \u0027clusters\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"067f3727_e69721a3","line":478,"range":{"start_line":477,"start_character":0,"end_line":478,"end_character":57},"in_reply_to":"5228d941_0ae8b244","updated":"2024-06-05 04:43:08.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":478,"context_line":"                    \u0027clusters\u0027, [\u0027datastore_version_id\u0027])"},{"line_number":479,"context_line":"    op.create_index(\u0027clusters_deleted\u0027, \u0027clusters\u0027, [\u0027deleted\u0027])"},{"line_number":480,"context_line":"    op.create_index(\u0027clusters_tenant_id\u0027, \u0027clusters\u0027, [\u0027tenant_id\u0027])"},{"line_number":481,"context_line":"    op.create_index(\u0027clusters_configuration_id\u0027, \u0027clusters\u0027,"},{"line_number":482,"context_line":"                    [\u0027configuration_id\u0027])"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    \"\"\"033_datastore_parameters.py"}],"source_content_type":"text/x-python","patch_set":11,"id":"787173a4_51a54c62","line":481,"updated":"2024-05-29 16:43:14.000000000","message":"ditto","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"f2833eb1c91ce33c4586022e43a6fdc597279d13","unresolved":false,"context_lines":[{"line_number":478,"context_line":"                    \u0027clusters\u0027, [\u0027datastore_version_id\u0027])"},{"line_number":479,"context_line":"    op.create_index(\u0027clusters_deleted\u0027, \u0027clusters\u0027, [\u0027deleted\u0027])"},{"line_number":480,"context_line":"    op.create_index(\u0027clusters_tenant_id\u0027, \u0027clusters\u0027, [\u0027tenant_id\u0027])"},{"line_number":481,"context_line":"    op.create_index(\u0027clusters_configuration_id\u0027, \u0027clusters\u0027,"},{"line_number":482,"context_line":"                    [\u0027configuration_id\u0027])"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    \"\"\"033_datastore_parameters.py"}],"source_content_type":"text/x-python","patch_set":11,"id":"132b5ecf_1d1ee66f","line":481,"in_reply_to":"787173a4_51a54c62","updated":"2024-06-05 04:43:08.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":636,"context_line":"        Column(\u0027tenant_id\u0027, String(36), nullable\u003dFalse),"},{"line_number":637,"context_line":"        Column(\u0027instance_id\u0027, String(36), nullable\u003dFalse, default\u003d\u0027\u0027),"},{"line_number":638,"context_line":"        Column(\u0027backend\u0027, String(255), nullable\u003dFalse),"},{"line_number":639,"context_line":"        Column(\u0027swift_container\u0027, String(255)),"},{"line_number":640,"context_line":"        Column(\u0027created\u0027, DateTime()),"},{"line_number":641,"context_line":"        UniqueConstraint("},{"line_number":642,"context_line":"            \u0027tenant_id\u0027, \u0027instance_id\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"75ce9adf_5095b338","line":639,"range":{"start_line":639,"start_character":8,"end_line":639,"end_character":47},"updated":"2024-05-29 16:43:14.000000000","message":"`nullable\u003dTrue` ? I am not sure whether the default value for Column object is already `True`. but It would be better to keep consistent with previous column define.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"0d006759703f514e0cea0f5f6efdbaab89d13eb2","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        Column(\u0027tenant_id\u0027, String(36), nullable\u003dFalse),"},{"line_number":637,"context_line":"        Column(\u0027instance_id\u0027, String(36), nullable\u003dFalse, default\u003d\u0027\u0027),"},{"line_number":638,"context_line":"        Column(\u0027backend\u0027, String(255), nullable\u003dFalse),"},{"line_number":639,"context_line":"        Column(\u0027swift_container\u0027, String(255)),"},{"line_number":640,"context_line":"        Column(\u0027created\u0027, DateTime()),"},{"line_number":641,"context_line":"        UniqueConstraint("},{"line_number":642,"context_line":"            \u0027tenant_id\u0027, \u0027instance_id\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"f8b4f30a_2146fe46","line":639,"range":{"start_line":639,"start_character":8,"end_line":639,"end_character":47},"in_reply_to":"27952c28_69133190","updated":"2024-06-05 22:46:28.000000000","message":"Hi Wu, Thanks for the comment and your help. I will review it 😊","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"c18dd476bde21b23c617c8ae0c9a3275823e8ada","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        Column(\u0027tenant_id\u0027, String(36), nullable\u003dFalse),"},{"line_number":637,"context_line":"        Column(\u0027instance_id\u0027, String(36), nullable\u003dFalse, default\u003d\u0027\u0027),"},{"line_number":638,"context_line":"        Column(\u0027backend\u0027, String(255), nullable\u003dFalse),"},{"line_number":639,"context_line":"        Column(\u0027swift_container\u0027, String(255)),"},{"line_number":640,"context_line":"        Column(\u0027created\u0027, DateTime()),"},{"line_number":641,"context_line":"        UniqueConstraint("},{"line_number":642,"context_line":"            \u0027tenant_id\u0027, \u0027instance_id\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"f1fa8c59_ed1b995a","line":639,"range":{"start_line":639,"start_character":8,"end_line":639,"end_character":47},"in_reply_to":"75ce9adf_5095b338","updated":"2024-06-05 06:10:39.000000000","message":"\u003e It would be better to keep consistent with previous column define.\n\nYes, you are right.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"c87d0274119b2a4bbf84aaaa4f6ef803216a691e","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        Column(\u0027tenant_id\u0027, String(36), nullable\u003dFalse),"},{"line_number":637,"context_line":"        Column(\u0027instance_id\u0027, String(36), nullable\u003dFalse, default\u003d\u0027\u0027),"},{"line_number":638,"context_line":"        Column(\u0027backend\u0027, String(255), nullable\u003dFalse),"},{"line_number":639,"context_line":"        Column(\u0027swift_container\u0027, String(255)),"},{"line_number":640,"context_line":"        Column(\u0027created\u0027, DateTime()),"},{"line_number":641,"context_line":"        UniqueConstraint("},{"line_number":642,"context_line":"            \u0027tenant_id\u0027, \u0027instance_id\u0027,"}],"source_content_type":"text/x-python","patch_set":11,"id":"27952c28_69133190","line":639,"range":{"start_line":639,"start_character":8,"end_line":639,"end_character":47},"in_reply_to":"f1fa8c59_ed1b995a","updated":"2024-06-05 13:49:40.000000000","message":"Hi, hirotaka, I also add some codes based on this patch to do the following things.\n1. add support of migrating from the previous branch.\n2. update database migration docs\n3. update minimum sqlachemy version in requirements.txt\n4. remove `registry_ext` and `repl_strategy` column creation to `5c68b4fb3cd1` for upgrade.\n5. update all CheckConstraint name as the higher mysql database needs unique name.\n6. add a new reversion to drop the migrate_version table.\n\nI will update this patch tomorrow, please help me to review it.\n\nthanks in advance.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":667,"context_line":"        batch_op.create_foreign_key("},{"line_number":668,"context_line":"            \u0027instances_ibfk_1\u0027,"},{"line_number":669,"context_line":"            \u0027datastore_versions\u0027,"},{"line_number":670,"context_line":"            [\u0027datastore_version_id\u0027],"},{"line_number":671,"context_line":"            [\u0027id\u0027]"},{"line_number":672,"context_line":"        )"},{"line_number":673,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5208a84f_9bc50373","line":670,"updated":"2024-05-29 16:43:14.000000000","message":"why don\u0027t we use `\nColumn(\u0027datastore_version_id\u0027, String(36),                              \n ForeignKey(\u0027datastore_versions.id\u0027))` at the creation of table?\n \n The previous `foreignkey` was added to the column object directly in `016_add_datastore_type.py`","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"b92f6f45657d297770f75aaecc773d44992eef96","unresolved":false,"context_lines":[{"line_number":667,"context_line":"        batch_op.create_foreign_key("},{"line_number":668,"context_line":"            \u0027instances_ibfk_1\u0027,"},{"line_number":669,"context_line":"            \u0027datastore_versions\u0027,"},{"line_number":670,"context_line":"            [\u0027datastore_version_id\u0027],"},{"line_number":671,"context_line":"            [\u0027id\u0027]"},{"line_number":672,"context_line":"        )"},{"line_number":673,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dc095eba_a32799a4","line":670,"in_reply_to":"5208a84f_9bc50373","updated":"2024-06-05 04:22:04.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":675,"context_line":"    # op.add_column(\u0027instances\u0027, configuration_id)"},{"line_number":676,"context_line":"    with op.batch_alter_table(\u0027instances\u0027) as batch_op:"},{"line_number":677,"context_line":"        batch_op.create_foreign_key("},{"line_number":678,"context_line":"            \u0027instances_ibfk_2\u0027,"},{"line_number":679,"context_line":"            \u0027configurations\u0027,"},{"line_number":680,"context_line":"            [\u0027configuration_id\u0027],"},{"line_number":681,"context_line":"            [\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"1817c6af_b79da50d","line":678,"updated":"2024-05-29 16:43:14.000000000","message":"ditto","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"b92f6f45657d297770f75aaecc773d44992eef96","unresolved":false,"context_lines":[{"line_number":675,"context_line":"    # op.add_column(\u0027instances\u0027, configuration_id)"},{"line_number":676,"context_line":"    with op.batch_alter_table(\u0027instances\u0027) as batch_op:"},{"line_number":677,"context_line":"        batch_op.create_foreign_key("},{"line_number":678,"context_line":"            \u0027instances_ibfk_2\u0027,"},{"line_number":679,"context_line":"            \u0027configurations\u0027,"},{"line_number":680,"context_line":"            [\u0027configuration_id\u0027],"},{"line_number":681,"context_line":"            [\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"e6a485c0_210e6365","line":678,"in_reply_to":"1817c6af_b79da50d","updated":"2024-06-05 04:22:04.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":684,"context_line":"    # op.add_column(\u0027instances\u0027, Column(\u0027slave_of_id\u0027, String(36)))"},{"line_number":685,"context_line":"    with op.batch_alter_table(\u0027instances\u0027) as batch_op:"},{"line_number":686,"context_line":"        batch_op.create_foreign_key("},{"line_number":687,"context_line":"            \u0027instances_ibfk_3\u0027,"},{"line_number":688,"context_line":"            \u0027instances\u0027,"},{"line_number":689,"context_line":"            [\u0027slave_of_id\u0027],"},{"line_number":690,"context_line":"            [\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"1c12aabc_0cb6b025","line":687,"updated":"2024-05-29 16:43:14.000000000","message":"ditto","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"b92f6f45657d297770f75aaecc773d44992eef96","unresolved":false,"context_lines":[{"line_number":684,"context_line":"    # op.add_column(\u0027instances\u0027, Column(\u0027slave_of_id\u0027, String(36)))"},{"line_number":685,"context_line":"    with op.batch_alter_table(\u0027instances\u0027) as batch_op:"},{"line_number":686,"context_line":"        batch_op.create_foreign_key("},{"line_number":687,"context_line":"            \u0027instances_ibfk_3\u0027,"},{"line_number":688,"context_line":"            \u0027instances\u0027,"},{"line_number":689,"context_line":"            [\u0027slave_of_id\u0027],"},{"line_number":690,"context_line":"            [\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"2b0d392d_f0719797","line":687,"in_reply_to":"1c12aabc_0cb6b025","updated":"2024-06-05 04:22:04.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"00ad29e443834e077adf5671871488b29eccc9d4","unresolved":true,"context_lines":[{"line_number":693,"context_line":"    with op.batch_alter_table(\u0027instances\u0027) as batch_op:"},{"line_number":694,"context_line":"        batch_op.create_foreign_key("},{"line_number":695,"context_line":"            \u0027instances_ibfk_4\u0027,"},{"line_number":696,"context_line":"            \u0027clusters\u0027,"},{"line_number":697,"context_line":"            [\u0027cluster_id\u0027],"},{"line_number":698,"context_line":"            [\u0027id\u0027]"},{"line_number":699,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":11,"id":"cfe08d79_cf9f9397","line":696,"updated":"2024-05-29 16:43:14.000000000","message":"ditto","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"b92f6f45657d297770f75aaecc773d44992eef96","unresolved":false,"context_lines":[{"line_number":693,"context_line":"    with op.batch_alter_table(\u0027instances\u0027) as batch_op:"},{"line_number":694,"context_line":"        batch_op.create_foreign_key("},{"line_number":695,"context_line":"            \u0027instances_ibfk_4\u0027,"},{"line_number":696,"context_line":"            \u0027clusters\u0027,"},{"line_number":697,"context_line":"            [\u0027cluster_id\u0027],"},{"line_number":698,"context_line":"            [\u0027id\u0027]"},{"line_number":699,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":11,"id":"99a1aa32_97d3af7f","line":696,"in_reply_to":"cfe08d79_cf9f9397","updated":"2024-06-05 04:22:04.000000000","message":"Thanks, I fixed the issue.","commit_id":"a18c5a0455fe2681a22b4bf59e8c575e87787a0a"}]}
