)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"116046840df99e6600d18a92766842d348e43df4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     a1b113ce (Merge \"Remove python-cinderclient dependency\")"},{"line_number":2,"context_line":"Author:     Winicius Allan \u003cwdasilva@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2026-08-07 22:50:31 -0300"},{"line_number":4,"context_line":"Commit:     Winicius Allan \u003cwdasilva@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"4e09902d_a67c4295","line":1,"updated":"2026-08-27 15:28:26.000000000","message":"The commit message states \u0027Revert is supported via unshelve\u0027 for the shelve action, but watcher/applier/actions/shelve.py revert() only logs \u0027Revert not supported for shelve action\u0027 and returns False. No unshelve call exists anywhere in the change, and test_revert_not_supported asserts the no-op behavior. The permanent change history contradicts the implemented behavior; either the revert is missing or the message is inaccurate.\n\n**Severity**: WARNING | **Confidence**: 0.95\n\n**Impact**: Operators reading the commit history will expect shelved instances to be restored (unshelved) when a workflow is rolled back, but rollback leaves instances shelved and the revert marked failed. The mismatch misleads reviewers and future maintainers of the action contract.\n\n**Suggestion**:\nEither implement Shelve.revert() to unshelve via NovaHelper (mirroring stop.py\u0027s _revert_stop) or, if revert is intentionally unsupported in this patchset, correct the commit message before merge to state revert is not implemented.","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"73b70e4a94893e358d2641469add7332bf84e7bd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"Parent:     a1b113ce (Merge \"Remove python-cinderclient dependency\")"},{"line_number":2,"context_line":"Author:     Winicius Allan \u003cwdasilva@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2026-08-07 22:50:31 -0300"},{"line_number":4,"context_line":"Commit:     Winicius Allan \u003cwdasilva@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"0d35aba1_b3c497bc","line":1,"in_reply_to":"2558b5f0_6f013f9a","updated":"2026-09-03 14:22:19.000000000","message":"Done","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5e1ecb54ded019812ab8ca5d8fe0759e8ebdfd06","unresolved":true,"context_lines":[{"line_number":1,"context_line":"Parent:     a1b113ce (Merge \"Remove python-cinderclient dependency\")"},{"line_number":2,"context_line":"Author:     Winicius Allan \u003cwdasilva@redhat.com\u003e"},{"line_number":3,"context_line":"AuthorDate: 2026-08-07 22:50:31 -0300"},{"line_number":4,"context_line":"Commit:     Winicius Allan \u003cwdasilva@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"2558b5f0_6f013f9a","line":1,"in_reply_to":"4e09902d_a67c4295","updated":"2026-09-02 19:50:26.000000000","message":"this is valid","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8747415e806c7f3b3c7e61b3d3760649f2adb1d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"37f27c47_fdf1319c","updated":"2026-08-12 20:39:58.000000000","message":"this and the new shelve action are very similar, you can merge both in the same patch.\nYou should create a new release note just mentioning the new actions added, and don\u0027t need to refer to preemtible feature there.\nWe also need a simple watcher-tempest-code that validates that both actions works. You can create an extension of the Actuator test. See:\nhttps://github.com/openstack/watcher-tempest-plugin/blob/master/watcher_tempest_plugin/tests/scenario/test_execute_actuator.py\nYou watcher-tempest-plugin change should depends on the watcher action patch, so it can test the code before merging it.\nLet me know if you have questions.\nThanks Winicius.","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b33029d8ba41166235215faf66720d46e8770e11","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"1619a1fb_d07db392","updated":"2026-09-02 19:12:19.000000000","message":"Looks good, the tempest tests are passing for master branch:\nhttps://bf577344f312855566af-7e513b902e81eb926eb2654dfc72839e.ssl.cf2.rackcdn.com/openstack/dd347b47227147d9ada4bb19d90549f1/testr_results.html\n\ntest_delete_active_instance[actuator,id-b3f2a1c4-8e7d-4a90-bc12-5f6e3d9a0b47,strategy]\npass\ntest_delete_skipped_when_instance_already_deleted[actuator,id-4070c0ec-43b1-41fc-9363-a5e8458cb87c,strategy]\npass\ntest_shelve_active_instance[actuator,id-ef156ca9-50d3-45e6-83f4-d97bfa92e168,strategy]\npass\ntest_shelve_skipped_when_instance_already_shelved[actuator,id-752d84da-bb38-4cf2-8fb0-7bd1963dab21,strategy]\npass\ntest_shelve_skipped_when_instance_not_found[actuator,id-72c68eec-3223-4216-a984-902caca3cfb4,strategy]\npass","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b33029d8ba41166235215faf66720d46e8770e11","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5c02daa9_cd058b36","updated":"2026-09-02 19:12:19.000000000","message":"You need to submit a new change to solve the Merge Conflict.","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"6981018bb98250496633771b625f2477681e0bb3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f92013da_ffbe6bc7","updated":"2026-09-03 16:50:38.000000000","message":"LGTM, a most recent run of proposed tests for Delete and Shelve is also passing in CI:\nhttps://7542777bee369d12653e-0855c69ab3b618fcee1eae2bcd2375e7.ssl.cf2.rackcdn.com/openstack/82c49b24836d45df8c2d56a87a30eaeb/testr_results.html\nThanks Winicius","commit_id":"ff8c48bcecc0a3a44a203f5376d2137b87817125"}],"doc/source/actions/delete.rst":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8747415e806c7f3b3c7e61b3d3760649f2adb1d5","unresolved":true,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This action will allow you to delete a server instance, removing it and all"},{"line_number":13,"context_line":"associated resources. This is a destructive and irreversible action primarily"},{"line_number":14,"context_line":"used as part of the preemptible instance management feature in Watcher."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Configuration"},{"line_number":17,"context_line":"-------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"91ca47dd_bc11796e","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":70},"updated":"2026-08-12 20:39:58.000000000","message":"We can omit this detail","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"da4e3c127267e043267bbd85476acc849b60d069","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"This action will allow you to delete a server instance, removing it and all"},{"line_number":13,"context_line":"associated resources. This is a destructive and irreversible action primarily"},{"line_number":14,"context_line":"used as part of the preemptible instance management feature in Watcher."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Configuration"},{"line_number":17,"context_line":"-------------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9d8a6b92_f172b45b","line":14,"range":{"start_line":14,"start_character":0,"end_line":14,"end_character":70},"in_reply_to":"91ca47dd_bc11796e","updated":"2026-08-13 15:20:25.000000000","message":"Done","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Action parameters:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":"parameter                type   required description"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":"``resource_id``          string yes      UUID of the server instance to delete"},{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Skipping conditions"},{"line_number":27,"context_line":"--------------------"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"0b706c8c_053b3dad","line":25,"range":{"start_line":20,"start_character":0,"end_line":25,"end_character":1},"updated":"2026-08-26 19:00:29.000000000","message":"nit: this is ok, in general we shoudl prefer to use actual tables for new docs\n\n```\n.. list-table::\n   :widths: 25 10 10 55\n   :header-rows: 1\n\n   * - parameter\n     - type\n     - required\n     - description\n   * - ``resource_id``\n     - string\n     - yes\n     - UUID of the server instance to delete\n```","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Action parameters:"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":"parameter                type   required description"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":"``resource_id``          string yes      UUID of the server instance to delete"},{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Skipping conditions"},{"line_number":27,"context_line":"--------------------"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"222411b5_5cdf2f46","line":25,"range":{"start_line":20,"start_character":0,"end_line":25,"end_character":1},"in_reply_to":"0b706c8c_053b3dad","updated":"2026-08-26 21:29:56.000000000","message":"Done","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"}],"doc/source/actions/shelve.rst":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":24,"context_line":"parameter                type   required description"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":"``resource_id``          string yes      UUID of the server instance to shelve"},{"line_number":27,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Skipping conditions"},{"line_number":30,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"eaf7ea96_0224f4bb","line":27,"updated":"2026-08-26 19:00:29.000000000","message":"ditto","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":false,"context_lines":[{"line_number":24,"context_line":"parameter                type   required description"},{"line_number":25,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":26,"context_line":"``resource_id``          string yes      UUID of the server instance to shelve"},{"line_number":27,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Skipping conditions"},{"line_number":30,"context_line":"--------------------"}],"source_content_type":"text/x-rst","patch_set":2,"id":"86b37739_efdaaf82","line":27,"in_reply_to":"eaf7ea96_0224f4bb","updated":"2026-08-26 21:29:56.000000000","message":"Done","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"}],"releasenotes/notes/actions-delete-and-shelve-383ab53d622cca49.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":13,"context_line":"    not exist or is already in ``SHELVED`` or ``SHELVED_OFFLOADED`` state."},{"line_number":14,"context_line":"    The action accepts both states as valid postconditions, since Nova may"},{"line_number":15,"context_line":"    offload the instance immediately depending on the backend storage. The"},{"line_number":16,"context_line":"    shelve action can be reverted by unshelving the instance."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"c2746a24_13badd79","line":16,"updated":"2026-08-26 19:00:29.000000000","message":"+4\n\nthis is perhaps more detailed the i woudl normally add in an admin/operator focused release not but it is corerct.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5e1ecb54ded019812ab8ca5d8fe0759e8ebdfd06","unresolved":false,"context_lines":[{"line_number":13,"context_line":"    not exist or is already in ``SHELVED`` or ``SHELVED_OFFLOADED`` state."},{"line_number":14,"context_line":"    The action accepts both states as valid postconditions, since Nova may"},{"line_number":15,"context_line":"    offload the instance immediately depending on the backend storage. The"},{"line_number":16,"context_line":"    shelve action can be reverted by unshelving the instance."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"d7f54fc5_621ef2af","line":16,"in_reply_to":"b16ec349_6621e386","updated":"2026-09-02 19:50:26.000000000","message":"this is ok as it is now","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":true,"context_lines":[{"line_number":13,"context_line":"    not exist or is already in ``SHELVED`` or ``SHELVED_OFFLOADED`` state."},{"line_number":14,"context_line":"    The action accepts both states as valid postconditions, since Nova may"},{"line_number":15,"context_line":"    offload the instance immediately depending on the backend storage. The"},{"line_number":16,"context_line":"    shelve action can be reverted by unshelving the instance."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"b16ec349_6621e386","line":16,"in_reply_to":"c2746a24_13badd79","updated":"2026-08-26 21:29:56.000000000","message":"Do you have any suggestion for rephrasing it or is it good as is? I\u0027ve removed the mention for reverting shelve, but I\u0027d also remove mentions about postconditions.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"}],"setup.cfg":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b33029d8ba41166235215faf66720d46e8770e11","unresolved":true,"context_lines":[{"line_number":99,"context_line":"    change_node_power_state \u003d watcher.applier.actions.change_node_power_state:ChangeNodePowerState"},{"line_number":100,"context_line":"    volume_migrate \u003d watcher.applier.actions.volume_migration:VolumeMigrate"},{"line_number":101,"context_line":"    stop \u003d watcher.applier.actions.stop:Stop"},{"line_number":102,"context_line":"    delete \u003d watcher.applier.actions.delete:Delete"},{"line_number":103,"context_line":"    shelve \u003d watcher.applier.actions.shelve:Shelve"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"watcher_workflow_engines \u003d"},{"line_number":106,"context_line":"    taskflow \u003d watcher.applier.workflow_engine.default:DefaultWorkFlowEngine"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-ttcn-cfg","patch_set":5,"id":"672f5a9f_4f6189f9","line":104,"range":{"start_line":102,"start_character":0,"end_line":104,"end_character":0},"updated":"2026-09-02 19:12:19.000000000","message":"note that this needs to be moved to pyproject.toml now since we merged [1]\n\n[1] https://review.opendev.org/c/openstack/watcher/+/981604","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"73b70e4a94893e358d2641469add7332bf84e7bd","unresolved":false,"context_lines":[{"line_number":99,"context_line":"    change_node_power_state \u003d watcher.applier.actions.change_node_power_state:ChangeNodePowerState"},{"line_number":100,"context_line":"    volume_migrate \u003d watcher.applier.actions.volume_migration:VolumeMigrate"},{"line_number":101,"context_line":"    stop \u003d watcher.applier.actions.stop:Stop"},{"line_number":102,"context_line":"    delete \u003d watcher.applier.actions.delete:Delete"},{"line_number":103,"context_line":"    shelve \u003d watcher.applier.actions.shelve:Shelve"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"watcher_workflow_engines \u003d"},{"line_number":106,"context_line":"    taskflow \u003d watcher.applier.workflow_engine.default:DefaultWorkFlowEngine"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-ttcn-cfg","patch_set":5,"id":"55ed1f7c_86173a86","line":104,"range":{"start_line":102,"start_character":0,"end_line":104,"end_character":0},"in_reply_to":"672f5a9f_4f6189f9","updated":"2026-09-03 14:22:19.000000000","message":"Done","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"}],"watcher/applier/actions/delete.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8747415e806c7f3b3c7e61b3d3760649f2adb1d5","unresolved":true,"context_lines":[{"line_number":78,"context_line":"            )"},{"line_number":79,"context_line":"            return False"},{"line_number":80,"context_line":"        except Exception as e:"},{"line_number":81,"context_line":"            LOG.debug("},{"line_number":82,"context_line":"                \"An unexpected error occurred while deleting \""},{"line_number":83,"context_line":"                \"instance %s: %s\","},{"line_number":84,"context_line":"                self.instance_uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"0e1f4d53_5436807a","line":81,"range":{"start_line":81,"start_character":16,"end_line":81,"end_character":21},"updated":"2026-08-12 20:39:58.000000000","message":"should be at least a LOG.error","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"da4e3c127267e043267bbd85476acc849b60d069","unresolved":true,"context_lines":[{"line_number":78,"context_line":"            )"},{"line_number":79,"context_line":"            return False"},{"line_number":80,"context_line":"        except Exception as e:"},{"line_number":81,"context_line":"            LOG.debug("},{"line_number":82,"context_line":"                \"An unexpected error occurred while deleting \""},{"line_number":83,"context_line":"                \"instance %s: %s\","},{"line_number":84,"context_line":"                self.instance_uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"dad79bf0_ca7acede","line":81,"range":{"start_line":81,"start_character":16,"end_line":81,"end_character":21},"in_reply_to":"0e1f4d53_5436807a","updated":"2026-08-13 15:20:25.000000000","message":"Changed. Does it make sense to do the same with L74?\n\nhttps://review.opendev.org/c/openstack/watcher/+/1000168/1/watcher/applier/actions/delete.py#74","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            )"},{"line_number":79,"context_line":"            return False"},{"line_number":80,"context_line":"        except Exception as e:"},{"line_number":81,"context_line":"            LOG.debug("},{"line_number":82,"context_line":"                \"An unexpected error occurred while deleting \""},{"line_number":83,"context_line":"                \"instance %s: %s\","},{"line_number":84,"context_line":"                self.instance_uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3782e7a8_9a980eea","line":81,"range":{"start_line":81,"start_character":16,"end_line":81,"end_character":21},"in_reply_to":"817af536_a0858a67","updated":"2026-08-26 19:00:29.000000000","message":"Done","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"ea0d778cb7421c6e5c815441987382937e14d7bc","unresolved":true,"context_lines":[{"line_number":78,"context_line":"            )"},{"line_number":79,"context_line":"            return False"},{"line_number":80,"context_line":"        except Exception as e:"},{"line_number":81,"context_line":"            LOG.debug("},{"line_number":82,"context_line":"                \"An unexpected error occurred while deleting \""},{"line_number":83,"context_line":"                \"instance %s: %s\","},{"line_number":84,"context_line":"                self.instance_uuid,"}],"source_content_type":"text/x-python","patch_set":1,"id":"817af536_a0858a67","line":81,"range":{"start_line":81,"start_character":16,"end_line":81,"end_character":21},"in_reply_to":"dad79bf0_ca7acede","updated":"2026-08-26 13:09:00.000000000","message":"yes, at this point it is expected that the instance exists, so it would be an error, and woudl be good to log as error","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":38,"context_line":"            }"},{"line_number":39,"context_line":"        )"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    The `resource_id` is the UUID of the server instance to delete."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":2,"id":"2dbb5923_9b55a963","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":2},"updated":"2026-08-26 19:00:29.000000000","message":"we would not share this action with other api resocues such as volume so im not sure why this is not just server_id to align with nova naming \n\nhttps://docs.openstack.org/api-ref/compute/#id29\n\nor instance_uuid","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":true,"context_lines":[{"line_number":38,"context_line":"            }"},{"line_number":39,"context_line":"        )"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    The `resource_id` is the UUID of the server instance to delete."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":2,"id":"cd32c847_144a9acf","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":2},"in_reply_to":"2dbb5923_9b55a963","updated":"2026-08-26 21:29:56.000000000","message":"I can change it to `server_id`, looks good, however it is described in the spec that the action schema receives a `resource_id`. we would also need to change there\n\nhttps://review.opendev.org/c/openstack/watcher-specs/+/987171/13/specs/2026.2/approved/preemptible-instances.rst#272","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f2bd966eaeb64de5a547992a56f6a249c7b2673b","unresolved":true,"context_lines":[{"line_number":38,"context_line":"            }"},{"line_number":39,"context_line":"        )"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    The `resource_id` is the UUID of the server instance to delete."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":2,"id":"d25402f0_a5899412","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":2},"in_reply_to":"cd32c847_144a9acf","updated":"2026-08-27 13:00:46.000000000","message":"It is a convention in the code to call the unique id as resource_id:\nhttps://github.com/openstack/watcher/blob/ec06744bffd4ba858da7f4996cc872723dfbde70/watcher/applier/actions/base.py#L27-L31\nSo we would need to override RESOURCE_ID to \u0027server_id\u0027 and see if other methods are really referencing Action.RESOURCE_ID (they should)\nI think that is ok to keep it as resource_id too","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5e1ecb54ded019812ab8ca5d8fe0759e8ebdfd06","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            }"},{"line_number":39,"context_line":"        )"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    The `resource_id` is the UUID of the server instance to delete."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":2,"id":"c7f9e867_d5941812","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":2},"in_reply_to":"d25402f0_a5899412","updated":"2026-09-02 19:50:26.000000000","message":"Acknowledged thanks i was not aware of that depency lets keep it as is","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"bd5654ee563c63741b32b0c3a80289d632898a0c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"            }"},{"line_number":39,"context_line":"        )"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    The `resource_id` is the UUID of the server instance to delete."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":2,"id":"b9747995_b8d89f62","line":41,"range":{"start_line":41,"start_character":0,"end_line":41,"end_character":2},"in_reply_to":"d25402f0_a5899412","updated":"2026-08-27 17:53:39.000000000","message":"Marking as resolve considering discussions in the weekly meeting.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        LOG.debug(\"Deleting instance %s\", self.instance_uuid)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        try:"},{"line_number":72,"context_line":"            result \u003d nova.delete_instance(instance_id\u003dself.instance_uuid)"},{"line_number":73,"context_line":"        except exception.NovaClientError as e:"},{"line_number":74,"context_line":"            LOG.debug("},{"line_number":75,"context_line":"                \"Nova client exception occurred while deleting \""}],"source_content_type":"text/x-python","patch_set":2,"id":"0230aa04_46e1a7ec","line":72,"updated":"2026-08-26 19:00:29.000000000","message":"https://docs.openstack.org/api-ref/compute/?expanded\u003ddelete-server-detail#delete-server\n\nso internally we will want to accept SOFT_DELETED as  the same as deleted\n\nserver list does not show SOFT_DELETED instnace by default.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        LOG.debug(\"Deleting instance %s\", self.instance_uuid)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        try:"},{"line_number":72,"context_line":"            result \u003d nova.delete_instance(instance_id\u003dself.instance_uuid)"},{"line_number":73,"context_line":"        except exception.NovaClientError as e:"},{"line_number":74,"context_line":"            LOG.debug("},{"line_number":75,"context_line":"                \"Nova client exception occurred while deleting \""}],"source_content_type":"text/x-python","patch_set":2,"id":"7ea05420_524ce284","line":72,"in_reply_to":"0230aa04_46e1a7ec","updated":"2026-08-26 21:29:56.000000000","message":"you said that this is a legacy feature and \"almost never used\". should we still care about handling soft delete? if so, I can add this into the code without more problems.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b33029d8ba41166235215faf66720d46e8770e11","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        LOG.debug(\"Deleting instance %s\", self.instance_uuid)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        try:"},{"line_number":72,"context_line":"            result \u003d nova.delete_instance(instance_id\u003dself.instance_uuid)"},{"line_number":73,"context_line":"        except exception.NovaClientError as e:"},{"line_number":74,"context_line":"            LOG.debug("},{"line_number":75,"context_line":"                \"Nova client exception occurred while deleting \""}],"source_content_type":"text/x-python","patch_set":2,"id":"6eaa32ca_ed7b8a1d","line":72,"in_reply_to":"3aaebedd_2290e4dc","updated":"2026-09-02 19:12:19.000000000","message":"ok, so this is being covered here then: https://review.opendev.org/c/openstack/watcher/+/1000168/5/watcher/common/nova_helper.py#1189\nwhere it accepts both DELETED or SOFT_DELETED, but likely with will get a instance not found, right?","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5e1ecb54ded019812ab8ca5d8fe0759e8ebdfd06","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        LOG.debug(\"Deleting instance %s\", self.instance_uuid)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        try:"},{"line_number":72,"context_line":"            result \u003d nova.delete_instance(instance_id\u003dself.instance_uuid)"},{"line_number":73,"context_line":"        except exception.NovaClientError as e:"},{"line_number":74,"context_line":"            LOG.debug("},{"line_number":75,"context_line":"                \"Nova client exception occurred while deleting \""}],"source_content_type":"text/x-python","patch_set":2,"id":"fe201d19_0d772db8","line":72,"in_reply_to":"6eaa32ca_ed7b8a1d","updated":"2026-09-02 19:50:26.000000000","message":"yes which is also valdi for delete if nova has archvie/purged deleted rows\n\nit also depend on the toke we use since its watcher admin/service token it can view deleted instances that are not purged/archived by that is governed by policy i belive\n\nwe have to treate all 3 as deleted","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bef2a01638cae38b40c81151fe2cfd66fefa3501","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        LOG.debug(\"Deleting instance %s\", self.instance_uuid)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        try:"},{"line_number":72,"context_line":"            result \u003d nova.delete_instance(instance_id\u003dself.instance_uuid)"},{"line_number":73,"context_line":"        except exception.NovaClientError as e:"},{"line_number":74,"context_line":"            LOG.debug("},{"line_number":75,"context_line":"                \"Nova client exception occurred while deleting \""}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaebedd_2290e4dc","line":72,"in_reply_to":"7ea05420_524ce284","updated":"2026-08-27 13:25:55.000000000","message":"yes its not ok to knowingly write incorrect code\nthat woudl be a bug in production","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        return self.delete()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def revert(self):"},{"line_number":105,"context_line":"        \"\"\"Revert is not possible for delete action."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        Once an instance is deleted, it cannot be restored."},{"line_number":108,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"8b2f59f0_6a968f81","line":105,"range":{"start_line":105,"start_character":11,"end_line":105,"end_character":52},"updated":"2026-08-26 19:00:29.000000000","message":"nit: technially it is if and only if soft delete is enabeld in nova config\nhoweer that is  alegacy feature and almost never used i also dont think we shoudl\nsupport revert in general in watcher at least not automatic revert like this so this is ok\n\nthe restore actions is not garunteed to work\n\nhttps://docs.openstack.org/api-ref/compute/?expanded\u003ddelete-server-detail#restore-soft-deleted-instance-restore-action\n\nand i belive it does not work if you sue some more advanced features in nova","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        return self.delete()"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def revert(self):"},{"line_number":105,"context_line":"        \"\"\"Revert is not possible for delete action."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"        Once an instance is deleted, it cannot be restored."},{"line_number":108,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"109dfe14_3c97582c","line":105,"range":{"start_line":105,"start_character":11,"end_line":105,"end_character":52},"in_reply_to":"8b2f59f0_6a968f81","updated":"2026-08-26 21:29:56.000000000","message":"I did a small rephrase changing the \"not possible\" to \"not supported\", once it\u0027s actually possible but we do not implement in code.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"}],"watcher/applier/actions/shelve.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"ea0d778cb7421c6e5c815441987382937e14d7bc","unresolved":true,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            result \u003d nova.shelve_instance(instance_id\u003dself.instance_uuid)"},{"line_number":75,"context_line":"        except exception.NovaClientError as e:"},{"line_number":76,"context_line":"            LOG.debug("},{"line_number":77,"context_line":"                \"Nova client exception occurred while shelving \""},{"line_number":78,"context_line":"                \"instance %(instance)s. Exception: %(exception)s\","},{"line_number":79,"context_line":"                {\u0027instance\u0027: self.instance_uuid, \u0027exception\u0027: e},"},{"line_number":80,"context_line":"            )"},{"line_number":81,"context_line":"            return False"},{"line_number":82,"context_line":"        except Exception as e:"},{"line_number":83,"context_line":"            LOG.debug("},{"line_number":84,"context_line":"                \"An unexpected error occurred while shelving instance %s: %s\","},{"line_number":85,"context_line":"                self.instance_uuid,"},{"line_number":86,"context_line":"                str(e),"},{"line_number":87,"context_line":"            )"},{"line_number":88,"context_line":"            return False"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if result:"},{"line_number":91,"context_line":"            LOG.debug("}],"source_content_type":"text/x-python","patch_set":2,"id":"1eee5711_3f20381b","line":88,"range":{"start_line":75,"start_character":0,"end_line":88,"end_character":24},"updated":"2026-08-26 13:09:00.000000000","message":"same comment about loggin an error instead","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        try:"},{"line_number":74,"context_line":"            result \u003d nova.shelve_instance(instance_id\u003dself.instance_uuid)"},{"line_number":75,"context_line":"        except exception.NovaClientError as e:"},{"line_number":76,"context_line":"            LOG.debug("},{"line_number":77,"context_line":"                \"Nova client exception occurred while shelving \""},{"line_number":78,"context_line":"                \"instance %(instance)s. Exception: %(exception)s\","},{"line_number":79,"context_line":"                {\u0027instance\u0027: self.instance_uuid, \u0027exception\u0027: e},"},{"line_number":80,"context_line":"            )"},{"line_number":81,"context_line":"            return False"},{"line_number":82,"context_line":"        except Exception as e:"},{"line_number":83,"context_line":"            LOG.debug("},{"line_number":84,"context_line":"                \"An unexpected error occurred while shelving instance %s: %s\","},{"line_number":85,"context_line":"                self.instance_uuid,"},{"line_number":86,"context_line":"                str(e),"},{"line_number":87,"context_line":"            )"},{"line_number":88,"context_line":"            return False"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if result:"},{"line_number":91,"context_line":"            LOG.debug("}],"source_content_type":"text/x-python","patch_set":2,"id":"34f53e2a_ae058720","line":88,"range":{"start_line":75,"start_character":0,"end_line":88,"end_character":24},"in_reply_to":"1eee5711_3f20381b","updated":"2026-08-26 21:29:56.000000000","message":"Done","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"7dc4ed19d05e74227926662893adbaf228b0e975","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                    {\u0027uuid\u0027: self.instance_uuid, \u0027state\u0027: instance.vm_state},"},{"line_number":118,"context_line":"                )"},{"line_number":119,"context_line":"                return True"},{"line_number":120,"context_line":"            nova.connection.compute.unshelve_server(self.instance_uuid)"},{"line_number":121,"context_line":"            LOG.debug("},{"line_number":122,"context_line":"                \"Successfully reverted shelve action and unshelved \""},{"line_number":123,"context_line":"                \"instance %(uuid)s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"d5ecf2fb_fa3d89d1","line":120,"updated":"2026-08-13 17:11:35.000000000","message":"The _revert_shelve method in shelve.py calls nova.connection.compute.unshelve_server() directly on the raw openstacksdk Connection object instead of going through a NovaHelper method. Every other Nova API call in the codebase goes through NovaHelper methods decorated with @nova_retries and @handl...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: The unshelve call lacks retry on transient connection failures and will raise raw openstacksdk exceptions instead of Watcher-specific exceptions. While the outer try/except catches generic Exception, the lack of retry logic means transient network errors during revert could cause unnecessary reve...\n\n**Suggestion**:\nAdd an unshelve_instance method to NovaHelper (following the pattern of _nova_shelve_instance/shelve_instance) decorated with @nova_retries and @handle_nova_error, and call it from _revert_shelve instead of accessing nova.connection.compute directly.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":117,"context_line":"                    {\u0027uuid\u0027: self.instance_uuid, \u0027state\u0027: instance.vm_state},"},{"line_number":118,"context_line":"                )"},{"line_number":119,"context_line":"                return True"},{"line_number":120,"context_line":"            nova.connection.compute.unshelve_server(self.instance_uuid)"},{"line_number":121,"context_line":"            LOG.debug("},{"line_number":122,"context_line":"                \"Successfully reverted shelve action and unshelved \""},{"line_number":123,"context_line":"                \"instance %(uuid)s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"a6695c13_ba0397a1","line":120,"in_reply_to":"2ae3290c_f741b9a1","updated":"2026-08-26 19:00:29.000000000","message":"agreed we shoudl not implment revert at all","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                    {\u0027uuid\u0027: self.instance_uuid, \u0027state\u0027: instance.vm_state},"},{"line_number":118,"context_line":"                )"},{"line_number":119,"context_line":"                return True"},{"line_number":120,"context_line":"            nova.connection.compute.unshelve_server(self.instance_uuid)"},{"line_number":121,"context_line":"            LOG.debug("},{"line_number":122,"context_line":"                \"Successfully reverted shelve action and unshelved \""},{"line_number":123,"context_line":"                \"instance %(uuid)s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"8c8489b0_c79a48fa","line":120,"in_reply_to":"a6695c13_ba0397a1","updated":"2026-08-26 21:29:56.000000000","message":"Done","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"ea0d778cb7421c6e5c815441987382937e14d7bc","unresolved":true,"context_lines":[{"line_number":117,"context_line":"                    {\u0027uuid\u0027: self.instance_uuid, \u0027state\u0027: instance.vm_state},"},{"line_number":118,"context_line":"                )"},{"line_number":119,"context_line":"                return True"},{"line_number":120,"context_line":"            nova.connection.compute.unshelve_server(self.instance_uuid)"},{"line_number":121,"context_line":"            LOG.debug("},{"line_number":122,"context_line":"                \"Successfully reverted shelve action and unshelved \""},{"line_number":123,"context_line":"                \"instance %(uuid)s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"2ae3290c_f741b9a1","line":120,"in_reply_to":"d5ecf2fb_fa3d89d1","updated":"2026-08-26 13:09:00.000000000","message":"correct, it should implement it in the NovaHelper, but I think that we don\u0027t need the revert at all.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"ea0d778cb7421c6e5c815441987382937e14d7bc","unresolved":true,"context_lines":[{"line_number":139,"context_line":"            return False"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def revert(self):"},{"line_number":142,"context_line":"        LOG.debug("},{"line_number":143,"context_line":"            \"Reverting shelve action for instance %s\", self.instance_uuid"},{"line_number":144,"context_line":"        )"},{"line_number":145,"context_line":"        return self._revert_shelve()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def abort(self):"},{"line_number":148,"context_line":"        \"\"\"Abort the shelve action - not applicable for shelve operations\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"28114298_ec4050f8","line":145,"range":{"start_line":142,"start_character":0,"end_line":145,"end_character":36},"updated":"2026-08-26 13:09:00.000000000","message":"Ww currently don\u0027t support revert of action plan and action, it is a feature that don\u0027t work properly in Watcher, so we don\u0027t really know if it works as expected. I would say that we should return False instead of implementing it","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":139,"context_line":"            return False"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def revert(self):"},{"line_number":142,"context_line":"        LOG.debug("},{"line_number":143,"context_line":"            \"Reverting shelve action for instance %s\", self.instance_uuid"},{"line_number":144,"context_line":"        )"},{"line_number":145,"context_line":"        return self._revert_shelve()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def abort(self):"},{"line_number":148,"context_line":"        \"\"\"Abort the shelve action - not applicable for shelve operations\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"28b06f2f_3dddafbe","line":145,"range":{"start_line":142,"start_character":0,"end_line":145,"end_character":36},"in_reply_to":"28114298_ec4050f8","updated":"2026-08-26 19:00:29.000000000","message":"+1","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            return False"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    def revert(self):"},{"line_number":142,"context_line":"        LOG.debug("},{"line_number":143,"context_line":"            \"Reverting shelve action for instance %s\", self.instance_uuid"},{"line_number":144,"context_line":"        )"},{"line_number":145,"context_line":"        return self._revert_shelve()"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    def abort(self):"},{"line_number":148,"context_line":"        \"\"\"Abort the shelve action - not applicable for shelve operations\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"82c580b1_351e3062","line":145,"range":{"start_line":142,"start_character":0,"end_line":145,"end_character":36},"in_reply_to":"28b06f2f_3dddafbe","updated":"2026-08-26 21:29:56.000000000","message":"Done. Removed the _revert_shelve function and all other references.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5e1ecb54ded019812ab8ca5d8fe0759e8ebdfd06","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class Shelve(base.BaseAction):"},{"line_number":28,"context_line":"    \"\"\"Shelves a server instance"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    This action will allow you to shelve a server instance. The instance"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a125d44_e6c2df9b","line":27,"updated":"2026-09-02 19:50:26.000000000","message":"we can adress this later but we may want to add an unshlve action in the futre jsut for partity but not for use in the premet action\n\nbut we do not need to do that until we have a usecase that requries it","commit_id":"4c1c54f2b9fb0e2a01a9a905c0b7fa3d8de9a686"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"788f1c87c57172c519e0e2995d3ab74ff9555271","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    def execute(self):"},{"line_number":104,"context_line":"        return self.shelve()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def revert(self):"},{"line_number":107,"context_line":"        LOG.warning(\"Revert not supported for shelve action\")"},{"line_number":108,"context_line":"        return False"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"e3ed01f8_a8077415","line":106,"updated":"2026-08-26 21:38:50.000000000","message":"The change message states \u0027Revert is supported via unshelve\u0027 for the new shelve action, but Shelve.revert() only logs a warning and returns False. No unshelve helper (unshelve_server API call) was added anywhere in watcher/common/nova_helper.py, so rollback of an action plan that shelved instances cannot restore them.\n\n**Severity**: WARNING | **Confidence**: 0.85\n\n**Impact**: When an action plan containing shelve actions is rolled back (for example, a later action in the plan fails and the workflow engine reverts), shelved instances remain shelved and their workloads stay offline even though the revert is documented as supported. Reviewers and operators reading the change message will expect unshelve-based rollback that does not exist.\n\n**Suggestion**:\nEither implement the advertised rollback: add an unshelve_instance helper to NovaHelper (connection.compute.unshelve_server, waiting for vm_state \u0027active\u0027) and have Shelve.revert() call it, mirroring Stop._revert_stop(); or correct the change message and release note to state that revert is not supported so the advertised behavior matches the code.","commit_id":"4c1c54f2b9fb0e2a01a9a905c0b7fa3d8de9a686"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"92287bd7bf8953163ef021b6c8228d270b7a9dcf","unresolved":false,"context_lines":[{"line_number":103,"context_line":"    def execute(self):"},{"line_number":104,"context_line":"        return self.shelve()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def revert(self):"},{"line_number":107,"context_line":"        LOG.warning(\"Revert not supported for shelve action\")"},{"line_number":108,"context_line":"        return False"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"d4ec2abd_7767d810","line":106,"updated":"2026-08-27 14:57:14.000000000","message":"The commit message for this change states \u0027Revert is supported via unshelve\u0027 for the new shelve action, but the implementation provides no unshelve path. Shelve.revert() only logs a warning and returns False, and NovaHelper contains no unshelve_instance method (the only \u0027unshelve\u0027 references in the tree are decision-engine notification handlers). The delete action\u0027s irreversibility is documented and implemented correctly, so the mismatch is specific to shelve.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: If a plan rollback is enabled (CONF.watcher_applier.rollback_when_actionplan_failed, default False and deprecated), the revert of a shelve action silently does nothing, leaving instances shelved after a failed action plan even though the commit message promised unshelve-based recovery. More immediately, reviewers and operators reading the commit message will believe revert works when it does not.\n\n**Suggestion**:\nEither implement revert by calling an unshelve operation (add NovaHelper.unshelve_instance using connection.compute.unshelve_server and wait for the active state), or correct the commit message to state that revert is not supported. Since unshelving is a straightforward Nova call, implementing it is the smallest fix consistent with the stated intent.","commit_id":"cbd7d7fe885cede6ed5f2eb0796e33bea8e5b89f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5e1ecb54ded019812ab8ca5d8fe0759e8ebdfd06","unresolved":true,"context_lines":[{"line_number":104,"context_line":"        return self.shelve()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def revert(self):"},{"line_number":107,"context_line":"        LOG.warning(\"Revert not supported for shelve action\")"},{"line_number":108,"context_line":"        return False"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def abort(self):"},{"line_number":111,"context_line":"        \"\"\"Abort the shelve action - not applicable for shelve operations\"\"\""},{"line_number":112,"context_line":"        LOG.info("}],"source_content_type":"text/x-python","patch_set":5,"id":"a8bdb4e2_b8bc4cf4","line":109,"range":{"start_line":107,"start_character":1,"end_line":109,"end_character":1},"updated":"2026-09-02 19:50:26.000000000","message":"can you update the commit message to refelct that we are not supproting revert ro jsut remvoe the refence that says its suproted via unshleve.","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"73b70e4a94893e358d2641469add7332bf84e7bd","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        return self.shelve()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def revert(self):"},{"line_number":107,"context_line":"        LOG.warning(\"Revert not supported for shelve action\")"},{"line_number":108,"context_line":"        return False"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def abort(self):"},{"line_number":111,"context_line":"        \"\"\"Abort the shelve action - not applicable for shelve operations\"\"\""},{"line_number":112,"context_line":"        LOG.info("}],"source_content_type":"text/x-python","patch_set":5,"id":"fdac5022_4c9289e1","line":109,"range":{"start_line":107,"start_character":1,"end_line":109,"end_character":1},"in_reply_to":"a8bdb4e2_b8bc4cf4","updated":"2026-09-03 14:22:19.000000000","message":"Done. Updated the commit message.","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"}],"watcher/common/nova_helper.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8747415e806c7f3b3c7e61b3d3760649f2adb1d5","unresolved":true,"context_lines":[{"line_number":1228,"context_line":"        \"\"\""},{"line_number":1229,"context_line":"        return self.connection.compute.delete_server(instance_id)"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"    def delete_instance(self, instance_id):"},{"line_number":1232,"context_line":"        \"\"\"This method deletes a given instance."},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"        :param instance_id: the unique id of the instance to delete."}],"source_content_type":"text/x-python","patch_set":1,"id":"22ee0b8b_e1e67662","line":1231,"range":{"start_line":1231,"start_character":8,"end_line":1231,"end_character":23},"updated":"2026-08-12 20:39:58.000000000","message":"we should add unit tests to these new methods","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"da4e3c127267e043267bbd85476acc849b60d069","unresolved":false,"context_lines":[{"line_number":1228,"context_line":"        \"\"\""},{"line_number":1229,"context_line":"        return self.connection.compute.delete_server(instance_id)"},{"line_number":1230,"context_line":""},{"line_number":1231,"context_line":"    def delete_instance(self, instance_id):"},{"line_number":1232,"context_line":"        \"\"\"This method deletes a given instance."},{"line_number":1233,"context_line":""},{"line_number":1234,"context_line":"        :param instance_id: the unique id of the instance to delete."}],"source_content_type":"text/x-python","patch_set":1,"id":"40aa450a_5300c722","line":1231,"range":{"start_line":1231,"start_character":8,"end_line":1231,"end_character":23},"in_reply_to":"22ee0b8b_e1e67662","updated":"2026-08-13 15:20:25.000000000","message":"Done","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8747415e806c7f3b3c7e61b3d3760649f2adb1d5","unresolved":true,"context_lines":[{"line_number":1248,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":"        # Wait for instance to disappear"},{"line_number":1251,"context_line":"        retry \u003d 10"},{"line_number":1252,"context_line":"        while retry:"},{"line_number":1253,"context_line":"            time.sleep(5)"},{"line_number":1254,"context_line":"            try:"},{"line_number":1255,"context_line":"                self.find_instance(instance_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"b4066b6a_f6cc0c3a","line":1252,"range":{"start_line":1251,"start_character":0,"end_line":1252,"end_character":20},"updated":"2026-08-12 20:39:58.000000000","message":"retry should be configurable from method params, we can set a default there. And also increase the number of default retries","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f2bd966eaeb64de5a547992a56f6a249c7b2673b","unresolved":false,"context_lines":[{"line_number":1248,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":"        # Wait for instance to disappear"},{"line_number":1251,"context_line":"        retry \u003d 10"},{"line_number":1252,"context_line":"        while retry:"},{"line_number":1253,"context_line":"            time.sleep(5)"},{"line_number":1254,"context_line":"            try:"},{"line_number":1255,"context_line":"                self.find_instance(instance_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"80b77026_fa050309","line":1252,"range":{"start_line":1251,"start_character":0,"end_line":1252,"end_character":20},"in_reply_to":"2489a4df_330695fe","updated":"2026-08-27 13:00:46.000000000","message":"Done","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"da4e3c127267e043267bbd85476acc849b60d069","unresolved":true,"context_lines":[{"line_number":1248,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1249,"context_line":""},{"line_number":1250,"context_line":"        # Wait for instance to disappear"},{"line_number":1251,"context_line":"        retry \u003d 10"},{"line_number":1252,"context_line":"        while retry:"},{"line_number":1253,"context_line":"            time.sleep(5)"},{"line_number":1254,"context_line":"            try:"},{"line_number":1255,"context_line":"                self.find_instance(instance_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"2489a4df_330695fe","line":1252,"range":{"start_line":1251,"start_character":0,"end_line":1252,"end_character":20},"in_reply_to":"b4066b6a_f6cc0c3a","updated":"2026-08-13 15:20:25.000000000","message":"I stepped back and decided to use the existing `wait_for_instance_state` func passing the retry from params. PTAL","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8747415e806c7f3b3c7e61b3d3760649f2adb1d5","unresolved":true,"context_lines":[{"line_number":1250,"context_line":"        # Wait for instance to disappear"},{"line_number":1251,"context_line":"        retry \u003d 10"},{"line_number":1252,"context_line":"        while retry:"},{"line_number":1253,"context_line":"            time.sleep(5)"},{"line_number":1254,"context_line":"            try:"},{"line_number":1255,"context_line":"                self.find_instance(instance_id)"},{"line_number":1256,"context_line":"            except exception.ComputeResourceNotFound:"}],"source_content_type":"text/x-python","patch_set":1,"id":"de78857c_d00b9c74","line":1253,"range":{"start_line":1253,"start_character":23,"end_line":1253,"end_character":24},"updated":"2026-08-12 20:39:58.000000000","message":"we usually set to 1","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"da4e3c127267e043267bbd85476acc849b60d069","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"        # Wait for instance to disappear"},{"line_number":1251,"context_line":"        retry \u003d 10"},{"line_number":1252,"context_line":"        while retry:"},{"line_number":1253,"context_line":"            time.sleep(5)"},{"line_number":1254,"context_line":"            try:"},{"line_number":1255,"context_line":"                self.find_instance(instance_id)"},{"line_number":1256,"context_line":"            except exception.ComputeResourceNotFound:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ca4f988_3ebdc1ac","line":1253,"range":{"start_line":1253,"start_character":23,"end_line":1253,"end_character":24},"in_reply_to":"de78857c_d00b9c74","updated":"2026-08-13 15:20:25.000000000","message":"Done. Passed 1 in the call to `wait_for_instance_state`","commit_id":"c0b2b840ab0c3cd3bdfcf0296ef91692916224da"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":1176,"context_line":"        active, stopped, deleted, shelved, shelved_offloaded."},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"        :param server: Server wrapper object."},{"line_number":1179,"context_line":"        :param state: target vm_state string, or list of target vm_state"},{"line_number":1180,"context_line":"            strings, for which we are waiting."},{"line_number":1181,"context_line":"        :param retry: how many times to retry"},{"line_number":1182,"context_line":"        :param sleep: seconds to sleep between the retries"},{"line_number":1183,"context_line":"        :raises: NovaClientError if there is any problem while calling the Nova"}],"source_content_type":"text/x-python","patch_set":2,"id":"e798d487_a8067359","line":1180,"range":{"start_line":1179,"start_character":9,"end_line":1180,"end_character":46},"updated":"2026-08-26 19:00:29.000000000","message":"we shoudl not have parmater that change types depending on how its called\n\nthis shoudl be renmaed `state` -\u003e `states` and always be a list of states\n\nfor old caller just pass [state]","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":false,"context_lines":[{"line_number":1176,"context_line":"        active, stopped, deleted, shelved, shelved_offloaded."},{"line_number":1177,"context_line":""},{"line_number":1178,"context_line":"        :param server: Server wrapper object."},{"line_number":1179,"context_line":"        :param state: target vm_state string, or list of target vm_state"},{"line_number":1180,"context_line":"            strings, for which we are waiting."},{"line_number":1181,"context_line":"        :param retry: how many times to retry"},{"line_number":1182,"context_line":"        :param sleep: seconds to sleep between the retries"},{"line_number":1183,"context_line":"        :raises: NovaClientError if there is any problem while calling the Nova"}],"source_content_type":"text/x-python","patch_set":2,"id":"6a53c457_de38a0dc","line":1180,"range":{"start_line":1179,"start_character":9,"end_line":1180,"end_character":46},"in_reply_to":"e798d487_a8067359","updated":"2026-08-26 21:29:56.000000000","message":"Done","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        if self.wait_for_instance_state(instance, \"deleted\", retry, 1):"},{"line_number":1255,"context_line":"            LOG.debug(\"Instance %s deleted.\", instance_id)"},{"line_number":1256,"context_line":"            return True"},{"line_number":1257,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"25534581_fb89ee58","line":1254,"range":{"start_line":1254,"start_character":7,"end_line":1254,"end_character":71},"updated":"2026-08-26 19:00:29.000000000","message":"you would need to `soft-delete`  but also im not sure it ever end up \"deleted\" it\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/fields.py#L1042-L1043\n\nthat is a valid status but you might just get a 404\n\nhttps://docs.openstack.org/nova/latest/reference/vm-states.html\n\nwe shoudl not try to supprot \n\nforce_delete or restore in watcher.","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6cd7e41b7f016a3b9d85db5d82504eb7c51d2d6","unresolved":false,"context_lines":[{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        if self.wait_for_instance_state(instance, \"deleted\", retry, 1):"},{"line_number":1255,"context_line":"            LOG.debug(\"Instance %s deleted.\", instance_id)"},{"line_number":1256,"context_line":"            return True"},{"line_number":1257,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7fef912a_4ab4e1a7","line":1254,"range":{"start_line":1254,"start_character":7,"end_line":1254,"end_character":71},"in_reply_to":"25534581_fb89ee58","updated":"2026-09-03 14:28:35.000000000","message":"Done","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"ea0d778cb7421c6e5c815441987382937e14d7bc","unresolved":true,"context_lines":[{"line_number":1266,"context_line":"        \"\"\""},{"line_number":1267,"context_line":"        return self.connection.compute.shelve_server(instance_id)"},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"    def shelve_instance(self, instance_id, retry\u003d30):"},{"line_number":1270,"context_line":"        \"\"\"This method shelves a given instance."},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"        Waits for the instance to reach either the ``shelved`` or"}],"source_content_type":"text/x-python","patch_set":2,"id":"34f1af9f_de1a0e74","line":1269,"range":{"start_line":1269,"start_character":44,"end_line":1269,"end_character":51},"updated":"2026-08-26 13:09:00.000000000","message":"not sure if is a good default value, lets see what others think","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":true,"context_lines":[{"line_number":1266,"context_line":"        \"\"\""},{"line_number":1267,"context_line":"        return self.connection.compute.shelve_server(instance_id)"},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"    def shelve_instance(self, instance_id, retry\u003d30):"},{"line_number":1270,"context_line":"        \"\"\"This method shelves a given instance."},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"        Waits for the instance to reach either the ``shelved`` or"}],"source_content_type":"text/x-python","patch_set":2,"id":"6b114ade_1cc8a450","line":1269,"range":{"start_line":1269,"start_character":44,"end_line":1269,"end_character":51},"in_reply_to":"34f1af9f_de1a0e74","updated":"2026-08-26 19:00:29.000000000","message":"so we shoudl not use the term retry fo the number of tiem we pool\n\nand this shoudl be set in config like the other pollign intervals and attempts\n\nhttps://docs.openstack.org/watcher/latest/configuration/watcher.html#nova.migration_max_retries\nhttps://docs.openstack.org/watcher/latest/configuration/watcher.html#nova.migration_interval\n\ni dont think we need to have a function argumetn for this at all","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"530b2fcb7ab5ba88aff07b3e03933024ab6f3e14","unresolved":true,"context_lines":[{"line_number":1266,"context_line":"        \"\"\""},{"line_number":1267,"context_line":"        return self.connection.compute.shelve_server(instance_id)"},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"    def shelve_instance(self, instance_id, retry\u003d30):"},{"line_number":1270,"context_line":"        \"\"\"This method shelves a given instance."},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"        Waits for the instance to reach either the ``shelved`` or"}],"source_content_type":"text/x-python","patch_set":2,"id":"da58ce17_39004645","line":1269,"range":{"start_line":1269,"start_character":44,"end_line":1269,"end_character":51},"in_reply_to":"6b114ade_1cc8a450","updated":"2026-08-26 21:29:56.000000000","message":"Done. Added config fields for both retries and interval for each action. I changed a little bit the default values, LMK if you guys think it\u0027s good","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5e1ecb54ded019812ab8ca5d8fe0759e8ebdfd06","unresolved":false,"context_lines":[{"line_number":1266,"context_line":"        \"\"\""},{"line_number":1267,"context_line":"        return self.connection.compute.shelve_server(instance_id)"},{"line_number":1268,"context_line":""},{"line_number":1269,"context_line":"    def shelve_instance(self, instance_id, retry\u003d30):"},{"line_number":1270,"context_line":"        \"\"\"This method shelves a given instance."},{"line_number":1271,"context_line":""},{"line_number":1272,"context_line":"        Waits for the instance to reach either the ``shelved`` or"}],"source_content_type":"text/x-python","patch_set":2,"id":"444cad96_63f3dc97","line":1269,"range":{"start_line":1269,"start_character":44,"end_line":1269,"end_character":51},"in_reply_to":"da58ce17_39004645","updated":"2026-09-02 19:50:26.000000000","message":"Acknowledged","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"},{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"116046840df99e6600d18a92766842d348e43df4","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"            LOG.debug(\"Instance not found: %s, already deleted\", instance_id)"},{"line_number":1250,"context_line":"            return True"},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        retry \u003d CONF.nova.delete_max_retries"},{"line_number":1255,"context_line":"        interval \u003d CONF.nova.delete_interval"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a0a0497_b051002d","line":1252,"updated":"2026-08-27 15:28:26.000000000","message":"NovaHelper.delete_instance treats ComputeResourceNotFound from the initial find_instance as success (idempotent), but the subsequent self._nova_delete_instance() call is decorated with handle_nova_error, which converts an openstacksdk NotFoundException (HTTP 404 from delete_server) into exception.ComputeResourceNotFound. That exception is not caught in delete_instance; it propagates to Delete.delete(), where the generic \u0027except Exception\u0027 handler returns False, marking the action failed even though the instance no longer exists.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If the instance is deleted by another actor in the window between find_instance and delete_server, the action plan records the delete action as FAILED even though the desired end state (instance gone) was reached, producing false failures and possibly triggering unnecessary rollback in the workflow.\n\n**Suggestion**:\nWrap the self._nova_delete_instance(instance_id) call in try/except exception.ComputeResourceNotFound and return True (logging that the instance was already deleted), consistent with the idempotent handling of the initial find_instance at nova_helper.py:1245-1248.","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e6cd7e41b7f016a3b9d85db5d82504eb7c51d2d6","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"            LOG.debug(\"Instance not found: %s, already deleted\", instance_id)"},{"line_number":1250,"context_line":"            return True"},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        retry \u003d CONF.nova.delete_max_retries"},{"line_number":1255,"context_line":"        interval \u003d CONF.nova.delete_interval"}],"source_content_type":"text/x-python","patch_set":5,"id":"99913509_50bbc9c4","line":1252,"in_reply_to":"5a84181e_0e32229f","updated":"2026-09-03 14:28:35.000000000","message":"Done","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b33029d8ba41166235215faf66720d46e8770e11","unresolved":true,"context_lines":[{"line_number":1249,"context_line":"            LOG.debug(\"Instance not found: %s, already deleted\", instance_id)"},{"line_number":1250,"context_line":"            return True"},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        retry \u003d CONF.nova.delete_max_retries"},{"line_number":1255,"context_line":"        interval \u003d CONF.nova.delete_interval"}],"source_content_type":"text/x-python","patch_set":5,"id":"a2a8c195_b8239ef7","line":1252,"in_reply_to":"9a0a0497_b051002d","updated":"2026-09-02 19:12:19.000000000","message":"I think that this improvemente is valid, it may happen that instance is deleted between find_instance and delete. We can add it as a follow up or in the nex patch set that you may send","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"73b70e4a94893e358d2641469add7332bf84e7bd","unresolved":true,"context_lines":[{"line_number":1249,"context_line":"            LOG.debug(\"Instance not found: %s, already deleted\", instance_id)"},{"line_number":1250,"context_line":"            return True"},{"line_number":1251,"context_line":""},{"line_number":1252,"context_line":"        self._nova_delete_instance(instance_id)"},{"line_number":1253,"context_line":""},{"line_number":1254,"context_line":"        retry \u003d CONF.nova.delete_max_retries"},{"line_number":1255,"context_line":"        interval \u003d CONF.nova.delete_interval"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a84181e_0e32229f","line":1252,"in_reply_to":"a2a8c195_b8239ef7","updated":"2026-09-03 14:22:19.000000000","message":"I moved this call to the same try/except block right above. PTAL.","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b33029d8ba41166235215faf66720d46e8770e11","unresolved":false,"context_lines":[{"line_number":1290,"context_line":"            instance \u003d self.find_instance(instance_id)"},{"line_number":1291,"context_line":"        except exception.ComputeResourceNotFound:"},{"line_number":1292,"context_line":"            LOG.debug(\"Instance not found: %s, can\u0027t shelve it\", instance_id)"},{"line_number":1293,"context_line":"            return False"},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"        if instance.vm_state in (\"shelved\", \"shelved_offloaded\"):"},{"line_number":1296,"context_line":"            LOG.debug(\"Instance already shelved: %s\", instance_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3c275d57_c97a8bc9","line":1293,"range":{"start_line":1293,"start_character":19,"end_line":1293,"end_character":24},"updated":"2026-09-02 19:12:19.000000000","message":"yeah, I think take make sense to be false here, different from the delete case","commit_id":"a22a4b7c1b696900f6196a0f872131b1f4f378bf"}],"watcher/conf/nova.py":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"788f1c87c57172c519e0e2995d3ab74ff9555271","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        \u0027before giving up and considering the operation failed. \u0027"},{"line_number":55,"context_line":"        \u0027Default value is 15.\u0027,"},{"line_number":56,"context_line":"    ),"},{"line_number":57,"context_line":"    cfg.FloatOpt("},{"line_number":58,"context_line":"        \u0027delete_interval\u0027,"},{"line_number":59,"context_line":"        default\u003d5.0,"},{"line_number":60,"context_line":"        min\u003d0.1,"}],"source_content_type":"text/x-python","patch_set":3,"id":"73d16ffa_04f2f321","line":57,"updated":"2026-08-26 21:38:50.000000000","message":"Both new FloatOpt help strings end with \u0027Default value is 1.0 seconds.\u0027 while the options are declared with default\u003d5.0. This appears to be copy-paste from an older option\u0027s help text.\n\n**Severity**: SUGGESTION | **Confidence**: 0.97\n\n**Impact**: Operators reading the sample config or the generated configuration reference will believe polling happens every 1.0 second by default when it actually happens every 5.0 seconds, complicating capacity and timeout reasoning (retry\u003d15 x 5.0s \u003d 75s worst case, not 15s).\n\n**Recommendation**:\nChange the final sentence of both help strings to \u0027Default value is 5.0 seconds.\u0027 to match the declared defaults.","commit_id":"4c1c54f2b9fb0e2a01a9a905c0b7fa3d8de9a686"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f2bd966eaeb64de5a547992a56f6a249c7b2673b","unresolved":true,"context_lines":[{"line_number":59,"context_line":"        default\u003d5.0,"},{"line_number":60,"context_line":"        min\u003d0.1,"},{"line_number":61,"context_line":"        help\u003d\u0027Interval in seconds to check the status in instance \u0027"},{"line_number":62,"context_line":"        \u0027deletion operations (value is float). Default value is 1.0 \u0027"},{"line_number":63,"context_line":"        \u0027seconds.\u0027,"},{"line_number":64,"context_line":"    ),"},{"line_number":65,"context_line":"    cfg.IntOpt("}],"source_content_type":"text/x-python","patch_set":3,"id":"42d78d54_2c0881c3","line":62,"range":{"start_line":62,"start_character":64,"end_line":62,"end_character":67},"updated":"2026-08-27 13:00:46.000000000","message":"It should be 1, but it is set to 5","commit_id":"4c1c54f2b9fb0e2a01a9a905c0b7fa3d8de9a686"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"bd5654ee563c63741b32b0c3a80289d632898a0c","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        default\u003d5.0,"},{"line_number":60,"context_line":"        min\u003d0.1,"},{"line_number":61,"context_line":"        help\u003d\u0027Interval in seconds to check the status in instance \u0027"},{"line_number":62,"context_line":"        \u0027deletion operations (value is float). Default value is 1.0 \u0027"},{"line_number":63,"context_line":"        \u0027seconds.\u0027,"},{"line_number":64,"context_line":"    ),"},{"line_number":65,"context_line":"    cfg.IntOpt("}],"source_content_type":"text/x-python","patch_set":3,"id":"0906a90e_6ceed740","line":62,"range":{"start_line":62,"start_character":64,"end_line":62,"end_character":67},"in_reply_to":"42d78d54_2c0881c3","updated":"2026-08-27 17:53:39.000000000","message":"Done","commit_id":"4c1c54f2b9fb0e2a01a9a905c0b7fa3d8de9a686"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f2bd966eaeb64de5a547992a56f6a249c7b2673b","unresolved":true,"context_lines":[{"line_number":75,"context_line":"        default\u003d5.0,"},{"line_number":76,"context_line":"        min\u003d0.1,"},{"line_number":77,"context_line":"        help\u003d\u0027Interval in seconds to check the status in instance \u0027"},{"line_number":78,"context_line":"        \u0027shelve operations (value is float). Default value is 1.0 \u0027"},{"line_number":79,"context_line":"        \u0027seconds.\u0027,"},{"line_number":80,"context_line":"    ),"},{"line_number":81,"context_line":"    cfg.IntOpt("},{"line_number":82,"context_line":"        \u0027http_retries\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"face8973_15638779","line":79,"range":{"start_line":78,"start_character":62,"end_line":79,"end_character":19},"updated":"2026-08-27 13:00:46.000000000","message":"same","commit_id":"4c1c54f2b9fb0e2a01a9a905c0b7fa3d8de9a686"},{"author":{"_account_id":36630,"name":"Winicius Allan Bezerra da Silva","display_name":"Winicius Allan","email":"winiciusab12@gmail.com","username":"winiciusallan"},"change_message_id":"bd5654ee563c63741b32b0c3a80289d632898a0c","unresolved":false,"context_lines":[{"line_number":75,"context_line":"        default\u003d5.0,"},{"line_number":76,"context_line":"        min\u003d0.1,"},{"line_number":77,"context_line":"        help\u003d\u0027Interval in seconds to check the status in instance \u0027"},{"line_number":78,"context_line":"        \u0027shelve operations (value is float). Default value is 1.0 \u0027"},{"line_number":79,"context_line":"        \u0027seconds.\u0027,"},{"line_number":80,"context_line":"    ),"},{"line_number":81,"context_line":"    cfg.IntOpt("},{"line_number":82,"context_line":"        \u0027http_retries\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"a16026ac_0b0db3ed","line":79,"range":{"start_line":78,"start_character":62,"end_line":79,"end_character":19},"in_reply_to":"face8973_15638779","updated":"2026-08-27 17:53:39.000000000","message":"Done","commit_id":"4c1c54f2b9fb0e2a01a9a905c0b7fa3d8de9a686"}],"watcher/decision_engine/planner/weight.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"280c8601331e31eb8b39ee98baf17d6bd57f1850","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    def __init__(self, config):"},{"line_number":47,"context_line":"        super().__init__(config)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    action_weights \u003d {"},{"line_number":50,"context_line":"        \u0027nop\u0027: 70,"},{"line_number":51,"context_line":"        \u0027volume_migrate\u0027: 60,"},{"line_number":52,"context_line":"        \u0027change_nova_service_state\u0027: 50,"},{"line_number":53,"context_line":"        \u0027sleep\u0027: 40,"},{"line_number":54,"context_line":"        \u0027shelve\u0027: 37,"},{"line_number":55,"context_line":"        \u0027stop\u0027: 35,"},{"line_number":56,"context_line":"        \u0027delete\u0027: 33,"},{"line_number":57,"context_line":"        \u0027migrate\u0027: 30,"},{"line_number":58,"context_line":"        \u0027resize\u0027: 20,"},{"line_number":59,"context_line":"        \u0027turn_host_to_acpi_s3_state\u0027: 10,"},{"line_number":60,"context_line":"        \u0027change_node_power_state\u0027: 9,"},{"line_number":61,"context_line":"    }"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    parallelization \u003d {"},{"line_number":64,"context_line":"        \u0027turn_host_to_acpi_s3_state\u0027: 2,"},{"line_number":65,"context_line":"        \u0027resize\u0027: 2,"},{"line_number":66,"context_line":"        \u0027stop\u0027: 2,"},{"line_number":67,"context_line":"        \u0027delete\u0027: 2,"},{"line_number":68,"context_line":"        \u0027shelve\u0027: 2,"},{"line_number":69,"context_line":"        \u0027migrate\u0027: 2,"},{"line_number":70,"context_line":"        \u0027sleep\u0027: 1,"},{"line_number":71,"context_line":"        \u0027change_nova_service_state\u0027: 1,"},{"line_number":72,"context_line":"        \u0027nop\u0027: 1,"},{"line_number":73,"context_line":"        \u0027change_node_power_state\u0027: 2,"},{"line_number":74,"context_line":"        \u0027volume_migrate\u0027: 2,"},{"line_number":75,"context_line":"    }"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    @classmethod"},{"line_number":78,"context_line":"    def get_config_opts(cls):"}],"source_content_type":"text/x-python","patch_set":2,"id":"dd45aedd_61936479","line":75,"range":{"start_line":49,"start_character":3,"end_line":75,"end_character":5},"updated":"2026-08-26 19:00:29.000000000","message":"these seam ok.\n\nnova by default allow 10 io opertions per host wehre start delete shelve all count as an io operation so allowing 2 is fine\n\nwe may want to externalise this at some point so that it can be configure rather then hard coded","commit_id":"eb07a5bf09adcf55f3719c59559a643ad4f1fba7"}],"watcher/tests/unit/common/test_nova_helper.py":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"788f1c87c57172c519e0e2995d3ab74ff9555271","unresolved":false,"context_lines":[{"line_number":269,"context_line":"        for call in self.mock_sleep.call_args_list:"},{"line_number":270,"context_line":"            self.assertEqual(call[0][0], 5.0)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_delete_instance_timeout(self):"},{"line_number":273,"context_line":"        \"\"\"Verify delete_instance returns False when instance is not found.\"\"\""},{"line_number":274,"context_line":"        nova_util \u003d nova_helper.NovaHelper()"},{"line_number":275,"context_line":"        instance_id \u003d utils.generate_uuid()"}],"source_content_type":"text/x-python","patch_set":3,"id":"f82b3819_15384772","line":272,"updated":"2026-08-26 21:38:50.000000000","message":"The new test\u0027s docstring says \u0027Verify delete_instance returns False when instance is not found\u0027, but the test actually verifies the timeout path where the instance keeps existing and never disappears.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Impact**: When this test fails, the misleading docstring points a developer at the wrong code path (not-found handling instead of the retry/timeout loop), wasting debugging time.\n\n**Recommendation**:\nRewrite the docstring to \u0027Verify delete_instance returns False when the instance never disappears and the retry limit is reached.\u0027","commit_id":"4c1c54f2b9fb0e2a01a9a905c0b7fa3d8de9a686"}]}
