)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"e8aad3821ccb7743c7a4c23a8459f7ef73fc0355","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"53d67f31_2d9d44fd","updated":"2025-07-27 21:59:45.000000000","message":"Commenting for internal reference:\n\nI\u0027ve spent a while looking into implementing \u0027share create --backup-id\u0027 and have\nstruggled for a couple of reasons:\n\n\u0027share create\u0027 is a command that is (eventually) performed by the share_manager of manila with its create_share_instance method. The share_manager implements its own backup call wrappers that are in turn actually implemented by the share_driver currently being used by the service. \n\nWhen we work via the share backup api e.g. \u0027share backup \u003ccommand\u003e\u0027 we work primarily with the manila data manager which implements share backup via backup drivers. within the share backup API we handle this division of backup workflows between the share manager (share driver) and data manager (backup driver) gracefully by using the \u0027TOPIC\u0027 field of a given backup to determine where it is appropriate to make an RPC call for the operation.\n\nHowever, because \u0027share_create\u0027 is allways routed to the share manager, we are forced to perform the restore from within its scope. This is partially fine, as the share_manager imports the data managers rpc api as  \u0027data_rpcapi\u0027 for passing off calls if needed.\n\nat the moment, data_rpcapi is used once within the share_manager, namely for the migration of a share to a different destination host in the function \u0027_migration_start_host_assisted\u0027\n\nThe main problem in my mind is that currently, the share_manager doesn\u0027t have a proper way to deffer a share backup API operation to the data_manager from the context of calls that have rightfully been served to itself.\n\nIn practice, it would be possible to only modify the \u0027create_share_instance\u0027 function of the share_manager to perform a data_manager driven restore via data_rpcapi, but this is a short sighted approach.\n\nRather I think further work to allow the share_manager to also expose the data managers  backup calls alongside its own internal backup methods (similar to how backup[\u0027topic\u0027] is used) is perhaps better? e.g:\n\nrestore_backup within the share manager should allow driver driven restores:\n\tself.driver.restore_backup(context, backup, share_instance, share_server\u003dshare_server)\nand also deferal to the data manger:\n\tself.data_rpc.restore_backup(context, backup, share_instance)\n\nthis would have implications for more then just a share backup restore clearly however and encompasses further work then perhaps I predicted when writing the intial specification for targeted restores.\n\nWith this in mind, I have cut the implementation for this from the feature for now and propose that restore upon share creation should be explored outside of this effort, so that the points I have raised and their implications can be better discussed, without blocking the implementation of targeted restores within the data_manager.","commit_id":"da56169da010b1217deae9929614166e50202013"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"ea2711beca61642085caec598b348b974604e297","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"9553abe6_38046aec","in_reply_to":"53d67f31_2d9d44fd","updated":"2025-08-17 16:18:04.000000000","message":"Done","commit_id":"da56169da010b1217deae9929614166e50202013"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"83bd7df247daf08cf718c4931e0f385f112f8a01","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3d24d67c_7059e5bf","updated":"2025-07-28 08:38:50.000000000","message":"run Pure Storage CI","commit_id":"f6a720e46bb5f70655fe3457601b386142a5bda4"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"6c331c948ef6fade4dc8a3efc75a598b49cffd1a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"50e17811_b4323211","updated":"2025-07-28 10:51:59.000000000","message":"run Pure Storage CI","commit_id":"f6a720e46bb5f70655fe3457601b386142a5bda4"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"0b1bd9128ebf0c92fe48086bbd1c780586f874d9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"beb3ebc2_3986e96c","updated":"2025-07-28 10:08:04.000000000","message":"run Pure Storage CI","commit_id":"f6a720e46bb5f70655fe3457601b386142a5bda4"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"a0d9d566689e3c6f85cabaa8768c3b05fdde7696","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"da2ab3ed_55723588","updated":"2025-07-28 07:20:47.000000000","message":"run Pure Storage CI","commit_id":"f6a720e46bb5f70655fe3457601b386142a5bda4"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"75e293fec3a9975cf90068d7413677ce72ae6c42","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"fc38fef8_36a57892","updated":"2025-07-28 06:10:16.000000000","message":"run Pure Storage CI","commit_id":"f6a720e46bb5f70655fe3457601b386142a5bda4"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"f562a0c61c9cc26379356ba4b20d9937929a9bcc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"21d17f7a_ff7c2a21","updated":"2025-07-28 11:56:37.000000000","message":"run Pure Storage CI","commit_id":"423c7a72cb2ce1a6d9ec696547762987ba1e6d1b"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"d5ab6daedd8f9b07ec108eb0cd5647290ccb789b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"912456f8_0f258dd9","updated":"2025-07-28 11:52:26.000000000","message":"run Pure Storage CI","commit_id":"423c7a72cb2ce1a6d9ec696547762987ba1e6d1b"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"10fc8ecf5aa9c9572dd55035741b983397a204ad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"027577c3_eccb61a0","updated":"2025-07-29 08:35:30.000000000","message":"run Pure Storage CI","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"0a85b0852218816298c9f412f378a78f09376869","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8021e649_cecbb0c5","updated":"2025-07-29 06:37:40.000000000","message":"run Pure Storage CI","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"00a5eb473309593a607b39a7260fc819b7b79e89","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"ae96413f_f9b9cd37","updated":"2025-07-29 07:16:18.000000000","message":"run Pure Storage CI","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"407bf61e46ec0cbedb7edc342106e84ff09054c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"06fbfabe_4099c72c","updated":"2025-07-29 15:47:41.000000000","message":"run Pure Storage CI","commit_id":"e8877e75dc18ad092f6cf2bcbbfeb21379038046"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"e703837586863518846d50cbb5d6e9d6840f1a4d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"0eacea89_9a42e459","updated":"2025-07-29 14:53:36.000000000","message":"run Pure Storage CI","commit_id":"e8877e75dc18ad092f6cf2bcbbfeb21379038046"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"1f9811df58de64a2a0278afb06580af2ff81fce5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"61150d40_687e240b","updated":"2025-07-29 13:05:21.000000000","message":"run Pure Storage CI","commit_id":"e8877e75dc18ad092f6cf2bcbbfeb21379038046"},{"author":{"_account_id":35316,"name":"Keerthivasan S","email":"ksuresh@purestorage.com","username":"keerthivasan"},"change_message_id":"4a6d97ce78b4449ff0a3f0066f9f3b5c3198b750","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"e6609679_bb30267c","updated":"2025-07-29 13:44:54.000000000","message":"run Pure Storage CI","commit_id":"e8877e75dc18ad092f6cf2bcbbfeb21379038046"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"e5ffa528_08e950ab","updated":"2025-08-14 04:58:36.000000000","message":"Hi Zac, thank you for your patience with the reviews and the great collab review session. Please see some comments inline","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"cbe203d564246a148f01f27f03e7bf750437321b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"8f941568_70ea319a","updated":"2025-08-14 20:56:14.000000000","message":"Thanks for the changes, some more comments inline","commit_id":"e123ac55fc06d9ed6e4fd65e9d103c0dd1441fdc"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a06d6582b1e1e02e6f16cefd8903ab85e1bf4b28","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"46d36bb7_e978f8fe","updated":"2025-08-27 22:19:18.000000000","message":"Hi @zachary.goggin@cern.ch: ty for the updates, we merged share encryption APIs, and now this change is in merge conflict. Could you rebase it?","commit_id":"a57822b8546f2401d01807b383ec67b6bee2344e"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"63dadde7b8eeee19e569143c59c9ce1bd4c5f8d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"15d70d41_748c0727","updated":"2025-08-26 19:12:10.000000000","message":"recheck\nLVM job had a post failure","commit_id":"a57822b8546f2401d01807b383ec67b6bee2344e"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"d6f5a647d78b73948c93acbe7b4616003b1d56f6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"9d26199a_64d85b9f","updated":"2025-08-28 18:45:11.000000000","message":"LGTM, but for the issue with the release note. Please post another change fixing the release note if this merges. \n\nTesting for this patch can continue beyond the feature freeze deadline, I don\u0027t anticipate API changes - in the rare case there are, Backup APIs are experimental - so this is acceptable with their stage of development.\n\nThank you for working on this Zac! I hope to be able to enable both NFS and CBACK tests in the CI soon","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"7acbcfa9cd8c81b8ae56d5615cbb1af7766a731a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"6847d599_16ea0427","updated":"2025-08-28 18:59:22.000000000","message":"LGTM, thanks for working on this change, Zach. I have one comment inline that should be addressed otherwise the version\u0027s won\u0027t match 100%. Great job and thank you for your commitment to this change!","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"b94d092b9390ad09b2674a07b67280a27ec84458","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"5c31a2d1_35179774","updated":"2025-08-28 19:06:44.000000000","message":"Let\u0027s get this in. Please fix both mine and Goutham\u0027s comments as soon as you have a chance, otherwise people using share backups with API version 2.90 will get a 404.","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"ddfd185e7bf1f28bdb6a30af3459711d5b1a425f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"4f499463_08ce2511","in_reply_to":"5c31a2d1_35179774","updated":"2025-08-28 19:38:17.000000000","message":"Acknowledged, I will prep a change with these two fixes if the gate jobs pass, or otherwise prep them here.\n\nI\u0027d just like to say thanks to both of you once more for your time and support. It certainly wouldn\u0027t of made its way in without your guidance.\n\nThanks!\nZac.","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"}],"manila/api/openstack/api_version_request.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a06d6582b1e1e02e6f16cefd8903ab85e1bf4b28","unresolved":true,"context_lines":[{"line_number":215,"context_line":"# The default api version request is defined to be the"},{"line_number":216,"context_line":"# minimum version of the API supported."},{"line_number":217,"context_line":"_MIN_API_VERSION \u003d \"2.0\""},{"line_number":218,"context_line":"_MAX_API_VERSION \u003d \"2.90\""},{"line_number":219,"context_line":"DEFAULT_API_VERSION \u003d _MIN_API_VERSION"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ba57cf41_a0f9abef","line":218,"range":{"start_line":218,"start_character":20,"end_line":218,"end_character":24},"updated":"2025-08-27 22:19:18.000000000","message":"2.91 after rebasing this change on master","commit_id":"a57822b8546f2401d01807b383ec67b6bee2344e"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"3160b70814cf11b875d95d2d3e0e7c7c3a523556","unresolved":false,"context_lines":[{"line_number":215,"context_line":"# The default api version request is defined to be the"},{"line_number":216,"context_line":"# minimum version of the API supported."},{"line_number":217,"context_line":"_MIN_API_VERSION \u003d \"2.0\""},{"line_number":218,"context_line":"_MAX_API_VERSION \u003d \"2.90\""},{"line_number":219,"context_line":"DEFAULT_API_VERSION \u003d _MIN_API_VERSION"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"79318179_46aabe2f","line":218,"range":{"start_line":218,"start_character":20,"end_line":218,"end_character":24},"in_reply_to":"ba57cf41_a0f9abef","updated":"2025-08-28 10:18:17.000000000","message":"Done.","commit_id":"a57822b8546f2401d01807b383ec67b6bee2344e"}],"manila/api/v2/share_backups.py":[{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"1989e2acfa5c4b3d3ab474a2ac03a29a109c7e0e","unresolved":true,"context_lines":[{"line_number":211,"context_line":"        target_share \u003d None"},{"line_number":212,"context_line":"        if target_share_id:"},{"line_number":213,"context_line":"            try:"},{"line_number":214,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"},{"line_number":215,"context_line":"            except exception.ShareNotFound:"},{"line_number":216,"context_line":"                msg \u003d _(\"No share exists with ID %s.\")"},{"line_number":217,"context_line":"                raise exc.HTTPNotFound(explanation\u003dmsg % target_share_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"cd2218a1_4341f89d","line":214,"updated":"2025-07-29 07:30:43.000000000","message":"Maybe it would be better to only pass the target share ID from the\nshare backup API to the share API, and let the share be fetched there\ninstead?\n\nBoth can do it, just a case of which is easier to read.","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":true,"context_lines":[{"line_number":211,"context_line":"        target_share \u003d None"},{"line_number":212,"context_line":"        if target_share_id:"},{"line_number":213,"context_line":"            try:"},{"line_number":214,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"},{"line_number":215,"context_line":"            except exception.ShareNotFound:"},{"line_number":216,"context_line":"                msg \u003d _(\"No share exists with ID %s.\")"},{"line_number":217,"context_line":"                raise exc.HTTPNotFound(explanation\u003dmsg % target_share_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"dd6f37a7_17181bb6","line":214,"in_reply_to":"cd2218a1_4341f89d","updated":"2025-08-14 04:58:36.000000000","message":"yes; the share_api\u0027s \"get\" method [1] has RBAC checks - i.e., does the user have permission to fetch the share... retrieving it directly from the DB would bypass such checks.\n\nhttps://opendev.org/openstack/manila/src/commit/0c4e0d03bb7299559b4fa4b91992b280531a78ac/manila/share/api.py#L2299-L2314","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        target_share \u003d None"},{"line_number":212,"context_line":"        if target_share_id:"},{"line_number":213,"context_line":"            try:"},{"line_number":214,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"},{"line_number":215,"context_line":"            except exception.ShareNotFound:"},{"line_number":216,"context_line":"                msg \u003d _(\"No share exists with ID %s.\")"},{"line_number":217,"context_line":"                raise exc.HTTPNotFound(explanation\u003dmsg % target_share_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ecc44901_c00bab77","line":214,"in_reply_to":"dd6f37a7_17181bb6","updated":"2025-08-14 16:29:34.000000000","message":"Done","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        target_share \u003d None"},{"line_number":212,"context_line":"        if target_share_id:"},{"line_number":213,"context_line":"            try:"},{"line_number":214,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"},{"line_number":215,"context_line":"            except exception.ShareNotFound:"},{"line_number":216,"context_line":"                msg \u003d _(\"No share exists with ID %s.\")"},{"line_number":217,"context_line":"                raise exc.HTTPNotFound(explanation\u003dmsg % target_share_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"ee22bbe0_27767a16","line":214,"in_reply_to":"dd6f37a7_17181bb6","updated":"2025-08-14 16:29:34.000000000","message":"Done","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":true,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    @wsgi.Controller.api_version(MIN_SUPPORTED_API_VERSION, experimental\u003dTrue)"},{"line_number":200,"context_line":"    @wsgi.action(\u0027restore\u0027)"},{"line_number":201,"context_line":"    @wsgi.Controller.authorize"},{"line_number":202,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":14,"id":"2f561774_c4018676","line":199,"range":{"start_line":199,"start_character":59,"end_line":199,"end_character":60},"updated":"2025-08-14 04:58:36.000000000","message":"add \u00272.89\u0027 here\n```suggestion\n    @wsgi.Controller.api_version(MIN_SUPPORTED_API_VERSION, \u00272.89\u0027, experimental\u003dTrue)\n```","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":false,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        return webob.Response(status_int\u003d202)"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    @wsgi.Controller.api_version(MIN_SUPPORTED_API_VERSION, experimental\u003dTrue)"},{"line_number":200,"context_line":"    @wsgi.action(\u0027restore\u0027)"},{"line_number":201,"context_line":"    @wsgi.Controller.authorize"},{"line_number":202,"context_line":"    @wsgi.response(202)"}],"source_content_type":"text/x-python","patch_set":14,"id":"60daa303_53f48f7b","line":199,"range":{"start_line":199,"start_character":59,"end_line":199,"end_character":60},"in_reply_to":"2f561774_c4018676","updated":"2025-08-14 16:29:34.000000000","message":"Done","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":true,"context_lines":[{"line_number":227,"context_line":"        \"\"\"Restore an existing backup to a share.\"\"\""},{"line_number":228,"context_line":"        context \u003d req.environ[\u0027manila.context\u0027]"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        target_share_id \u003d None"},{"line_number":231,"context_line":"        if body:"},{"line_number":232,"context_line":"            target_share_id \u003d body.get(\u0027restore\u0027)"},{"line_number":233,"context_line":"        target_share \u003d None"},{"line_number":234,"context_line":"        if target_share_id:"},{"line_number":235,"context_line":"            try:"},{"line_number":236,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"d445c841_cb000b92","line":233,"range":{"start_line":230,"start_character":8,"end_line":233,"end_character":0},"updated":"2025-08-14 04:58:36.000000000","message":"Can you de-duplicate the code between these two restore methods.. i.e., extract common parts into a different method that you can call from the top level \"restore\" methods.","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"cbe203d564246a148f01f27f03e7bf750437321b","unresolved":true,"context_lines":[{"line_number":227,"context_line":"        \"\"\"Restore an existing backup to a share.\"\"\""},{"line_number":228,"context_line":"        context \u003d req.environ[\u0027manila.context\u0027]"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        target_share_id \u003d None"},{"line_number":231,"context_line":"        if body:"},{"line_number":232,"context_line":"            target_share_id \u003d body.get(\u0027restore\u0027)"},{"line_number":233,"context_line":"        target_share \u003d None"},{"line_number":234,"context_line":"        if target_share_id:"},{"line_number":235,"context_line":"            try:"},{"line_number":236,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"5b1b4222_84cdbb92","line":233,"range":{"start_line":230,"start_character":8,"end_line":233,"end_character":0},"in_reply_to":"027ef0c6_8f851979","updated":"2025-08-14 20:56:14.000000000","message":"Try something like this:\n\n```\ndef _restore(self, req, id, body):\n    \"\"\"Common logic for the restore API methods.\"\"\"\n    context \u003d req.environ[\u0027manila.context\u0027]\n    try:\n        backup \u003d db.share_backup_get(context, id)\n    except exception.ShareBackupNotFound:\n        msg \u003d \"No backup exists with ID %s.\" % id\n        raise exc.HTTPNotFound(explanation\u003dmsg)\n\n    target_share_id \u003d None\n    if body and \u0027restore\u0027 in body:\n        target_share_id \u003d body.get(\u0027restore\u0027)\n\n    try:\n        restored \u003d self.share_api.restore_share_backup(\n            context, backup, target_share_id)\n    except (exception.InvalidShare, exception.InvalidBackup) as e:\n        raise exc.HTTPBadRequest(explanation\u003de.msg)\n\n    return self._view_builder.restore_summary(req, restored)\n\n@wsgi.Controller.api_version(MIN_SUPPORTED_API_VERSION, \u00272.89\u0027,\n                             experimental\u003dTrue)\n@wsgi.action(\u0027restore\u0027)\n@wsgi.Controller.authorize\n@wsgi.response(202)\ndef restore(self, req, id, body):\n    return self._restore(req, id, None)\n\n@wsgi.Controller.api_version(\u00272.90\u0027, experimental\u003dTrue)\n@wsgi.action(\u0027restore\u0027)\n@wsgi.Controller.authorize\n@wsgi.response(202)\ndef restore(self, req, id, body):  # noqa F811\n    \"\"\"Allows restoring to a target share.\"\"\"\n    return self._restore(req, id, body)\n\n```\n\nAlso notice, ShareBackupNotFound must raise HTTPNotFound because the backup ID is in the path.","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"ea2711beca61642085caec598b348b974604e297","unresolved":false,"context_lines":[{"line_number":227,"context_line":"        \"\"\"Restore an existing backup to a share.\"\"\""},{"line_number":228,"context_line":"        context \u003d req.environ[\u0027manila.context\u0027]"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        target_share_id \u003d None"},{"line_number":231,"context_line":"        if body:"},{"line_number":232,"context_line":"            target_share_id \u003d body.get(\u0027restore\u0027)"},{"line_number":233,"context_line":"        target_share \u003d None"},{"line_number":234,"context_line":"        if target_share_id:"},{"line_number":235,"context_line":"            try:"},{"line_number":236,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"0f8bbcf7_56b29be8","line":233,"range":{"start_line":230,"start_character":8,"end_line":233,"end_character":0},"in_reply_to":"5b1b4222_84cdbb92","updated":"2025-08-17 16:18:04.000000000","message":"Done, And understood, thanks for the advice! will use it for future reference.","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":true,"context_lines":[{"line_number":227,"context_line":"        \"\"\"Restore an existing backup to a share.\"\"\""},{"line_number":228,"context_line":"        context \u003d req.environ[\u0027manila.context\u0027]"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        target_share_id \u003d None"},{"line_number":231,"context_line":"        if body:"},{"line_number":232,"context_line":"            target_share_id \u003d body.get(\u0027restore\u0027)"},{"line_number":233,"context_line":"        target_share \u003d None"},{"line_number":234,"context_line":"        if target_share_id:"},{"line_number":235,"context_line":"            try:"},{"line_number":236,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"027ef0c6_8f851979","line":233,"range":{"start_line":230,"start_character":8,"end_line":233,"end_character":0},"in_reply_to":"d445c841_cb000b92","updated":"2025-08-14 16:29:34.000000000","message":"~Done, let me know if this is sufficient, I have left the error catching and return as it seems excessive to split these into a tiny function.","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":true,"context_lines":[{"line_number":236,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"},{"line_number":237,"context_line":"            except exception.ShareNotFound:"},{"line_number":238,"context_line":"                msg \u003d _(\"No share exists with ID %s.\")"},{"line_number":239,"context_line":"                raise exc.HTTPNotFound(explanation\u003dmsg % target_share_id)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        try:"},{"line_number":242,"context_line":"            backup \u003d db.share_backup_get(context, id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3e13a070_ba2a8169","line":239,"range":{"start_line":239,"start_character":26,"end_line":239,"end_character":38},"updated":"2025-08-14 04:58:36.000000000","message":"HTTPBadRequest ; the share\u0027s UUID isn\u0027t in the URL... so it\u0027d be inappropriate to respond with 404","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":false,"context_lines":[{"line_number":236,"context_line":"                target_share \u003d db.share_get(context, target_share_id)"},{"line_number":237,"context_line":"            except exception.ShareNotFound:"},{"line_number":238,"context_line":"                msg \u003d _(\"No share exists with ID %s.\")"},{"line_number":239,"context_line":"                raise exc.HTTPNotFound(explanation\u003dmsg % target_share_id)"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        try:"},{"line_number":242,"context_line":"            backup \u003d db.share_backup_get(context, id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9458a517_53b55039","line":239,"range":{"start_line":239,"start_character":26,"end_line":239,"end_character":38},"in_reply_to":"3e13a070_ba2a8169","updated":"2025-08-14 16:29:34.000000000","message":"Done","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":29632,"name":"Carlos Eduardo","email":"ces.eduardo98@gmail.com","username":"silvacarlos"},"change_message_id":"7acbcfa9cd8c81b8ae56d5615cbb1af7766a731a","unresolved":true,"context_lines":[{"line_number":218,"context_line":"        retval \u003d self._view_builder.restore_summary(req, restored)"},{"line_number":219,"context_line":"        return retval"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    @wsgi.Controller.api_version(MIN_SUPPORTED_API_VERSION, \u00272.89\u0027,"},{"line_number":222,"context_line":"                                 experimental\u003dTrue)"},{"line_number":223,"context_line":"    @wsgi.action(\u0027restore\u0027)"},{"line_number":224,"context_line":"    @wsgi.Controller.authorize"}],"source_content_type":"text/x-python","patch_set":17,"id":"04b0bb87_7418b98b","line":221,"range":{"start_line":221,"start_character":63,"end_line":221,"end_character":65},"updated":"2025-08-28 18:59:22.000000000","message":"2.90","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"ddfd185e7bf1f28bdb6a30af3459711d5b1a425f","unresolved":true,"context_lines":[{"line_number":218,"context_line":"        retval \u003d self._view_builder.restore_summary(req, restored)"},{"line_number":219,"context_line":"        return retval"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    @wsgi.Controller.api_version(MIN_SUPPORTED_API_VERSION, \u00272.89\u0027,"},{"line_number":222,"context_line":"                                 experimental\u003dTrue)"},{"line_number":223,"context_line":"    @wsgi.action(\u0027restore\u0027)"},{"line_number":224,"context_line":"    @wsgi.Controller.authorize"}],"source_content_type":"text/x-python","patch_set":17,"id":"0e3fc406_a852e00c","line":221,"range":{"start_line":221,"start_character":63,"end_line":221,"end_character":65},"in_reply_to":"04b0bb87_7418b98b","updated":"2025-08-28 19:38:17.000000000","message":"Acknowledged","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"1ffb3adf0a7561e8686deb1ff92d62e360d10f98","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        retval \u003d self._view_builder.restore_summary(req, restored)"},{"line_number":219,"context_line":"        return retval"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    @wsgi.Controller.api_version(MIN_SUPPORTED_API_VERSION, \u00272.89\u0027,"},{"line_number":222,"context_line":"                                 experimental\u003dTrue)"},{"line_number":223,"context_line":"    @wsgi.action(\u0027restore\u0027)"},{"line_number":224,"context_line":"    @wsgi.Controller.authorize"}],"source_content_type":"text/x-python","patch_set":17,"id":"18844f96_6eeef320","line":221,"range":{"start_line":221,"start_character":63,"end_line":221,"end_character":65},"in_reply_to":"0e3fc406_a852e00c","updated":"2025-08-28 20:51:20.000000000","message":"Done - see https://review.opendev.org/c/openstack/manila/+/958813","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"}],"manila/data/backup_driver.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        # This flag indicates if backup driver implement backup, restore and"},{"line_number":25,"context_line":"        # delete operation by its own or uses data manager."},{"line_number":26,"context_line":"        self.use_data_manager \u003d True"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        # This flag indicates if the backup driver supports out of place"},{"line_number":29,"context_line":"        # restores to a share other then the source of a given backup."}],"source_content_type":"text/x-python","patch_set":14,"id":"e84ae08c_8cf44ac3","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":36},"updated":"2025-08-14 04:58:36.000000000","message":"this flag doesn\u0027t sound too good to me now, because we\u0027re having to end up sprinkling if..else conditions all over the place because of it. \n\nBackupDriver happens to be an abstract base class/parent class, it could simply implement the methods and the data manager, and an implementation in the child class (a real backup driver) can override it.","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a06d6582b1e1e02e6f16cefd8903ab85e1bf4b28","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        # This flag indicates if backup driver implement backup, restore and"},{"line_number":25,"context_line":"        # delete operation by its own or uses data manager."},{"line_number":26,"context_line":"        self.use_data_manager \u003d True"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        # This flag indicates if the backup driver supports out of place"},{"line_number":29,"context_line":"        # restores to a share other then the source of a given backup."}],"source_content_type":"text/x-python","patch_set":14,"id":"c9d633da_4fdb2bdd","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":36},"in_reply_to":"2fe45772_33a30b1e","updated":"2025-08-27 22:19:18.000000000","message":"i reported https://bugs.launchpad.net/manila/+bug/2121565 to do this refactor later","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"cbe203d564246a148f01f27f03e7bf750437321b","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        # This flag indicates if backup driver implement backup, restore and"},{"line_number":25,"context_line":"        # delete operation by its own or uses data manager."},{"line_number":26,"context_line":"        self.use_data_manager \u003d True"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        # This flag indicates if the backup driver supports out of place"},{"line_number":29,"context_line":"        # restores to a share other then the source of a given backup."}],"source_content_type":"text/x-python","patch_set":14,"id":"a2661645_ef45648b","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":36},"in_reply_to":"88b05ccb_64daf85e","updated":"2025-08-14 20:56:14.000000000","message":"\u003e one thing that comes to mind is in the case of a half implemented backup driver, or otherwise, one that only wants to support a subset of share backup driver methods.\n\nthat\u0027d be a perfect case for inheritance.. i.e., if something needs to be explicitly blocked, the driver could raise NotImplementedError for a specific method, or intentionally allow falling back to the base driver\u0027s implementation.. \n\nTry this.. if you think the code\u0027s getting too unwieldy, we make this refactor in a separate change","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"ea2711beca61642085caec598b348b974604e297","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        # This flag indicates if backup driver implement backup, restore and"},{"line_number":25,"context_line":"        # delete operation by its own or uses data manager."},{"line_number":26,"context_line":"        self.use_data_manager \u003d True"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        # This flag indicates if the backup driver supports out of place"},{"line_number":29,"context_line":"        # restores to a share other then the source of a given backup."}],"source_content_type":"text/x-python","patch_set":14,"id":"2fe45772_33a30b1e","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":36},"in_reply_to":"a2661645_ef45648b","updated":"2025-08-17 16:18:04.000000000","message":"Acknowledged","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"4df98d1af601fbfc555a03dcf36da3915c185684","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        # This flag indicates if backup driver implement backup, restore and"},{"line_number":25,"context_line":"        # delete operation by its own or uses data manager."},{"line_number":26,"context_line":"        self.use_data_manager \u003d True"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        # This flag indicates if the backup driver supports out of place"},{"line_number":29,"context_line":"        # restores to a share other then the source of a given backup."}],"source_content_type":"text/x-python","patch_set":14,"id":"55b09cd1_f6a8811a","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":36},"in_reply_to":"c9d633da_4fdb2bdd","updated":"2025-08-28 09:16:18.000000000","message":"Apologies for the delay, I thought I responded to this specific comment last friday.\n\nIndeed, as mentioned in the weekly meeting, I struggled to do this refactor because the methods in the data manager itself are inherent to the DM \"backup drivers\" implementation and are called at positions that make extracting the non DM reliant structure into the base backup driver class tricky.  \n\nThe two options I thought of were to bring the base BackupDriver class inside the DM, or, to make further helper functions within the DM that can be exported but I\u0027m not a great fan of either approach, it would be nice to keep the isolation between the two classes and I\u0027m not sure it makes sense to tear these out of the DM just to reimport a bunch of things... maybe the latter makes more sense.\n\nI will resolve for now, but if you would like me to re-evaluate this bug later happy to do so.","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"        # This flag indicates if backup driver implement backup, restore and"},{"line_number":25,"context_line":"        # delete operation by its own or uses data manager."},{"line_number":26,"context_line":"        self.use_data_manager \u003d True"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"        # This flag indicates if the backup driver supports out of place"},{"line_number":29,"context_line":"        # restores to a share other then the source of a given backup."}],"source_content_type":"text/x-python","patch_set":14,"id":"88b05ccb_64daf85e","line":26,"range":{"start_line":26,"start_character":8,"end_line":26,"end_character":36},"in_reply_to":"e84ae08c_8cf44ac3","updated":"2025-08-14 16:29:34.000000000","message":"Understood, I agree that its a cleaner to have the one call per method in the data_manager, given we add further flags maybe it becomes harder to maintain with the approach I have commited.\n\none thing that comes to mind is in the case of a half implemented backup driver, or otherwise, one that only wants to support a subset of share backup driver methods.\n\nPerhaps this is unlikely but could this cause unexpected behaviour by defaulting to the data manager implementation? I think the likelihood of only implementing a portion of the methods is small.\n\nLet me know if you think thats cause for concern, but otherwise I will drop the flag for now and move the data_managers internal methods into the base class, and change this logic such that we override the methods instead of using the flag.","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"}],"manila/data/manager.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":true,"context_lines":[{"line_number":642,"context_line":"                    \" for targeted restores\") % ("},{"line_number":643,"context_line":"                        {\u0027backup\u0027: backup[\u0027id\u0027], \u0027share\u0027: share[\u0027id\u0027]}"},{"line_number":644,"context_line":"                )"},{"line_number":645,"context_line":"            LOG.exception(msg)"},{"line_number":646,"context_line":"            raise exception.BackupException(reason\u003dmsg)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        try:"},{"line_number":649,"context_line":"            if self.backup_driver.use_data_manager is False:"}],"source_content_type":"text/x-python","patch_set":14,"id":"323c90a9_e86270db","line":646,"range":{"start_line":645,"start_character":12,"end_line":646,"end_character":55},"updated":"2025-08-14 04:58:36.000000000","message":"put lines 638-647 in the try..except block below so that the exception handling will take care of updating the statuses of the resources properly..","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":false,"context_lines":[{"line_number":642,"context_line":"                    \" for targeted restores\") % ("},{"line_number":643,"context_line":"                        {\u0027backup\u0027: backup[\u0027id\u0027], \u0027share\u0027: share[\u0027id\u0027]}"},{"line_number":644,"context_line":"                )"},{"line_number":645,"context_line":"            LOG.exception(msg)"},{"line_number":646,"context_line":"            raise exception.BackupException(reason\u003dmsg)"},{"line_number":647,"context_line":""},{"line_number":648,"context_line":"        try:"},{"line_number":649,"context_line":"            if self.backup_driver.use_data_manager is False:"}],"source_content_type":"text/x-python","patch_set":14,"id":"5d6d33ab_c53f41ff","line":646,"range":{"start_line":645,"start_character":12,"end_line":646,"end_character":55},"in_reply_to":"323c90a9_e86270db","updated":"2025-08-14 16:29:34.000000000","message":"Done","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"5f8b00dc44e736c8bde2d41953434061403ed8cd","unresolved":true,"context_lines":[{"line_number":446,"context_line":"                else:"},{"line_number":447,"context_line":"                    result \u003d self.data_copy_get_progress(context, share_id)"},{"line_number":448,"context_line":"                    progress \u003d result.get(\u0027total_progress\u0027, \u00270\u0027)"},{"line_number":449,"context_line":"                    backup_values \u003d {\u0027progress\u0027: progress}"},{"line_number":450,"context_line":"                    if progress \u003d\u003d \u0027100\u0027:"},{"line_number":451,"context_line":"                        self.db.share_update("},{"line_number":452,"context_line":"                            context, share_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"eb140cd6_3181ae06","line":449,"updated":"2025-09-24 12:13:57.000000000","message":"backup_values and bellow should be common to both a \nexternal driver and the data manager, not the data manager solely.\n\notherwise we never update the progress of a backup ran by a external driver.","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"59d973900152e06f2bdd35ef45cee23407fa9f5a","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                else:"},{"line_number":447,"context_line":"                    result \u003d self.data_copy_get_progress(context, share_id)"},{"line_number":448,"context_line":"                    progress \u003d result.get(\u0027total_progress\u0027, \u00270\u0027)"},{"line_number":449,"context_line":"                    backup_values \u003d {\u0027progress\u0027: progress}"},{"line_number":450,"context_line":"                    if progress \u003d\u003d \u0027100\u0027:"},{"line_number":451,"context_line":"                        self.db.share_update("},{"line_number":452,"context_line":"                            context, share_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"6afe798f_fed85b05","line":449,"in_reply_to":"eb140cd6_3181ae06","updated":"2025-09-24 12:37:27.000000000","message":"Done: resolved by https://review.opendev.org/c/openstack/manila/+/962182","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"5f8b00dc44e736c8bde2d41953434061403ed8cd","unresolved":true,"context_lines":[{"line_number":701,"context_line":"                    else:"},{"line_number":702,"context_line":"                        result \u003d self.data_copy_get_progress(context, share_id)"},{"line_number":703,"context_line":"                        progress \u003d result.get(\u0027total_progress\u0027, \u00270\u0027)"},{"line_number":704,"context_line":"                        backup_values \u003d {\u0027restore_progress\u0027: progress}"},{"line_number":705,"context_line":"                        if progress \u003d\u003d \u0027100\u0027:"},{"line_number":706,"context_line":"                            self.db.share_update("},{"line_number":707,"context_line":"                                context, share_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"d9dd1ade_5a40bead","line":704,"updated":"2025-09-24 12:13:57.000000000","message":"backup_values and bellow should be common to both a \nexternal driver and the data manager, not the data manager solely.\n\notherwise we never update the progress of a backup ran by a external driver.","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"59d973900152e06f2bdd35ef45cee23407fa9f5a","unresolved":false,"context_lines":[{"line_number":701,"context_line":"                    else:"},{"line_number":702,"context_line":"                        result \u003d self.data_copy_get_progress(context, share_id)"},{"line_number":703,"context_line":"                        progress \u003d result.get(\u0027total_progress\u0027, \u00270\u0027)"},{"line_number":704,"context_line":"                        backup_values \u003d {\u0027restore_progress\u0027: progress}"},{"line_number":705,"context_line":"                        if progress \u003d\u003d \u0027100\u0027:"},{"line_number":706,"context_line":"                            self.db.share_update("},{"line_number":707,"context_line":"                                context, share_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"326836c7_48881101","line":704,"in_reply_to":"d9dd1ade_5a40bead","updated":"2025-09-24 12:37:27.000000000","message":"Done: resolved by https://review.opendev.org/c/openstack/manila/+/962182","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"}],"manila/share/manager.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":true,"context_lines":[{"line_number":5506,"context_line":"        share \u003d self.db.share_get(context, share_id)"},{"line_number":5507,"context_line":"        share_instance \u003d self._get_share_instance(context, share)"},{"line_number":5508,"context_line":""},{"line_number":5509,"context_line":"        if (self.driver.restore_to_target_support is False and"},{"line_number":5510,"context_line":"                share_id !\u003d backup_share_id):"},{"line_number":5511,"context_line":"            msg \u003d _(\"Cannot restore backup %(backup)s to target share \""},{"line_number":5512,"context_line":"                    \"%(share)s as share driver does not provide support \""},{"line_number":5513,"context_line":"                    \" for targeted restores\") % ("},{"line_number":5514,"context_line":"                        {\u0027backup\u0027: backup_id, \u0027share\u0027: share_id}"},{"line_number":5515,"context_line":"                )"},{"line_number":5516,"context_line":"            LOG.exception(msg)"},{"line_number":5517,"context_line":"            raise exception.BackupException(reason\u003dmsg)"},{"line_number":5518,"context_line":""},{"line_number":5519,"context_line":"        try:"},{"line_number":5520,"context_line":"            share_server \u003d self._get_share_server(context, share_instance)"}],"source_content_type":"text/x-python","patch_set":14,"id":"f3ae1b83_a1ad2f25","line":5517,"range":{"start_line":5509,"start_character":7,"end_line":5517,"end_character":55},"updated":"2025-08-14 04:58:36.000000000","message":"same issue here as the data manager.. put this section into the try block below so statuses of resources can be set appropriately.","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":false,"context_lines":[{"line_number":5506,"context_line":"        share \u003d self.db.share_get(context, share_id)"},{"line_number":5507,"context_line":"        share_instance \u003d self._get_share_instance(context, share)"},{"line_number":5508,"context_line":""},{"line_number":5509,"context_line":"        if (self.driver.restore_to_target_support is False and"},{"line_number":5510,"context_line":"                share_id !\u003d backup_share_id):"},{"line_number":5511,"context_line":"            msg \u003d _(\"Cannot restore backup %(backup)s to target share \""},{"line_number":5512,"context_line":"                    \"%(share)s as share driver does not provide support \""},{"line_number":5513,"context_line":"                    \" for targeted restores\") % ("},{"line_number":5514,"context_line":"                        {\u0027backup\u0027: backup_id, \u0027share\u0027: share_id}"},{"line_number":5515,"context_line":"                )"},{"line_number":5516,"context_line":"            LOG.exception(msg)"},{"line_number":5517,"context_line":"            raise exception.BackupException(reason\u003dmsg)"},{"line_number":5518,"context_line":""},{"line_number":5519,"context_line":"        try:"},{"line_number":5520,"context_line":"            share_server \u003d self._get_share_server(context, share_instance)"}],"source_content_type":"text/x-python","patch_set":14,"id":"90cf23f6_f7317d13","line":5517,"range":{"start_line":5509,"start_character":7,"end_line":5517,"end_character":55},"in_reply_to":"f3ae1b83_a1ad2f25","updated":"2025-08-14 16:29:34.000000000","message":"Done","commit_id":"5bc4d593b55fa9280e3fcd65aed15cc7743edb8f"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a06d6582b1e1e02e6f16cefd8903ab85e1bf4b28","unresolved":true,"context_lines":[{"line_number":5515,"context_line":"                            {\u0027backup\u0027: backup_id, \u0027share\u0027: share_id}"},{"line_number":5516,"context_line":"                    )"},{"line_number":5517,"context_line":"                LOG.exception(msg)"},{"line_number":5518,"context_line":"                raise exception.BackupException(reason\u003dmsg)"},{"line_number":5519,"context_line":""},{"line_number":5520,"context_line":"            share_server \u003d self._get_share_server(context, share_instance)"},{"line_number":5521,"context_line":"            self.driver.restore_backup(context, backup, share_instance,"}],"source_content_type":"text/x-python","patch_set":16,"id":"fa0f0d84_02e1edf2","line":5518,"updated":"2025-08-27 22:19:18.000000000","message":"this should ideally result in an asynchronous user message: https://docs.openstack.org/manila/latest/contributor/user_messages.html","commit_id":"a57822b8546f2401d01807b383ec67b6bee2344e"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"3160b70814cf11b875d95d2d3e0e7c7c3a523556","unresolved":false,"context_lines":[{"line_number":5515,"context_line":"                            {\u0027backup\u0027: backup_id, \u0027share\u0027: share_id}"},{"line_number":5516,"context_line":"                    )"},{"line_number":5517,"context_line":"                LOG.exception(msg)"},{"line_number":5518,"context_line":"                raise exception.BackupException(reason\u003dmsg)"},{"line_number":5519,"context_line":""},{"line_number":5520,"context_line":"            share_server \u003d self._get_share_server(context, share_instance)"},{"line_number":5521,"context_line":"            self.driver.restore_backup(context, backup, share_instance,"}],"source_content_type":"text/x-python","patch_set":16,"id":"5159fcef_14d0e95e","line":5518,"in_reply_to":"fa0f0d84_02e1edf2","updated":"2025-08-28 10:18:17.000000000","message":"Done.","commit_id":"a57822b8546f2401d01807b383ec67b6bee2344e"}],"manila/tests/api/v2/test_share_backups.py":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"cbe203d564246a148f01f27f03e7bf750437321b","unresolved":true,"context_lines":[{"line_number":428,"context_line":"        self.mock_object(share.API, \u0027restore\u0027,"},{"line_number":429,"context_line":"                         mock.Mock(side_effect\u003dfake_exception))"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        self.assertRaises(exc.HTTPBadRequest,"},{"line_number":432,"context_line":"                          self.controller.restore,"},{"line_number":433,"context_line":"                          self.backups_req,"},{"line_number":434,"context_line":"                          \u0027FAKE_BACKUP_ID\u0027, body)"}],"source_content_type":"text/x-python","patch_set":15,"id":"11e54f9d_aac84442","line":431,"range":{"start_line":431,"start_character":30,"end_line":431,"end_character":44},"updated":"2025-08-14 20:56:14.000000000","message":"this should be NotFound..","commit_id":"e123ac55fc06d9ed6e4fd65e9d103c0dd1441fdc"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"ea2711beca61642085caec598b348b974604e297","unresolved":false,"context_lines":[{"line_number":428,"context_line":"        self.mock_object(share.API, \u0027restore\u0027,"},{"line_number":429,"context_line":"                         mock.Mock(side_effect\u003dfake_exception))"},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        self.assertRaises(exc.HTTPBadRequest,"},{"line_number":432,"context_line":"                          self.controller.restore,"},{"line_number":433,"context_line":"                          self.backups_req,"},{"line_number":434,"context_line":"                          \u0027FAKE_BACKUP_ID\u0027, body)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3e5045f5_190a5295","line":431,"range":{"start_line":431,"start_character":30,"end_line":431,"end_character":44},"in_reply_to":"11e54f9d_aac84442","updated":"2025-08-17 16:18:04.000000000","message":"Done","commit_id":"e123ac55fc06d9ed6e4fd65e9d103c0dd1441fdc"}],"manila/tests/data/test_manager.py":[{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"f47f8d900188e3fb5a3bb9b31e54bec9a2505b6c","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        self.share \u003d db_utils.create_share()"},{"line_number":51,"context_line":"        manager.CONF.set_default(\u0027mount_tmp_location\u0027, \u0027/tmp/\u0027)"},{"line_number":52,"context_line":"        manager.CONF.set_default(\u0027backup_mount_tmp_location\u0027, \u0027/tmp/\u0027)"},{"line_number":53,"context_line":"        # REVIEW: - zgoggin: If the intention bellow is to use the fake in the"},{"line_number":54,"context_line":"        # tests, this will not work, while the CONF value is set properly,"},{"line_number":55,"context_line":"        # the manager defaults/loads the NFS driver prior when instanced above."},{"line_number":56,"context_line":"        # This can be seen with print(vars(self.manager.backup_driver)) within"}],"source_content_type":"text/x-python","patch_set":6,"id":"92b6ed5c_0ea2a4ff","line":53,"updated":"2025-07-28 06:34:46.000000000","message":"highlighting for self and others.","commit_id":"da56169da010b1217deae9929614166e50202013"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"ea2711beca61642085caec598b348b974604e297","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.share \u003d db_utils.create_share()"},{"line_number":51,"context_line":"        manager.CONF.set_default(\u0027mount_tmp_location\u0027, \u0027/tmp/\u0027)"},{"line_number":52,"context_line":"        manager.CONF.set_default(\u0027backup_mount_tmp_location\u0027, \u0027/tmp/\u0027)"},{"line_number":53,"context_line":"        # REVIEW: - zgoggin: If the intention bellow is to use the fake in the"},{"line_number":54,"context_line":"        # tests, this will not work, while the CONF value is set properly,"},{"line_number":55,"context_line":"        # the manager defaults/loads the NFS driver prior when instanced above."},{"line_number":56,"context_line":"        # This can be seen with print(vars(self.manager.backup_driver)) within"}],"source_content_type":"text/x-python","patch_set":6,"id":"6a219add_70888b19","line":53,"in_reply_to":"70e43faf_237f541b","updated":"2025-08-17 16:18:04.000000000","message":"Done, correct backup driver is loaded then instanced:\n```\nDeleted share fake_share_id                                                     \n{7} manila.tests.share.test_manager.ShareManagerTestCase.test_create_share_instance_with_server_created [0.444332s] ... ok\nDeleted share instance instance_id1                                             \nDeleted share instance instance_id3                                             \nDeleted share fake_share_id                                                     \n@@@FILTER_FOR_ME@@@ \u003cclass \u0027manila.tests.fake_backup_driver.FakeBackupDriver\u0027\u003e             \nstdin:4:21: M310 Log method arguments should not be a tuple.                    \n{5} manila.tests.test_hacking.HackingTestCase.test_logging_with_tuple_argument_01_debug [0.018122s] ... ok\n{6} manila.tests.share.test_share_utils.ShareUtilsTestCase.test_extract_host_missing_backend_only_return_backend [0.016916s] ... ok\n```\n\nand test coverage looks fine with the fake backup driver.","commit_id":"da56169da010b1217deae9929614166e50202013"},{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"a9b5b7b955b73bee4e5a832db2d8af12a472c337","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        self.share \u003d db_utils.create_share()"},{"line_number":51,"context_line":"        manager.CONF.set_default(\u0027mount_tmp_location\u0027, \u0027/tmp/\u0027)"},{"line_number":52,"context_line":"        manager.CONF.set_default(\u0027backup_mount_tmp_location\u0027, \u0027/tmp/\u0027)"},{"line_number":53,"context_line":"        # REVIEW: - zgoggin: If the intention bellow is to use the fake in the"},{"line_number":54,"context_line":"        # tests, this will not work, while the CONF value is set properly,"},{"line_number":55,"context_line":"        # the manager defaults/loads the NFS driver prior when instanced above."},{"line_number":56,"context_line":"        # This can be seen with print(vars(self.manager.backup_driver)) within"}],"source_content_type":"text/x-python","patch_set":6,"id":"a0727d7e_a350410d","line":53,"in_reply_to":"92b6ed5c_0ea2a4ff","updated":"2025-08-14 04:58:36.000000000","message":"ack, thank you.. looks like a bug.. would it make sense to move this set_default directive before creating the manager instance on line 47?","commit_id":"da56169da010b1217deae9929614166e50202013"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"8711d7f6a11468662fb3d9fd94425c47ed28190f","unresolved":true,"context_lines":[{"line_number":50,"context_line":"        self.share \u003d db_utils.create_share()"},{"line_number":51,"context_line":"        manager.CONF.set_default(\u0027mount_tmp_location\u0027, \u0027/tmp/\u0027)"},{"line_number":52,"context_line":"        manager.CONF.set_default(\u0027backup_mount_tmp_location\u0027, \u0027/tmp/\u0027)"},{"line_number":53,"context_line":"        # REVIEW: - zgoggin: If the intention bellow is to use the fake in the"},{"line_number":54,"context_line":"        # tests, this will not work, while the CONF value is set properly,"},{"line_number":55,"context_line":"        # the manager defaults/loads the NFS driver prior when instanced above."},{"line_number":56,"context_line":"        # This can be seen with print(vars(self.manager.backup_driver)) within"}],"source_content_type":"text/x-python","patch_set":6,"id":"70e43faf_237f541b","line":53,"in_reply_to":"a0727d7e_a350410d","updated":"2025-08-14 16:29:34.000000000","message":"I think there\u0027s a good chance this will fix it, it makes sense to probably set all of these configuration parameters prior to instancing any of the classes.\n\nI can test if this would fix it / what the implications of running the test suite with the fake backup driver are, and report back.","commit_id":"da56169da010b1217deae9929614166e50202013"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"1989e2acfa5c4b3d3ab474a2ac03a29a109c7e0e","unresolved":true,"context_lines":[{"line_number":703,"context_line":"            self.context, backup_info[\u0027id\u0027],"},{"line_number":704,"context_line":"            {\u0027status\u0027: constants.STATUS_AVAILABLE, \u0027restore_progress\u0027: \u0027100\u0027})"},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    def test_restore_share_backup_respects_restore_to_target_flag(self):"},{"line_number":707,"context_line":"        target_share_info \u003d db_utils.create_share("},{"line_number":708,"context_line":"            status\u003dconstants.STATUS_AVAILABLE)"},{"line_number":709,"context_line":"        share_info \u003d db_utils.create_share(status\u003dconstants.STATUS_AVAILABLE)"}],"source_content_type":"text/x-python","patch_set":10,"id":"c36648ec_57cf17b4","line":706,"updated":"2025-07-29 07:30:43.000000000","message":"nit: remove \u0027flag\u0027 to keep consistency with other test names","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"9edeabfe6460f1a6e1bc5855251fd472474af8e8","unresolved":false,"context_lines":[{"line_number":703,"context_line":"            self.context, backup_info[\u0027id\u0027],"},{"line_number":704,"context_line":"            {\u0027status\u0027: constants.STATUS_AVAILABLE, \u0027restore_progress\u0027: \u0027100\u0027})"},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    def test_restore_share_backup_respects_restore_to_target_flag(self):"},{"line_number":707,"context_line":"        target_share_info \u003d db_utils.create_share("},{"line_number":708,"context_line":"            status\u003dconstants.STATUS_AVAILABLE)"},{"line_number":709,"context_line":"        share_info \u003d db_utils.create_share(status\u003dconstants.STATUS_AVAILABLE)"}],"source_content_type":"text/x-python","patch_set":10,"id":"878e36eb_f8a7a3f8","line":706,"in_reply_to":"c36648ec_57cf17b4","updated":"2025-07-29 11:08:24.000000000","message":"Done","commit_id":"b5795d7983a1113d00f4ba3d4806a39eb0e23b64"}],"releasenotes/notes/share-backup-out-of-place-restore-1db334d8a22be3fa.yaml":[{"author":{"_account_id":16643,"name":"Goutham Pacha Ravi","email":"gouthampravi@gmail.com","username":"gouthamr"},"change_message_id":"d6f5a647d78b73948c93acbe7b4616003b1d56f6","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Added support for targeted share backup restores in the share backup API to"},{"line_number":5,"context_line":"    allow the restore a share backup from one source share to another target"},{"line_number":6,"context_line":"    share, given the backup or share driver provides support for the operation."},{"line_number":7,"context_line":"    Available from microversion 2.90. and supported by the default NFS driver."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"fb43cf48_825c75e2","line":7,"range":{"start_line":7,"start_character":32,"end_line":7,"end_character":36},"updated":"2025-08-28 18:45:11.000000000","message":"2.91","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"1ffb3adf0a7561e8686deb1ff92d62e360d10f98","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Added support for targeted share backup restores in the share backup API to"},{"line_number":5,"context_line":"    allow the restore a share backup from one source share to another target"},{"line_number":6,"context_line":"    share, given the backup or share driver provides support for the operation."},{"line_number":7,"context_line":"    Available from microversion 2.90. and supported by the default NFS driver."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"44edddea_308d04d3","line":7,"range":{"start_line":7,"start_character":32,"end_line":7,"end_character":36},"in_reply_to":"9d9575a2_379c1528","updated":"2025-08-28 20:51:20.000000000","message":"Done - see https://review.opendev.org/c/openstack/manila/+/958813","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"},{"author":{"_account_id":36761,"name":"za","display_name":"zgoggin","email":"zacharygoggin@coenin.co.uk","username":"za","status":"Manila share backup enthusiast :)"},"change_message_id":"ddfd185e7bf1f28bdb6a30af3459711d5b1a425f","unresolved":true,"context_lines":[{"line_number":4,"context_line":"    Added support for targeted share backup restores in the share backup API to"},{"line_number":5,"context_line":"    allow the restore a share backup from one source share to another target"},{"line_number":6,"context_line":"    share, given the backup or share driver provides support for the operation."},{"line_number":7,"context_line":"    Available from microversion 2.90. and supported by the default NFS driver."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"9d9575a2_379c1528","line":7,"range":{"start_line":7,"start_character":32,"end_line":7,"end_character":36},"in_reply_to":"fb43cf48_825c75e2","updated":"2025-08-28 19:38:17.000000000","message":"Acknowledged","commit_id":"c4e6ac71c20136883ccc7b1017ae4812e98bad7f"}]}
