)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"47e5cc079db4a193841becc2a684c979b2fbd434","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"697e028a_96cee686","updated":"2025-01-21 06:55:00.000000000","message":"Pending\nUnit and functional tests\nGlance client support\nDocumentation and API reference guide","commit_id":"9be74c76e8b6b6d2534882eb28fb64c675616f40"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"37560f73ce68e0a0ec362271f14b2b0840b2cd4c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"ef8994c5_d1eea7a1","updated":"2025-08-28 14:54:59.000000000","message":"Thank you for inputs Dan, I will work accordingly. Added one response for your comment inline.","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"293e48e9aa809387378dc5aedca01a88654d60d8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f1d6e2c0_1e05c9a5","updated":"2025-11-27 16:24:02.000000000","message":"I think we also need release notes, right? And maybe a doc update, unless you want to have it in a separate patch?\n\nOtherwise looks good to me!","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c33c1775edac174f5b8c85b9f3bf54af0bffe982","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5692ba43_0a0e72fe","updated":"2025-11-28 07:24:03.000000000","message":"Thank you Cyril for review, As mentioned in earlier reply I will submit the reno with doc and api reference patch.","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"faf007164cc5af436feaa5b7a8847bd3a72892cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"df48f5f5_6c1a55c6","updated":"2025-11-27 16:37:30.000000000","message":"yeah, I want to add docs and release notes and api reference in separate patch","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"bf82e1924217a5fa9629c542c44449cde1a45d2b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d0fd4697_d1a53517","updated":"2026-05-08 07:02:21.000000000","message":"Thank you dan!!","commit_id":"1fe36f662a1753445d7ccf4dbf54510bb520fe01"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"549c009618b8679e3946e3e89d34015369746a84","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"637eb64d_aae47bfd","updated":"2025-11-28 15:24:29.000000000","message":"Thanks, my concerns have been addressed.","commit_id":"1fe36f662a1753445d7ccf4dbf54510bb520fe01"},{"author":{"_account_id":37598,"name":"Ivan Anfimov","display_name":"Ivan Anfimov","email":"lazekteam@gmail.com","username":"anfimovir"},"change_message_id":"5d01794fc8d8ce96416a30345437aa3f2808f465","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8b0be08d_75a25612","updated":"2026-05-11 21:41:42.000000000","message":"recheck","commit_id":"783f9f937eaaadad8428171895639f884a712fd2"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"adbd4603711c2a67363bd41c98f777d183b7238a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a376cc0b_0eab9d4a","updated":"2026-05-12 06:44:16.000000000","message":"recheck, flaky format inspection test failure","commit_id":"783f9f937eaaadad8428171895639f884a712fd2"}],"glance/api/v2/cached_images.py":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"293e48e9aa809387378dc5aedca01a88654d60d8","unresolved":true,"context_lines":[{"line_number":188,"context_line":"        \"\"\""},{"line_number":189,"context_line":"        GET /cache/nodes/\u003cIMAGE_ID\u003e - Get all nodes where image is cached"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        Get all nodes where image is cached"},{"line_number":192,"context_line":"        \"\"\""},{"line_number":193,"context_line":"        self._enforce(req, new_policy\u003d\u0027list_cached_nodes\u0027)"},{"line_number":194,"context_line":"        if not CONF.image_cache_driver \u003d\u003d \u0027centralized_db\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"f68d0dff_4342ceb7","line":191,"range":{"start_line":191,"start_character":37,"end_line":191,"end_character":43},"updated":"2025-11-27 16:24:02.000000000","message":"I feel like you\u0027re repeating yourself in this docstring :) Is it needed for some automation tool?","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c33c1775edac174f5b8c85b9f3bf54af0bffe982","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        \"\"\""},{"line_number":189,"context_line":"        GET /cache/nodes/\u003cIMAGE_ID\u003e - Get all nodes where image is cached"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        Get all nodes where image is cached"},{"line_number":192,"context_line":"        \"\"\""},{"line_number":193,"context_line":"        self._enforce(req, new_policy\u003d\u0027list_cached_nodes\u0027)"},{"line_number":194,"context_line":"        if not CONF.image_cache_driver \u003d\u003d \u0027centralized_db\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"976d545c_1a43379d","line":191,"range":{"start_line":191,"start_character":37,"end_line":191,"end_character":43},"in_reply_to":"ba07b8cc_0a09c68a","updated":"2025-11-28 07:24:03.000000000","message":"Done","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"32bbe1515856cd2ca10a28322672702c22c84a5e","unresolved":true,"context_lines":[{"line_number":188,"context_line":"        \"\"\""},{"line_number":189,"context_line":"        GET /cache/nodes/\u003cIMAGE_ID\u003e - Get all nodes where image is cached"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"        Get all nodes where image is cached"},{"line_number":192,"context_line":"        \"\"\""},{"line_number":193,"context_line":"        self._enforce(req, new_policy\u003d\u0027list_cached_nodes\u0027)"},{"line_number":194,"context_line":"        if not CONF.image_cache_driver \u003d\u003d \u0027centralized_db\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"ba07b8cc_0a09c68a","line":191,"range":{"start_line":191,"start_character":37,"end_line":191,"end_character":43},"in_reply_to":"f68d0dff_4342ceb7","updated":"2025-11-27 16:42:04.000000000","message":"no :D","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"293e48e9aa809387378dc5aedca01a88654d60d8","unresolved":true,"context_lines":[{"line_number":191,"context_line":"        Get all nodes where image is cached"},{"line_number":192,"context_line":"        \"\"\""},{"line_number":193,"context_line":"        self._enforce(req, new_policy\u003d\u0027list_cached_nodes\u0027)"},{"line_number":194,"context_line":"        if not CONF.image_cache_driver \u003d\u003d \u0027centralized_db\u0027:"},{"line_number":195,"context_line":"            msg \u003d _(\"Centralized caching is not enabled\")"},{"line_number":196,"context_line":"            LOG.warning(msg)"},{"line_number":197,"context_line":"            raise webob.exc.HTTPConflict(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"faf195ab_57f95000","line":194,"range":{"start_line":194,"start_character":43,"end_line":194,"end_character":57},"updated":"2025-11-27 16:24:02.000000000","message":"If you need another patchset, maybe use \"if x !\u003d y\" rather than \"not \u003d\u003d\".","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"32bbe1515856cd2ca10a28322672702c22c84a5e","unresolved":false,"context_lines":[{"line_number":191,"context_line":"        Get all nodes where image is cached"},{"line_number":192,"context_line":"        \"\"\""},{"line_number":193,"context_line":"        self._enforce(req, new_policy\u003d\u0027list_cached_nodes\u0027)"},{"line_number":194,"context_line":"        if not CONF.image_cache_driver \u003d\u003d \u0027centralized_db\u0027:"},{"line_number":195,"context_line":"            msg \u003d _(\"Centralized caching is not enabled\")"},{"line_number":196,"context_line":"            LOG.warning(msg)"},{"line_number":197,"context_line":"            raise webob.exc.HTTPConflict(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"0be5e56d_fb59e878","line":194,"range":{"start_line":194,"start_character":43,"end_line":194,"end_character":57},"in_reply_to":"faf195ab_57f95000","updated":"2025-11-27 16:42:04.000000000","message":"Acknowledged","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"}],"glance/db/simple/api.py":[{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"293e48e9aa809387378dc5aedca01a88654d60d8","unresolved":true,"context_lines":[{"line_number":2201,"context_line":"    all_images \u003d DATA[\u0027cached_images\u0027]"},{"line_number":2202,"context_line":"    node_references \u003d DATA[\u0027node_reference\u0027]"},{"line_number":2203,"context_line":"    cached_nodes \u003d []"},{"line_number":2204,"context_line":"    for image in all_images:"},{"line_number":2205,"context_line":"        if all_images[image][\u0027image_id\u0027] \u003d\u003d image_id:"},{"line_number":2206,"context_line":"            for node in node_references:"},{"line_number":2207,"context_line":"                node_reference \u003d node_references[node]"}],"source_content_type":"text/x-python","patch_set":3,"id":"1e2e15a4_467176d7","line":2204,"range":{"start_line":2204,"start_character":17,"end_line":2204,"end_character":27},"updated":"2025-11-27 16:24:02.000000000","message":"We could do:\n\nfor image in all_images.values():\n\nSo we don\u0027t have to keep using all_images[image].","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"9987f29fa513527659d8f0029cc9e968f848df8e","unresolved":false,"context_lines":[{"line_number":2201,"context_line":"    all_images \u003d DATA[\u0027cached_images\u0027]"},{"line_number":2202,"context_line":"    node_references \u003d DATA[\u0027node_reference\u0027]"},{"line_number":2203,"context_line":"    cached_nodes \u003d []"},{"line_number":2204,"context_line":"    for image in all_images:"},{"line_number":2205,"context_line":"        if all_images[image][\u0027image_id\u0027] \u003d\u003d image_id:"},{"line_number":2206,"context_line":"            for node in node_references:"},{"line_number":2207,"context_line":"                node_reference \u003d node_references[node]"}],"source_content_type":"text/x-python","patch_set":3,"id":"47be38b0_efa3c67f","line":2204,"range":{"start_line":2204,"start_character":17,"end_line":2204,"end_character":27},"in_reply_to":"1e2e15a4_467176d7","updated":"2025-11-27 16:44:02.000000000","message":"Acknowledged","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":8122,"name":"Cyril Roelandt","email":"cyril@redhat.com","username":"cyril.roelandt.enovance"},"change_message_id":"293e48e9aa809387378dc5aedca01a88654d60d8","unresolved":true,"context_lines":[{"line_number":2202,"context_line":"    node_references \u003d DATA[\u0027node_reference\u0027]"},{"line_number":2203,"context_line":"    cached_nodes \u003d []"},{"line_number":2204,"context_line":"    for image in all_images:"},{"line_number":2205,"context_line":"        if all_images[image][\u0027image_id\u0027] \u003d\u003d image_id:"},{"line_number":2206,"context_line":"            for node in node_references:"},{"line_number":2207,"context_line":"                node_reference \u003d node_references[node]"},{"line_number":2208,"context_line":"                if all_images[image][\u0027node_reference_id\u0027] \u003d\u003d \\"}],"source_content_type":"text/x-python","patch_set":3,"id":"5d7839d4_968de0e8","line":2205,"range":{"start_line":2205,"start_character":44,"end_line":2205,"end_character":52},"updated":"2025-11-27 16:24:02.000000000","message":"And here we could do:\n\n    if image[\u0027image_id\u0027] !\u003d image_id:\n        continue\n        \n    for node in...\n\nWhich would be easier to read.","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"9987f29fa513527659d8f0029cc9e968f848df8e","unresolved":false,"context_lines":[{"line_number":2202,"context_line":"    node_references \u003d DATA[\u0027node_reference\u0027]"},{"line_number":2203,"context_line":"    cached_nodes \u003d []"},{"line_number":2204,"context_line":"    for image in all_images:"},{"line_number":2205,"context_line":"        if all_images[image][\u0027image_id\u0027] \u003d\u003d image_id:"},{"line_number":2206,"context_line":"            for node in node_references:"},{"line_number":2207,"context_line":"                node_reference \u003d node_references[node]"},{"line_number":2208,"context_line":"                if all_images[image][\u0027node_reference_id\u0027] \u003d\u003d \\"}],"source_content_type":"text/x-python","patch_set":3,"id":"5c830530_afe3ca87","line":2205,"range":{"start_line":2205,"start_character":44,"end_line":2205,"end_character":52},"in_reply_to":"5d7839d4_968de0e8","updated":"2025-11-27 16:44:02.000000000","message":"Acknowledged","commit_id":"25cc0da288860a97ced73164f5a7ba8da1594d96"}],"glance/db/sqlalchemy/api.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aeed0acea25fa58c4d809e7cb4eacdfce443ee65","unresolved":true,"context_lines":[{"line_number":2473,"context_line":"        isouter\u003dTrue).filter(image_id \u003d\u003d models.CachedImages.image_id)"},{"line_number":2474,"context_line":""},{"line_number":2475,"context_line":"    for url in query.all():"},{"line_number":2476,"context_line":"        cached_nodes.append(url[0])"},{"line_number":2477,"context_line":"    return cached_nodes"},{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"c53d19ef_40423166","line":2476,"updated":"2025-08-26 13:46:33.000000000","message":"It would be much more efficient to do a list comprehension for this:\n```\nreturn [url[0] for url in query.all()]\n```","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"37560f73ce68e0a0ec362271f14b2b0840b2cd4c","unresolved":false,"context_lines":[{"line_number":2473,"context_line":"        isouter\u003dTrue).filter(image_id \u003d\u003d models.CachedImages.image_id)"},{"line_number":2474,"context_line":""},{"line_number":2475,"context_line":"    for url in query.all():"},{"line_number":2476,"context_line":"        cached_nodes.append(url[0])"},{"line_number":2477,"context_line":"    return cached_nodes"},{"line_number":2478,"context_line":""},{"line_number":2479,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5e6569f1_e8f739f5","line":2476,"in_reply_to":"c53d19ef_40423166","updated":"2025-08-28 14:54:59.000000000","message":"Acknowledged","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"}],"glance/policies/image.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"285d67cd088383bcb12a83bc13274e700cb09eca","unresolved":true,"context_lines":[{"line_number":331,"context_line":"    ),"},{"line_number":332,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":333,"context_line":"        name\u003d\"list_cached_nodes\","},{"line_number":334,"context_line":"        check_str\u003dbase.ADMIN_OR_PROJECT_READER,"},{"line_number":335,"context_line":"        scope_types\u003d[\u0027project\u0027],"},{"line_number":336,"context_line":"        description\u003d\u0027Get all nodes where specified image is cached\u0027,"},{"line_number":337,"context_line":"        operations\u003d["}],"source_content_type":"text/x-python","patch_set":4,"id":"bc21c26e_1419f389","line":334,"updated":"2026-05-07 15:55:04.000000000","message":"We don\u0027t want to expose worker URLs to regular users do we? If an operator has a load balancer in front of the actual glance workers to protect them, this will expose them to the user. Hopefully they\u0027re protected (if they need to be) but this seems like too much information to give to anyone. Sort of like exposing backend URLs.\n\nProject reader is the lowest level of access one can have to a set of resources, right?","commit_id":"1fe36f662a1753445d7ccf4dbf54510bb520fe01"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"bf82e1924217a5fa9629c542c44449cde1a45d2b","unresolved":true,"context_lines":[{"line_number":331,"context_line":"    ),"},{"line_number":332,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":333,"context_line":"        name\u003d\"list_cached_nodes\","},{"line_number":334,"context_line":"        check_str\u003dbase.ADMIN_OR_PROJECT_READER,"},{"line_number":335,"context_line":"        scope_types\u003d[\u0027project\u0027],"},{"line_number":336,"context_line":"        description\u003d\u0027Get all nodes where specified image is cached\u0027,"},{"line_number":337,"context_line":"        operations\u003d["}],"source_content_type":"text/x-python","patch_set":4,"id":"d07f9864_2605fac6","line":334,"in_reply_to":"bc21c26e_1419f389","updated":"2026-05-08 07:02:21.000000000","message":"good point, will keep it admin only.","commit_id":"1fe36f662a1753445d7ccf4dbf54510bb520fe01"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"adbd4603711c2a67363bd41c98f777d183b7238a","unresolved":false,"context_lines":[{"line_number":331,"context_line":"    ),"},{"line_number":332,"context_line":"    policy.DocumentedRuleDefault("},{"line_number":333,"context_line":"        name\u003d\"list_cached_nodes\","},{"line_number":334,"context_line":"        check_str\u003dbase.ADMIN_OR_PROJECT_READER,"},{"line_number":335,"context_line":"        scope_types\u003d[\u0027project\u0027],"},{"line_number":336,"context_line":"        description\u003d\u0027Get all nodes where specified image is cached\u0027,"},{"line_number":337,"context_line":"        operations\u003d["}],"source_content_type":"text/x-python","patch_set":4,"id":"8744d64d_63d03849","line":334,"in_reply_to":"d07f9864_2605fac6","updated":"2026-05-12 06:44:16.000000000","message":"Done","commit_id":"1fe36f662a1753445d7ccf4dbf54510bb520fe01"}],"glance/tests/functional/v2/test_cache_api.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aeed0acea25fa58c4d809e7cb4eacdfce443ee65","unresolved":true,"context_lines":[{"line_number":147,"context_line":"        # Queue 1 image for caching"},{"line_number":148,"context_line":"        self.cache_queue(images[\u0027public\u0027])"},{"line_number":149,"context_line":"        self.list_cached_nodes(images[\u0027public\u0027],"},{"line_number":150,"context_line":"                               expected_code\u003d409)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def test_list_cached_nodes_centralized_cache_enabled(self):"},{"line_number":153,"context_line":"        self.start_server(enable_cache\u003dTrue, cache_driver\u003d\u0027centralized_db\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"05ec2c84_667a8c6b","line":150,"updated":"2025-08-26 13:46:33.000000000","message":"The 409 is because it\u0027s disabled, right? Shouldn\u0027t we verify that it returns 409 before anything is queued and after?\n\nAlso, why doesn\u0027t the cache_queue return the 409? Really I would think trying to cache something when it\u0027s disabled should return 409 and listing should return either 404 or an empty list, no?","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"37560f73ce68e0a0ec362271f14b2b0840b2cd4c","unresolved":true,"context_lines":[{"line_number":147,"context_line":"        # Queue 1 image for caching"},{"line_number":148,"context_line":"        self.cache_queue(images[\u0027public\u0027])"},{"line_number":149,"context_line":"        self.list_cached_nodes(images[\u0027public\u0027],"},{"line_number":150,"context_line":"                               expected_code\u003d409)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def test_list_cached_nodes_centralized_cache_enabled(self):"},{"line_number":153,"context_line":"        self.start_server(enable_cache\u003dTrue, cache_driver\u003d\u0027centralized_db\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ee9dc0e2_0a12d946","line":150,"in_reply_to":"05ec2c84_667a8c6b","updated":"2025-08-28 14:54:59.000000000","message":"At the moment we support 2 db drivers for caching.\n1 is sqlite which creates local db for each glance node\n2nd is cenrealized where we store all information in centralized db\n\nWe can not restrict queueing an image for caching if centralized db is not enabled since it is using sqlite db to store the information.","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"c33c1775edac174f5b8c85b9f3bf54af0bffe982","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        # Queue 1 image for caching"},{"line_number":148,"context_line":"        self.cache_queue(images[\u0027public\u0027])"},{"line_number":149,"context_line":"        self.list_cached_nodes(images[\u0027public\u0027],"},{"line_number":150,"context_line":"                               expected_code\u003d409)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def test_list_cached_nodes_centralized_cache_enabled(self):"},{"line_number":153,"context_line":"        self.start_server(enable_cache\u003dTrue, cache_driver\u003d\u0027centralized_db\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2c2b85_39cc5f4c","line":150,"in_reply_to":"761076dd_5a0a5250","updated":"2025-11-28 07:24:03.000000000","message":"Removed the redundant queuing and second assertion to keep it simple that the check is configuration-based, not state-based.","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"7c846e592437ff77717faae3eba067c9b2768cfb","unresolved":true,"context_lines":[{"line_number":147,"context_line":"        # Queue 1 image for caching"},{"line_number":148,"context_line":"        self.cache_queue(images[\u0027public\u0027])"},{"line_number":149,"context_line":"        self.list_cached_nodes(images[\u0027public\u0027],"},{"line_number":150,"context_line":"                               expected_code\u003d409)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def test_list_cached_nodes_centralized_cache_enabled(self):"},{"line_number":153,"context_line":"        self.start_server(enable_cache\u003dTrue, cache_driver\u003d\u0027centralized_db\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ae57e98_2abcf2f5","line":150,"in_reply_to":"8c49590f_f9a5ba08","updated":"2025-08-28 15:20:59.000000000","message":"Yes, IF caching is disable then we can return 409 regardless of the driver.\n\nThe answer for your \"why doesn\u0027t the cache_queue return the 409\" is that our functional test structure uses sqlite driver by default (see line 153) so I can not validate that here. The test you want is there at line #356.","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"47b4b7f71da07807ad6d6032dc44ebbba2bfe3fd","unresolved":true,"context_lines":[{"line_number":147,"context_line":"        # Queue 1 image for caching"},{"line_number":148,"context_line":"        self.cache_queue(images[\u0027public\u0027])"},{"line_number":149,"context_line":"        self.list_cached_nodes(images[\u0027public\u0027],"},{"line_number":150,"context_line":"                               expected_code\u003d409)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def test_list_cached_nodes_centralized_cache_enabled(self):"},{"line_number":153,"context_line":"        self.start_server(enable_cache\u003dTrue, cache_driver\u003d\u0027centralized_db\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"761076dd_5a0a5250","line":150,"in_reply_to":"9ae57e98_2abcf2f5","updated":"2025-08-28 15:26:11.000000000","message":"TO add further, earlier we use to have cachemanage as middleware now we moved it under API with new endpoint which is /v2/cache, if this endpoint is not available then it will return 404. We return 409 only if centralized driver is not configured for this new API","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5be9fd364f3852344a0e2fd653a1222d20ac4d6f","unresolved":true,"context_lines":[{"line_number":147,"context_line":"        # Queue 1 image for caching"},{"line_number":148,"context_line":"        self.cache_queue(images[\u0027public\u0027])"},{"line_number":149,"context_line":"        self.list_cached_nodes(images[\u0027public\u0027],"},{"line_number":150,"context_line":"                               expected_code\u003d409)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def test_list_cached_nodes_centralized_cache_enabled(self):"},{"line_number":153,"context_line":"        self.start_server(enable_cache\u003dTrue, cache_driver\u003d\u0027centralized_db\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"8c49590f_f9a5ba08","line":150,"in_reply_to":"ee9dc0e2_0a12d946","updated":"2025-08-28 15:10:09.000000000","message":"I\u0027m not sure that I understand this response.. Are you referring to the second comment about returning 409 from the queue operation itself? I guess I\u0027m not sure .. if caching is _disabled_ then we can return 409 regardless of the driver right?","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aeed0acea25fa58c4d809e7cb4eacdfce443ee65","unresolved":true,"context_lines":[{"line_number":156,"context_line":"        self.cache_queue(images[\u0027public\u0027])"},{"line_number":157,"context_line":"        self.wait_for_caching(images[\u0027public\u0027])"},{"line_number":158,"context_line":"        output \u003d self.list_cached_nodes(images[\u0027public\u0027])"},{"line_number":159,"context_line":"        self.assertEqual(1, len(output))"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_cache_queue(self):"},{"line_number":162,"context_line":"        self.start_server(enable_cache\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"68c35db6_e5c7442a","line":159,"updated":"2025-08-26 13:46:33.000000000","message":"Surely we can do a better verification of this right? Can\u0027t we look up the host and port of the thing we started?","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"37560f73ce68e0a0ec362271f14b2b0840b2cd4c","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        self.cache_queue(images[\u0027public\u0027])"},{"line_number":157,"context_line":"        self.wait_for_caching(images[\u0027public\u0027])"},{"line_number":158,"context_line":"        output \u003d self.list_cached_nodes(images[\u0027public\u0027])"},{"line_number":159,"context_line":"        self.assertEqual(1, len(output))"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_cache_queue(self):"},{"line_number":162,"context_line":"        self.start_server(enable_cache\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ca8ef084_1281dd93","line":159,"in_reply_to":"68c35db6_e5c7442a","updated":"2025-08-28 14:54:59.000000000","message":"Acknowledged","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aeed0acea25fa58c4d809e7cb4eacdfce443ee65","unresolved":true,"context_lines":[{"line_number":157,"context_line":"        self.wait_for_caching(images[\u0027public\u0027])"},{"line_number":158,"context_line":"        output \u003d self.list_cached_nodes(images[\u0027public\u0027])"},{"line_number":159,"context_line":"        self.assertEqual(1, len(output))"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_cache_queue(self):"},{"line_number":162,"context_line":"        self.start_server(enable_cache\u003dTrue)"},{"line_number":163,"context_line":"        images \u003d self.load_data()"}],"source_content_type":"text/x-python","patch_set":2,"id":"8af3d765_4da1dcaa","line":160,"updated":"2025-08-26 13:46:33.000000000","message":"What about checking a UUID that isn\u0027t cached?\n\nWhat about checking a UUID that isn\u0027t even an image?","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"37560f73ce68e0a0ec362271f14b2b0840b2cd4c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        self.wait_for_caching(images[\u0027public\u0027])"},{"line_number":158,"context_line":"        output \u003d self.list_cached_nodes(images[\u0027public\u0027])"},{"line_number":159,"context_line":"        self.assertEqual(1, len(output))"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def test_cache_queue(self):"},{"line_number":162,"context_line":"        self.start_server(enable_cache\u003dTrue)"},{"line_number":163,"context_line":"        images \u003d self.load_data()"}],"source_content_type":"text/x-python","patch_set":2,"id":"cb2677b9_0cf00652","line":160,"in_reply_to":"8af3d765_4da1dcaa","updated":"2025-08-28 14:54:59.000000000","message":"Acknowledged","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"}],"glance/tests/functional/v2/test_cache_api_policy.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aeed0acea25fa58c4d809e7cb4eacdfce443ee65","unresolved":true,"context_lines":[{"line_number":190,"context_line":"        })"},{"line_number":191,"context_line":"        response \u003d self.api_get(path)"},{"line_number":192,"context_line":"        self.assertEqual(403, response.status_code)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def test_delete_cached_image(self):"},{"line_number":195,"context_line":"        self.start_server()"},{"line_number":196,"context_line":"        # Create image and cache it"}],"source_content_type":"text/x-python","patch_set":2,"id":"4b4486dc_cec16df3","line":193,"updated":"2025-08-26 13:46:33.000000000","message":"I\u0027m not sure if this is the right test file for this, but.. what about making sure that (by default) users can\u0027t access this but admins can? I might be missing it, but I see no such test.","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"37560f73ce68e0a0ec362271f14b2b0840b2cd4c","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        })"},{"line_number":191,"context_line":"        response \u003d self.api_get(path)"},{"line_number":192,"context_line":"        self.assertEqual(403, response.status_code)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def test_delete_cached_image(self):"},{"line_number":195,"context_line":"        self.start_server()"},{"line_number":196,"context_line":"        # Create image and cache it"}],"source_content_type":"text/x-python","patch_set":2,"id":"2b3c9c96_b78349aa","line":193,"in_reply_to":"4b4486dc_cec16df3","updated":"2025-08-28 14:54:59.000000000","message":"Acknowledged","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"}],"glance/tests/unit/test_db.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"aeed0acea25fa58c4d809e7cb4eacdfce443ee65","unresolved":true,"context_lines":[{"line_number":268,"context_line":"    def test_get_cached_nodes(self):"},{"line_number":269,"context_line":"        cached_nodes \u003d self.db.get_cached_nodes(self.context, UUID1)"},{"line_number":270,"context_line":"        # assert that UUID1 is cached on 1 node only"},{"line_number":271,"context_line":"        self.assertEqual(1, len(cached_nodes))"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def test_get_cached_images(self):"},{"line_number":274,"context_line":"        # Two images are cached on node \u0027node_url_1\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"bb1c9e0f_7db80795","line":271,"updated":"2025-08-26 13:46:33.000000000","message":"Again, should be able to check this with more detail. And also, what about checking that UUID2 is not cached at all?","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"37560f73ce68e0a0ec362271f14b2b0840b2cd4c","unresolved":false,"context_lines":[{"line_number":268,"context_line":"    def test_get_cached_nodes(self):"},{"line_number":269,"context_line":"        cached_nodes \u003d self.db.get_cached_nodes(self.context, UUID1)"},{"line_number":270,"context_line":"        # assert that UUID1 is cached on 1 node only"},{"line_number":271,"context_line":"        self.assertEqual(1, len(cached_nodes))"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    def test_get_cached_images(self):"},{"line_number":274,"context_line":"        # Two images are cached on node \u0027node_url_1\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"71c14c51_fa84b8e4","line":271,"in_reply_to":"bb1c9e0f_7db80795","updated":"2025-08-28 14:54:59.000000000","message":"Acknowledged","commit_id":"d10591ed61a35812208a00265d3128d24c136b72"}]}
