)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"f03f6fc978505e017b6cc30b90ec5a36037a89c1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"881708f7_a3d73454","updated":"2026-03-16 16:59:11.000000000","message":"Hi Eric, I appreciate the thorough investigation into MySQL identifier constraints.\n\nI agree that, in principle, we should support backslashes. However, given that backslashes are special characters (e.g., \\t), simply relaxing the validation isn\u0027t enough; we need to ensure proper escaping is handled consistently. This shifts the scope from a validation fix to an architectural discussion that requires a comprehensive impact analysis.\n\nSince Trove\u0027s current logic assumes \"clean\" database names without backslashes, allowing them would necessitate adding escaping logic across multiple components. Because of these broader implications, it\u0027s hard to justify merging this patch without seeing how it fits into a larger fix for the entire pipeline. What do you think?\n\nThanks,","commit_id":"870007d0c89d47a10e803c3c31dddb18dbe5108e"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"erkin.mussurmankulov@ps.kz","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"e73663bd0fb7d1ad8d048e16ab81ba375c0d0680","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"2afeeca4_3908b650","in_reply_to":"1b83f8f3_f09543fb","updated":"2026-08-21 06:26:22.000000000","message":"@hiwkby@yahoo.com Hi!\nThis task turned out to be much more difficult than expected.\nFinally, it\u0027s ready for review.\n1. [API changes](https://review.opendev.org/c/openstack/trove/+/998782), preliminary patch to get rid of values with arbitrary characters in URL paths. Keeping old API endpoints for backward compatibility. They will be removed in 2027.2.\n2. [PostgreSQL](https://review.opendev.org/c/openstack/trove/+/998785) datastore related changes in guest agent.\n3. [MySQL](https://review.opendev.org/c/openstack/trove/+/971797) datastore related changes in guest agent. *(current MR)*\n4. [Special chars tests](https://review.opendev.org/c/openstack/trove-tempest-plugin/+/998786?usp\u003dsearch) in t-t-p.\n5. Changes in [python-troveclient](https://review.opendev.org/c/openstack/python-troveclient/+/998755?usp\u003dsearch), support the new API and keep backward compatibility with old endpoints until 2027.2.\n\nAnd, in addition, [this MR](https://review.opendev.org/c/openstack/trove/+/1000701) runs tests altogether.","commit_id":"870007d0c89d47a10e803c3c31dddb18dbe5108e"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"erkin.mussurmankulov@ps.kz","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"3f3f039919d7bebcdde27ab2eb2ef2a1680ec1a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"1b83f8f3_f09543fb","in_reply_to":"881708f7_a3d73454","updated":"2026-03-17 13:34:44.000000000","message":"Yes, you\u0027re right. I will add unit tests to ensure that everything works fine without strict naming constraints and corresponding changes in tempest scenarios.","commit_id":"870007d0c89d47a10e803c3c31dddb18dbe5108e"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"erkin.mussurmankulov@ps.kz","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"92a0deccf64bdbed4cfa33d85abf6429a6fa348d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"dfd64bdb_af8abe61","updated":"2026-07-27 16:40:57.000000000","message":"recheck","commit_id":"f7622be78a04b9965f65991258fc3e70ab36e3f2"},{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"de27f826bbab30098ebb842b25c8d4e24f540648","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"99871fc5_2ddb7f6c","updated":"2026-08-17 09:30:17.000000000","message":"LGTM","commit_id":"921cba0052f4286cab9ed1bedbc13ead7f0f8c48"}],"trove/guestagent/common/sql_query.py":[{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"1ed5c7c35b1a584d01db21ad0ab7f1048549bed2","unresolved":true,"context_lines":[{"line_number":151,"context_line":"    def _database(self):"},{"line_number":152,"context_line":"        if not self.database:"},{"line_number":153,"context_line":"            return \"*\""},{"line_number":154,"context_line":"        return _identifier(self.database)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    @property"},{"line_number":157,"context_line":"    def _table(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3082ff9e_b5531b5e","line":154,"updated":"2026-08-14 13:56:11.000000000","message":"`%` and `_` can be treated as wildcards in [database-level privilege statements](https://dev.mysql.com/doc/refman/8.4/en/grant.html). Maybe this case should be handled separately?","commit_id":"34351f8e3cda445d63081277b145fad7d542ef72"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"erkin.mussurmankulov@ps.kz","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"a2cb11a22f493ebc864e2dbb4c3a3f7690dd9016","unresolved":false,"context_lines":[{"line_number":151,"context_line":"    def _database(self):"},{"line_number":152,"context_line":"        if not self.database:"},{"line_number":153,"context_line":"            return \"*\""},{"line_number":154,"context_line":"        return _identifier(self.database)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    @property"},{"line_number":157,"context_line":"    def _table(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"5c58ef9c_71ef52d7","line":154,"in_reply_to":"3078196e_3edd17c9","updated":"2026-08-17 08:04:37.000000000","message":"Ok, got it. [Here](https://review.opendev.org/c/openstack/trove-tempest-plugin/+/1001089) is an additional test for that case.","commit_id":"34351f8e3cda445d63081277b145fad7d542ef72"},{"author":{"_account_id":36080,"name":"Erkin Mussurmankulov","display_name":"Eric","email":"erkin.mussurmankulov@ps.kz","username":"mongoose404","status":"PS Cloud services employee"},"change_message_id":"8b97bb8a5547df3ec2ab029861556935542df34b","unresolved":true,"context_lines":[{"line_number":151,"context_line":"    def _database(self):"},{"line_number":152,"context_line":"        if not self.database:"},{"line_number":153,"context_line":"            return \"*\""},{"line_number":154,"context_line":"        return _identifier(self.database)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    @property"},{"line_number":157,"context_line":"    def _table(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"4b17036e_1ca23dae","line":154,"in_reply_to":"3082ff9e_b5531b5e","updated":"2026-08-14 15:01:41.000000000","message":"I can\u0027t get the point: how is it related to the changes introduced in this MR?\nCan you give more context, please?","commit_id":"34351f8e3cda445d63081277b145fad7d542ef72"},{"author":{"_account_id":39300,"name":"Olessya Khussainova","display_name":"Olessya Khussainova","email":"olessya.khussainova@ps.kz","username":"Cellofun"},"change_message_id":"d918f25a9bd6b0ae86924e6a5ee0e1e2e8f5de26","unresolved":true,"context_lines":[{"line_number":151,"context_line":"    def _database(self):"},{"line_number":152,"context_line":"        if not self.database:"},{"line_number":153,"context_line":"            return \"*\""},{"line_number":154,"context_line":"        return _identifier(self.database)"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    @property"},{"line_number":157,"context_line":"    def _table(self):"}],"source_content_type":"text/x-python","patch_set":7,"id":"3078196e_3edd17c9","line":154,"in_reply_to":"4b17036e_1ca23dae","updated":"2026-08-17 06:23:26.000000000","message":"This allows % in database names, but _identifier() only quotes it. For example, granting access to a database named test% may also grant access to test1","commit_id":"34351f8e3cda445d63081277b145fad7d542ef72"}],"trove/guestagent/datastore/mysql_common/service.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"566329d92b432aeeb41ad52e38f4650f87eb06ac","unresolved":false,"context_lines":[{"line_number":865,"context_line":"                client.execute(text(\u0027RESET SLAVE ALL\u0027))"},{"line_number":866,"context_line":"                self.wait_for_slave_status(\u0027OFF\u0027, client, 180)"},{"line_number":867,"context_line":"                if not for_failover:"},{"line_number":868,"context_line":"                    du \u003d sql_query.DropUser(name, host\u003dhost)"},{"line_number":869,"context_line":"                    t \u003d text(str(du))"},{"line_number":870,"context_line":"                    LOG.debug(\"delete_user_by_name: %s\", t)"},{"line_number":871,"context_line":"                    client.execute(t)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5fdb25c0_5d7bcc9f","line":868,"updated":"2026-08-13 17:51:49.000000000","message":"pep8: F821 undefined name \u0027host\u0027","commit_id":"5dafa1a9b611df5f638dd9493e1ef4c5e261fbd7"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"566329d92b432aeeb41ad52e38f4650f87eb06ac","unresolved":false,"context_lines":[{"line_number":865,"context_line":"                client.execute(text(\u0027RESET SLAVE ALL\u0027))"},{"line_number":866,"context_line":"                self.wait_for_slave_status(\u0027OFF\u0027, client, 180)"},{"line_number":867,"context_line":"                if not for_failover:"},{"line_number":868,"context_line":"                    du \u003d sql_query.DropUser(name, host\u003dhost)"},{"line_number":869,"context_line":"                    t \u003d text(str(du))"},{"line_number":870,"context_line":"                    LOG.debug(\"delete_user_by_name: %s\", t)"},{"line_number":871,"context_line":"                    client.execute(t)"}],"source_content_type":"text/x-python","patch_set":6,"id":"587ce470_4d7670dc","line":868,"updated":"2026-08-13 17:51:49.000000000","message":"pep8: F821 undefined name \u0027name\u0027","commit_id":"5dafa1a9b611df5f638dd9493e1ef4c5e261fbd7"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"06cbb321e412756ef2cc7f6d366d7378a6a5f53a","unresolved":false,"context_lines":[{"line_number":865,"context_line":"                client.execute(text(\u0027RESET SLAVE ALL\u0027))"},{"line_number":866,"context_line":"                self.wait_for_slave_status(\u0027OFF\u0027, client, 180)"},{"line_number":867,"context_line":"                if not for_failover:"},{"line_number":868,"context_line":"                    du \u003d sql_query.DropUser(name, host\u003dhost)"},{"line_number":869,"context_line":"                    t \u003d text(str(du))"},{"line_number":870,"context_line":"                    LOG.debug(\"delete_user_by_name: %s\", t)"},{"line_number":871,"context_line":"                    client.execute(t)"}],"source_content_type":"text/x-python","patch_set":7,"id":"f12943b5_23cf5f51","line":868,"updated":"2026-08-14 11:24:21.000000000","message":"pep8: F821 undefined name \u0027host\u0027","commit_id":"34351f8e3cda445d63081277b145fad7d542ef72"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"06cbb321e412756ef2cc7f6d366d7378a6a5f53a","unresolved":false,"context_lines":[{"line_number":865,"context_line":"                client.execute(text(\u0027RESET SLAVE ALL\u0027))"},{"line_number":866,"context_line":"                self.wait_for_slave_status(\u0027OFF\u0027, client, 180)"},{"line_number":867,"context_line":"                if not for_failover:"},{"line_number":868,"context_line":"                    du \u003d sql_query.DropUser(name, host\u003dhost)"},{"line_number":869,"context_line":"                    t \u003d text(str(du))"},{"line_number":870,"context_line":"                    LOG.debug(\"delete_user_by_name: %s\", t)"},{"line_number":871,"context_line":"                    client.execute(t)"}],"source_content_type":"text/x-python","patch_set":7,"id":"9e8e8546_49674cce","line":868,"updated":"2026-08-14 11:24:21.000000000","message":"pep8: F821 undefined name \u0027name\u0027","commit_id":"34351f8e3cda445d63081277b145fad7d542ef72"}]}
