)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"2d44372a0963a14427ff498b8dcf3f7ecaa12086","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8d75ea19_6aef95c7","updated":"2026-05-13 05:15:18.000000000","message":"Hi Jon — would appreciate a review when you have time.         \n                                                               \nAdds a `cinder-manage image-cache` admin subcommand for listing\nexisting entries and warming the cache out of band. As a side\nbenefit, pre-warming sidesteps the long-standing PowerFlex\nfirst-create size drift (Bug #1915015) by avoiding the\ncache-miss path at user request time.","commit_id":"dd52b6b0ac6c0a7bb8028f40c83b4d091b8de65b"},{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"5817a5baefcffe3007e98612b8b9558967b242d3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"0f8596e7_b8c0d3d8","in_reply_to":"71d11636_8f1af1a6","updated":"2026-06-04 01:18:27.000000000","message":"gentle ping @jobernar@redhat.com","commit_id":"dd52b6b0ac6c0a7bb8028f40c83b4d091b8de65b"},{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"e06620740c846ee15a2d77ebf3bc0496fe88c31b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"71d11636_8f1af1a6","in_reply_to":"8d75ea19_6aef95c7","updated":"2026-05-13 05:17:20.000000000","message":"\u003e Hi Jon — would appreciate a review when you have time.         \n\u003e                                                                \n\u003e Adds a `cinder-manage image-cache` admin subcommand for listing\n\u003e existing entries and warming the cache out of band. As a side\n\u003e benefit, pre-warming sidesteps the long-standing PowerFlex\n\u003e first-create size drift (Bug #1915015) by avoiding the\n\u003e cache-miss path at user request time.","commit_id":"dd52b6b0ac6c0a7bb8028f40c83b4d091b8de65b"},{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"d1563dad15ca4a16e6c35e8a863bcf26766bbf16","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"999f050e_7287a336","updated":"2026-05-21 01:17:50.000000000","message":"recheck","commit_id":"8c1738c7857def035ad901cfd9b63f0d9d0d6aea"},{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"fe0745c03a3b1969a9b8cb7b41e138d66a10edb7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"06bdc338_edd2b36d","updated":"2026-07-13 01:34:34.000000000","message":"@jobernar@redhat.com\nHi Jon, could I ask for your review when you have time?\n\nThis implementation is paired with the spec:\nhttps://review.opendev.org/c/openstack/cinder-specs/+/986741\n\nBoth changes are passing Zuul, and I added them to the Hibiscus review request pad. Thanks!","commit_id":"85567e7eb0abc4147c49e2d5e1d51fe85de9fe51"},{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"438b385c90ee5a0a54fe88279dfac5a64149825c","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"60bfd68d_019c5db3","updated":"2026-07-20 17:33:52.000000000","message":"Hi Eric, could I ask for your review when you have bandwidth?\n\nThis adds cinder-manage commands for listing and warming the image-volume cache. I would especially appreciate your feedback on whether this is the right operator-facing approach.\n\nThe paired spec is:\nhttps://review.opendev.org/c/openstack/cinder-specs/+/986741\n\nBoth changes are passing Zuul. Thanks!","commit_id":"85567e7eb0abc4147c49e2d5e1d51fe85de9fe51"},{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"387e2088ea38a71e2729448ba7669fb75cc267c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"cb1e2085_365e3df5","in_reply_to":"60bfd68d_019c5db3","updated":"2026-11-05 06:44:20.000000000","message":"Done","commit_id":"85567e7eb0abc4147c49e2d5e1d51fe85de9fe51"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"01996490b2a57adefddb3cb3f4e084033895662a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"da815fb8_25f1fe4e","updated":"2026-11-11 15:27:34.000000000","message":"This matches spec PS9 step for step and the CLI exit paths behave as the table says; local unit and functional runs are clean. +1. One minor inline: an unset `[DEFAULT] glance_api_servers` surfaces as `reason\u003d... StopIteration`, which an operator cannot act on, so please name the option in that case. The rest are nits.","commit_id":"ea773cb2ec2c17e867cd33a558c79cfb94cc9468"},{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"2bb625fac1fdf4bd1c3a6c808027bf3ddc56b686","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"7de02e55_1c177110","updated":"2026-11-11 08:12:15.000000000","message":"recheck","commit_id":"ea773cb2ec2c17e867cd33a558c79cfb94cc9468"},{"author":{"_account_id":34539,"name":"minwoo seo","email":"alsdn1211@naver.com","username":"minwooseo"},"change_message_id":"c871d1f74b90938c17095d0be87505113510e5b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"bf8d4012_75ec4eb5","updated":"2026-11-11 11:01:18.000000000","message":"recheck","commit_id":"ea773cb2ec2c17e867cd33a558c79cfb94cc9468"}],"cinder/cmd/manage.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"01996490b2a57adefddb3cb3f4e084033895662a","unresolved":true,"context_lines":[{"line_number":1126,"context_line":""},{"line_number":1127,"context_line":"    @args(\u0027image_id\u0027, type\u003dstr,"},{"line_number":1128,"context_line":"          help\u003d\u0027Glance image UUID to warm the cache for.\u0027)"},{"line_number":1129,"context_line":"    @args(\u0027--host\u0027, dest\u003d\u0027target_host\u0027, type\u003dstr, default\u003dNone,"},{"line_number":1130,"context_line":"          help\u003d\u0027Pool to warm, as host@backend#pool or, for a clustered \u0027"},{"line_number":1131,"context_line":"               \u0027backend, cluster@backend#pool (the Name column of \u0027"},{"line_number":1132,"context_line":"               \u0027\"openstack volume backend pool list\"). Required.\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"6d959aae_4af8add7","line":1129,"updated":"2026-11-11 15:27:34.000000000","message":"Nit: the help says \"Required.\" but the option is optional to argparse, so the usage line shows `[--host TARGET_HOST]` and the check at 1160 does the work. `--backend-host` at 322 and `--currenthost` at 627 use `required\u003dTrue`; doing the same here gives the standard argparse usage error, still exit 2, and the in-function check can stay for direct callers.","commit_id":"ea773cb2ec2c17e867cd33a558c79cfb94cc9468"}],"cinder/tests/unit/test_cmd.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"01996490b2a57adefddb3cb3f4e084033895662a","unresolved":true,"context_lines":[{"line_number":649,"context_line":"        cache_get_all.assert_called_once_with(ctxt, image_id\u003dfake.IMAGE_ID)"},{"line_number":650,"context_line":"        glance_get.assert_called_once_with(ctxt, fake.IMAGE_ID)"},{"line_number":651,"context_line":"        image_service.show.assert_called_once_with(ctxt, fake.IMAGE_ID)"},{"line_number":652,"context_line":"        self.assertIn(\u0027cirros\u0027, fake_out.getvalue())"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"    @mock.patch(\u0027cinder.cmd.manage.glance.get_remote_image_service\u0027)"},{"line_number":655,"context_line":"    @mock.patch(\u0027cinder.cmd.manage.db.image_volume_cache_get_all\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7c604e15_998a805c","line":652,"updated":"2026-11-11 15:27:34.000000000","message":"Nit: `assertIn(\u0027cirros\u0027, ...)` is the only output check here, and 679-680 and 705-706 are substring checks too, so column order, the headers and the timestamp formatting at `manage.py:1259-1277` are unverified; every entry has `\u0027last_used\u0027: None` (639, 668, 691) so `_normalize_time` never sees a datetime, and at 698 the `(mock.Mock(), fake.IMAGE_ID)` return makes that test\u0027s Name cell a Mock repr. The existing list tests in this file (1124-1165, 1231-1268) assert the whole tabulate output; please do the same here with a real datetime and a `show` returning `{\u0027name\u0027: \u0027cirros\u0027}`.","commit_id":"ea773cb2ec2c17e867cd33a558c79cfb94cc9468"}],"cinder/volume/manager.py":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"01996490b2a57adefddb3cb3f4e084033895662a","unresolved":true,"context_lines":[{"line_number":5757,"context_line":"            # Some errors carry no message, e.g. StopIteration when no Glance"},{"line_number":5758,"context_line":"            # endpoint is configured."},{"line_number":5759,"context_line":"            return None, image_id, None, ("},{"line_number":5760,"context_line":"                \u0027failed to fetch image metadata: %s\u0027 %"},{"line_number":5761,"context_line":"                (str(e) or type(e).__name__))"},{"line_number":5762,"context_line":""},{"line_number":5763,"context_line":"        # A user create refuses such an image in the API"}],"source_content_type":"text/x-python","patch_set":15,"id":"5b3eb63e_4caa068e","line":5760,"updated":"2026-11-11 15:27:34.000000000","message":"The comment at 5757 names the cause but the operator never sees it: with `[DEFAULT] glance_api_servers` unset, `get_api_servers` falls back to `context.service_catalog`, which is `[]` for the internal-tenant context (`context.py:135`), so `glance.py:253` `next(self.api_servers)` raises a bare `StopIteration` and `warm` prints `reason\u003dfailed to fetch image metadata: StopIteration`, which `test_volume_manager.py:102` pins. Please add an `except StopIteration` before this generic handler returning a reason such as \"[DEFAULT] glance_api_servers is not set; the internal-tenant context has no service catalog\", and have `list` print the same one-line hint once when its first lookup raises it at `manage.py:1256`, rather than only `\u003cnot found\u003e`.","commit_id":"ea773cb2ec2c17e867cd33a558c79cfb94cc9468"}],"doc/source/cli/cinder-manage.rst":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"01996490b2a57adefddb3cb3f4e084033895662a","unresolved":true,"context_lines":[{"line_number":186,"context_line":"required and names the pool as ``openstack volume backend pool list`` shows"},{"line_number":187,"context_line":"it: ``host@backend#pool``, or ``cluster@backend#pool`` for a clustered"},{"line_number":188,"context_line":"backend. Unless a cache entry for the image is found, it creates a temporary"},{"line_number":189,"context_line":"volume of ``--volume-type`` (the backend\u0027s ``default_volume_type`` by default)"},{"line_number":190,"context_line":"from the image on the pool, through which the normal create path records the"},{"line_number":191,"context_line":"cache entry, and then deletes the temporary volume. ``--timeout`` sets how long"},{"line_number":192,"context_line":"to wait for the result, 600 seconds by default."}],"source_content_type":"text/x-rst","patch_set":15,"id":"85a6ca42_e813677b","line":189,"updated":"2026-11-11 15:27:34.000000000","message":"Nit: \"the backend\u0027s `default_volume_type`\" reads as a per-backend option, and the admin guide says the same at `image-volume-cache.rst:135` right after explaining that the cache options can be scoped per back end. The handler reads `CONF.default_volume_type` from `[DEFAULT]` (`manager.py:5783`), so a line under `[backend]` is silently ignored. Please write \"the `[DEFAULT] default_volume_type` of the cinder-volume service that handles the pool\" in both places, as the release note and the help text already do.","commit_id":"ea773cb2ec2c17e867cd33a558c79cfb94cc9468"}],"releasenotes/notes/image-cache-management-cli-0b04be8c0388d323.yaml":[{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"01996490b2a57adefddb3cb3f4e084033895662a","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":"    A new ``cinder-manage image-cache`` category has been added with two"},{"line_number":5,"context_line":"    actions, ``warm`` and ``list``. The ``warm`` action asks a cinder-volume"},{"line_number":6,"context_line":"    backend to pre-populate the image-volume cache of one pool for a given"},{"line_number":7,"context_line":"    image and waits for the result, so that operators can avoid the"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"65631591_a5313793","line":4,"updated":"2026-11-11 15:27:34.000000000","message":"Nit, no vote impact: at 47 lines this is a CLI reference rather than a release note, and 18-23 repeat `cinder-manage.rst:197-203` nearly word for word. Please trim the features entry to one paragraph (new `image-cache` category, `warm` pre-populates one pool given as `--host host@backend#pool` with exit 0/1/2, `list` shows entries with Glance names, pointer to the cinder-manage docs) and the upgrade section to one paragraph on the mixed-version `failed` result and the `[glance]` credentials plus `glance_api_servers` requirement; the RPC version sentence can go.","commit_id":"ea773cb2ec2c17e867cd33a558c79cfb94cc9468"}]}
