)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"aaf935c93acb26cc1cba351e7ebc8c7d27c209b5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"01f98435_3044da8a","updated":"2021-10-20 08:04:49.000000000","message":"Hello,\n\nPlease can you add some related tests into https://opendev.org/openstack/tooz/src/branch/master/tooz/tests/test_mysql.py ?\n\nAlso it could be worth to add a release note to highlight this significant point (TLS support).","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"902f437f7415874970830f37fc86c05f7171b710","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"bfcb812e_7a9e7695","updated":"2021-11-08 08:15:24.000000000","message":"Herve, yes, I will add those and may be one more option.","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"7a6acf963d5812eef69148d3f46745ba210a6505","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"12c4f1f2_1cfa95d0","updated":"2021-11-08 15:17:49.000000000","message":"Hello,\n\nThanks for this new patch set.\nPlease see my inline comments.\nMy -1 is related to the typo and the forgoten comments.","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"671d7db3f01b03a63e37a0bff71a1e8afd2637a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"eb599ae2_90c529b7","updated":"2021-11-08 17:47:16.000000000","message":"Hervé. thanks for review, new patch coming up.","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"77917d83bf75b67ee6758a6e55606c1ba8de49ca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b8eab396_d77beed4","updated":"2021-11-18 10:22:45.000000000","message":"recheck","commit_id":"81c629676c06e798e5073b4361cffd269876c553"}],"releasenotes/notes/mysql-tls-support-88941e2ebaf938b4.yaml":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"7a6acf963d5812eef69148d3f46745ba210a6505","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    The following TLS-related options now can be specifed in the MySQL"},{"line_number":7,"context_line":"    connection URL as query parameters"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    ssl_ca"},{"line_number":10,"context_line":"      path to the CA bundle to use for verifying server certificate"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    ssl_capath"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"39d66558_1def3a3f","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":10},"updated":"2021-11-08 15:17:49.000000000","message":"Please can you format this key (and the following) by surrounding them with \"`\" (example: ``ssl_ca``). They will be better rendered in the doc.","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"671d7db3f01b03a63e37a0bff71a1e8afd2637a1","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    The following TLS-related options now can be specifed in the MySQL"},{"line_number":7,"context_line":"    connection URL as query parameters"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"    ssl_ca"},{"line_number":10,"context_line":"      path to the CA bundle to use for verifying server certificate"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    ssl_capath"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"d020503e_aa2bf2e3","line":9,"range":{"start_line":9,"start_character":4,"end_line":9,"end_character":10},"in_reply_to":"39d66558_1def3a3f","updated":"2021-11-08 17:47:16.000000000","message":"Done","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"7a6acf963d5812eef69148d3f46745ba210a6505","unresolved":true,"context_lines":[{"line_number":16,"context_line":"      path to client public key certificate file"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    ssl_key"},{"line_number":19,"context_line":"      path to client prvate key file"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    ssl_check_hostname"},{"line_number":22,"context_line":"      verify server hostname against its certificate,"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"d1dbd6cf_844827a5","line":19,"range":{"start_line":19,"start_character":21,"end_line":19,"end_character":27},"updated":"2021-11-08 15:17:49.000000000","message":"private","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"671d7db3f01b03a63e37a0bff71a1e8afd2637a1","unresolved":false,"context_lines":[{"line_number":16,"context_line":"      path to client public key certificate file"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"    ssl_key"},{"line_number":19,"context_line":"      path to client prvate key file"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    ssl_check_hostname"},{"line_number":22,"context_line":"      verify server hostname against its certificate,"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"c81e11ee_f5e503b6","line":19,"range":{"start_line":19,"start_character":21,"end_line":19,"end_character":27},"in_reply_to":"d1dbd6cf_844827a5","updated":"2021-11-08 17:47:16.000000000","message":"Done","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"}],"tooz/drivers/mysql.py":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"aaf935c93acb26cc1cba351e7ebc8c7d27c209b5","unresolved":true,"context_lines":[{"line_number":119,"context_line":"      mysql://USERNAME:PASSWORD@HOST[:PORT]/DBNAME[?OPTION1\u003dVALUE1[\u0026OPTION2\u003dVALUE2[\u0026...]]]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    If not specified, PORT defaults to 3306."},{"line_number":122,"context_line":"    Available options are:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d  \u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":125,"context_line":"    Name                Default"}],"source_content_type":"text/x-python","patch_set":3,"id":"aad94742_8996ab69","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":26},"updated":"2021-10-20 08:04:49.000000000","message":"For convenience, the following keys may also be specified inline within the URL\nwhere they will be interpreted into the \"ssl\" dictionary automatically:\n- \"ssl_capath\"\n- \"ssl_cipher\",\n- \"ssl_check_hostname\"\n\nIf the server uses an automatically-generated certificate that is self-signed or does not match the host name (as seen from the client), it may also be necessary to indicate ``ssl_check_hostname\u003dfalse``, an example is as follows:\n\n```\nconnection_uri \u003d (\n    \"mysql://scott:tiger@192.168.0.134/test\"\n    \"?ssl_ca\u003d/home/gord/client-ssl/ca.pem\"\n    \"\u0026ssl_cert\u003d/home/gord/client-ssl/client-cert.pem\"\n    \"\u0026ssl_key\u003d/home/gord/client-ssl/client-key.pem\"\n    \"\u0026ssl_check_hostname\u003dfalse\"\n)\n```\n\nThoughts?","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"902f437f7415874970830f37fc86c05f7171b710","unresolved":true,"context_lines":[{"line_number":119,"context_line":"      mysql://USERNAME:PASSWORD@HOST[:PORT]/DBNAME[?OPTION1\u003dVALUE1[\u0026OPTION2\u003dVALUE2[\u0026...]]]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    If not specified, PORT defaults to 3306."},{"line_number":122,"context_line":"    Available options are:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d  \u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":125,"context_line":"    Name                Default"}],"source_content_type":"text/x-python","patch_set":3,"id":"e3f69561_3baa2d17","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":26},"in_reply_to":"2a022b02_50e30f0a","updated":"2021-11-08 08:15:24.000000000","message":"yes, seems worthy adding.\n\nAlso looking at pymysql code, there\u0027s one more option that it understands which is ssl_verify_mode which can be:\n- None\n- True or it\u0027s string variants (\"yes\", \"1\", \"true\", \"required\")\n- False or its string variants (\"no\", \"0\", \"false\", \"none\")\n- \"optional\"\n\nhttps://github.com/PyMySQL/PyMySQL/blob/f24cb9aa7295921bcd8f34f752c8a05b981d3125/pymysql/connections.py#L361","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"8404b20ab05741dc21ac5cd03672146cc0f32945","unresolved":true,"context_lines":[{"line_number":119,"context_line":"      mysql://USERNAME:PASSWORD@HOST[:PORT]/DBNAME[?OPTION1\u003dVALUE1[\u0026OPTION2\u003dVALUE2[\u0026...]]]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    If not specified, PORT defaults to 3306."},{"line_number":122,"context_line":"    Available options are:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d  \u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":125,"context_line":"    Name                Default"}],"source_content_type":"text/x-python","patch_set":3,"id":"2a022b02_50e30f0a","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":26},"in_reply_to":"aad94742_8996ab69","updated":"2021-10-20 08:06:21.000000000","message":"https://dev.mysql.com/doc/refman/5.7/en/using-encrypted-connections.html#using-encrypted-connections-client-side-configuration","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"1e4a13bd9a5214c8f077a066ce5616feec0434de","unresolved":false,"context_lines":[{"line_number":119,"context_line":"      mysql://USERNAME:PASSWORD@HOST[:PORT]/DBNAME[?OPTION1\u003dVALUE1[\u0026OPTION2\u003dVALUE2[\u0026...]]]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    If not specified, PORT defaults to 3306."},{"line_number":122,"context_line":"    Available options are:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d  \u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":125,"context_line":"    Name                Default"}],"source_content_type":"text/x-python","patch_set":3,"id":"4265d05b_c97b1e8e","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":26},"in_reply_to":"e3f69561_3baa2d17","updated":"2021-11-08 11:25:02.000000000","message":"Done","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"1e4a13bd9a5214c8f077a066ce5616feec0434de","unresolved":false,"context_lines":[{"line_number":119,"context_line":"      mysql://USERNAME:PASSWORD@HOST[:PORT]/DBNAME[?OPTION1\u003dVALUE1[\u0026OPTION2\u003dVALUE2[\u0026...]]]"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    If not specified, PORT defaults to 3306."},{"line_number":122,"context_line":"    Available options are:"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d  \u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":125,"context_line":"    Name                Default"}],"source_content_type":"text/x-python","patch_set":3,"id":"885a96e5_659669fa","line":122,"range":{"start_line":122,"start_character":4,"end_line":122,"end_character":26},"in_reply_to":"e3f69561_3baa2d17","updated":"2021-11-08 11:25:02.000000000","message":"Done","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"aaf935c93acb26cc1cba351e7ebc8c7d27c209b5","unresolved":true,"context_lines":[{"line_number":194,"context_line":"        unix_socket \u003d options.get(\"unix_socket\")"},{"line_number":195,"context_line":"        # NOTE(pas-ha) using legacy ssl argument to support pymysql\u003c1"},{"line_number":196,"context_line":"        ssl_args \u003d {}"},{"line_number":197,"context_line":"        for o in (\"ca\", \"cert\", \"key\"):"},{"line_number":198,"context_line":"            value \u003d options.get(\"ssl_\" + o)"},{"line_number":199,"context_line":"            if value:"},{"line_number":200,"context_line":"                ssl_args[o] \u003d value"}],"source_content_type":"text/x-python","patch_set":3,"id":"036b94a9_0fbce3dd","line":197,"range":{"start_line":197,"start_character":19,"end_line":197,"end_character":36},"updated":"2021-10-20 08:04:49.000000000","message":"Depending on my previous suggestion this tuple could be amended with keys suggested previously.","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"1e4a13bd9a5214c8f077a066ce5616feec0434de","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        unix_socket \u003d options.get(\"unix_socket\")"},{"line_number":195,"context_line":"        # NOTE(pas-ha) using legacy ssl argument to support pymysql\u003c1"},{"line_number":196,"context_line":"        ssl_args \u003d {}"},{"line_number":197,"context_line":"        for o in (\"ca\", \"cert\", \"key\"):"},{"line_number":198,"context_line":"            value \u003d options.get(\"ssl_\" + o)"},{"line_number":199,"context_line":"            if value:"},{"line_number":200,"context_line":"                ssl_args[o] \u003d value"}],"source_content_type":"text/x-python","patch_set":3,"id":"5061be7d_b5565feb","line":197,"range":{"start_line":197,"start_character":19,"end_line":197,"end_character":36},"in_reply_to":"036b94a9_0fbce3dd","updated":"2021-11-08 11:25:02.000000000","message":"Done","commit_id":"4a89e731c7f420d3a3e5d368afdfb7bfa6780fb1"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"7a6acf963d5812eef69148d3f46745ba210a6505","unresolved":true,"context_lines":[{"line_number":211,"context_line":"                ssl_args[o] \u003d value"},{"line_number":212,"context_line":"        check_hostname \u003d options.get(\"ssl_check_hostname\")"},{"line_number":213,"context_line":"        if check_hostname is not None:"},{"line_number":214,"context_line":"            if isinstance(check_hostname, bool):"},{"line_number":215,"context_line":"                ssl_args[\"check_hostname\"] \u003d check_hostname"},{"line_number":216,"context_line":"            else:"},{"line_number":217,"context_line":"                if isinstance(check_hostname, str):"}],"source_content_type":"text/x-python","patch_set":5,"id":"be17a116_07a3b9a3","line":214,"range":{"start_line":214,"start_character":12,"end_line":214,"end_character":48},"updated":"2021-11-08 15:17:49.000000000","message":"Out of curiosity, I\u0027m not sure to see when this param can be a bool instead of a string, please can you give me an example?","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"c8a1e11893a1d48abed2da4dd5321c74702349e0","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                ssl_args[o] \u003d value"},{"line_number":212,"context_line":"        check_hostname \u003d options.get(\"ssl_check_hostname\")"},{"line_number":213,"context_line":"        if check_hostname is not None:"},{"line_number":214,"context_line":"            if isinstance(check_hostname, bool):"},{"line_number":215,"context_line":"                ssl_args[\"check_hostname\"] \u003d check_hostname"},{"line_number":216,"context_line":"            else:"},{"line_number":217,"context_line":"                if isinstance(check_hostname, str):"}],"source_content_type":"text/x-python","patch_set":5,"id":"f8045ecd_cc48022e","line":214,"range":{"start_line":214,"start_character":12,"end_line":214,"end_character":48},"in_reply_to":"7a0535f1_df692bb3","updated":"2022-04-21 16:29:28.000000000","message":"Done","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"671d7db3f01b03a63e37a0bff71a1e8afd2637a1","unresolved":true,"context_lines":[{"line_number":211,"context_line":"                ssl_args[o] \u003d value"},{"line_number":212,"context_line":"        check_hostname \u003d options.get(\"ssl_check_hostname\")"},{"line_number":213,"context_line":"        if check_hostname is not None:"},{"line_number":214,"context_line":"            if isinstance(check_hostname, bool):"},{"line_number":215,"context_line":"                ssl_args[\"check_hostname\"] \u003d check_hostname"},{"line_number":216,"context_line":"            else:"},{"line_number":217,"context_line":"                if isinstance(check_hostname, str):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a0535f1_df692bb3","line":214,"range":{"start_line":214,"start_character":12,"end_line":214,"end_character":48},"in_reply_to":"be17a116_07a3b9a3","updated":"2021-11-08 17:47:16.000000000","message":"yeah, on closer inspection this might not be needed. I modeled it after parsing of verify_mode in pymysql itself, and there it seems it can load those values from some config file too. Here though we only ever get this check_hostname from parsing of connection string, and there\u0027s no type conversion there during parsing AFAIK, so should indeed be safe to assume it is always a string if it is there at all.\n\nFixed.","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"}],"tooz/tests/test_mysql.py":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"7a6acf963d5812eef69148d3f46745ba210a6505","unresolved":true,"context_lines":[{"line_number":66,"context_line":"            \"\u0026ssl_key\u003d/key/not/there\""},{"line_number":67,"context_line":"            \"\u0026ssl_cipher\u003dspam,ham\""},{"line_number":68,"context_line":"        )"},{"line_number":69,"context_line":"        # self.assertRaises(coordination.ToozConnectionError, c.start)"},{"line_number":70,"context_line":"        c.start()"},{"line_number":71,"context_line":"        sql_mock.assert_called_once_with("},{"line_number":72,"context_line":"            host\u003d\"invalidhost\","}],"source_content_type":"text/x-python","patch_set":5,"id":"4effeb11_3a5a7487","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":70},"updated":"2021-11-08 15:17:49.000000000","message":"Could be removed","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"671d7db3f01b03a63e37a0bff71a1e8afd2637a1","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            \"\u0026ssl_key\u003d/key/not/there\""},{"line_number":67,"context_line":"            \"\u0026ssl_cipher\u003dspam,ham\""},{"line_number":68,"context_line":"        )"},{"line_number":69,"context_line":"        # self.assertRaises(coordination.ToozConnectionError, c.start)"},{"line_number":70,"context_line":"        c.start()"},{"line_number":71,"context_line":"        sql_mock.assert_called_once_with("},{"line_number":72,"context_line":"            host\u003d\"invalidhost\","}],"source_content_type":"text/x-python","patch_set":5,"id":"b229ced9_5bcafac6","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":70},"in_reply_to":"4effeb11_3a5a7487","updated":"2021-11-08 17:47:16.000000000","message":"Done","commit_id":"d96ea2f45cbe22541231f2d81e6662e87a1a152b"}]}
