)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"1c5ac7a80919da2954771ab4ef115befa670c115","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5d3159bf_0f068625","updated":"2026-07-29 13:12:52.000000000","message":"soft -1, because this needs to cover more\noverall seems good to me,\ncan you also add same check and exception for snpashot being backing-up with tests\nthis can also cover restore.","commit_id":"796f3c593608ac220939d4edd12e7525f3a56986"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"511d1ddbd7963f4a663f5808b7caeaf15239bac2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9bc45983_b8270a10","updated":"2026-08-11 18:30:19.000000000","message":"CI green, review appreciated.","commit_id":"3b9342cca52a1af8772281e6e1b6861b45b15c9b"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"e119a3e287a6955ae630647eb9db4b9ec851f448","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3cf780ed_eff3f17d","updated":"2026-08-14 06:37:01.000000000","message":"just a nit, and ask for more test coverage.\n\nthakns for the updats.","commit_id":"3b9342cca52a1af8772281e6e1b6861b45b15c9b"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"aac9b2f59b4262e95df65c55fe4de0834475b6e6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"64a0cc57_857491e5","updated":"2026-08-11 11:56:26.000000000","message":"recheck","commit_id":"3b9342cca52a1af8772281e6e1b6861b45b15c9b"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"7400e138665a0b8e3cc469edbc75960be24b0f64","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"41831cbc_a7d267de","updated":"2026-08-25 09:30:13.000000000","message":"lgtm, thanks for addressing all comments.","commit_id":"a452d74a577be88ca5afcf1032bb2a9cdf0f7c51"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"16fbfd1759a576c1ed44823ed3bcdcf859d801b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"0ab0bb57_9fa66103","updated":"2026-08-17 11:16:08.000000000","message":"recheck","commit_id":"a452d74a577be88ca5afcf1032bb2a9cdf0f7c51"}],"cinder/api/contrib/backups.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"e119a3e287a6955ae630647eb9db4b9ec851f448","unresolved":true,"context_lines":[{"line_number":232,"context_line":"                exception.InvalidVolume,"},{"line_number":233,"context_line":"                exception.InvalidBackup) as error:"},{"line_number":234,"context_line":"            raise exc.HTTPBadRequest(explanation\u003derror.msg)"},{"line_number":235,"context_line":"        except exception.BackupInProgress as error:"},{"line_number":236,"context_line":"            raise exc.HTTPConflict(explanation\u003derror.msg)"},{"line_number":237,"context_line":"        except (exception.VolumeSizeExceedsAvailableQuota,"},{"line_number":238,"context_line":"                exception.VolumeLimitExceeded) as error:"}],"source_content_type":"text/x-python","patch_set":5,"id":"74103bdc_fab47b23","line":235,"updated":"2026-08-14 06:37:01.000000000","message":"maybe a nit and not need to update, but as you might respin.\n\nabove whicle creation, `BackupInProgress` is caught before invalidVolume, we can follow same here in restore for consistency, \nunless there is particular reason !","commit_id":"3b9342cca52a1af8772281e6e1b6861b45b15c9b"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"db74df53e061e285dae1994787b3cf6243c2d57f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f3cbcfa0_ee4e36ec","in_reply_to":"74103bdc_fab47b23","updated":"2026-08-16 15:52:10.000000000","message":"Moved BackupInProgress exception handling before InvalidVolume in restore() for consistency with create().","commit_id":"a452d74a577be88ca5afcf1032bb2a9cdf0f7c51"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"3c8f0f1c1df90db104b4ce6a037c6b6f8e1e1038","unresolved":true,"context_lines":[{"line_number":189,"context_line":"                                                volume_id, container,"},{"line_number":190,"context_line":"                                                incremental, availability_zone,"},{"line_number":191,"context_line":"                                                force, snapshot_id, metadata)"},{"line_number":192,"context_line":"        except exception.BackupInProgress as error:"},{"line_number":193,"context_line":"            # Distinguishable from the generic 400s below: this is a"},{"line_number":194,"context_line":"            # transient conflict with an in-flight backup/restore on the"},{"line_number":195,"context_line":"            # same volume, so callers can safely retry."}],"source_content_type":"text/x-python","patch_set":6,"id":"0963b686_8cfb1cff","line":192,"updated":"2026-09-02 05:14:05.000000000","message":"I didn\u0027t understand BackupInProgress mapped to HTTPConflict. Mapping Backup related exception to HTTP exception? Something wrong with logic or flow?","commit_id":"a452d74a577be88ca5afcf1032bb2a9cdf0f7c51"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"b26da23079e26ce53507992037d5aa4e452fb78e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"9c260bf5_b7fcf4c7","in_reply_to":"0963b686_8cfb1cff","updated":"2026-09-02 10:33:44.000000000","message":"In Cinder\u0027s architecture, the service layer (cinder/backup/api.py) raises internal domain exceptions (subclasses of CinderException like BackupInProgress), while WSGI controllers (cinder/api/contrib/backups.py) translate those domain exceptions into WebOb HTTP exceptions for REST clients (HTTPConflict -\u003e 409, HTTPBadRequest -\u003e 400, HTTPServiceUnavailable -\u003e 503, etc.).\n\nUnder RFC 9110 / REST standards, HTTP 409 (Conflict) indicates that the request could not be processed due to a conflict with the current state of the resource (here, the volume or snapshot currently undergoing an in-flight backup or restore). Mapping BackupInProgress to HTTPConflict addresses Bug #2161978 so clients can distinguish a transient resource state conflict (safe to retry) from a genuinely invalid request (HTTP 400).","commit_id":"a6430fd313b086ab966078770a869b1c006d4a54"}],"cinder/backup/api.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"1c5ac7a80919da2954771ab4ef115befa670c115","unresolved":true,"context_lines":[{"line_number":245,"context_line":"                       % snapshot[\u0027status\u0027])"},{"line_number":246,"context_line":"                raise exception.InvalidSnapshot(reason\u003dmsg)"},{"line_number":247,"context_line":"        elif volume[\u0027status\u0027] \u003d\u003d fields.VolumeStatus.BACKING_UP:"},{"line_number":248,"context_line":"            # A concurrent backup request against a volume that\u0027s already"},{"line_number":249,"context_line":"            # being backed up is a transient conflict, not a fundamentally"},{"line_number":250,"context_line":"            # invalid request -- raise a distinguishable, retryable error"},{"line_number":251,"context_line":"            # (HTTP 409) instead of grouping it with genuinely invalid"},{"line_number":252,"context_line":"            # volume states under a generic HTTP 400."},{"line_number":253,"context_line":"            raise exception.BackupInProgress(vol_id\u003dvolume_id)"},{"line_number":254,"context_line":"        elif volume[\u0027status\u0027] not in [\"available\", \"in-use\"]:"},{"line_number":255,"context_line":"            msg \u003d (_(\u0027Volume to be backed up must be available \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"2134fbe2_f5b46864","line":252,"range":{"start_line":248,"start_character":13,"end_line":252,"end_character":53},"updated":"2026-07-29 13:12:52.000000000","message":"we may not need this, commit and exception  msg is enough","commit_id":"796f3c593608ac220939d4edd12e7525f3a56986"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"ee21ba6091a711335e9f44a6b77bbc918d310e16","unresolved":false,"context_lines":[{"line_number":245,"context_line":"                       % snapshot[\u0027status\u0027])"},{"line_number":246,"context_line":"                raise exception.InvalidSnapshot(reason\u003dmsg)"},{"line_number":247,"context_line":"        elif volume[\u0027status\u0027] \u003d\u003d fields.VolumeStatus.BACKING_UP:"},{"line_number":248,"context_line":"            # A concurrent backup request against a volume that\u0027s already"},{"line_number":249,"context_line":"            # being backed up is a transient conflict, not a fundamentally"},{"line_number":250,"context_line":"            # invalid request -- raise a distinguishable, retryable error"},{"line_number":251,"context_line":"            # (HTTP 409) instead of grouping it with genuinely invalid"},{"line_number":252,"context_line":"            # volume states under a generic HTTP 400."},{"line_number":253,"context_line":"            raise exception.BackupInProgress(vol_id\u003dvolume_id)"},{"line_number":254,"context_line":"        elif volume[\u0027status\u0027] not in [\"available\", \"in-use\"]:"},{"line_number":255,"context_line":"            msg \u003d (_(\u0027Volume to be backed up must be available \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"0a11b9c1_5a1ec357","line":252,"range":{"start_line":248,"start_character":13,"end_line":252,"end_character":53},"in_reply_to":"2134fbe2_f5b46864","updated":"2026-08-08 18:21:10.000000000","message":"Done","commit_id":"796f3c593608ac220939d4edd12e7525f3a56986"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"e119a3e287a6955ae630647eb9db4b9ec851f448","unresolved":true,"context_lines":[{"line_number":232,"context_line":"        snapshot \u003d None"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        if volume[\u0027status\u0027] \u003d\u003d fields.VolumeStatus.BACKING_UP:"},{"line_number":235,"context_line":"            raise exception.BackupInProgress(vol_id\u003dvolume_id)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        if snapshot_id:"},{"line_number":238,"context_line":"            snapshot \u003d self.volume_api.get_snapshot(context, snapshot_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"486f6487_86aefa79","line":235,"updated":"2026-08-14 06:37:01.000000000","message":"should! like restore create should also check for status being restoring?","commit_id":"3b9342cca52a1af8772281e6e1b6861b45b15c9b"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"db74df53e061e285dae1994787b3cf6243c2d57f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"27333ba0_11abcba5","in_reply_to":"486f6487_86aefa79","updated":"2026-08-16 15:52:10.000000000","message":"Updated create() in cinder/backup/api.py to check for both fields.VolumeStatus.RESTORING_BACKUP on volumes and fields.SnapshotStatus.RESTORING on snapshots.","commit_id":"a452d74a577be88ca5afcf1032bb2a9cdf0f7c51"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"3c8f0f1c1df90db104b4ce6a037c6b6f8e1e1038","unresolved":true,"context_lines":[{"line_number":232,"context_line":"        snapshot \u003d None"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        if volume[\u0027status\u0027] in (fields.VolumeStatus.BACKING_UP,"},{"line_number":235,"context_line":"                                fields.VolumeStatus.RESTORING_BACKUP):"},{"line_number":236,"context_line":"            raise exception.BackupInProgress(vol_id\u003dvolume_id)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        if snapshot_id:"}],"source_content_type":"text/x-python","patch_set":6,"id":"ec00d9bd_b4de46ae","line":235,"updated":"2026-09-02 05:14:05.000000000","message":"This check sits above the snapshot_id branch, so a backup-from-snapshot is now rejected when the parent volume is backing-up or restoring-backup.\n\nOn master, volume status is only validated in the elif of `if snapshot_id`. Snapshot backups do not set volume.status to backing-up (they set snapshot.status) and get_backup_device() backups the snapshot (or a temp volume from it) without requiring the parent to be idle.\n\nThat is a behavior change, not just a 400→409 mapping. Either move this under `if not snapshot_id`, or document it as an intentional serialization of all backup/restore activity on the volume (commit message, reno, api-ref).","commit_id":"a452d74a577be88ca5afcf1032bb2a9cdf0f7c51"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"3c8f0f1c1df90db104b4ce6a037c6b6f8e1e1038","unresolved":true,"context_lines":[{"line_number":245,"context_line":"                          \u0027vol2\u0027: snapshot.volume_id})"},{"line_number":246,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":247,"context_line":"            if snapshot[\u0027status\u0027] in (fields.SnapshotStatus.BACKING_UP,"},{"line_number":248,"context_line":"                                      fields.SnapshotStatus.RESTORING):"},{"line_number":249,"context_line":"                raise exception.BackupInProgress(vol_id\u003dvolume_id)"},{"line_number":250,"context_line":"            elif snapshot[\u0027status\u0027] not in [\"available\"]:"},{"line_number":251,"context_line":"                msg \u003d (_(\u0027Snapshot to be backed up must be available, \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"8c3e7ed9_d0042fd6","line":248,"updated":"2026-09-02 05:14:05.000000000","message":"SnapshotStatus.RESTORING is not backup restore. The only in-tree writer is volume.api.API.revert_to_snapshot() (sets snapshot to restoring, volume to reverting). Backup restore sets volume restoring-backup and backup restoring; it never touches snapshot.status.\n\nA backup of a snapshot that is the source of an in-progress revert should stay InvalidSnapshot/400 (\"must be available\"), not BackupInProgress/409 with a message that says the *volume* is being backed up.\n\nKeep BACKING_UP → 409. Drop RESTORING from this tuple.","commit_id":"a452d74a577be88ca5afcf1032bb2a9cdf0f7c51"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"9e8d1c624d7430eaf21282e99e5c4c0ac1073eef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"94280fc3_d4b1e59e","in_reply_to":"3fc1a9ca_42fb0b50","updated":"2026-09-04 07:02:24.000000000","message":"oh nice Jayaanand","commit_id":"a6430fd313b086ab966078770a869b1c006d4a54"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"b26da23079e26ce53507992037d5aa4e452fb78e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"41e9f3f0_ed43ba12","in_reply_to":"8c3e7ed9_d0042fd6","updated":"2026-09-02 10:33:44.000000000","message":"Agreed and fixed! Dropped SnapshotStatus.RESTORING from the tuple so only SnapshotStatus.BACKING_UP triggers BackupInProgress (409 Conflict). Snapshots in \u0027restoring\u0027 status (e.g. from an in-progress revert) now fall through to elif snapshot[\u0027status\u0027] not in [\u0027available\u0027] and raise InvalidSnapshot (HTTP 400) as before. Updated test_create_backup_with_snapshot_already_restoring to assert HTTP 400.","commit_id":"a6430fd313b086ab966078770a869b1c006d4a54"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"b26da23079e26ce53507992037d5aa4e452fb78e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3fc1a9ca_42fb0b50","in_reply_to":"ec00d9bd_b4de46ae","updated":"2026-09-02 10:33:44.000000000","message":"Good catch, thank you! Moved the volume status check into the elif branch so it only validates when not snapshot_id. This preserves master\u0027s behavior where backup-from-snapshot does not require the parent volume to be idle. Added unit test test_create_backup_from_snapshot_with_volume_backing_up to verify.","commit_id":"a6430fd313b086ab966078770a869b1c006d4a54"}],"cinder/tests/unit/api/contrib/test_backups.py":[{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"1c5ac7a80919da2954771ab4ef115befa670c115","unresolved":true,"context_lines":[{"line_number":1109,"context_line":"        res \u003d req.get_response(fakes.wsgi_app("},{"line_number":1110,"context_line":"            fake_auth_context\u003dself.user_context))"},{"line_number":1111,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_int)"},{"line_number":1114,"context_line":"        self.assertEqual(HTTPStatus.BAD_REQUEST,"},{"line_number":1115,"context_line":"                         res_dict[\u0027badRequest\u0027][\u0027code\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"56935c13_4547fbae","line":1112,"updated":"2026-07-29 13:12:52.000000000","message":"can you assert same here as well.","commit_id":"796f3c593608ac220939d4edd12e7525f3a56986"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"ee21ba6091a711335e9f44a6b77bbc918d310e16","unresolved":false,"context_lines":[{"line_number":1109,"context_line":"        res \u003d req.get_response(fakes.wsgi_app("},{"line_number":1110,"context_line":"            fake_auth_context\u003dself.user_context))"},{"line_number":1111,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_int)"},{"line_number":1114,"context_line":"        self.assertEqual(HTTPStatus.BAD_REQUEST,"},{"line_number":1115,"context_line":"                         res_dict[\u0027badRequest\u0027][\u0027code\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"838b5f77_b48c295f","line":1112,"in_reply_to":"56935c13_4547fbae","updated":"2026-08-08 18:21:10.000000000","message":"Done","commit_id":"796f3c593608ac220939d4edd12e7525f3a56986"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"7400e138665a0b8e3cc469edbc75960be24b0f64","unresolved":false,"context_lines":[{"line_number":1109,"context_line":"        res \u003d req.get_response(fakes.wsgi_app("},{"line_number":1110,"context_line":"            fake_auth_context\u003dself.user_context))"},{"line_number":1111,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_int)"},{"line_number":1114,"context_line":"        self.assertEqual(HTTPStatus.BAD_REQUEST,"},{"line_number":1115,"context_line":"                         res_dict[\u0027badRequest\u0027][\u0027code\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"e4b7d528_b74c5e61","line":1112,"in_reply_to":"5e8a0a78_3f3d0cbb","updated":"2026-08-25 09:30:13.000000000","message":"Done","commit_id":"796f3c593608ac220939d4edd12e7525f3a56986"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"e119a3e287a6955ae630647eb9db4b9ec851f448","unresolved":true,"context_lines":[{"line_number":1109,"context_line":"        res \u003d req.get_response(fakes.wsgi_app("},{"line_number":1110,"context_line":"            fake_auth_context\u003dself.user_context))"},{"line_number":1111,"context_line":"        res_dict \u003d jsonutils.loads(res.body)"},{"line_number":1112,"context_line":""},{"line_number":1113,"context_line":"        self.assertEqual(HTTPStatus.BAD_REQUEST, res.status_int)"},{"line_number":1114,"context_line":"        self.assertEqual(HTTPStatus.BAD_REQUEST,"},{"line_number":1115,"context_line":"                         res_dict[\u0027badRequest\u0027][\u0027code\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5e8a0a78_3f3d0cbb","line":1112,"in_reply_to":"838b5f77_b48c295f","updated":"2026-08-14 06:37:01.000000000","message":"minor commets are fine to resolve\nbut please do not resolve all comments, reviewer will do, unresolve comments helps with loading context in our mind w.r.t last reviews.","commit_id":"796f3c593608ac220939d4edd12e7525f3a56986"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"e119a3e287a6955ae630647eb9db4b9ec851f448","unresolved":true,"context_lines":[{"line_number":1855,"context_line":"    def test_restore_backup_with_volume_already_backing_up(self):"},{"line_number":1856,"context_line":"        backup \u003d utils.create_backup(self.context,"},{"line_number":1857,"context_line":"                                     status\u003dfields.BackupStatus.AVAILABLE)"},{"line_number":1858,"context_line":"        volume \u003d utils.create_volume(self.context, size\u003d5, status\u003d\u0027backing-up\u0027)"},{"line_number":1859,"context_line":""},{"line_number":1860,"context_line":"        body \u003d {\"restore\": {\"volume_id\": volume.id}}"},{"line_number":1861,"context_line":"        req \u003d webob.Request.blank(\u0027/v3/%s/backups/%s/restore\u0027 % ("}],"source_content_type":"text/x-python","patch_set":5,"id":"48c1fb15_6b3d7df1","line":1858,"updated":"2026-08-14 06:37:01.000000000","message":"+1\n\ncan ypu also add for `status\u003d\u0027restoring-backup\u0027`","commit_id":"3b9342cca52a1af8772281e6e1b6861b45b15c9b"},{"author":{"_account_id":39353,"name":"Akash Roshan Chaurasia","display_name":"Akash Roshan Chaurasia","email":"akashroshanchaurasia@gmail.com","username":"akash-roshan"},"change_message_id":"db74df53e061e285dae1994787b3cf6243c2d57f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8016169e_5f6e6f63","in_reply_to":"48c1fb15_6b3d7df1","updated":"2026-08-16 15:52:10.000000000","message":"Added test_restore_backup_with_volume_already_restoring_backup, test_create_backup_with_volume_already_restoring_backup, and test_create_backup_with_snapshot_already_restoring in test_backups.py.","commit_id":"a452d74a577be88ca5afcf1032bb2a9cdf0f7c51"},{"author":{"_account_id":34860,"name":"Amit Uniyal","email":"auniyal@redhat.com","username":"auniyal"},"change_message_id":"9e8d1c624d7430eaf21282e99e5c4c0ac1073eef","unresolved":false,"context_lines":[{"line_number":1276,"context_line":""},{"line_number":1277,"context_line":"        snapshot.destroy()"},{"line_number":1278,"context_line":"        volume.destroy()"},{"line_number":1279,"context_line":""},{"line_number":1280,"context_line":"    @mock.patch(\u0027cinder.db.api.service_get_all\u0027)"},{"line_number":1281,"context_line":"    def test_create_backup_WithOUT_enabled_backup_service("},{"line_number":1282,"context_line":"            self,"}],"source_content_type":"text/x-python","patch_set":7,"id":"2a8682f4_197bc11c","line":1279,"updated":"2026-09-04 07:02:24.000000000","message":"+1","commit_id":"a6430fd313b086ab966078770a869b1c006d4a54"}]}
