)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"0538bdabccbb1d7f9f9511ab3f9fdc6b6900710f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a31f36b5_4c18b394","updated":"2025-07-07 13:30:27.000000000","message":"We also have PowerFlex rest client in os-brick[1], which also need an update.\n\n[1] https://opendev.org/openstack/os-brick/src/branch/master/os_brick/initiator/connectors/scaleio.py#L281","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"2a2d1de6e9acfc1135d0c64020702db2e551a634","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d656d0e4_7fa8db90","in_reply_to":"a31f36b5_4c18b394","updated":"2025-08-21 07:52:34.000000000","message":"Once the patch [1] and [2] are merged, `os-brick` does not invoke the PowerFlex rest client anymore. We don\u0027t need to update `os-brick` then. \n\n[1] https://review.opendev.org/c/openstack/os-brick/+/952655\n[2] https://review.opendev.org/c/openstack/cinder/+/952800","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"2a2d1de6e9acfc1135d0c64020702db2e551a634","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7baaccab_021571ce","in_reply_to":"a31f36b5_4c18b394","updated":"2025-08-21 07:52:34.000000000","message":"Once the patches [1][2] are merged, the PowerFlex rest client in `os-brick` is not used anymore. We don\u0027t need to update \u0027os-brick\u0027 then.\n\n[1] https://review.opendev.org/c/openstack/os-brick/+/952655\n[2] https://review.opendev.org/c/openstack/cinder/+/952800","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"459a287d5f38bb6be9cbe14f16fd7e60e1990094","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"82daafa5_d2fd566f","updated":"2025-09-15 15:55:16.000000000","message":"recheck openstack-tox-py312 cinder.tests.unit.volume.drivers.netapp.dataontap.utils.test_capabilities.CapabilitiesLibraryTestCase.test_update_ssc_2_iscsi","commit_id":"274ca6513093e881edea008999962191067a0ed1"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"4e99405e88178e67489f75cd7b3da3338882b4d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e8cc3c26_a1667054","updated":"2025-09-15 14:26:40.000000000","message":"run-DellEMC PowerFlex CI","commit_id":"274ca6513093e881edea008999962191067a0ed1"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"60cfce3e7cf8843a6fdb999cd574a6aeeac54acf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ef902971_ec00cf1e","updated":"2025-10-14 06:20:20.000000000","message":"Thanks for reviewing! Comments are resolved.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":38286,"name":"Siddharth Kumar","display_name":"Siddharth","email":"siddharth.kumar1@dell.com","username":"siddhvrth"},"change_message_id":"27b676ce72ee6ea19bd4a2dac7a8da9571887325","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"db5e77f6_f4aafca9","updated":"2026-02-11 06:13:36.000000000","message":"@rosmaita.fossdev@gmail.com @rajatdhasmana@gmail.com\nHi, can you help us with the review!","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":38286,"name":"Siddharth Kumar","display_name":"Siddharth","email":"siddharth.kumar1@dell.com","username":"siddhvrth"},"change_message_id":"b18f483fc1ff46197256d40a134adc4b128d0149","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"5fde7933_a973b80a","updated":"2026-02-06 06:54:02.000000000","message":"Hi team, the CI job works with the change.\nPlease review it.","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":9236,"name":"Jon Bernard","email":"jobernar@redhat.com","username":"jbernard"},"change_message_id":"8d67fc1be6f2b30897701b78e744b143241be8f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"37b6f8e5_ac8316c5","updated":"2026-01-28 23:33:03.000000000","message":"Look ok to me, I concur with Alan.","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"3d99bc9d9f6e661376854e9db2b082baa7ec4db1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"008d4d74_ae320656","updated":"2025-10-28 15:56:27.000000000","message":"The unit test coverage looks good, and though the hard-coded timeout values could be replaced with the variables, I\u0027m OK upvoting the patch as is.","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"82fdba2d6b228c702589404d1001d73142b9155b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"674f72f8_9047f34e","updated":"2025-10-28 06:02:18.000000000","message":"recheck","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"48bb18396af20f7784c3184a2aae0a5cc39fc8a8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f476a001_fefc8937","updated":"2025-10-28 09:08:41.000000000","message":"recheck cinder-tempest-plugin-lvm-lio-barbican","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":38286,"name":"Siddharth Kumar","display_name":"Siddharth","email":"siddharth.kumar1@dell.com","username":"siddhvrth"},"change_message_id":"72096828532b899effd2ed95e07a738c5307e835","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"291d6be1_75a606b8","updated":"2026-02-06 05:05:21.000000000","message":"run-DellEMC PowerFlex CI","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":38286,"name":"Siddharth Kumar","display_name":"Siddharth","email":"siddharth.kumar1@dell.com","username":"siddhvrth"},"change_message_id":"69f6ddc543d9d0991c4936559b4163d8fb99d0cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"2fd87742_efcef733","updated":"2026-01-28 09:04:59.000000000","message":"run-DellEMC PowerFlex CI","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":38286,"name":"Siddharth Kumar","display_name":"Siddharth","email":"siddharth.kumar1@dell.com","username":"siddhvrth"},"change_message_id":"b7e82729d054602a4a042c95f508a94d3e8bd9ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"c84cec33_06b2520e","updated":"2026-01-29 05:54:05.000000000","message":"run-DellEMC PowerFlex CI","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"}],"cinder/tests/unit/volume/drivers/dell_emc/powerflex/test_powerflex_client.py":[{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"3d99bc9d9f6e661376854e9db2b082baa7ec4db1","unresolved":true,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        self.client._refresh_token \u003d mock.Mock(return_value\u003dTrue)"},{"line_number":141,"context_line":"        expected_interval \u003d self.client._refresh_token_periodically()"},{"line_number":142,"context_line":"        self.assertEqual(expected_interval, 300)"},{"line_number":143,"context_line":"        self.client._refresh_token.assert_called_once()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        succ_info \u003d \"Token refresh succeeded. Sleeping for %d seconds.\""}],"source_content_type":"text/x-python","patch_set":6,"id":"f9e387ae_a5facc30","line":142,"range":{"start_line":142,"start_character":44,"end_line":142,"end_character":47},"updated":"2025-10-28 15:56:27.000000000","message":"You should be using the TOKEN_REFRESH_SUCC_INTERVAL and TOKEN_REFRESH_FAIL_INTERVAL variables.","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":38286,"name":"Siddharth Kumar","display_name":"Siddharth","email":"siddharth.kumar1@dell.com","username":"siddhvrth"},"change_message_id":"aed260843ec43241e29fec7c9865b76a52ead0ef","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        self.client._refresh_token \u003d mock.Mock(return_value\u003dTrue)"},{"line_number":141,"context_line":"        expected_interval \u003d self.client._refresh_token_periodically()"},{"line_number":142,"context_line":"        self.assertEqual(expected_interval, 300)"},{"line_number":143,"context_line":"        self.client._refresh_token.assert_called_once()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        succ_info \u003d \"Token refresh succeeded. Sleeping for %d seconds.\""}],"source_content_type":"text/x-python","patch_set":6,"id":"f9683b78_f4270138","line":142,"range":{"start_line":142,"start_character":44,"end_line":142,"end_character":47},"in_reply_to":"28ffdecc_c81fee66","updated":"2026-02-11 05:52:38.000000000","message":"Done","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"},{"author":{"_account_id":38286,"name":"Siddharth Kumar","display_name":"Siddharth","email":"siddharth.kumar1@dell.com","username":"siddhvrth"},"change_message_id":"b18f483fc1ff46197256d40a134adc4b128d0149","unresolved":true,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        self.client._refresh_token \u003d mock.Mock(return_value\u003dTrue)"},{"line_number":141,"context_line":"        expected_interval \u003d self.client._refresh_token_periodically()"},{"line_number":142,"context_line":"        self.assertEqual(expected_interval, 300)"},{"line_number":143,"context_line":"        self.client._refresh_token.assert_called_once()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        succ_info \u003d \"Token refresh succeeded. Sleeping for %d seconds.\""}],"source_content_type":"text/x-python","patch_set":6,"id":"28ffdecc_c81fee66","line":142,"range":{"start_line":142,"start_character":44,"end_line":142,"end_character":47},"in_reply_to":"f9e387ae_a5facc30","updated":"2026-02-06 06:54:02.000000000","message":"Hey Alan, thanks for the review.\nSince its a trivial change associated with the test files, can we fix it in the follow-up patch?\nWe already got one [+2].","commit_id":"56a944d52ccc0bc1debda83a96a26f21057f99b1"}],"cinder/volume/drivers/dell_emc/powerflex/rest_client.py":[{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"cedec28a8dbd626da23a2fa94c61d05ffc845b67","unresolved":true,"context_lines":[{"line_number":16,"context_line":"import http.client as http_client"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import re"},{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import urllib.parse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"429cfcd4_35693576","line":19,"updated":"2025-08-26 19:56:46.000000000","message":"An even better approach is to use olso\u0027s \u0027loopingcall\u0027 functionality instead of the complexity of managing your own thread. Search for \"loopingcall.FixedIntervalLoopingCall\" or \"loopingcall.FixedIntervalWithTimeoutLoopingCall\" in the driver tree for examples of how other drivers use the feature.","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"0538bdabccbb1d7f9f9511ab3f9fdc6b6900710f","unresolved":true,"context_lines":[{"line_number":16,"context_line":"import http.client as http_client"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import re"},{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import urllib.parse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"a8ec16b3_1cae2e72","line":19,"updated":"2025-07-07 13:30:27.000000000","message":"OpenStack uses libraries `eventlet` and `greenlet` for thread modeling.\nI\u0027m not sure if `threading` is acceptable for the core team.","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"e454ff385ba6efeff413f941126d79005f8cc46f","unresolved":true,"context_lines":[{"line_number":16,"context_line":"import http.client as http_client"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import re"},{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import urllib.parse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"79c728be_80def412","line":19,"in_reply_to":"1177d65d_d410ecbb","updated":"2025-09-16 16:44:06.000000000","message":"I think you need to revisit using loopingcall, and hopefully figure out the blocking problem. loopingcall is specifically designed for this scenario.","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"a561a57c3e53090219cb7f311b7911c43bb04b85","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import http.client as http_client"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import re"},{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import urllib.parse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1177d65d_d410ecbb","line":19,"in_reply_to":"429cfcd4_35693576","updated":"2025-09-15 09:11:51.000000000","message":"Tested with \"loopingcall\" but it seems blocking the main thread.","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"6e86ee0b48fb2da9085c12d6fdbc614dfa27fe49","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import http.client as http_client"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import re"},{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import urllib.parse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7fc8733f_edeff513","line":19,"in_reply_to":"79c728be_80def412","updated":"2025-10-14 04:46:00.000000000","message":"Done","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"2a2d1de6e9acfc1135d0c64020702db2e551a634","unresolved":true,"context_lines":[{"line_number":16,"context_line":"import http.client as http_client"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import re"},{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import urllib.parse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ebf0e813_37fa305b","line":19,"in_reply_to":"a8ec16b3_1cae2e72","updated":"2025-08-21 07:52:34.000000000","message":"Python native \u0027thread\u0027 module is also used in cinder code, for example [1].\n\nHowever, \u0027time.sleep()\u0027 can be replaced by greenthread.sleep().\n\n[1] https://opendev.org/openstack/cinder/src/branch/master/cinder/cmd/api.py","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"2a2d1de6e9acfc1135d0c64020702db2e551a634","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import http.client as http_client"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import re"},{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import urllib.parse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"e756408f_56129c7c","line":19,"in_reply_to":"a8ec16b3_1cae2e72","updated":"2025-08-21 07:52:34.000000000","message":"Python native `thread` module is also used by cinder codes, for example [1].\n\n[1] https://opendev.org/openstack/cinder/src/branch/master/cinder/cmd/api.py","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"a561a57c3e53090219cb7f311b7911c43bb04b85","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import http.client as http_client"},{"line_number":17,"context_line":"import json"},{"line_number":18,"context_line":"import re"},{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import time"},{"line_number":21,"context_line":"import urllib.parse"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7e1cb020_3afcb35c","line":19,"in_reply_to":"ebf0e813_37fa305b","updated":"2025-09-15 09:11:51.000000000","message":"Done","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"0538bdabccbb1d7f9f9511ab3f9fdc6b6900710f","unresolved":true,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class RestClient(object):"},{"line_number":48,"context_line":"    _thread_started \u003d False"},{"line_number":49,"context_line":"    _lock \u003d threading.Lock()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __init__(self, configuration, is_primary\u003dTrue):"},{"line_number":52,"context_line":"        self.configuration \u003d configuration"}],"source_content_type":"text/x-python","patch_set":1,"id":"bbe70add_33cd2af5","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":28},"updated":"2025-07-07 13:30:27.000000000","message":"`_thread_started` and `_lock` are both class attribute.\nIn a multiple PowerFlex backends scenario, multiple `RestClient` objects share the same variables. Then, only the first object can start token refresh thread.","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"a561a57c3e53090219cb7f311b7911c43bb04b85","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"class RestClient(object):"},{"line_number":48,"context_line":"    _thread_started \u003d False"},{"line_number":49,"context_line":"    _lock \u003d threading.Lock()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def __init__(self, configuration, is_primary\u003dTrue):"},{"line_number":52,"context_line":"        self.configuration \u003d configuration"}],"source_content_type":"text/x-python","patch_set":1,"id":"e5ba16cf_c87faa1c","line":49,"range":{"start_line":48,"start_character":0,"end_line":49,"end_character":28},"in_reply_to":"bbe70add_33cd2af5","updated":"2025-09-15 09:11:51.000000000","message":"Done","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"3c5c018748c947d51acf9eeb41e29deea9f3b773","unresolved":true,"context_lines":[{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def refresh_token(self):"},{"line_number":606,"context_line":"        try:"},{"line_number":607,"context_line":"            login_url \u003d \"/login\""},{"line_number":608,"context_line":"            login_request \u003d self.base_url + login_url"},{"line_number":609,"context_line":"            verify_cert \u003d self._get_verify_cert()"},{"line_number":610,"context_line":"            timeout \u003d (self.rest_api_connect_timeout,"},{"line_number":611,"context_line":"                       self.rest_api_read_timeout)"},{"line_number":612,"context_line":"            r \u003d requests.get(login_request,"}],"source_content_type":"text/x-python","patch_set":1,"id":"951a2110_463408ae","line":609,"range":{"start_line":607,"start_character":0,"end_line":609,"end_character":0},"updated":"2025-07-07 14:11:23.000000000","message":"I believe the suggested approach is to refresh the token instead of re-login.","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"2a2d1de6e9acfc1135d0c64020702db2e551a634","unresolved":false,"context_lines":[{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def refresh_token(self):"},{"line_number":606,"context_line":"        try:"},{"line_number":607,"context_line":"            login_url \u003d \"/login\""},{"line_number":608,"context_line":"            login_request \u003d self.base_url + login_url"},{"line_number":609,"context_line":"            verify_cert \u003d self._get_verify_cert()"},{"line_number":610,"context_line":"            timeout \u003d (self.rest_api_connect_timeout,"},{"line_number":611,"context_line":"                       self.rest_api_read_timeout)"},{"line_number":612,"context_line":"            r \u003d requests.get(login_request,"}],"source_content_type":"text/x-python","patch_set":1,"id":"f52083b2_df45699b","line":609,"range":{"start_line":607,"start_character":0,"end_line":609,"end_character":0},"in_reply_to":"951a2110_463408ae","updated":"2025-08-21 07:52:34.000000000","message":"PowerFlex V4 has api to refresh token, but v3 not.\nTo be compatible for both, we still use the `login` api to retrieve new token.","commit_id":"6f851c7205ada432941839823c1a0c3aac0befa8"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"e454ff385ba6efeff413f941126d79005f8cc46f","unresolved":true,"context_lines":[{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import urllib.parse"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from eventlet import greenthread"},{"line_number":23,"context_line":"from oslo_log import log as logging"},{"line_number":24,"context_line":"from oslo_utils import units"},{"line_number":25,"context_line":"import requests"}],"source_content_type":"text/x-python","patch_set":3,"id":"7bb681c1_badfa104","line":22,"updated":"2025-09-16 16:44:06.000000000","message":"This is not a good approach, because all upstream projects are specifically trying to eliminate use of eventlet.","commit_id":"274ca6513093e881edea008999962191067a0ed1"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"6e86ee0b48fb2da9085c12d6fdbc614dfa27fe49","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":"import urllib.parse"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from eventlet import greenthread"},{"line_number":23,"context_line":"from oslo_log import log as logging"},{"line_number":24,"context_line":"from oslo_utils import units"},{"line_number":25,"context_line":"import requests"}],"source_content_type":"text/x-python","patch_set":3,"id":"84deeeaf_e1fe90be","line":22,"in_reply_to":"7bb681c1_badfa104","updated":"2025-10-14 04:46:00.000000000","message":"The cinder doc \u0027Threading model\u0027 [1]  is still using \u0027eventlet\u0027.\nIf it\u0027s not the case anymore, which approach is recommended now?\n\n[1] https://docs.openstack.org/cinder/latest/contributor/threading.html","commit_id":"274ca6513093e881edea008999962191067a0ed1"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"82fd5ae8de615858e61f9a17886d09e3a3296d4b","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        self._set_rest_token()"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _set_rest_token(self):"},{"line_number":145,"context_line":"        self._rest_token \u003d None"},{"line_number":146,"context_line":"        self._thread_started \u003d False"},{"line_number":147,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"235c5b0e_529c89c1","line":145,"updated":"2025-10-22 19:23:27.000000000","message":"Why rename this variable? I think the original name (without the leading underscore) is fine, and renaming it forced you to change L545.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"b1a62c5522180dba313c7277b17b64c37107b19a","unresolved":true,"context_lines":[{"line_number":142,"context_line":"        self._set_rest_token()"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _set_rest_token(self):"},{"line_number":145,"context_line":"        self._rest_token \u003d None"},{"line_number":146,"context_line":"        self._thread_started \u003d False"},{"line_number":147,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f51ec69_9eb7bf80","line":145,"in_reply_to":"154c2ed9_d36f29b7","updated":"2025-10-27 16:57:20.000000000","message":"That\u0027s not a rule we enforce, and most of the other fields (none of which have a leading underscore in the name) are also only referenced by code in this file.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"973ee05d8323a4daa814270c3e62fdea3f05290a","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        self._set_rest_token()"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _set_rest_token(self):"},{"line_number":145,"context_line":"        self._rest_token \u003d None"},{"line_number":146,"context_line":"        self._thread_started \u003d False"},{"line_number":147,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"154c2ed9_d36f29b7","line":145,"in_reply_to":"235c5b0e_529c89c1","updated":"2025-10-26 11:25:12.000000000","message":"Indicate `_rest_token` should be private and accessible inside the RestClient object.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"43d3c0d606da75963292d91d0b23d8da27bf3fb8","unresolved":false,"context_lines":[{"line_number":142,"context_line":"        self._set_rest_token()"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _set_rest_token(self):"},{"line_number":145,"context_line":"        self._rest_token \u003d None"},{"line_number":146,"context_line":"        self._thread_started \u003d False"},{"line_number":147,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"dfdc1ce8_a46b0cef","line":145,"in_reply_to":"5f51ec69_9eb7bf80","updated":"2025-10-28 04:22:10.000000000","message":"Done","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"82fd5ae8de615858e61f9a17886d09e3a3296d4b","unresolved":true,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _set_rest_token(self):"},{"line_number":145,"context_line":"        self._rest_token \u003d None"},{"line_number":146,"context_line":"        self._thread_started \u003d False"},{"line_number":147,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # Initilaize PowerFlex rest token"},{"line_number":150,"context_line":"        LOG.info(\"Initialize PowerFlex rest token.\")"},{"line_number":151,"context_line":"        self._refresh_token()"}],"source_content_type":"text/x-python","patch_set":4,"id":"4591aab0_b51d6509","line":148,"range":{"start_line":146,"start_character":0,"end_line":148,"end_character":1},"updated":"2025-10-22 19:23:27.000000000","message":"Why are these necessary? I know the driver creates separate rest clients (primary and secondary), but I don\u0027t see how _start_token_refresh_thread() would ever be called more than once per client.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"973ee05d8323a4daa814270c3e62fdea3f05290a","unresolved":false,"context_lines":[{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def _set_rest_token(self):"},{"line_number":145,"context_line":"        self._rest_token \u003d None"},{"line_number":146,"context_line":"        self._thread_started \u003d False"},{"line_number":147,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        # Initilaize PowerFlex rest token"},{"line_number":150,"context_line":"        LOG.info(\"Initialize PowerFlex rest token.\")"},{"line_number":151,"context_line":"        self._refresh_token()"}],"source_content_type":"text/x-python","patch_set":4,"id":"af4abd65_614d635a","line":148,"range":{"start_line":146,"start_character":0,"end_line":148,"end_character":1},"in_reply_to":"4591aab0_b51d6509","updated":"2025-10-26 11:25:12.000000000","message":"Done","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"82fd5ae8de615858e61f9a17886d09e3a3296d4b","unresolved":true,"context_lines":[{"line_number":159,"context_line":"                LOG.info(\"Start token refresh thread.\")"},{"line_number":160,"context_line":"                timer \u003d loopingcall.DynamicLoopingCall("},{"line_number":161,"context_line":"                    self._refresh_token_periodically)"},{"line_number":162,"context_line":"                timer.start(initial_delay\u003d0)"},{"line_number":163,"context_line":"                self._thread_started \u003d True"},{"line_number":164,"context_line":"            else:"},{"line_number":165,"context_line":"                LOG.info(\"Token refresh thread already started.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a17ad88_a237d587","line":162,"updated":"2025-10-22 19:23:27.000000000","message":"Why set an initial_delay of 0 when you should have already fetched a token on L151?","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"b1a62c5522180dba313c7277b17b64c37107b19a","unresolved":true,"context_lines":[{"line_number":159,"context_line":"                LOG.info(\"Start token refresh thread.\")"},{"line_number":160,"context_line":"                timer \u003d loopingcall.DynamicLoopingCall("},{"line_number":161,"context_line":"                    self._refresh_token_periodically)"},{"line_number":162,"context_line":"                timer.start(initial_delay\u003d0)"},{"line_number":163,"context_line":"                self._thread_started \u003d True"},{"line_number":164,"context_line":"            else:"},{"line_number":165,"context_line":"                LOG.info(\"Token refresh thread already started.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"a0c0c5e7_0f9230df","line":162,"in_reply_to":"97c375bb_ac5b197d","updated":"2025-10-27 16:57:20.000000000","message":"I suggest you confirm the token isn\u0027t initially fetched at L148, and then immediately refreshed by the periodic function. This wouldn\u0027t be a major problem, but there\u0027s no reason to fetch a token twice on startup.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"973ee05d8323a4daa814270c3e62fdea3f05290a","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                LOG.info(\"Start token refresh thread.\")"},{"line_number":160,"context_line":"                timer \u003d loopingcall.DynamicLoopingCall("},{"line_number":161,"context_line":"                    self._refresh_token_periodically)"},{"line_number":162,"context_line":"                timer.start(initial_delay\u003d0)"},{"line_number":163,"context_line":"                self._thread_started \u003d True"},{"line_number":164,"context_line":"            else:"},{"line_number":165,"context_line":"                LOG.info(\"Token refresh thread already started.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"97c375bb_ac5b197d","line":162,"in_reply_to":"9a17ad88_a237d587","updated":"2025-10-26 11:25:12.000000000","message":"Make the looping call start immediately. It seems no need to postpone.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"43d3c0d606da75963292d91d0b23d8da27bf3fb8","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                LOG.info(\"Start token refresh thread.\")"},{"line_number":160,"context_line":"                timer \u003d loopingcall.DynamicLoopingCall("},{"line_number":161,"context_line":"                    self._refresh_token_periodically)"},{"line_number":162,"context_line":"                timer.start(initial_delay\u003d0)"},{"line_number":163,"context_line":"                self._thread_started \u003d True"},{"line_number":164,"context_line":"            else:"},{"line_number":165,"context_line":"                LOG.info(\"Token refresh thread already started.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"8debc27c_ef799f92","line":162,"in_reply_to":"a0c0c5e7_0f9230df","updated":"2025-10-28 04:22:10.000000000","message":"After the token is initially fetched by the main thread, several rest calls are issued by driver `check_for_setup_error` to retrieve storage version, domain id, and pool id. Then, the token is fetched again by the \u0027token refresh\u0027 thread.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"82fd5ae8de615858e61f9a17886d09e3a3296d4b","unresolved":true,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def _refresh_token_periodically(self):"},{"line_number":168,"context_line":"        if self._refresh_token():"},{"line_number":169,"context_line":"            LOG.info(\"Token refresh succeeded. Sleeping for 300 seconds.\")"},{"line_number":170,"context_line":"            return TOKEN_REFRESH_SUCC_INTERVAL"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # Token refresh failed. Continue using current token."}],"source_content_type":"text/x-python","patch_set":4,"id":"a9f4b5f4_2dc475a5","line":169,"updated":"2025-10-22 19:23:27.000000000","message":"The message shouldn\u0027t hard code \"300\" in the string. Use %d and the TOKEN_REFRESH_SUCC_INTERVAL variable.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"973ee05d8323a4daa814270c3e62fdea3f05290a","unresolved":false,"context_lines":[{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def _refresh_token_periodically(self):"},{"line_number":168,"context_line":"        if self._refresh_token():"},{"line_number":169,"context_line":"            LOG.info(\"Token refresh succeeded. Sleeping for 300 seconds.\")"},{"line_number":170,"context_line":"            return TOKEN_REFRESH_SUCC_INTERVAL"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # Token refresh failed. Continue using current token."}],"source_content_type":"text/x-python","patch_set":4,"id":"30bf224c_5b2fb339","line":169,"in_reply_to":"a9f4b5f4_2dc475a5","updated":"2025-10-26 11:25:12.000000000","message":"Done","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"82fd5ae8de615858e61f9a17886d09e3a3296d4b","unresolved":true,"context_lines":[{"line_number":170,"context_line":"            return TOKEN_REFRESH_SUCC_INTERVAL"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # Token refresh failed. Continue using current token."},{"line_number":173,"context_line":"        LOG.info(\"Token refresh failed. Sleeping for 60 seconds.\")"},{"line_number":174,"context_line":"        return TOKEN_REFRESH_FAIL_INTERVAL"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def _refresh_token(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fbb2f2d7_e314e5b7","line":173,"updated":"2025-10-22 19:23:27.000000000","message":"Same again (use %d and TOKEN_REFRESH_FAIL_INTERVAL instead of \"60\").\n\nAlso, maybe this should be a LOG.warning?","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"973ee05d8323a4daa814270c3e62fdea3f05290a","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            return TOKEN_REFRESH_SUCC_INTERVAL"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        # Token refresh failed. Continue using current token."},{"line_number":173,"context_line":"        LOG.info(\"Token refresh failed. Sleeping for 60 seconds.\")"},{"line_number":174,"context_line":"        return TOKEN_REFRESH_FAIL_INTERVAL"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def _refresh_token(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"29dd0ca4_5b4fd54d","line":173,"in_reply_to":"fbb2f2d7_e314e5b7","updated":"2025-10-26 11:25:12.000000000","message":"Done","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":21129,"name":"Alan Bishop","email":"abishopsweng@gmail.com","username":"ASBishop","status":"ex Red Hat"},"change_message_id":"82fd5ae8de615858e61f9a17886d09e3a3296d4b","unresolved":true,"context_lines":[{"line_number":190,"context_line":"            return False"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        self._rest_token \u003d token"},{"line_number":193,"context_line":"        LOG.info(\"Refreshed token. Thread: %s\", threading.current_thread())"},{"line_number":194,"context_line":"        return True"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def query_rest_api_version(self, fromcache\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":4,"id":"94d29d4d_bdd39757","line":193,"updated":"2025-10-22 19:23:27.000000000","message":"I don\u0027t think you need this log when you have the one on L169.","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"},{"author":{"_account_id":35759,"name":"Yian Zong","display_name":"Yian Zong","email":"yian.zong@dell.com","username":"yianzong"},"change_message_id":"973ee05d8323a4daa814270c3e62fdea3f05290a","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            return False"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        self._rest_token \u003d token"},{"line_number":193,"context_line":"        LOG.info(\"Refreshed token. Thread: %s\", threading.current_thread())"},{"line_number":194,"context_line":"        return True"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def query_rest_api_version(self, fromcache\u003dTrue):"}],"source_content_type":"text/x-python","patch_set":4,"id":"802a0b60_578222b9","line":193,"in_reply_to":"94d29d4d_bdd39757","updated":"2025-10-26 11:25:12.000000000","message":"Done","commit_id":"e539541cc37cf0f622213a94af1a83ccc5300c19"}]}
