)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":37924,"name":"Abhishek Bongale","display_name":"abongale","email":"abhishekbongale@outlook.com","username":"abhibongale"},"change_message_id":"fd661aacf61f3dee358a7d266505a94987464646","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"446f07c2_4327bfb2","updated":"2025-12-19 12:24:47.000000000","message":"lgtm","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"942ef11bfc909383f356a5ecf521a29dcab32d6b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"062a4a71_751c02d6","updated":"2026-01-07 02:43:40.000000000","message":"thanks, overall lgtm, but one suggestion","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":37924,"name":"Abhishek Bongale","display_name":"abongale","email":"abhishekbongale@outlook.com","username":"abhibongale"},"change_message_id":"d42b30694d8dac3624d0e029292164fc609587ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"cc6afdcf_713e4953","updated":"2026-01-14 16:04:38.000000000","message":"soft -1 , I guess we could remove the credentials from the test_list_servers_negative.py","commit_id":"52451f88349b081e63e0c8987f7b8873025b4400"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"d966b214558823cf8aad23c591c838d7d160f1df","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"caa2f98d_41f87f7b","in_reply_to":"cc6afdcf_713e4953","updated":"2026-01-14 16:37:04.000000000","message":"yup, done","commit_id":"52451f88349b081e63e0c8987f7b8873025b4400"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"c0387c643983a4b3199e80772fc72fb52cad1a71","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"bfc4eea0_0c68c81c","updated":"2026-01-19 14:58:10.000000000","message":"Thank you for the review once again @gmaan@ghanshyammann.com.  I believe I have addressed all the comments.","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"},{"author":{"_account_id":37924,"name":"Abhishek Bongale","display_name":"abongale","email":"abhishekbongale@outlook.com","username":"abhibongale"},"change_message_id":"331484bcfaf8fc7b88ace5adb06d3ba2754b9412","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"5690c139_b33f0a90","updated":"2026-01-15 12:25:08.000000000","message":"lgtm","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ee88b1fb424ea683e09d84c0a2d813465536c42a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"6f135a52_42f57f4c","updated":"2026-01-17 02:04:55.000000000","message":"looks good but let\u0027s avoid hasattr check in child test classes.","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"0da18ec11ca421d985355568e00907d809d77ba5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"0de82db8_8c3e33a0","updated":"2026-01-14 22:01:05.000000000","message":"recheck cinder failed to create volume","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"01fec66b72f5775fb4f31d14f375d718c028ce68","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"b18c38df_2f364a40","updated":"2026-01-19 17:56:29.000000000","message":"perfect, thanks for updates. lgtm","commit_id":"cd988b77e48f5bfc07f27130820ac3d5a23ea540"}],"tempest/api/compute/base.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ee88b1fb424ea683e09d84c0a2d813465536c42a","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def setup_clients(cls):"},{"line_number":79,"context_line":"        super(BaseV2ComputeTest, cls).setup_clients()"},{"line_number":80,"context_line":"        cls.servers_client \u003d cls.os_primary.servers_client"},{"line_number":81,"context_line":"        if CONF.enforce_scope.nova and hasattr(cls, \u0027os_project_reader\u0027):"},{"line_number":82,"context_line":"            cls.reader_servers_client \u003d cls.os_project_reader.servers_client"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            cls.reader_servers_client \u003d cls.servers_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"80871ea0_daf19b9d","line":81,"range":{"start_line":81,"start_character":39,"end_line":81,"end_character":69},"updated":"2026-01-17 02:04:55.000000000","message":"++. yeah, this is needed as not all child classes will be creating the reader creds.","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"}],"tempest/api/compute/flavors/test_flavors.py":[{"author":{"_account_id":37924,"name":"Abhishek Bongale","display_name":"abongale","email":"abhishekbongale@outlook.com","username":"abhibongale"},"change_message_id":"0d481bfe67f583cc2ef072120c0f65db01e4efb2","unresolved":true,"context_lines":[{"line_number":24,"context_line":"class FlavorsV2TestJSON(base.BaseV2ComputeTest):"},{"line_number":25,"context_line":"    \"\"\"Tests Flavors\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7b5155bb_e91b3495","line":27,"updated":"2026-01-13 16:09:45.000000000","message":"I guess it\u0027s redundant, We should remove it right? \n\nSince parent class have exact same list values as this one (credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027])","commit_id":"5c2e9cca8fe2bdfb65e6f0f70f3deb020009b5e9"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"c406272776254b632a0c9ddb8f102f3a3e73352d","unresolved":false,"context_lines":[{"line_number":24,"context_line":"class FlavorsV2TestJSON(base.BaseV2ComputeTest):"},{"line_number":25,"context_line":"    \"\"\"Tests Flavors\"\"\""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027]"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1ac87a17_f97800b8","line":27,"in_reply_to":"7b5155bb_e91b3495","updated":"2026-01-13 16:52:55.000000000","message":"Done","commit_id":"5c2e9cca8fe2bdfb65e6f0f70f3deb020009b5e9"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ee88b1fb424ea683e09d84c0a2d813465536c42a","unresolved":true,"context_lines":[{"line_number":27,"context_line":"    @classmethod"},{"line_number":28,"context_line":"    def setup_clients(cls):"},{"line_number":29,"context_line":"        super(FlavorsV2TestJSON, cls).setup_clients()"},{"line_number":30,"context_line":"        if CONF.enforce_scope.nova and hasattr(cls, \u0027os_project_reader\u0027):"},{"line_number":31,"context_line":"            cls.reader_client \u003d cls.os_project_reader.flavors_client"},{"line_number":32,"context_line":"        else:"},{"line_number":33,"context_line":"            cls.reader_client \u003d cls.flavors_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"dd755dda_00f110ab","line":30,"range":{"start_line":30,"start_character":35,"end_line":30,"end_character":73},"updated":"2026-01-17 02:04:55.000000000","message":"I will not check it here as this can silently hide the issue is reader creds are not created which is needed for this tests. This check in base class is ok but in other test class, I think it is better to have an error if reader creds are not created.\n\nFor example, if anyone remove the \u0027project_reader\u0027 from base class credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027] then this test will still pass and we will not get to know. If we do not check hasattr here then change in base class \u0027credentials \u0027 will tell about this test failing.","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"c0387c643983a4b3199e80772fc72fb52cad1a71","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    @classmethod"},{"line_number":28,"context_line":"    def setup_clients(cls):"},{"line_number":29,"context_line":"        super(FlavorsV2TestJSON, cls).setup_clients()"},{"line_number":30,"context_line":"        if CONF.enforce_scope.nova and hasattr(cls, \u0027os_project_reader\u0027):"},{"line_number":31,"context_line":"            cls.reader_client \u003d cls.os_project_reader.flavors_client"},{"line_number":32,"context_line":"        else:"},{"line_number":33,"context_line":"            cls.reader_client \u003d cls.flavors_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"15f6bf4c_6d3f719a","line":30,"range":{"start_line":30,"start_character":35,"end_line":30,"end_character":73},"in_reply_to":"dd755dda_00f110ab","updated":"2026-01-19 14:58:10.000000000","message":"Done","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"}],"tempest/api/compute/flavors/test_flavors_negative.py":[{"author":{"_account_id":37924,"name":"Abhishek Bongale","display_name":"abongale","email":"abhishekbongale@outlook.com","username":"abhibongale"},"change_message_id":"0d481bfe67f583cc2ef072120c0f65db01e4efb2","unresolved":true,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class FlavorsV2NegativeTest(base.BaseV2ComputeTest):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @classmethod"},{"line_number":34,"context_line":"    def setup_clients(cls):"}],"source_content_type":"text/x-python","patch_set":14,"id":"e0230abc_8fbb7cc4","line":31,"range":{"start_line":31,"start_character":4,"end_line":31,"end_character":15},"updated":"2026-01-13 16:09:45.000000000","message":"```suggestion\n```\n\nI guess it\u0027s redundant, We should remove it right?\n\nSince parent class have exact same list values as this one.","commit_id":"5c2e9cca8fe2bdfb65e6f0f70f3deb020009b5e9"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"c406272776254b632a0c9ddb8f102f3a3e73352d","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class FlavorsV2NegativeTest(base.BaseV2ComputeTest):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @classmethod"},{"line_number":34,"context_line":"    def setup_clients(cls):"}],"source_content_type":"text/x-python","patch_set":14,"id":"a019e148_9351b77d","line":31,"range":{"start_line":31,"start_character":4,"end_line":31,"end_character":15},"in_reply_to":"e0230abc_8fbb7cc4","updated":"2026-01-13 16:52:55.000000000","message":"Done","commit_id":"5c2e9cca8fe2bdfb65e6f0f70f3deb020009b5e9"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ee88b1fb424ea683e09d84c0a2d813465536c42a","unresolved":true,"context_lines":[{"line_number":31,"context_line":"    @classmethod"},{"line_number":32,"context_line":"    def setup_clients(cls):"},{"line_number":33,"context_line":"        super(FlavorsV2NegativeTest, cls).setup_clients()"},{"line_number":34,"context_line":"        if CONF.enforce_scope.nova and hasattr(cls, \u0027os_project_reader\u0027):"},{"line_number":35,"context_line":"            cls.reader_client \u003d cls.os_project_reader.flavors_client"},{"line_number":36,"context_line":"        else:"},{"line_number":37,"context_line":"            cls.reader_client \u003d cls.flavors_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"76834eb1_6a9f4e7f","line":34,"range":{"start_line":34,"start_character":35,"end_line":34,"end_character":73},"updated":"2026-01-17 02:04:55.000000000","message":"ditto","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"c0387c643983a4b3199e80772fc72fb52cad1a71","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    @classmethod"},{"line_number":32,"context_line":"    def setup_clients(cls):"},{"line_number":33,"context_line":"        super(FlavorsV2NegativeTest, cls).setup_clients()"},{"line_number":34,"context_line":"        if CONF.enforce_scope.nova and hasattr(cls, \u0027os_project_reader\u0027):"},{"line_number":35,"context_line":"            cls.reader_client \u003d cls.os_project_reader.flavors_client"},{"line_number":36,"context_line":"        else:"},{"line_number":37,"context_line":"            cls.reader_client \u003d cls.flavors_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"4e1982c3_d0915ff4","line":34,"range":{"start_line":34,"start_character":35,"end_line":34,"end_character":73},"in_reply_to":"76834eb1_6a9f4e7f","updated":"2026-01-19 14:58:10.000000000","message":"Done","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"}],"tempest/api/compute/servers/test_attach_interfaces.py":[{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"2693d25d59fea706e755409d9db55259e67106bc","unresolved":true,"context_lines":[{"line_number":88,"context_line":"            wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":89,"context_line":"        # NOTE(mgoddard): Get detailed server to ensure addresses are present"},{"line_number":90,"context_line":"        # in fixed IP case."},{"line_number":91,"context_line":"        server \u003d self.servers_client.show_server(server[\u0027id\u0027])[\u0027server\u0027]"},{"line_number":92,"context_line":"        # NOTE(artom) self.create_test_server adds cleanups, but this is"},{"line_number":93,"context_line":"        # apparently not enough? Add cleanup here."},{"line_number":94,"context_line":"        self.addCleanup(self.delete_server, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"8a8cac12_1b1f0c31","line":91,"updated":"2026-01-13 20:25:42.000000000","message":"soft -1 but can\u0027t we use reader client here as well ? or is it left out on purpose for some reason ?","commit_id":"87b919832c70419a772d96e6d52605cc66181785"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"0cbdbd163759fdf19bd2ac7361c91491494eee89","unresolved":true,"context_lines":[{"line_number":88,"context_line":"            wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":89,"context_line":"        # NOTE(mgoddard): Get detailed server to ensure addresses are present"},{"line_number":90,"context_line":"        # in fixed IP case."},{"line_number":91,"context_line":"        server \u003d self.servers_client.show_server(server[\u0027id\u0027])[\u0027server\u0027]"},{"line_number":92,"context_line":"        # NOTE(artom) self.create_test_server adds cleanups, but this is"},{"line_number":93,"context_line":"        # apparently not enough? Add cleanup here."},{"line_number":94,"context_line":"        self.addCleanup(self.delete_server, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"905d5560_7918320e","line":91,"in_reply_to":"8a8cac12_1b1f0c31","updated":"2026-01-14 14:06:16.000000000","message":"good catch, updated a few other spots I found with the same issue as well.","commit_id":"87b919832c70419a772d96e6d52605cc66181785"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"08e9e0ffb5f3026476e718bcab04547ffe5eca5e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            wait_until\u003d\u0027ACTIVE\u0027)"},{"line_number":89,"context_line":"        # NOTE(mgoddard): Get detailed server to ensure addresses are present"},{"line_number":90,"context_line":"        # in fixed IP case."},{"line_number":91,"context_line":"        server \u003d self.servers_client.show_server(server[\u0027id\u0027])[\u0027server\u0027]"},{"line_number":92,"context_line":"        # NOTE(artom) self.create_test_server adds cleanups, but this is"},{"line_number":93,"context_line":"        # apparently not enough? Add cleanup here."},{"line_number":94,"context_line":"        self.addCleanup(self.delete_server, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":16,"id":"a3b82c09_4e79ed68","line":91,"in_reply_to":"905d5560_7918320e","updated":"2026-01-14 14:06:58.000000000","message":"Done","commit_id":"87b919832c70419a772d96e6d52605cc66181785"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ee88b1fb424ea683e09d84c0a2d813465536c42a","unresolved":true,"context_lines":[{"line_number":60,"context_line":"        super(AttachInterfacesTestBase, cls).setup_clients()"},{"line_number":61,"context_line":"        cls.subnets_client \u003d cls.os_primary.subnets_client"},{"line_number":62,"context_line":"        cls.ports_client \u003d cls.os_primary.ports_client"},{"line_number":63,"context_line":"        if CONF.enforce_scope.nova and hasattr(cls, \u0027os_project_reader\u0027):"},{"line_number":64,"context_line":"            cls.reader_interfaces_client \u003d ("},{"line_number":65,"context_line":"                cls.os_project_reader.interfaces_client)"},{"line_number":66,"context_line":"            cls.reader_ports_client \u003d cls.os_project_reader.ports_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"520dbe09_e8458e24","line":63,"range":{"start_line":63,"start_character":35,"end_line":63,"end_character":73},"updated":"2026-01-17 02:04:55.000000000","message":"ditto, and in other places also.","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"c0387c643983a4b3199e80772fc72fb52cad1a71","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        super(AttachInterfacesTestBase, cls).setup_clients()"},{"line_number":61,"context_line":"        cls.subnets_client \u003d cls.os_primary.subnets_client"},{"line_number":62,"context_line":"        cls.ports_client \u003d cls.os_primary.ports_client"},{"line_number":63,"context_line":"        if CONF.enforce_scope.nova and hasattr(cls, \u0027os_project_reader\u0027):"},{"line_number":64,"context_line":"            cls.reader_interfaces_client \u003d ("},{"line_number":65,"context_line":"                cls.os_project_reader.interfaces_client)"},{"line_number":66,"context_line":"            cls.reader_ports_client \u003d cls.os_project_reader.ports_client"}],"source_content_type":"text/x-python","patch_set":18,"id":"d2f8cef5_6dcede79","line":63,"range":{"start_line":63,"start_character":35,"end_line":63,"end_character":73},"in_reply_to":"520dbe09_e8458e24","updated":"2026-01-19 14:58:10.000000000","message":"Done","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"}],"tempest/api/compute/servers/test_availability_zone.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"942ef11bfc909383f356a5ecf521a29dcab32d6b","unresolved":true,"context_lines":[{"line_number":31,"context_line":"        super(AZV2TestJSON, cls).setup_clients()"},{"line_number":32,"context_line":"        cls.client \u003d cls.availability_zone_client"},{"line_number":33,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":34,"context_line":"            cls.reader_client \u003d cls.os_project_reader.availability_zone_client"},{"line_number":35,"context_line":"        else:"},{"line_number":36,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"cb01045d_5a0afafd","line":34,"range":{"start_line":34,"start_character":16,"end_line":34,"end_character":30},"updated":"2026-01-07 02:43:40.000000000","message":"we have been not so good on naming the client var in past but let improve it for any new one.\n\nI would name it reader_az_client","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"d91ec93a5ccd5071a2987621b680023007250781","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        super(AZV2TestJSON, cls).setup_clients()"},{"line_number":32,"context_line":"        cls.client \u003d cls.availability_zone_client"},{"line_number":33,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":34,"context_line":"            cls.reader_client \u003d cls.os_project_reader.availability_zone_client"},{"line_number":35,"context_line":"        else:"},{"line_number":36,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"113e20ca_c992b1a1","line":34,"range":{"start_line":34,"start_character":16,"end_line":34,"end_character":30},"in_reply_to":"cb01045d_5a0afafd","updated":"2026-01-07 16:33:08.000000000","message":"Done","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"}],"tempest/api/compute/servers/test_create_server.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ee88b1fb424ea683e09d84c0a2d813465536c42a","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            self.password,"},{"line_number":126,"context_line":"            validation_resources[\u0027keypair\u0027][\u0027private_key\u0027],"},{"line_number":127,"context_line":"            server\u003dself.server,"},{"line_number":128,"context_line":"            servers_client\u003dself.servers_client)"},{"line_number":129,"context_line":"        output \u003d linux_client.exec_command(\u0027grep -c ^processor /proc/cpuinfo\u0027)"},{"line_number":130,"context_line":"        self.assertEqual(flavor[\u0027vcpus\u0027], int(output))"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"e3ed6e8e_8bd3bfc4","line":128,"range":{"start_line":128,"start_character":27,"end_line":128,"end_character":46},"updated":"2026-01-17 02:04:55.000000000","message":"++, this is better and easy to read. Thanks.","commit_id":"7d634ef2d75694a8f22686264c819539c43771d8"}],"tempest/api/compute/servers/test_delete_server.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ee88b1fb424ea683e09d84c0a2d813465536c42a","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    @classmethod"},{"line_number":36,"context_line":"    def setup_clients(cls):"},{"line_number":37,"context_line":"        super(DeleteServersTestJSON, cls).setup_clients()"},{"line_number":38,"context_line":"        cls.client \u003d cls.servers_client"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @decorators.idempotent_id(\u00279e6e0c87-3352-42f7-9faf-5d6210dbd159\u0027)"},{"line_number":41,"context_line":"    def test_delete_server_while_in_building_state(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"5b3250a8_7ddd2a2d","side":"PARENT","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":39},"updated":"2026-01-17 02:04:55.000000000","message":"++","commit_id":"1b54854f98e94476301a5985a3c4f8ef29ea2901"}],"tempest/api/compute/servers/test_disk_config.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"942ef11bfc909383f356a5ecf521a29dcab32d6b","unresolved":true,"context_lines":[{"line_number":41,"context_line":"        super(ServerDiskConfigTestJSON, cls).setup_clients()"},{"line_number":42,"context_line":"        cls.client \u003d cls.os_primary.servers_client"},{"line_number":43,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":44,"context_line":"            cls.reader_client \u003d cls.os_project_reader.servers_client"},{"line_number":45,"context_line":"        else:"},{"line_number":46,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"78793610_284f8085","line":44,"range":{"start_line":44,"start_character":12,"end_line":44,"end_character":29},"updated":"2026-01-07 02:43:40.000000000","message":"while reviewing these many files, i realized that reader server client is needed in most of the file, let\u0027s define this in base class base.BaseV2ComputeTest so that we can reuse the code in all these tests file and use self.reader_servers_client from base class itself.\n\nIn the base.BaseV2ComputeTest class:\n\n1. you can define the\n\n       credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027]\n\n   -  \nhttps://github.com/openstack/tempest/blob/1b54854f98e94476301a5985a3c4f8ef29ea2901/tempest/api/compute/base.py#L47\n\n2. in setup_clients():\n\n    @classmethod\n    def setup_clients(cls):\n        super(BaseV2ComputeTest, cls).setup_clients()\n        cls.servers_client \u003d cls.os_primary.servers_client\n        if CONF.enforce_scope.nova:\n            cls.reader_servers_client \u003d cls.os_project_reader.servers_client\n        else:\n            cls.reader_servers_client \u003d cls.servers_client\n\n\n   - https://github.com/openstack/tempest/blob/1b54854f98e94476301a5985a3c4f8ef29ea2901/tempest/api/compute/base.py#L80\n            \nand then you can use self.reader_servers_client in all these files without redinfing it everytime.","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"c0387c643983a4b3199e80772fc72fb52cad1a71","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        super(ServerDiskConfigTestJSON, cls).setup_clients()"},{"line_number":42,"context_line":"        cls.client \u003d cls.os_primary.servers_client"},{"line_number":43,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":44,"context_line":"            cls.reader_client \u003d cls.os_project_reader.servers_client"},{"line_number":45,"context_line":"        else:"},{"line_number":46,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"cf02dfb2_2415d7a4","line":44,"range":{"start_line":44,"start_character":12,"end_line":44,"end_character":29},"in_reply_to":"75e3e9e9_1917681b","updated":"2026-01-19 14:58:10.000000000","message":"Done","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"d91ec93a5ccd5071a2987621b680023007250781","unresolved":true,"context_lines":[{"line_number":41,"context_line":"        super(ServerDiskConfigTestJSON, cls).setup_clients()"},{"line_number":42,"context_line":"        cls.client \u003d cls.os_primary.servers_client"},{"line_number":43,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":44,"context_line":"            cls.reader_client \u003d cls.os_project_reader.servers_client"},{"line_number":45,"context_line":"        else:"},{"line_number":46,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"75e3e9e9_1917681b","line":44,"range":{"start_line":44,"start_character":12,"end_line":44,"end_character":29},"in_reply_to":"78793610_284f8085","updated":"2026-01-07 16:33:08.000000000","message":"There is a comment in the base class but I\u0027m not sure what the alt_manager is...  https://github.com/openstack/tempest/blob/1b54854f98e94476301a5985a3c4f8ef29ea2901/tempest/api/compute/base.py#L45\n\nAlso, there are several readers clients like reader_interfaces_client, reader_az_client, etc. so should those also be added to the base class if they are used in multiple files or just let those be defined in the individual files?\n\nAnd i realized that we could then also remove definitions for cls.client and directly reference self.servers_client, which creates more changes...","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"}],"tempest/api/compute/servers/test_list_servers_negative.py":[{"author":{"_account_id":37924,"name":"Abhishek Bongale","display_name":"abongale","email":"abhishekbongale@outlook.com","username":"abhibongale"},"change_message_id":"d42b30694d8dac3624d0e029292164fc609587ba","unresolved":true,"context_lines":[{"line_number":26,"context_line":"class ListServersNegativeTestJSON(base.BaseV2ComputeTest):"},{"line_number":27,"context_line":"    \"\"\"Negative tests of listing servers\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027]"},{"line_number":30,"context_line":"    create_default_network \u003d True"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":17,"id":"2cf0be25_ac88a3b3","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":47},"updated":"2026-01-14 16:04:38.000000000","message":"I guess we could remove this, since already in the base class.","commit_id":"52451f88349b081e63e0c8987f7b8873025b4400"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"d966b214558823cf8aad23c591c838d7d160f1df","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class ListServersNegativeTestJSON(base.BaseV2ComputeTest):"},{"line_number":27,"context_line":"    \"\"\"Negative tests of listing servers\"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027project_reader\u0027]"},{"line_number":30,"context_line":"    create_default_network \u003d True"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":17,"id":"992397d4_fed5d6fa","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":47},"in_reply_to":"2cf0be25_ac88a3b3","updated":"2026-01-14 16:37:04.000000000","message":"good catch, thank you","commit_id":"52451f88349b081e63e0c8987f7b8873025b4400"}],"tempest/api/compute/servers/test_novnc.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"942ef11bfc909383f356a5ecf521a29dcab32d6b","unresolved":true,"context_lines":[{"line_number":55,"context_line":"        super(NoVNCConsoleTestJSON, cls).setup_clients()"},{"line_number":56,"context_line":"        cls.client \u003d cls.servers_client"},{"line_number":57,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":58,"context_line":"            cls.reader_client \u003d cls.os_project_reader.servers_client"},{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"8584e2aa_ddde1706","line":58,"range":{"start_line":58,"start_character":12,"end_line":58,"end_character":29},"updated":"2026-01-07 02:43:40.000000000","message":"do we use this in this test?","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"d91ec93a5ccd5071a2987621b680023007250781","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        super(NoVNCConsoleTestJSON, cls).setup_clients()"},{"line_number":56,"context_line":"        cls.client \u003d cls.servers_client"},{"line_number":57,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":58,"context_line":"            cls.reader_client \u003d cls.os_project_reader.servers_client"},{"line_number":59,"context_line":"        else:"},{"line_number":60,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"99dd6396_b11cd85b","line":58,"range":{"start_line":58,"start_character":12,"end_line":58,"end_character":29},"in_reply_to":"8584e2aa_ddde1706","updated":"2026-01-07 16:33:08.000000000","message":"good catch","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"}],"tempest/api/compute/servers/test_server_actions.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"942ef11bfc909383f356a5ecf521a29dcab32d6b","unresolved":true,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        def _check_full_length_console_log():"},{"line_number":717,"context_line":"            output \u003d self.client.get_console_output(server[\u0027id\u0027])["},{"line_number":718,"context_line":"                \u0027output\u0027]"},{"line_number":719,"context_line":"            self.assertTrue(output, \"Console output was empty.\")"},{"line_number":720,"context_line":"            lines \u003d len(output.split(\u0027\\n\u0027))"},{"line_number":721,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"a364101d_6274b359","line":718,"range":{"start_line":718,"start_character":0,"end_line":718,"end_character":25},"updated":"2026-01-07 02:43:40.000000000","message":"unrelated change, i generally avoid any other unrelated change from what this commit is scoped to unless that is explicitly mentioned in commit msg.","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"c0387c643983a4b3199e80772fc72fb52cad1a71","unresolved":false,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        def _check_full_length_console_log():"},{"line_number":717,"context_line":"            output \u003d self.client.get_console_output(server[\u0027id\u0027])["},{"line_number":718,"context_line":"                \u0027output\u0027]"},{"line_number":719,"context_line":"            self.assertTrue(output, \"Console output was empty.\")"},{"line_number":720,"context_line":"            lines \u003d len(output.split(\u0027\\n\u0027))"},{"line_number":721,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"4c31cbc6_55da21e7","line":718,"range":{"start_line":718,"start_character":0,"end_line":718,"end_character":25},"in_reply_to":"68830982_2ed7922c","updated":"2026-01-19 14:58:10.000000000","message":"Done","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"d91ec93a5ccd5071a2987621b680023007250781","unresolved":true,"context_lines":[{"line_number":715,"context_line":""},{"line_number":716,"context_line":"        def _check_full_length_console_log():"},{"line_number":717,"context_line":"            output \u003d self.client.get_console_output(server[\u0027id\u0027])["},{"line_number":718,"context_line":"                \u0027output\u0027]"},{"line_number":719,"context_line":"            self.assertTrue(output, \"Console output was empty.\")"},{"line_number":720,"context_line":"            lines \u003d len(output.split(\u0027\\n\u0027))"},{"line_number":721,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"68830982_2ed7922c","line":718,"range":{"start_line":718,"start_character":0,"end_line":718,"end_character":25},"in_reply_to":"a364101d_6274b359","updated":"2026-01-07 16:33:08.000000000","message":"this is just formatting, nothing changed except putting \u0027output\u0027 on a newline","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":35153,"name":"Ashish Gupta","email":"ashigupt@redhat.com","username":"ashigupt","status":"Redhat"},"change_message_id":"e486c458ceeb3a2802af859aeaa41677b95cc7fe","unresolved":true,"context_lines":[{"line_number":944,"context_line":"        # Verify the server properties after the rebuild completes"},{"line_number":945,"context_line":"        waiters.wait_for_server_status(self.servers_client,"},{"line_number":946,"context_line":"                                       rebuilt_server[\u0027id\u0027], \u0027ACTIVE\u0027)"},{"line_number":947,"context_line":"        server \u003d self.servers_client.show_server("},{"line_number":948,"context_line":"            rebuilt_server[\u0027id\u0027])[\u0027server\u0027]"},{"line_number":949,"context_line":"        volume_id \u003d server[\u0027os-extended-volumes:volumes_attached\u0027][0][\u0027id\u0027]"},{"line_number":950,"context_line":"        volume_after_rebuild \u003d self.volumes_client.show_volume(volume_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"63923461_f687acdd","line":947,"updated":"2026-01-13 20:33:46.000000000","message":"reader_client can be used here as well I suppose ?","commit_id":"87b919832c70419a772d96e6d52605cc66181785"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"0cbdbd163759fdf19bd2ac7361c91491494eee89","unresolved":false,"context_lines":[{"line_number":944,"context_line":"        # Verify the server properties after the rebuild completes"},{"line_number":945,"context_line":"        waiters.wait_for_server_status(self.servers_client,"},{"line_number":946,"context_line":"                                       rebuilt_server[\u0027id\u0027], \u0027ACTIVE\u0027)"},{"line_number":947,"context_line":"        server \u003d self.servers_client.show_server("},{"line_number":948,"context_line":"            rebuilt_server[\u0027id\u0027])[\u0027server\u0027]"},{"line_number":949,"context_line":"        volume_id \u003d server[\u0027os-extended-volumes:volumes_attached\u0027][0][\u0027id\u0027]"},{"line_number":950,"context_line":"        volume_after_rebuild \u003d self.volumes_client.show_volume(volume_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"09ad37fe_945f4325","line":947,"in_reply_to":"63923461_f687acdd","updated":"2026-01-14 14:06:16.000000000","message":"Done","commit_id":"87b919832c70419a772d96e6d52605cc66181785"}],"tempest/api/compute/servers/test_server_group.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"942ef11bfc909383f356a5ecf521a29dcab32d6b","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        super(ServerGroupTestJSON, cls).setup_clients()"},{"line_number":40,"context_line":"        cls.client \u003d cls.server_groups_client"},{"line_number":41,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":42,"context_line":"            cls.reader_client \u003d cls.os_project_reader.server_groups_client"},{"line_number":43,"context_line":"        else:"},{"line_number":44,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e011f78f_3e6dce7d","line":42,"range":{"start_line":42,"start_character":12,"end_line":42,"end_character":29},"updated":"2026-01-07 02:43:40.000000000","message":"ditto, cls.reader_sg_client","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"},{"author":{"_account_id":34373,"name":"Jason Paroly","email":"jparoly@redhat.com","username":"jparoly"},"change_message_id":"d91ec93a5ccd5071a2987621b680023007250781","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super(ServerGroupTestJSON, cls).setup_clients()"},{"line_number":40,"context_line":"        cls.client \u003d cls.server_groups_client"},{"line_number":41,"context_line":"        if CONF.enforce_scope.nova:"},{"line_number":42,"context_line":"            cls.reader_client \u003d cls.os_project_reader.server_groups_client"},{"line_number":43,"context_line":"        else:"},{"line_number":44,"context_line":"            cls.reader_client \u003d cls.client"},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b5ab1fb2_4464769e","line":42,"range":{"start_line":42,"start_character":12,"end_line":42,"end_character":29},"in_reply_to":"e011f78f_3e6dce7d","updated":"2026-01-07 16:33:08.000000000","message":"Done","commit_id":"08017c3f06eaed990fc70fd20a42da3045dcdf46"}]}
