)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d4677af5fb35833c7e1a1cf4f07d1556398df38a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"8f456b4e_abb7139d","updated":"2026-08-27 15:09:30.000000000","message":"recheck \n\ndepends-on patch was updated with the new flag to true","commit_id":"5bfc0787e5a1923cb2f7933c58308045e8d41247"}],"watcher_tempest_plugin/tests/scenario/test_execute_actuator.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":"c53ef20df20ee86408705865e3320972e4c456c7","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            }"},{"line_number":304,"context_line":"        ]"},{"line_number":305,"context_line":""},{"line_number":306,"context_line":"        self.wait_for_all_action_plans_to_finish()"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"        audit_template \u003d self.create_audit_template_for_strategy()"},{"line_number":309,"context_line":"        audit \u003d self.create_audit_and_wait("}],"source_content_type":"text/x-python","patch_set":2,"id":"8394a604_870685e7","line":306,"updated":"2026-08-24 18:47:34.000000000","message":"test_delete_skipped_when_instance_already_deleted and test_shelve_skipped_when_instance_not_found each inline a verbatim ~35-line copy of the audit-template creation, audit-and-wait, action plan lookup, start, poll, and state-assertion flow. This duplicates the _run_actuator_action helper added in the same patch and the pre-existing execute_actions_and_validate_states(pre_execution_hook\u003d...) helper in test_execute_skipped_actions.py that exists precisely for mutating resources between audit completion and action plan start. The invariant \u0027start the plan, wait for completion, assert finished state\u0027 now has three independent implementations in the added code.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: A future change to the start/wait contract (timeout handling, finished-state assertions, action listing) must be applied in three places in this file plus the sibling module; missing a copy makes the skip-path tests silently diverge from the postcondition tests they are meant to mirror.\n\n**Recommendation**:\nExtend _run_actuator_action with an optional pre_execution_hook callable invoked after show_action_plan and before start_action_plan, and have both skip tests call it with functools.partial(self._delete_instance, instance[\u0027id\u0027]), mirroring execute_actions_and_validate_states in test_execute_skipped_actions.py.","commit_id":"cea9ddb0acc6ce7142bcbb38c6c405b9aef48d71"},{"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":"2ef2d77243c31739ca37ed05504472f7527827f7","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    # Minimal version required for _create_instance with a specific host"},{"line_number":216,"context_line":"    compute_min_microversion \u003d base.NOVA_API_VERSION_CREATE_WITH_HOST"},{"line_number":217,"context_line":"    # Minimal version required for _create_instance with a specific host"},{"line_number":218,"context_line":"    min_microversion \u003d \u00271.3\u0027"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    GOAL \u003d \"unclassified\""}],"source_content_type":"text/x-python","patch_set":3,"id":"854e2901_ecd9e6d9","line":217,"updated":"2026-08-25 15:07:49.000000000","message":"The class sets two microversion attributes with the identical comment \u0027# Minimal version required for _create_instance with a specific host\u0027. The comment is correct for compute_min_microversion \u003d NOVA_API_VERSION_CREATE_WITH_HOST (\u00272.74\u0027) but wrong for min_microversion \u003d \u00271.3\u0027, which is the Watcher infra-optim API microversion and unrelated to host-specific instance creation.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: A future maintainer reading the comment may change or remove min_microversion assuming it is a Nova-side constraint (or vice versa), breaking the watcher API version contract these tests rely on.\n\n**Recommendation**:\nReplace the second comment with one that states the actual purpose, e.g. \u0027# Minimal Watcher (infra-optim) API microversion required by these tests\u0027, and note why 1.3 is needed.","commit_id":"766a7ba0ba1db12cd8256e64e8fc2679cb5b01cd"},{"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":"2ef2d77243c31739ca37ed05504472f7527827f7","unresolved":false,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027actuator\u0027])"},{"line_number":343,"context_line":"    @decorators.idempotent_id(\u0027ef156ca9-50d3-45e6-83f4-d97bfa92e168\u0027)"},{"line_number":344,"context_line":"    def test_shelve_active_instance(self):"},{"line_number":345,"context_line":"        \"\"\"Test that the shelve action shelves an ACTIVE instance."},{"line_number":346,"context_line":""},{"line_number":347,"context_line":"        Creates an instance, submits a shelve action through the actuator"}],"source_content_type":"text/x-python","patch_set":3,"id":"6e013496_43fba042","line":344,"updated":"2026-08-25 15:07:49.000000000","message":"Three of the new tests (test_shelve_active_instance, test_shelve_skipped_when_instance_already_shelved, test_shelve_skipped_when_instance_not_found) rely on the Nova shelve API, but the class never checks the tempest compute_feature_enabled.shelve capability flag, unlike tempest\u0027s own shelve tests and this plugin\u0027s consistent use of capability skip checks for other features.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: On deployments where shelve is not available or disabled in tempest configuration, these tests fail with API errors instead of skipping, producing false negatives for the watcher shelve action coverage.\n\n**Suggestion**:\nAdd a skip check in the class (or per-test) mirroring the plugin convention, e.g. in skip_checks: if not CONF.compute_feature_enabled.shelve: raise cls.skipException(\u0027Shelve is not enabled\u0027) for the shelve tests, or split shelve tests into a subclass with that gate.","commit_id":"766a7ba0ba1db12cd8256e64e8fc2679cb5b01cd"},{"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":"2ef2d77243c31739ca37ed05504472f7527827f7","unresolved":false,"context_lines":[{"line_number":393,"context_line":"        # Shelve the instance before the action plan runs so the"},{"line_number":394,"context_line":"        # pre_condition finds it already shelved and skips the action."},{"line_number":395,"context_line":"        self.mgr.servers_client.shelve_server(instance[\u0027id\u0027])"},{"line_number":396,"context_line":"        waiters.wait_for_server_status("},{"line_number":397,"context_line":"            self.mgr.servers_client,"},{"line_number":398,"context_line":"            instance[\u0027id\u0027],"},{"line_number":399,"context_line":"            (\u0027SHELVED\u0027, \u0027SHELVED_OFFLOADED\u0027),"}],"source_content_type":"text/x-python","patch_set":3,"id":"0751b397_bda20d27","line":396,"updated":"2026-08-25 15:07:49.000000000","message":"test_shelve_skipped_when_instance_already_shelved passes (\u0027SHELVED\u0027, \u0027SHELVED_OFFLOADED\u0027) as the status argument to tempest.common.waiters.wait_for_server_status. That waiter compares the server status with plain equality (if server_status \u003d\u003d status), so a tuple never matches a string status and the call can only end in TimeoutException.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Impact**: The new shelve-skip test cannot pass: after shelving the server, the wait always raises TimeoutException once build_timeout elapses, so every run of test_shelve_skipped_when_instance_already_shelved fails and burns the full timeout before doing so.\n\n**Priority**: Before merge\n**Recommendation**:\nWait for a single concrete status, e.g. waiters.wait_for_server_status(self.mgr.servers_client, instance[\u0027id\u0027], \u0027SHELVED\u0027, ready_wait\u003dFalse), or poll both states with test_utils.call_until_true checking show_server()[\u0027server\u0027][\u0027status\u0027] in (\u0027SHELVED\u0027, \u0027SHELVED_OFFLOADED\u0027) using CONF.optimize.resource_timeout/resource_check_interval.","commit_id":"766a7ba0ba1db12cd8256e64e8fc2679cb5b01cd"},{"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":"611e5db577b61ad3aff0ccfeb1e54ad1fc62072e","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    # Minimal version required for _create_instance with a specific host"},{"line_number":217,"context_line":"    compute_min_microversion \u003d base.NOVA_API_VERSION_CREATE_WITH_HOST"},{"line_number":218,"context_line":"    # Minimal version required for _create_instance with a specific host"},{"line_number":219,"context_line":"    min_microversion \u003d \u00271.3\u0027"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    GOAL \u003d \"unclassified\""}],"source_content_type":"text/x-python","patch_set":4,"id":"6172c2a8_de87850f","line":218,"updated":"2026-08-25 17:43:42.000000000","message":"The new class sets two attributes with the identical comment \u0027# Minimal version required for _create_instance with a specific host\u0027. The first applies to compute_min_microversion (Nova 2.74 for host-pinned boot), but min_microversion \u003d \u00271.3\u0027 is the Watcher (optimize) API microversion and is unrelated to _create_instance. The duplicated comment misattributes a constraint to the wrong version knob.\n\n**Severity**: SUGGESTION | **Confidence**: 0.95\n\n**Impact**: A reader debugging microversion skips will assume the Watcher 1.3 requirement comes from host-pinned instance creation and may adjust or remove the wrong knob, silently changing test skip behavior.\n\n**Recommendation**:\nReplace the second comment with one stating the actual constraint, e.g. \u0027# Watcher API min microversion required by these tests\u0027, naming the API feature that needs 1.3.","commit_id":"7ba5c3a062b4621f72abb19022d05dd76a226441"},{"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":"611e5db577b61ad3aff0ccfeb1e54ad1fc62072e","unresolved":false,"context_lines":[{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027actuator\u0027])"},{"line_number":286,"context_line":"    @decorators.idempotent_id(\u00274070c0ec-43b1-41fc-9363-a5e8458cb87c\u0027)"},{"line_number":287,"context_line":"    def test_delete_skipped_when_instance_already_deleted(self):"},{"line_number":288,"context_line":"        \"\"\"Test that the delete action is skipped when instance is gone."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        Deletes the instance before executing the action plan. The"}],"source_content_type":"text/x-python","patch_set":4,"id":"1b18cb3b_3ea3098c","line":287,"updated":"2026-08-25 17:43:42.000000000","message":"test_delete_skipped_when_instance_already_deleted (287-340) and test_shelve_skipped_when_instance_not_found (422-475) reproduce, statement for statement, the audit creation, action-plan listing/show, start, state assertion, call_until_true polling and final show sequence that _run_actuator_action (224-253) already encapsulates in the same class. The only inserted step is _delete_instance() between showing and starting the plan, giving three independent implementations of the same execution invariant.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: A future fix to polling, timeouts or the PENDING/ONGOING assertion must be applied in three places; missing one leaves the skipped-variant tests with divergent execution semantics that yield inconsistent behavior across tests of the same feature.\n\n**Recommendation**:\nAdd an optional pre-start callback to _run_actuator_action (invoked just before start_action_plan), or split it into _create_pending_action_plan(actions) and _start_and_wait_action_plan(uuid), and have both skipped tests wrap their single _delete_instance call with the shared helpers.","commit_id":"7ba5c3a062b4621f72abb19022d05dd76a226441"},{"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":"a8e8699504ff8ff9683bdd768bb5636a118a36a7","unresolved":false,"context_lines":[{"line_number":215,"context_line":""},{"line_number":216,"context_line":"    # Minimal version required for _create_instance with a specific host"},{"line_number":217,"context_line":"    compute_min_microversion \u003d base.NOVA_API_VERSION_CREATE_WITH_HOST"},{"line_number":218,"context_line":"    # Minimal version required for _create_instance with a specific host"},{"line_number":219,"context_line":"    min_microversion \u003d \u00271.3\u0027"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    GOAL \u003d \"unclassified\""}],"source_content_type":"text/x-python","patch_set":5,"id":"5104f811_8e12c4d9","line":218,"updated":"2026-08-27 15:47:22.000000000","message":"Line 218 repeats the comment \u0027# Minimal version required for _create_instance with a specific host\u0027 above min_microversion \u003d \u00271.3\u0027. That comment describes the Nova compute microversion on lines 216-217 (NOVA_API_VERSION_CREATE_WITH_HOST \u003d \u00272.74\u0027, see base.py:52-57), but min_microversion here is the Watcher infra-optim API microversion (base.py:110-112, 144-146 select it for the optimize client), matching the \u00271.3\u0027 convention in every other scenario test class (test_continuous_audit.py:30, test_data_model.py:33, etc.).\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Impact**: A maintainer reading the class may conclude the Watcher API min_microversion is dictated by Nova 2.74 host pinning, or fear that raising/lowering Nova requirements also changes the Watcher API floor, making future microversion changes in this class error-prone.\n\n**Recommendation**:\nDelete the duplicated comment on line 218, or replace it with an accurate one such as \u0027# Minimal Watcher infra-optim API microversion required by these tests\u0027.","commit_id":"5bfc0787e5a1923cb2f7933c58308045e8d41247"},{"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":"a8e8699504ff8ff9683bdd768bb5636a118a36a7","unresolved":false,"context_lines":[{"line_number":314,"context_line":"            }"},{"line_number":315,"context_line":"        ]"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        self.wait_for_all_action_plans_to_finish()"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        audit_template \u003d self.create_audit_template_for_strategy()"},{"line_number":320,"context_line":"        audit \u003d self.create_audit_and_wait("}],"source_content_type":"text/x-python","patch_set":5,"id":"dfa02747_1c1bc871","line":317,"updated":"2026-08-27 15:47:22.000000000","message":"test_delete_skipped_when_instance_already_deleted (lines 317-349) and test_shelve_skipped_when_instance_not_found (lines 452-483) each inline an identical sequence: wait_for_all_action_plans_to_finish, create_audit_template_for_strategy, create_audit_and_wait with actions parameters, list/show the action plan, delete the instance, start the plan, assert PENDING/ONGOING, poll has_action_plan_finished, show the finished plan, list actions, and assert SUCCEEDED/SUPERSEDED plus SKIPPED. The same patch already adds _run_actuator_action (lines 232-262) implementing most of this flow; the inline copies exist only because the instance must be deleted between plan discovery and start.\n\n**Severity**: SUGGESTION | **Confidence**: 0.85\n\n**Impact**: The action-plan execution/assertion invariant now has three owners in one file. A future edit applied to only one copy (for example tightening the terminal-state assertion or the skip assertion) silently leaves the other tests enforcing the old behavior, producing inconsistent coverage of the same pre_condition contract.\n\n**Recommendation**:\nExtend _run_actuator_action with an optional pre-start hook, e.g. def _run_actuator_action(self, actions, before_start\u003dNone): ... if before_start: before_start() ... placed after action-plan discovery and before start_action_plan, and have both tests call it with before_start\u003dlambda: self._delete_instance(instance[\u0027id\u0027]). The action-state assertions can also be folded into the helper or a small _assert_action_skipped helper.","commit_id":"5bfc0787e5a1923cb2f7933c58308045e8d41247"}]}
