)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"1ddcdb0d80ac83eb0b65bc2935d7c4a4ed36ccf4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e46554b7_0f2ef696","updated":"2025-04-23 06:01:07.000000000","message":"Unrelated to patch CI gates failures","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"c106301170fa8fd14df01be203a4651c46574437","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"39008264_df854ae0","updated":"2025-05-14 18:06:39.000000000","message":"is this gate fix? or anything urgent/blocked by this change?  As per my understanding, it is not so setting RP as +1 instead of +2","commit_id":"d43f2f472678d0c788473adb37acefaaa3dfc3ea"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"1976c41d3755b06e642484f1239bbcbfb6e385a0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"f1d957e6_92a8f03b","updated":"2025-05-20 10:02:14.000000000","message":"Also please mark existing comments as resolved","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6c42a218b47a4e4c7b2f6b5551859dc7551ab265","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"ae4aae8a_f280b48f","updated":"2025-06-12 18:20:17.000000000","message":"it seems test did not executed as expected","commit_id":"74db8ccaae2bf21d78b6b1b9d8e19c18b7a82ff5"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"a4fa2d91185fe15c7655a865894240492efc4c76","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"e5a01d97_43ee7095","updated":"2025-06-26 06:08:07.000000000","message":"recheck","commit_id":"74db8ccaae2bf21d78b6b1b9d8e19c18b7a82ff5"}],"releasenotes/notes/add-parallel_upload_count-config-bafb25b86222dbdd.yaml":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"3effa837ae534e9a58553b640e3125570bb4f799","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adding new config option in `image` section for parallel"},{"line_number":5,"context_line":"    image upload tests"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"a3fef594_f0de19c3","line":5,"range":{"start_line":4,"start_character":4,"end_line":5,"end_character":22},"updated":"2025-05-20 10:01:56.000000000","message":"need to mention name of the config option here as well","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"33be0619eb9e665f3b9e09a694b5c58f43a03455","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adding new config option in `image` section for parallel"},{"line_number":5,"context_line":"    image upload tests"}],"source_content_type":"text/x-yaml","patch_set":18,"id":"04e9e1a1_e18cf8ff","line":5,"range":{"start_line":4,"start_character":4,"end_line":5,"end_character":22},"in_reply_to":"a3fef594_f0de19c3","updated":"2025-05-20 13:46:53.000000000","message":"Done","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"fdef4c4df06d718c75c992d4180dbfc6376ff7d0","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adding new config option `parallel_upload_count` in `image` section "},{"line_number":5,"context_line":"    for parallel image upload tests"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"ee133399_ff555ba1","line":4,"range":{"start_line":4,"start_character":71,"end_line":4,"end_character":72},"updated":"2025-05-20 17:01:25.000000000","message":"please remove this trailing space","commit_id":"20159f5e6b6dacac8ad05e8ed43eda76e9ac3a0d"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"16dfbf143921a58de494d4a6d7a7f704afd1206b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adding new config option `parallel_upload_count` in `image` section "},{"line_number":5,"context_line":"    for parallel image upload tests"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"0711ecc3_fc13584f","line":4,"range":{"start_line":4,"start_character":71,"end_line":4,"end_character":72},"in_reply_to":"ee133399_ff555ba1","updated":"2025-05-20 18:13:01.000000000","message":"Done","commit_id":"20159f5e6b6dacac8ad05e8ed43eda76e9ac3a0d"}],"tempest/api/image/base.py":[{"author":{"_account_id":19262,"name":"Liron Kuchlani","email":"lkuchlan@redhat.com","username":"lkuchlan"},"change_message_id":"2f6c82ca6dbb7112dc876722da60a4d31577fb46","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"f95158e3_8055c6a6","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"updated":"2025-04-23 07:31:12.000000000","message":"There is already a class with admin credentials, BaseV2ImageAdminTest\nplease move.\nBy the way, you don\u0027t use admin client in this class.","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"17e95efd_b1ebbb60","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"0252946a_97ec9cf7","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"c781ca94bea04407ad6a0bef3b533e5b269f4006","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7b903e7f_d1a6c5f9","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"27e40d8f_8aca79e2","updated":"2025-04-29 11:56:16.000000000","message":"Will move credentials to test class.\nFor parallel tests i don\u0027t see any difference if we test with users in same project or in different one","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":19262,"name":"Liron Kuchlani","email":"lkuchlan@redhat.com","username":"lkuchlan"},"change_message_id":"3e1e01bc880c258be702d5ce178965794615e68c","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"a0e67f65_08ce5d81","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"7b903e7f_d1a6c5f9","updated":"2025-04-29 12:14:47.000000000","message":"great, so please initialize the credentials within the test class like this::\ncredentials \u003d [\u0027primary\u0027, \u0027alt\u0027]","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":19262,"name":"Liron Kuchlani","email":"lkuchlan@redhat.com","username":"lkuchlan"},"change_message_id":"1d92484faec5f3411f733dc98ba3c62333be9f40","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"27e40d8f_8aca79e2","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"84632e8c_f2a95a98","updated":"2025-04-29 10:40:04.000000000","message":"why initialize it in the base class? it\u0027s better to initialize it within the test class itself. Also, consider using an alternate user instead of creating a new one, unless there\u0027s a specific reason, the user should belong to the same project","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0dc9226db6f39574021ca80809973663bf906b41","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"0252946a_97ec9cf7","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"87ef628e_8859ff4e","updated":"2025-05-14 22:28:08.000000000","message":"this is base test class for non admin users. if anything we need to access via admin users then test class needs to be inherrited by the BaseV2ImageAdminTest","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"5ec673b8e05c97e3e917a264006e971c9a805072","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"a1943c90_38675f8c","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"a0e67f65_08ce5d81","updated":"2025-04-29 13:36:48.000000000","message":"`admin` credentials we need to create multiple clients.\nhttps://review.opendev.org/c/openstack/tempest/+/945320/11/tempest/api/image/v2/test_images.py#1038","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":19262,"name":"Liron Kuchlani","email":"lkuchlan@redhat.com","username":"lkuchlan"},"change_message_id":"1e27cf362213c62cff8ada0e195ed8b98eb01668","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"e20d0cb2_d11f37b1","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"a1943c90_38675f8c","updated":"2025-04-29 19:38:55.000000000","message":"you don\u0027t need this method, alt and primary users are already available.\nyou just need to initialize them. In fact, you can inherit from BaseV2MemberImageTest (see https://github.com/openstack/tempest/blob/master/tempest/api/image/base.py#L214), which already handles their initialization and sets up the necessary client references in the setup_clients method.","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"1b7b1245ff19307a72fcc7d2ad54e34fcbdd5bf3","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"87ef628e_8859ff4e","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"e20d0cb2_d11f37b1","updated":"2025-04-30 08:43:52.000000000","message":"I can\u0027t understand logic here.\nCan you please paste code with change and run parallel test with change you are suggesting?","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ca0526aeae8996e80bc9cae9100a09657e8fa25a","unresolved":true,"context_lines":[{"line_number":79,"context_line":""},{"line_number":80,"context_line":"class BaseV2ImageTest(BaseImageTest):"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    @classmethod"},{"line_number":85,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":10,"id":"84632e8c_f2a95a98","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":38},"in_reply_to":"f95158e3_8055c6a6","updated":"2025-04-29 09:27:08.000000000","message":"`BaseV2ImageAdminTest` for glance admin tests.\n`admin` credentials we use to create additional user clients.","commit_id":"d8e9a900458d357c6816558451a8c3f4331c3996"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"43decce007b1fc39ee7c83d438b6f342279e35dc","unresolved":true,"context_lines":[{"line_number":59,"context_line":"                name\u003dcls.__name__ + \"-image\")"},{"line_number":60,"context_line":"            kwargs[\u0027name\u0027] \u003d name"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        if \u0027disk_format\u0027 in kwargs:"},{"line_number":63,"context_line":"            if kwargs[\u0027disk_format\u0027] not in CONF.image.disk_formats:"},{"line_number":64,"context_line":"                # If the test asked for some disk format that is not available,"},{"line_number":65,"context_line":"                # consider that a programming error. Tests with specific"},{"line_number":66,"context_line":"                # requirements should be checking to see if it is available and"},{"line_number":67,"context_line":"                # skipping themselves instead of this helper doing it."},{"line_number":68,"context_line":"                raise RuntimeError(\u0027Test requires unavailable disk_format %s, \u0027"},{"line_number":69,"context_line":"                                   \u0027but did not skip\u0027 % kwargs[\u0027disk_format\u0027])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        image \u003d cls.client.create_image(**kwargs)"},{"line_number":72,"context_line":"        cls.created_images.append(image[\u0027id\u0027])"},{"line_number":73,"context_line":"        cls.addClassResourceCleanup(cls.client.wait_for_resource_deletion,"}],"source_content_type":"text/x-python","patch_set":12,"id":"8b71bdc1_14725552","line":70,"range":{"start_line":62,"start_character":8,"end_line":70,"end_character":1},"updated":"2025-05-15 17:25:25.000000000","message":"Any particular reason for this check here?","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"35ef3368316c73d114975672018f38c75c7826dc","unresolved":true,"context_lines":[{"line_number":59,"context_line":"                name\u003dcls.__name__ + \"-image\")"},{"line_number":60,"context_line":"            kwargs[\u0027name\u0027] \u003d name"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        if \u0027disk_format\u0027 in kwargs:"},{"line_number":63,"context_line":"            if kwargs[\u0027disk_format\u0027] not in CONF.image.disk_formats:"},{"line_number":64,"context_line":"                # If the test asked for some disk format that is not available,"},{"line_number":65,"context_line":"                # consider that a programming error. Tests with specific"},{"line_number":66,"context_line":"                # requirements should be checking to see if it is available and"},{"line_number":67,"context_line":"                # skipping themselves instead of this helper doing it."},{"line_number":68,"context_line":"                raise RuntimeError(\u0027Test requires unavailable disk_format %s, \u0027"},{"line_number":69,"context_line":"                                   \u0027but did not skip\u0027 % kwargs[\u0027disk_format\u0027])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        image \u003d cls.client.create_image(**kwargs)"},{"line_number":72,"context_line":"        cls.created_images.append(image[\u0027id\u0027])"},{"line_number":73,"context_line":"        cls.addClassResourceCleanup(cls.client.wait_for_resource_deletion,"}],"source_content_type":"text/x-python","patch_set":12,"id":"96aae8d9_8ac65734","line":70,"range":{"start_line":62,"start_character":8,"end_line":70,"end_character":1},"in_reply_to":"8b71bdc1_14725552","updated":"2025-05-18 14:26:33.000000000","message":"removed","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":59,"context_line":"                name\u003dcls.__name__ + \"-image\")"},{"line_number":60,"context_line":"            kwargs[\u0027name\u0027] \u003d name"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        if \u0027disk_format\u0027 in kwargs:"},{"line_number":63,"context_line":"            if kwargs[\u0027disk_format\u0027] not in CONF.image.disk_formats:"},{"line_number":64,"context_line":"                # If the test asked for some disk format that is not available,"},{"line_number":65,"context_line":"                # consider that a programming error. Tests with specific"},{"line_number":66,"context_line":"                # requirements should be checking to see if it is available and"},{"line_number":67,"context_line":"                # skipping themselves instead of this helper doing it."},{"line_number":68,"context_line":"                raise RuntimeError(\u0027Test requires unavailable disk_format %s, \u0027"},{"line_number":69,"context_line":"                                   \u0027but did not skip\u0027 % kwargs[\u0027disk_format\u0027])"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        image \u003d cls.client.create_image(**kwargs)"},{"line_number":72,"context_line":"        cls.created_images.append(image[\u0027id\u0027])"},{"line_number":73,"context_line":"        cls.addClassResourceCleanup(cls.client.wait_for_resource_deletion,"}],"source_content_type":"text/x-python","patch_set":12,"id":"e8a1a29d_c07501c8","line":70,"range":{"start_line":62,"start_character":8,"end_line":70,"end_character":1},"in_reply_to":"96aae8d9_8ac65734","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"43decce007b1fc39ee7c83d438b6f342279e35dc","unresolved":true,"context_lines":[{"line_number":107,"context_line":"                        namespace_name)"},{"line_number":108,"context_line":"        return namespace"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def create_and_stage_image("},{"line_number":111,"context_line":"            self, all_stores\u003dFalse, image_file\u003dNone, **kwargs):"},{"line_number":112,"context_line":"        \"\"\"Create Image \u0026 stage image file."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"01599570_a2329142","line":110,"updated":"2025-05-15 17:25:25.000000000","message":"I am not sure why you have made changes in this method as you are not using this method in your test at all?","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"35ef3368316c73d114975672018f38c75c7826dc","unresolved":true,"context_lines":[{"line_number":107,"context_line":"                        namespace_name)"},{"line_number":108,"context_line":"        return namespace"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def create_and_stage_image("},{"line_number":111,"context_line":"            self, all_stores\u003dFalse, image_file\u003dNone, **kwargs):"},{"line_number":112,"context_line":"        \"\"\"Create Image \u0026 stage image file."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bb437c08_6c114b12","line":110,"in_reply_to":"01599570_a2329142","updated":"2025-05-18 14:26:33.000000000","message":"used by `MultiStoresImportImagesTest` at line 353 already","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":107,"context_line":"                        namespace_name)"},{"line_number":108,"context_line":"        return namespace"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def create_and_stage_image("},{"line_number":111,"context_line":"            self, all_stores\u003dFalse, image_file\u003dNone, **kwargs):"},{"line_number":112,"context_line":"        \"\"\"Create Image \u0026 stage image file."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"62eaf38e_98e10ee6","line":110,"in_reply_to":"7dda6950_edd711eb","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c4e79aeafed2ea488be70e422336fe00a1924097","unresolved":true,"context_lines":[{"line_number":107,"context_line":"                        namespace_name)"},{"line_number":108,"context_line":"        return namespace"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def create_and_stage_image("},{"line_number":111,"context_line":"            self, all_stores\u003dFalse, image_file\u003dNone, **kwargs):"},{"line_number":112,"context_line":"        \"\"\"Create Image \u0026 stage image file."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"bfcd2356_3aad9776","line":110,"in_reply_to":"bb437c08_6c114b12","updated":"2025-05-19 09:36:47.000000000","message":"Can you please point out from where you are passing image_file to this method?","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"25955e84bd9d272796e4b3c8478e50adce68640c","unresolved":true,"context_lines":[{"line_number":107,"context_line":"                        namespace_name)"},{"line_number":108,"context_line":"        return namespace"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def create_and_stage_image("},{"line_number":111,"context_line":"            self, all_stores\u003dFalse, image_file\u003dNone, **kwargs):"},{"line_number":112,"context_line":"        \"\"\"Create Image \u0026 stage image file."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7dda6950_edd711eb","line":110,"in_reply_to":"bfcd2356_3aad9776","updated":"2025-05-19 10:05:00.000000000","message":"Yes we don\u0027t use this method.\nWill remove changes in this method","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"43decce007b1fc39ee7c83d438b6f342279e35dc","unresolved":true,"context_lines":[{"line_number":131,"context_line":"                                     self.client.delete_image,"},{"line_number":132,"context_line":"                                     image[\u0027id\u0027])"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        if image_file:"},{"line_number":135,"context_line":"            self.client.stage_image_file("},{"line_number":136,"context_line":"                image[\u0027id\u0027],"},{"line_number":137,"context_line":"                io.BytesIO(image_file))"},{"line_number":138,"context_line":"            # Check image status is \u0027uploading\u0027"},{"line_number":139,"context_line":"            body \u003d self.client.show_image(image[\u0027id\u0027])"},{"line_number":140,"context_line":"            self.assertEqual(image[\u0027id\u0027], body[\u0027id\u0027])"},{"line_number":141,"context_line":"            self.assertEqual(\u0027uploading\u0027, body[\u0027status\u0027])"},{"line_number":142,"context_line":"        else:"},{"line_number":143,"context_line":"            self.client.stage_image_file("},{"line_number":144,"context_line":"                image[\u0027id\u0027],"},{"line_number":145,"context_line":"                io.BytesIO(data_utils.random_bytes()))"},{"line_number":146,"context_line":"            # Check image status is \u0027uploading\u0027"},{"line_number":147,"context_line":"            body \u003d self.client.show_image(image[\u0027id\u0027])"},{"line_number":148,"context_line":"            self.assertEqual(image[\u0027id\u0027], body[\u0027id\u0027])"},{"line_number":149,"context_line":"            self.assertEqual(\u0027uploading\u0027, body[\u0027status\u0027])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        if all_stores:"},{"line_number":152,"context_line":"            stores_list \u003d \u0027,\u0027.join([store[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"b3bfa670_cd92f1f0","line":149,"range":{"start_line":134,"start_character":8,"end_line":149,"end_character":57},"updated":"2025-05-15 17:25:25.000000000","message":"You can simplify this code like below;\n\n```\n        if not image_file:\n            image_file \u003d data_utils.random_bytes()\n            \n        self.client.stage_image_file(\n            image[\u0027id\u0027],\n            io.BytesIO(image_file))\n        # Check image status is \u0027uploading\u0027\n        body \u003d self.client.show_image(image[\u0027id\u0027])\n        self.assertEqual(image[\u0027id\u0027], body[\u0027id\u0027])\n        self.assertEqual(\u0027uploading\u0027, body[\u0027status\u0027])\n```","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":131,"context_line":"                                     self.client.delete_image,"},{"line_number":132,"context_line":"                                     image[\u0027id\u0027])"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        if image_file:"},{"line_number":135,"context_line":"            self.client.stage_image_file("},{"line_number":136,"context_line":"                image[\u0027id\u0027],"},{"line_number":137,"context_line":"                io.BytesIO(image_file))"},{"line_number":138,"context_line":"            # Check image status is \u0027uploading\u0027"},{"line_number":139,"context_line":"            body \u003d self.client.show_image(image[\u0027id\u0027])"},{"line_number":140,"context_line":"            self.assertEqual(image[\u0027id\u0027], body[\u0027id\u0027])"},{"line_number":141,"context_line":"            self.assertEqual(\u0027uploading\u0027, body[\u0027status\u0027])"},{"line_number":142,"context_line":"        else:"},{"line_number":143,"context_line":"            self.client.stage_image_file("},{"line_number":144,"context_line":"                image[\u0027id\u0027],"},{"line_number":145,"context_line":"                io.BytesIO(data_utils.random_bytes()))"},{"line_number":146,"context_line":"            # Check image status is \u0027uploading\u0027"},{"line_number":147,"context_line":"            body \u003d self.client.show_image(image[\u0027id\u0027])"},{"line_number":148,"context_line":"            self.assertEqual(image[\u0027id\u0027], body[\u0027id\u0027])"},{"line_number":149,"context_line":"            self.assertEqual(\u0027uploading\u0027, body[\u0027status\u0027])"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        if all_stores:"},{"line_number":152,"context_line":"            stores_list \u003d \u0027,\u0027.join([store[\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"32725960_a4a5dd58","line":149,"range":{"start_line":134,"start_character":8,"end_line":149,"end_character":57},"in_reply_to":"b3bfa670_cd92f1f0","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"43decce007b1fc39ee7c83d438b6f342279e35dc","unresolved":true,"context_lines":[{"line_number":171,"context_line":"            response.raise_for_status()"},{"line_number":172,"context_line":"            return response.content"},{"line_number":173,"context_line":"        except requests.RequestException as e:"},{"line_number":174,"context_line":"            raise RuntimeError(\"Failed to download cirros file\") from e"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @classmethod"},{"line_number":177,"context_line":"    def get_available_stores(cls):"}],"source_content_type":"text/x-python","patch_set":12,"id":"fc823058_e87c5437","line":174,"range":{"start_line":174,"start_character":70,"end_line":174,"end_character":71},"updated":"2025-05-15 17:25:25.000000000","message":"this should be url?","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            response.raise_for_status()"},{"line_number":172,"context_line":"            return response.content"},{"line_number":173,"context_line":"        except requests.RequestException as e:"},{"line_number":174,"context_line":"            raise RuntimeError(\"Failed to download cirros file\") from e"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    @classmethod"},{"line_number":177,"context_line":"    def get_available_stores(cls):"}],"source_content_type":"text/x-python","patch_set":12,"id":"d8fe1fb8_87e3d3fd","line":174,"range":{"start_line":174,"start_character":70,"end_line":174,"end_character":71},"in_reply_to":"fc823058_e87c5437","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d950f788342564dbc565d0ba88591eb78e8b7cff","unresolved":true,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        :params returns: Binary data"},{"line_number":136,"context_line":"        \"\"\""},{"line_number":137,"context_line":"        url \u003d CONF.image.http_qcow2_image"},{"line_number":138,"context_line":"        try:"},{"line_number":139,"context_line":"            response \u003d requests.get(url)"},{"line_number":140,"context_line":"            response.raise_for_status()"}],"source_content_type":"text/x-python","patch_set":26,"id":"48fc4380_5c6ee7a4","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":41},"updated":"2026-01-06 19:57:22.000000000","message":"do we really need to download rhe qcow2 image file for this tests or can we upload with random bytes like done in most of the tests in tempest/api/image/v2/test_images.py","commit_id":"b3da28b989fb566a93c16a0d3e04387c922eca82"}],"tempest/api/image/v2/admin/test_images.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d950f788342564dbc565d0ba88591eb78e8b7cff","unresolved":true,"context_lines":[{"line_number":240,"context_line":"            first_image_store_deleted)"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"class ParallelImageTest(base.BaseV2ImageTest):"},{"line_number":244,"context_line":"    \"\"\"Test cases verifying parallel execution tasks"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    Tests executes with own image client per thread"}],"source_content_type":"text/x-python","patch_set":26,"id":"b03755cb_fb65d8a8","line":243,"range":{"start_line":243,"start_character":29,"end_line":243,"end_character":44},"updated":"2026-01-06 19:57:22.000000000","message":"you need to drive this from admin class BaseV2ImageAdminTest","commit_id":"b3da28b989fb566a93c16a0d3e04387c922eca82"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d950f788342564dbc565d0ba88591eb78e8b7cff","unresolved":true,"context_lines":[{"line_number":320,"context_line":"        image_file \u003d self._prepare_file()"},{"line_number":321,"context_line":"        threads \u003d []"},{"line_number":322,"context_line":"        for i in range(0, self.num_processes):"},{"line_number":323,"context_line":"            test_image_client \u003d getattr("},{"line_number":324,"context_line":"                getattr(self, f\"os_user{i}\"), \"image_client_v2\")"},{"line_number":325,"context_line":"            image_id \u003d self._create_image(disk_format\u003d\u0027raw\u0027,"},{"line_number":326,"context_line":"                                          container_format\u003d\u0027bare\u0027,"},{"line_number":327,"context_line":"                                          test_client\u003dtest_image_client)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5cfd9bc5_2fc3444e","line":324,"range":{"start_line":323,"start_character":0,"end_line":324,"end_character":64},"updated":"2026-01-06 19:57:22.000000000","message":"I did not get why we need the separate client to test the parallel upload. is there any difference from glance point of view if same user upload multiple image in parallel vs different user?","commit_id":"b3da28b989fb566a93c16a0d3e04387c922eca82"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d950f788342564dbc565d0ba88591eb78e8b7cff","unresolved":true,"context_lines":[{"line_number":322,"context_line":"        for i in range(0, self.num_processes):"},{"line_number":323,"context_line":"            test_image_client \u003d getattr("},{"line_number":324,"context_line":"                getattr(self, f\"os_user{i}\"), \"image_client_v2\")"},{"line_number":325,"context_line":"            image_id \u003d self._create_image(disk_format\u003d\u0027raw\u0027,"},{"line_number":326,"context_line":"                                          container_format\u003d\u0027bare\u0027,"},{"line_number":327,"context_line":"                                          test_client\u003dtest_image_client)"},{"line_number":328,"context_line":"            thread \u003d threading.Thread(target\u003dself._safe_thread,"},{"line_number":329,"context_line":"                                      args\u003d(self._store_image_file,"},{"line_number":330,"context_line":"                                            image_id,"}],"source_content_type":"text/x-python","patch_set":26,"id":"2f82a3b9_e70c3e10","line":327,"range":{"start_line":325,"start_character":23,"end_line":327,"end_character":72},"updated":"2026-01-06 19:57:22.000000000","message":"you can use the base class create_image() method which will do the cleanup also","commit_id":"b3da28b989fb566a93c16a0d3e04387c922eca82"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d950f788342564dbc565d0ba88591eb78e8b7cff","unresolved":true,"context_lines":[{"line_number":330,"context_line":"                                            image_id,"},{"line_number":331,"context_line":"                                            image_file,"},{"line_number":332,"context_line":"                                            test_image_client))"},{"line_number":333,"context_line":"            thread.start()"},{"line_number":334,"context_line":"            threads.append(thread)"},{"line_number":335,"context_line":"        for thread in threads:"},{"line_number":336,"context_line":"            thread.join()"}],"source_content_type":"text/x-python","patch_set":26,"id":"fa60388d_f9850174","line":333,"range":{"start_line":333,"start_character":0,"end_line":333,"end_character":26},"updated":"2026-01-06 19:57:22.000000000","message":"I would start the threads out of this for loop so that we can avoid chance of uploading image before next image upload is tried.","commit_id":"b3da28b989fb566a93c16a0d3e04387c922eca82"}],"tempest/api/image/v2/test_images.py":[{"author":{"_account_id":19262,"name":"Liron Kuchlani","email":"lkuchlan@redhat.com","username":"lkuchlan"},"change_message_id":"ae77592cb9289aca90e6f1b306eb13acf36a1dfe","unresolved":true,"context_lines":[{"line_number":1027,"context_line":"        # personas in own domains"},{"line_number":1028,"context_line":"        own_domain_id \u003d cls.os_primary.credentials.domain_id"},{"line_number":1029,"context_line":"        cls.test_clients \u003d []"},{"line_number":1030,"context_line":"        for i in range(0, cls.num_processes):"},{"line_number":1031,"context_line":"            test_client \u003d \"cls.test_client_\" + str(i)"},{"line_number":1032,"context_line":"            test_user \u003d \"cls.test_user_\" + str(i)"},{"line_number":1033,"context_line":"            test_client, test_user \u003d cls.setup_user_client("},{"line_number":1034,"context_line":"                domain_id\u003down_domain_id)"},{"line_number":1035,"context_line":"            cls.test_clients.append(test_client.image_client_v2)"},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"    @classmethod"},{"line_number":1038,"context_line":"    def setup_user_client(cls, domain_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"0d0adf79_4bbedfab","line":1035,"range":{"start_line":1030,"start_character":0,"end_line":1035,"end_character":64},"updated":"2025-04-30 10:04:15.000000000","message":"Sorry if I’m missing something, but I don’t understand why new user clients need to be created when the existing ones can be used.","commit_id":"d43f2f472678d0c788473adb37acefaaa3dfc3ea"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"8be748820004860aa83e664838daafb33d67e946","unresolved":true,"context_lines":[{"line_number":1027,"context_line":"        # personas in own domains"},{"line_number":1028,"context_line":"        own_domain_id \u003d cls.os_primary.credentials.domain_id"},{"line_number":1029,"context_line":"        cls.test_clients \u003d []"},{"line_number":1030,"context_line":"        for i in range(0, cls.num_processes):"},{"line_number":1031,"context_line":"            test_client \u003d \"cls.test_client_\" + str(i)"},{"line_number":1032,"context_line":"            test_user \u003d \"cls.test_user_\" + str(i)"},{"line_number":1033,"context_line":"            test_client, test_user \u003d cls.setup_user_client("},{"line_number":1034,"context_line":"                domain_id\u003down_domain_id)"},{"line_number":1035,"context_line":"            cls.test_clients.append(test_client.image_client_v2)"},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"    @classmethod"},{"line_number":1038,"context_line":"    def setup_user_client(cls, domain_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"940d7454_11f5a1f6","line":1035,"range":{"start_line":1030,"start_character":0,"end_line":1035,"end_character":64},"in_reply_to":"0d0adf79_4bbedfab","updated":"2025-05-06 03:39:44.000000000","message":"https://review.opendev.org/c/openstack/tempest/+/945320/11/tempest/api/image/v2/test_images.py#994","commit_id":"d43f2f472678d0c788473adb37acefaaa3dfc3ea"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"0dc9226db6f39574021ca80809973663bf906b41","unresolved":true,"context_lines":[{"line_number":1027,"context_line":"        # personas in own domains"},{"line_number":1028,"context_line":"        own_domain_id \u003d cls.os_primary.credentials.domain_id"},{"line_number":1029,"context_line":"        cls.test_clients \u003d []"},{"line_number":1030,"context_line":"        for i in range(0, cls.num_processes):"},{"line_number":1031,"context_line":"            test_client \u003d \"cls.test_client_\" + str(i)"},{"line_number":1032,"context_line":"            test_user \u003d \"cls.test_user_\" + str(i)"},{"line_number":1033,"context_line":"            test_client, test_user \u003d cls.setup_user_client("},{"line_number":1034,"context_line":"                domain_id\u003down_domain_id)"},{"line_number":1035,"context_line":"            cls.test_clients.append(test_client.image_client_v2)"},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"    @classmethod"},{"line_number":1038,"context_line":"    def setup_user_client(cls, domain_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"e344d07d_e091f5c2","line":1035,"range":{"start_line":1030,"start_character":0,"end_line":1035,"end_character":64},"in_reply_to":"940d7454_11f5a1f6","updated":"2025-05-14 22:28:08.000000000","message":"yeah, test users as per the requested credential types are already taken care by the bast test class via dynamic_cred class, you do not need to create the separate test users in test class. You can request as many as user with different/same role via \u0027credentials\u0027. for example - \n\ncredentials \u003d [\u0027primary\u0027, \u0027admin\u0027, \u0027alt\u0027]\n                               \n                               \ncredentials \u003d [\u0027primary\u0027, \u0027admin\u0027, [\u0027user2\u0027, \u0027member\u0027], [\u0027user3\u0027, \u0027admin\u0027]]\n\n- https://github.com/openstack/tempest/blob/b72f28e6fc622f813e43a883ed57919dc748d8e9/tempest/lib/common/dynamic_creds.py","commit_id":"d43f2f472678d0c788473adb37acefaaa3dfc3ea"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":1027,"context_line":"        # personas in own domains"},{"line_number":1028,"context_line":"        own_domain_id \u003d cls.os_primary.credentials.domain_id"},{"line_number":1029,"context_line":"        cls.test_clients \u003d []"},{"line_number":1030,"context_line":"        for i in range(0, cls.num_processes):"},{"line_number":1031,"context_line":"            test_client \u003d \"cls.test_client_\" + str(i)"},{"line_number":1032,"context_line":"            test_user \u003d \"cls.test_user_\" + str(i)"},{"line_number":1033,"context_line":"            test_client, test_user \u003d cls.setup_user_client("},{"line_number":1034,"context_line":"                domain_id\u003down_domain_id)"},{"line_number":1035,"context_line":"            cls.test_clients.append(test_client.image_client_v2)"},{"line_number":1036,"context_line":""},{"line_number":1037,"context_line":"    @classmethod"},{"line_number":1038,"context_line":"    def setup_user_client(cls, domain_id\u003dNone):"}],"source_content_type":"text/x-python","patch_set":11,"id":"bbaea224_e1df0939","line":1035,"range":{"start_line":1030,"start_character":0,"end_line":1035,"end_character":64},"in_reply_to":"e344d07d_e091f5c2","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"d43f2f472678d0c788473adb37acefaaa3dfc3ea"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"43decce007b1fc39ee7c83d438b6f342279e35dc","unresolved":true,"context_lines":[{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":"from testtools.matchers import Equals"},{"line_number":23,"context_line":"from testtools.matchers import IsInstance"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from tempest.api.image import base"},{"line_number":26,"context_line":"from tempest import clients"}],"source_content_type":"text/x-python","patch_set":12,"id":"180d15fb_fda0899f","line":23,"range":{"start_line":22,"start_character":0,"end_line":23,"end_character":41},"updated":"2025-05-15 17:25:25.000000000","message":"I think as per pep8 standards we should not import classes or attributes directly\n\nif should be\nimport testtools.matchers\n\nand used like\n\ntesttools.matchers.Equals","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import threading"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from oslo_log import log as logging"},{"line_number":22,"context_line":"from testtools.matchers import Equals"},{"line_number":23,"context_line":"from testtools.matchers import IsInstance"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"from tempest.api.image import base"},{"line_number":26,"context_line":"from tempest import clients"}],"source_content_type":"text/x-python","patch_set":12,"id":"58f88206_d376d826","line":23,"range":{"start_line":22,"start_character":0,"end_line":23,"end_character":41},"in_reply_to":"180d15fb_fda0899f","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"43decce007b1fc39ee7c83d438b6f342279e35dc","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"    lock \u003d threading.Lock()"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    @classmethod"},{"line_number":1004,"context_line":"    def skip_checks(cls):"},{"line_number":1005,"context_line":"        super(ParallelImageTest, cls).skip_checks()"},{"line_number":1006,"context_line":"        if not CONF.image.image_parallel_upload:"},{"line_number":1007,"context_line":"            skip_msg \u003d ("},{"line_number":1008,"context_line":"                \"%s skipped as image parallel upload is not available\" %"},{"line_number":1009,"context_line":"                cls.__name__)"},{"line_number":1010,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    def _create_image(self, disk_format, container_format, test_client):"},{"line_number":1013,"context_line":"        \"\"\"Create and check images"}],"source_content_type":"text/x-python","patch_set":12,"id":"960d163f_bcd9327b","line":1010,"range":{"start_line":1004,"start_character":0,"end_line":1010,"end_character":45},"updated":"2025-05-15 17:25:25.000000000","message":"I think this should be moved before line 997, right, else that line will result in failure.","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"30c21522ffd6393012fe7173855d4b5c308c8c54","unresolved":false,"context_lines":[{"line_number":1001,"context_line":"    lock \u003d threading.Lock()"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    @classmethod"},{"line_number":1004,"context_line":"    def skip_checks(cls):"},{"line_number":1005,"context_line":"        super(ParallelImageTest, cls).skip_checks()"},{"line_number":1006,"context_line":"        if not CONF.image.image_parallel_upload:"},{"line_number":1007,"context_line":"            skip_msg \u003d ("},{"line_number":1008,"context_line":"                \"%s skipped as image parallel upload is not available\" %"},{"line_number":1009,"context_line":"                cls.__name__)"},{"line_number":1010,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1011,"context_line":""},{"line_number":1012,"context_line":"    def _create_image(self, disk_format, container_format, test_client):"},{"line_number":1013,"context_line":"        \"\"\"Create and check images"}],"source_content_type":"text/x-python","patch_set":12,"id":"5ccf7a7b_6f3643e9","line":1010,"range":{"start_line":1004,"start_character":0,"end_line":1010,"end_character":45},"in_reply_to":"960d163f_bcd9327b","updated":"2025-05-19 14:03:16.000000000","message":"Done","commit_id":"8db3d177d2a3819d5dac01f7c0e93ce4ee0f729f"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"30c21522ffd6393012fe7173855d4b5c308c8c54","unresolved":true,"context_lines":[{"line_number":1000,"context_line":"                cls.__name__)"},{"line_number":1001,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    num_processes \u003d CONF.image.image_parallel_upload"},{"line_number":1004,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027] + ["},{"line_number":1005,"context_line":"        [f\u0027user{i}\u0027, \u0027member\u0027] for i in range(0, num_processes)]"},{"line_number":1006,"context_line":"    thread_result \u003d []"}],"source_content_type":"text/x-python","patch_set":17,"id":"70a28cfe_fda0f604","line":1003,"range":{"start_line":1003,"start_character":31,"end_line":1003,"end_character":52},"updated":"2025-05-19 14:03:16.000000000","message":"I think better rename it to parallel_upload_count","commit_id":"aee37e5b9185b666e474207336fd8dadb336e24a"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":1000,"context_line":"                cls.__name__)"},{"line_number":1001,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    num_processes \u003d CONF.image.image_parallel_upload"},{"line_number":1004,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027] + ["},{"line_number":1005,"context_line":"        [f\u0027user{i}\u0027, \u0027member\u0027] for i in range(0, num_processes)]"},{"line_number":1006,"context_line":"    thread_result \u003d []"}],"source_content_type":"text/x-python","patch_set":17,"id":"aaccc0d6_8e220663","line":1003,"range":{"start_line":1003,"start_character":31,"end_line":1003,"end_character":52},"in_reply_to":"70a28cfe_fda0f604","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"aee37e5b9185b666e474207336fd8dadb336e24a"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"30c21522ffd6393012fe7173855d4b5c308c8c54","unresolved":true,"context_lines":[{"line_number":1021,"context_line":"        self.assertEqual(\u0027queued\u0027, image[\u0027status\u0027])"},{"line_number":1022,"context_line":"        return image[\u0027id\u0027]"},{"line_number":1023,"context_line":""},{"line_number":1024,"context_line":"    def _prepare_files(self, num_files):"},{"line_number":1025,"context_line":"        \"\"\"Prepare binary image data"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"          Create binary image data for each image upload thread"},{"line_number":1028,"context_line":"          :param num_files: Equal to number of parallel processes"},{"line_number":1029,"context_line":"          :param return: list[io.BytesIO]"},{"line_number":1030,"context_line":"        \"\"\""},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"        cirros_files \u003d []"},{"line_number":1033,"context_line":"        for i in range(0, num_files):"},{"line_number":1034,"context_line":"            file_content \u003d self.download_cirros_image_file()"},{"line_number":1035,"context_line":"            self.assertThat(file_content, testtools.matchers.IsInstance(bytes))"},{"line_number":1036,"context_line":"            image_file \u003d io.BytesIO(file_content)"},{"line_number":1037,"context_line":"            cirros_files.append(image_file)"},{"line_number":1038,"context_line":"        return cirros_files"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def _store_image_file(self, image_id, image_file, test_client):"},{"line_number":1041,"context_line":"        \"\"\"Upload binary data to image and check image"}],"source_content_type":"text/x-python","patch_set":17,"id":"883440c5_f78cff8b","line":1038,"range":{"start_line":1024,"start_character":4,"end_line":1038,"end_character":27},"updated":"2025-05-19 14:03:16.000000000","message":"I am not sure why we need multiple cirros images, you can pass same cirros image file to all the requests and it will not cause any issue.\n\nAlso you need to delete the downloaded file during cleanup.","commit_id":"aee37e5b9185b666e474207336fd8dadb336e24a"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":1021,"context_line":"        self.assertEqual(\u0027queued\u0027, image[\u0027status\u0027])"},{"line_number":1022,"context_line":"        return image[\u0027id\u0027]"},{"line_number":1023,"context_line":""},{"line_number":1024,"context_line":"    def _prepare_files(self, num_files):"},{"line_number":1025,"context_line":"        \"\"\"Prepare binary image data"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"          Create binary image data for each image upload thread"},{"line_number":1028,"context_line":"          :param num_files: Equal to number of parallel processes"},{"line_number":1029,"context_line":"          :param return: list[io.BytesIO]"},{"line_number":1030,"context_line":"        \"\"\""},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"        cirros_files \u003d []"},{"line_number":1033,"context_line":"        for i in range(0, num_files):"},{"line_number":1034,"context_line":"            file_content \u003d self.download_cirros_image_file()"},{"line_number":1035,"context_line":"            self.assertThat(file_content, testtools.matchers.IsInstance(bytes))"},{"line_number":1036,"context_line":"            image_file \u003d io.BytesIO(file_content)"},{"line_number":1037,"context_line":"            cirros_files.append(image_file)"},{"line_number":1038,"context_line":"        return cirros_files"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def _store_image_file(self, image_id, image_file, test_client):"},{"line_number":1041,"context_line":"        \"\"\"Upload binary data to image and check image"}],"source_content_type":"text/x-python","patch_set":17,"id":"11f25177_c0b46052","line":1038,"range":{"start_line":1024,"start_character":4,"end_line":1038,"end_character":27},"in_reply_to":"5b7bb5f2_f0a4f6ae","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"aee37e5b9185b666e474207336fd8dadb336e24a"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"0a6b70629785e58dbb425f71a8db40d3d1a58ff0","unresolved":true,"context_lines":[{"line_number":1021,"context_line":"        self.assertEqual(\u0027queued\u0027, image[\u0027status\u0027])"},{"line_number":1022,"context_line":"        return image[\u0027id\u0027]"},{"line_number":1023,"context_line":""},{"line_number":1024,"context_line":"    def _prepare_files(self, num_files):"},{"line_number":1025,"context_line":"        \"\"\"Prepare binary image data"},{"line_number":1026,"context_line":""},{"line_number":1027,"context_line":"          Create binary image data for each image upload thread"},{"line_number":1028,"context_line":"          :param num_files: Equal to number of parallel processes"},{"line_number":1029,"context_line":"          :param return: list[io.BytesIO]"},{"line_number":1030,"context_line":"        \"\"\""},{"line_number":1031,"context_line":""},{"line_number":1032,"context_line":"        cirros_files \u003d []"},{"line_number":1033,"context_line":"        for i in range(0, num_files):"},{"line_number":1034,"context_line":"            file_content \u003d self.download_cirros_image_file()"},{"line_number":1035,"context_line":"            self.assertThat(file_content, testtools.matchers.IsInstance(bytes))"},{"line_number":1036,"context_line":"            image_file \u003d io.BytesIO(file_content)"},{"line_number":1037,"context_line":"            cirros_files.append(image_file)"},{"line_number":1038,"context_line":"        return cirros_files"},{"line_number":1039,"context_line":""},{"line_number":1040,"context_line":"    def _store_image_file(self, image_id, image_file, test_client):"},{"line_number":1041,"context_line":"        \"\"\"Upload binary data to image and check image"}],"source_content_type":"text/x-python","patch_set":17,"id":"5b7bb5f2_f0a4f6ae","line":1038,"range":{"start_line":1024,"start_character":4,"end_line":1038,"end_character":27},"in_reply_to":"883440c5_f78cff8b","updated":"2025-05-20 06:13:53.000000000","message":"Right, I will pass same cirros image file.\n\nI think we don\u0027t save files.","commit_id":"aee37e5b9185b666e474207336fd8dadb336e24a"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"30c21522ffd6393012fe7173855d4b5c308c8c54","unresolved":true,"context_lines":[{"line_number":1050,"context_line":"        waiters.wait_for_image_status(test_client, image_id, \u0027active\u0027)"},{"line_number":1051,"context_line":"        image \u003d test_client.show_image(image_id)"},{"line_number":1052,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"},{"line_number":1053,"context_line":"        self.assertIsNot(0, image[\u0027size\u0027])"},{"line_number":1054,"context_line":"        self.assertIsNotNone(image[\u0027size\u0027])"},{"line_number":1055,"context_line":""},{"line_number":1056,"context_line":"    def _safe_thread(self, func, *args):"},{"line_number":1057,"context_line":"        \"\"\"\"Catch exceptions during parallel tasks\"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"9b2ed8f3_2eda82e0","line":1054,"range":{"start_line":1053,"start_character":0,"end_line":1054,"end_character":43},"updated":"2025-05-19 14:03:16.000000000","message":"You can assert either of them, I guess assertIsNotNone is better to have.","commit_id":"aee37e5b9185b666e474207336fd8dadb336e24a"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":false,"context_lines":[{"line_number":1050,"context_line":"        waiters.wait_for_image_status(test_client, image_id, \u0027active\u0027)"},{"line_number":1051,"context_line":"        image \u003d test_client.show_image(image_id)"},{"line_number":1052,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"},{"line_number":1053,"context_line":"        self.assertIsNot(0, image[\u0027size\u0027])"},{"line_number":1054,"context_line":"        self.assertIsNotNone(image[\u0027size\u0027])"},{"line_number":1055,"context_line":""},{"line_number":1056,"context_line":"    def _safe_thread(self, func, *args):"},{"line_number":1057,"context_line":"        \"\"\"\"Catch exceptions during parallel tasks\"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"dcd8f693_0b259d95","line":1054,"range":{"start_line":1053,"start_character":0,"end_line":1054,"end_character":43},"in_reply_to":"9b2ed8f3_2eda82e0","updated":"2025-05-20 13:11:58.000000000","message":"Done","commit_id":"aee37e5b9185b666e474207336fd8dadb336e24a"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"3effa837ae534e9a58553b640e3125570bb4f799","unresolved":true,"context_lines":[{"line_number":1005,"context_line":"        [f\u0027user{i}\u0027, \u0027member\u0027] for i in range(0, num_processes)]"},{"line_number":1006,"context_line":"    thread_result \u003d []"},{"line_number":1007,"context_line":"    lock \u003d threading.Lock()"},{"line_number":1008,"context_line":"    images_ids \u003d []"},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":"    def tearDown(self):"},{"line_number":1011,"context_line":"        for img_id in self.images_ids:"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f524303_148ab691","line":1008,"range":{"start_line":1008,"start_character":4,"end_line":1008,"end_character":19},"updated":"2025-05-20 10:01:56.000000000","message":"As you are adding image to cleanup at line 1052 don\u0027t need this and tearDown as well","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"33be0619eb9e665f3b9e09a694b5c58f43a03455","unresolved":false,"context_lines":[{"line_number":1005,"context_line":"        [f\u0027user{i}\u0027, \u0027member\u0027] for i in range(0, num_processes)]"},{"line_number":1006,"context_line":"    thread_result \u003d []"},{"line_number":1007,"context_line":"    lock \u003d threading.Lock()"},{"line_number":1008,"context_line":"    images_ids \u003d []"},{"line_number":1009,"context_line":""},{"line_number":1010,"context_line":"    def tearDown(self):"},{"line_number":1011,"context_line":"        for img_id in self.images_ids:"}],"source_content_type":"text/x-python","patch_set":18,"id":"5fe3af6e_6c67d605","line":1008,"range":{"start_line":1008,"start_character":4,"end_line":1008,"end_character":19},"in_reply_to":"5f524303_148ab691","updated":"2025-05-20 13:46:53.000000000","message":"Done","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"3effa837ae534e9a58553b640e3125570bb4f799","unresolved":true,"context_lines":[{"line_number":1049,"context_line":"        \"\"\""},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        test_client.store_image_file(image_id, image_file)"},{"line_number":1052,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":1053,"context_line":"                        self.client.delete_image,"},{"line_number":1054,"context_line":"                        image_id)"},{"line_number":1055,"context_line":"        waiters.wait_for_image_status(test_client, image_id, \u0027active\u0027)"},{"line_number":1056,"context_line":"        image \u003d test_client.show_image(image_id)"},{"line_number":1057,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"94d49217_8697aff8","line":1054,"range":{"start_line":1052,"start_character":0,"end_line":1054,"end_character":33},"updated":"2025-05-20 10:01:56.000000000","message":"I don\u0027t think after this you need to delete the image in tearDown explicitly","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"ecbfbf7e7db04f965dbfb99e3484ac6950ebfaf1","unresolved":true,"context_lines":[{"line_number":1049,"context_line":"        \"\"\""},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        test_client.store_image_file(image_id, image_file)"},{"line_number":1052,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":1053,"context_line":"                        self.client.delete_image,"},{"line_number":1054,"context_line":"                        image_id)"},{"line_number":1055,"context_line":"        waiters.wait_for_image_status(test_client, image_id, \u0027active\u0027)"},{"line_number":1056,"context_line":"        image \u003d test_client.show_image(image_id)"},{"line_number":1057,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"96518766_67172ed0","line":1054,"range":{"start_line":1052,"start_character":0,"end_line":1054,"end_character":33},"in_reply_to":"94d49217_8697aff8","updated":"2025-05-20 13:11:58.000000000","message":"If I intently fail code the images not deleted.Don\u0027t know why images not deleted.\nWith tearDown images deleted","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"3353237577f0d5fa296b7932dd2255f92876082c","unresolved":true,"context_lines":[{"line_number":1049,"context_line":"        \"\"\""},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        test_client.store_image_file(image_id, image_file)"},{"line_number":1052,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":1053,"context_line":"                        self.client.delete_image,"},{"line_number":1054,"context_line":"                        image_id)"},{"line_number":1055,"context_line":"        waiters.wait_for_image_status(test_client, image_id, \u0027active\u0027)"},{"line_number":1056,"context_line":"        image \u003d test_client.show_image(image_id)"},{"line_number":1057,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"ba4f02ec_b58254ed","line":1054,"range":{"start_line":1052,"start_character":0,"end_line":1054,"end_character":33},"in_reply_to":"96518766_67172ed0","updated":"2025-05-20 13:40:34.000000000","message":"Ok.Looks like need to admin client to delete images.","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"33be0619eb9e665f3b9e09a694b5c58f43a03455","unresolved":false,"context_lines":[{"line_number":1049,"context_line":"        \"\"\""},{"line_number":1050,"context_line":""},{"line_number":1051,"context_line":"        test_client.store_image_file(image_id, image_file)"},{"line_number":1052,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":1053,"context_line":"                        self.client.delete_image,"},{"line_number":1054,"context_line":"                        image_id)"},{"line_number":1055,"context_line":"        waiters.wait_for_image_status(test_client, image_id, \u0027active\u0027)"},{"line_number":1056,"context_line":"        image \u003d test_client.show_image(image_id)"},{"line_number":1057,"context_line":"        self.assertEqual(\u0027active\u0027, image[\u0027status\u0027])"}],"source_content_type":"text/x-python","patch_set":18,"id":"adc84964_cc4eff2c","line":1054,"range":{"start_line":1052,"start_character":0,"end_line":1054,"end_character":33},"in_reply_to":"ba4f02ec_b58254ed","updated":"2025-05-20 13:46:53.000000000","message":"Done","commit_id":"7ef5665555778e43dd2c61ea2c30a0c2442025d3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6c42a218b47a4e4c7b2f6b5551859dc7551ab265","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    num_processes \u003d CONF.image.parallel_upload_count"},{"line_number":1004,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027] + ["},{"line_number":1005,"context_line":"        [f\u0027user{i}\u0027, \u0027member\u0027] for i in range(0, num_processes)]"},{"line_number":1006,"context_line":"    thread_result \u003d []"},{"line_number":1007,"context_line":"    lock \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":20,"id":"bf8bceac_4cdd9aa7","line":1004,"range":{"start_line":1004,"start_character":20,"end_line":1004,"end_character":25},"updated":"2025-06-12 18:20:17.000000000","message":"If test needs admin user then you need to add test in tempest/api/image/v2/admin/test_images.py\n\nhttps://github.com/openstack/tempest/blob/master/tempest/api/image/v2/admin/test_images.py","commit_id":"74db8ccaae2bf21d78b6b1b9d8e19c18b7a82ff5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"535d7f3cd2c2045bb260c0bcc837bf6cdb6ee85b","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    num_processes \u003d CONF.image.parallel_upload_count"},{"line_number":1004,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027] + ["},{"line_number":1005,"context_line":"        [f\u0027user{i}\u0027, \u0027member\u0027] for i in range(0, num_processes)]"},{"line_number":1006,"context_line":"    thread_result \u003d []"},{"line_number":1007,"context_line":"    lock \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":20,"id":"3a1c78bb_27b5a1ad","line":1004,"range":{"start_line":1004,"start_character":20,"end_line":1004,"end_character":25},"in_reply_to":"29727b62_cc972620","updated":"2025-09-03 22:33:21.000000000","message":"you can create a new class ParallelImageTest in tempest/api/image/v2/admin/test_images.py and set up all the resources in resource_setup","commit_id":"74db8ccaae2bf21d78b6b1b9d8e19c18b7a82ff5"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"e75bfba9aabf4369182edf0b543197b7aad4aed0","unresolved":true,"context_lines":[{"line_number":1001,"context_line":"            raise cls.skipException(skip_msg)"},{"line_number":1002,"context_line":""},{"line_number":1003,"context_line":"    num_processes \u003d CONF.image.parallel_upload_count"},{"line_number":1004,"context_line":"    credentials \u003d [\u0027admin\u0027, \u0027primary\u0027] + ["},{"line_number":1005,"context_line":"        [f\u0027user{i}\u0027, \u0027member\u0027] for i in range(0, num_processes)]"},{"line_number":1006,"context_line":"    thread_result \u003d []"},{"line_number":1007,"context_line":"    lock \u003d threading.Lock()"}],"source_content_type":"text/x-python","patch_set":20,"id":"29727b62_cc972620","line":1004,"range":{"start_line":1004,"start_character":20,"end_line":1004,"end_character":25},"in_reply_to":"bf8bceac_4cdd9aa7","updated":"2025-06-29 06:52:03.000000000","message":"Should I move resource cleanup with admin user to `resource_setup`?","commit_id":"74db8ccaae2bf21d78b6b1b9d8e19c18b7a82ff5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"6c42a218b47a4e4c7b2f6b5551859dc7551ab265","unresolved":true,"context_lines":[{"line_number":1068,"context_line":"            image_id \u003d self._create_image(disk_format\u003d\u0027raw\u0027,"},{"line_number":1069,"context_line":"                                          container_format\u003d\u0027bare\u0027,"},{"line_number":1070,"context_line":"                                          test_client\u003dtest_image_client)"},{"line_number":1071,"context_line":"            thread \u003d threading.Thread(target\u003dself._safe_thread,"},{"line_number":1072,"context_line":"                                      args\u003d(self._store_image_file,"},{"line_number":1073,"context_line":"                                            image_id,"},{"line_number":1074,"context_line":"                                            image_file,"},{"line_number":1075,"context_line":"                                            test_image_client))"},{"line_number":1076,"context_line":"            thread.start()"},{"line_number":1077,"context_line":"            threads.append(thread)"},{"line_number":1078,"context_line":"        for thread in threads:"},{"line_number":1079,"context_line":"            thread.join()"}],"source_content_type":"text/x-python","patch_set":20,"id":"5105841d_6518d893","line":1079,"range":{"start_line":1071,"start_character":0,"end_line":1079,"end_character":25},"updated":"2025-06-12 18:20:17.000000000","message":"from log it seems create image and delete image (as part of cleanup) happened\n\nImage create:\n\nhttps://zuul.opendev.org/t/openstack/build/65ef036a12c4462db1a4266e6e213f2e/log/controller/logs/tempest_log.txt#46420\n\nthread call log:\n\nhttps://zuul.opendev.org/t/openstack/build/65ef036a12c4462db1a4266e6e213f2e/log/controller/logs/tempest_log.txt#46425 \n\n----------------\n2025-05-20 19:13:39.746 99010 DEBUG tempest.lib.common.utils.test_utils [-] Sane call name not found in [\u0027_log_request_start\u0027, \u0027raw_request\u0027, \u0027_request\u0027, \u0027request\u0027, \u0027store_image_file\u0027, \u0027_store_image_file\u0027, \u0027_safe_thread\u0027, \u0027run\u0027, \u0027_bootstrap_inner\u0027, \u0027_bootstrap\u0027] find_test_caller /opt/stack/tempest/tempest/lib/common/utils/test_utils.py:77\n\n-----------------\n\nImage delete:\n\n https://zuul.opendev.org/t/openstack/build/65ef036a12c4462db1a4266e6e213f2e/log/controller/logs/tempest_log.txt#46658","commit_id":"74db8ccaae2bf21d78b6b1b9d8e19c18b7a82ff5"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"e75bfba9aabf4369182edf0b543197b7aad4aed0","unresolved":true,"context_lines":[{"line_number":1068,"context_line":"            image_id \u003d self._create_image(disk_format\u003d\u0027raw\u0027,"},{"line_number":1069,"context_line":"                                          container_format\u003d\u0027bare\u0027,"},{"line_number":1070,"context_line":"                                          test_client\u003dtest_image_client)"},{"line_number":1071,"context_line":"            thread \u003d threading.Thread(target\u003dself._safe_thread,"},{"line_number":1072,"context_line":"                                      args\u003d(self._store_image_file,"},{"line_number":1073,"context_line":"                                            image_id,"},{"line_number":1074,"context_line":"                                            image_file,"},{"line_number":1075,"context_line":"                                            test_image_client))"},{"line_number":1076,"context_line":"            thread.start()"},{"line_number":1077,"context_line":"            threads.append(thread)"},{"line_number":1078,"context_line":"        for thread in threads:"},{"line_number":1079,"context_line":"            thread.join()"}],"source_content_type":"text/x-python","patch_set":20,"id":"05f75b1c_4367de1d","line":1079,"range":{"start_line":1071,"start_character":0,"end_line":1079,"end_character":25},"in_reply_to":"5105841d_6518d893","updated":"2025-06-29 06:52:03.000000000","message":"Looks like test utils can\u0027t find test Class/method name in threading internal  _bootstrap method but we see there is 3 processes started and finished.\nI think it\u0027s a minor issue here","commit_id":"74db8ccaae2bf21d78b6b1b9d8e19c18b7a82ff5"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"535d7f3cd2c2045bb260c0bcc837bf6cdb6ee85b","unresolved":true,"context_lines":[{"line_number":983,"context_line":"        self.assertNotIn(\u0027validation_data\u0027, image[\u0027locations\u0027][0])"},{"line_number":984,"context_line":""},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"class HashCalculationRemoteDeletionTest(base.BaseV2ImageTest):"},{"line_number":987,"context_line":"    \"\"\"Test calculation of image hash with new location API when the image is"},{"line_number":988,"context_line":"    deleted from a remote Glance service."},{"line_number":989,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"b5f5f858_7b532023","side":"PARENT","line":986,"range":{"start_line":986,"start_character":0,"end_line":986,"end_character":62},"updated":"2025-09-03 22:33:21.000000000","message":"why you are removing these test class? or is it rebase issue?","commit_id":"290069b157d948b76ab04993d8b6b5ae9e74e212"},{"author":{"_account_id":34510,"name":"Maxim Sava","email":"msava@redhat.com","username":"msava@redhat.com"},"change_message_id":"c9b8e1767356e96c65dbcf057b3869e42c8eeb57","unresolved":true,"context_lines":[{"line_number":983,"context_line":"        self.assertNotIn(\u0027validation_data\u0027, image[\u0027locations\u0027][0])"},{"line_number":984,"context_line":""},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"class HashCalculationRemoteDeletionTest(base.BaseV2ImageTest):"},{"line_number":987,"context_line":"    \"\"\"Test calculation of image hash with new location API when the image is"},{"line_number":988,"context_line":"    deleted from a remote Glance service."},{"line_number":989,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"c904b963_7d01d708","side":"PARENT","line":986,"range":{"start_line":986,"start_character":0,"end_line":986,"end_character":62},"in_reply_to":"b5f5f858_7b532023","updated":"2025-09-04 08:28:46.000000000","message":"Rebase issue","commit_id":"290069b157d948b76ab04993d8b6b5ae9e74e212"}]}
