)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"e8aedd3512c0b807fab060dda4506af7bf3758b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"747c288a_d3a12677","updated":"2026-09-21 08:17:39.000000000","message":"Thanks for the review Stephen, I have addressed your comments and updated the patch, please have a look.","commit_id":"8ea939bfd0fb5959c7543068727889a4b90c9fe3"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e73ddcb78c7c1c10153f0f4ec0a9fd23c75f65c2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"006c888d_b0519e3a","updated":"2026-09-21 11:51:02.000000000","message":"We\u0027ll need to bump the ksa version in our dependencies once we\u0027re able to cut a release so there\u0027s no point +2\u0027ing until then but this looks good to me otherwise now","commit_id":"8ea939bfd0fb5959c7543068727889a4b90c9fe3"}],"doc/source/cli/command-objects/image/v2/index.rst":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0836a13d78ee555a8534870a5455b58353f6c06c","unresolved":true,"context_lines":[{"line_number":144,"context_line":"cached image"},{"line_number":145,"context_line":"------------"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":148,"context_line":"   :command: cached image list"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":151,"context_line":"   :command: cached image queue"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":154,"context_line":"   :command: cached image delete"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":157,"context_line":"   :command: cached image clear"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":160,"context_line":"   :command: cached image clean"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":163,"context_line":"   :command: cached image prune"}],"source_content_type":"text/x-rst","patch_set":2,"id":"0221f681_ad96e8e4","line":163,"range":{"start_line":147,"start_character":0,"end_line":163,"end_character":31},"updated":"2026-09-17 12:53:03.000000000","message":"Could we simplify this to:\n\n```suggestion\n.. autoprogram-cliff:: openstack.image.v2\n   :command: cached image *\n```","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"},{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"e8aedd3512c0b807fab060dda4506af7bf3758b7","unresolved":false,"context_lines":[{"line_number":144,"context_line":"cached image"},{"line_number":145,"context_line":"------------"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":148,"context_line":"   :command: cached image list"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":151,"context_line":"   :command: cached image queue"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":154,"context_line":"   :command: cached image delete"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":157,"context_line":"   :command: cached image clear"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":160,"context_line":"   :command: cached image clean"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":".. autoprogram-cliff:: openstack.image.v2"},{"line_number":163,"context_line":"   :command: cached image prune"}],"source_content_type":"text/x-rst","patch_set":2,"id":"06ada91f_5b39cc0f","line":163,"range":{"start_line":147,"start_character":0,"end_line":163,"end_character":31},"in_reply_to":"0221f681_ad96e8e4","updated":"2026-09-21 08:17:39.000000000","message":"Done","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"}],"openstackclient/image/v2/cache.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0836a13d78ee555a8534870a5455b58353f6c06c","unresolved":true,"context_lines":[{"line_number":234,"context_line":"        image_client \u003d self.app.client_manager.image"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        try:"},{"line_number":237,"context_line":"            image_client.clean_cache()  # type: ignore[attr-defined, unused-ignore]"},{"line_number":238,"context_line":"        except Exception as e:"},{"line_number":239,"context_line":"            msg \u003d _(\"Failed to clean image cache: %s\") % e"},{"line_number":240,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"a6f6d77c_e9e46a6b","line":237,"updated":"2026-09-17 12:53:03.000000000","message":"Let\u0027s drop these `type: ignore` statement. We\u0027d expect this to fail until the SDK change is released. We depend on that anyway.\n\n\n\n```suggestion\n            image_client.clean_cache()\n```","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"},{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"e8aedd3512c0b807fab060dda4506af7bf3758b7","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        image_client \u003d self.app.client_manager.image"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        try:"},{"line_number":237,"context_line":"            image_client.clean_cache()  # type: ignore[attr-defined, unused-ignore]"},{"line_number":238,"context_line":"        except Exception as e:"},{"line_number":239,"context_line":"            msg \u003d _(\"Failed to clean image cache: %s\") % e"},{"line_number":240,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ddb3a476_f2b0b4d8","line":237,"in_reply_to":"a6f6d77c_e9e46a6b","updated":"2026-09-21 08:17:39.000000000","message":"Done","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0836a13d78ee555a8534870a5455b58353f6c06c","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        image_client \u003d self.app.client_manager.image"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        try:"},{"line_number":253,"context_line":"            result \u003d ("},{"line_number":254,"context_line":"                image_client.prune_cache()  # type: ignore[attr-defined, unused-ignore]"},{"line_number":255,"context_line":"                or {}"},{"line_number":256,"context_line":"            )"},{"line_number":257,"context_line":"        except Exception as e:"},{"line_number":258,"context_line":"            msg \u003d _(\"Failed to prune image cache: %s\") % e"},{"line_number":259,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"049218cb_76a5ebdd","line":256,"range":{"start_line":253,"start_character":0,"end_line":256,"end_character":13},"updated":"2026-09-17 12:53:03.000000000","message":"```suggestion\n            result \u003d image_client.prune_cache() or {}\n```\n\nThough I\u0027m not sure why you need the `or {}`? Can you add a comment?","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"},{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"e8aedd3512c0b807fab060dda4506af7bf3758b7","unresolved":false,"context_lines":[{"line_number":250,"context_line":"        image_client \u003d self.app.client_manager.image"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        try:"},{"line_number":253,"context_line":"            result \u003d ("},{"line_number":254,"context_line":"                image_client.prune_cache()  # type: ignore[attr-defined, unused-ignore]"},{"line_number":255,"context_line":"                or {}"},{"line_number":256,"context_line":"            )"},{"line_number":257,"context_line":"        except Exception as e:"},{"line_number":258,"context_line":"            msg \u003d _(\"Failed to prune image cache: %s\") % e"},{"line_number":259,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"ee0daff4_135d4ba6","line":256,"range":{"start_line":253,"start_character":0,"end_line":256,"end_character":13},"in_reply_to":"049218cb_76a5ebdd","updated":"2026-09-21 08:17:39.000000000","message":"Done","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"424e1f398aaa6667b88d8dbcabeb08d71e0819b3","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        image_client \u003d self.app.client_manager.image"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        try:"},{"line_number":237,"context_line":"            image_client.clean_cache()"},{"line_number":238,"context_line":"        except Exception as e:"},{"line_number":239,"context_line":"            msg \u003d _(\"Failed to clean image cache: %s\") % e"},{"line_number":240,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"e06cf7f5_91668538","line":237,"updated":"2026-09-21 09:36:56.000000000","message":"pep8: error: \"Proxy\" has no attribute \"clean_cache\"; maybe \"clear_cache\"?  [attr-defined]","commit_id":"8ea939bfd0fb5959c7543068727889a4b90c9fe3"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e73ddcb78c7c1c10153f0f4ec0a9fd23c75f65c2","unresolved":true,"context_lines":[{"line_number":250,"context_line":"        image_client \u003d self.app.client_manager.image"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"        try:"},{"line_number":253,"context_line":"            # prune_cache() is typed as dict[str, int], but an empty or"},{"line_number":254,"context_line":"            # missing JSON body can still yield None; ShowOne needs a mapping."},{"line_number":255,"context_line":"            result \u003d image_client.prune_cache() or {}"},{"line_number":256,"context_line":"        except Exception as e:"},{"line_number":257,"context_line":"            msg \u003d _(\"Failed to prune image cache: %s\") % e"}],"source_content_type":"text/x-python","patch_set":3,"id":"dd10882d_0ecf8188","line":254,"range":{"start_line":253,"start_character":0,"end_line":254,"end_character":78},"updated":"2026-09-21 11:51:02.000000000","message":"This sounds like a bug in SDK?","commit_id":"8ea939bfd0fb5959c7543068727889a4b90c9fe3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"424e1f398aaa6667b88d8dbcabeb08d71e0819b3","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        try:"},{"line_number":253,"context_line":"            # prune_cache() is typed as dict[str, int], but an empty or"},{"line_number":254,"context_line":"            # missing JSON body can still yield None; ShowOne needs a mapping."},{"line_number":255,"context_line":"            result \u003d image_client.prune_cache() or {}"},{"line_number":256,"context_line":"        except Exception as e:"},{"line_number":257,"context_line":"            msg \u003d _(\"Failed to prune image cache: %s\") % e"},{"line_number":258,"context_line":"            LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":3,"id":"92eded91_b7839197","line":255,"updated":"2026-09-21 09:36:56.000000000","message":"pep8: error: \"Proxy\" has no attribute \"prune_cache\"  [attr-defined]","commit_id":"8ea939bfd0fb5959c7543068727889a4b90c9fe3"}],"openstackclient/tests/functional/image/v2/test_cache.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0836a13d78ee555a8534870a5455b58353f6c06c","unresolved":true,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from openstackclient.tests.functional.image import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"def _sdk_supports_cache_maintenance() -\u003e bool:"},{"line_number":19,"context_line":"    return hasattr(image_proxy.Proxy, \u0027clean_cache\u0027) and hasattr("},{"line_number":20,"context_line":"        image_proxy.Proxy, \u0027prune_cache\u0027"},{"line_number":21,"context_line":"    )"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CacheTests(base.BaseImageTests):"}],"source_content_type":"text/x-python","patch_set":2,"id":"d70d31b7_19ccb0ad","line":21,"range":{"start_line":17,"start_character":1,"end_line":21,"end_character":5},"updated":"2026-09-17 12:53:03.000000000","message":"Let\u0027s drop this: we should be bumping the version of SDK in `requirements.txt` instead. Version-specific checks like this lead to rat-nest code. Note that this will cause the main tests to fail until the SDK patch is released, but the tips job (which install SDK and KSA from the `HEAD` of `master`) should pass.","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"},{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"e8aedd3512c0b807fab060dda4506af7bf3758b7","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"from openstackclient.tests.functional.image import base"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"def _sdk_supports_cache_maintenance() -\u003e bool:"},{"line_number":19,"context_line":"    return hasattr(image_proxy.Proxy, \u0027clean_cache\u0027) and hasattr("},{"line_number":20,"context_line":"        image_proxy.Proxy, \u0027prune_cache\u0027"},{"line_number":21,"context_line":"    )"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class CacheTests(base.BaseImageTests):"}],"source_content_type":"text/x-python","patch_set":2,"id":"364a50f5_93c41f38","line":21,"range":{"start_line":17,"start_character":1,"end_line":21,"end_character":5},"in_reply_to":"d70d31b7_19ccb0ad","updated":"2026-09-21 08:17:39.000000000","message":"Done","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"}],"openstackclient/tests/unit/image/v2/test_cache.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"0836a13d78ee555a8534870a5455b58353f6c06c","unresolved":true,"context_lines":[{"line_number":13,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"# under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from unittest.mock import Mock, call"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from openstack import exceptions as sdk_exceptions"},{"line_number":19,"context_line":"from osc_lib import exceptions"}],"source_content_type":"text/x-python","patch_set":2,"id":"1d4c7e31_c047224a","line":16,"updated":"2026-09-17 12:53:03.000000000","message":"Let\u0027s not import objects unless they\u0027re typing-related.\n\n```suggestion\nfrom unittest import mock\n```\n\nand `s/\\\u003ccall\\\u003e/mock.call/` / `s/\\\u003cMock\\\u003e/mock.Mock/`","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"},{"author":{"_account_id":19138,"name":"Pranali Deore","email":"pdeore@redhat.com","username":"PranaliD"},"change_message_id":"e8aedd3512c0b807fab060dda4506af7bf3758b7","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"# under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from unittest.mock import Mock, call"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from openstack import exceptions as sdk_exceptions"},{"line_number":19,"context_line":"from osc_lib import exceptions"}],"source_content_type":"text/x-python","patch_set":2,"id":"5a683a70_1554123c","line":16,"in_reply_to":"1d4c7e31_c047224a","updated":"2026-09-21 08:17:39.000000000","message":"Done","commit_id":"eb2d35c7c8d6ea1d2dd08cdae1753069bc95e967"}]}
