)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"4ca9378b8a5212cc9878b14aa05eb9a4ec33d85f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8c042b89_58f01632","updated":"2026-07-02 10:42:04.000000000","message":"Audit Scope test suite to be used to verify fixes for:\n - Host Maintenance: https://bugs.launchpad.net/watcher/+bug/2154805\n - Node Resource Consolidation: https://bugs.launchpad.net/watcher/+bug/2154806\n - Zone Migration: https://bugs.launchpad.net/watcher/+bug/2154807","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"e59c8e6762218d5b58efc09674a81831a7e04900","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"2a48cfa5_aabff5ec","updated":"2026-07-08 08:34:27.000000000","message":"recheck","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"79edf5f248466b5890c8409c031d06239fecf3c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"416a457b_d13cd496","updated":"2026-07-07 10:37:47.000000000","message":"recheck","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"}],"tox.ini":[{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"[tox]"},{"line_number":2,"context_line":"minversion \u003d 3.18.0"},{"line_number":3,"context_line":"envlist \u003d py3,pypy,pep8"},{"line_number":4,"context_line":"skipsdist \u003d True"}],"source_content_type":"text/x-properties","patch_set":2,"id":"cc7a81c3_8ac6392a","line":1,"updated":"2026-07-02 11:41:05.000000000","message":"The [DNM] (Do Not Merge) prefix in the commit subject signals this is a work-in-progress draft that must not be merged.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Merging a DNM commit would introduce the critical issues (missing expectedFailure, wrong bug numbers) into the gate, breaking CI when run_scope_tests is enabled.\n\n**Suggestion**:\nRemove the [DNM] prefix only after all blocking issues are resolved. The commit subject should be reworded to describe the feature without the DNM marker before final review.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"[flake8]"},{"line_number":71,"context_line":"show-source\u003dTrue"},{"line_number":72,"context_line":"ignore\u003d H105,E123,E226,N320,H202,W503,W504"},{"line_number":73,"context_line":"builtins\u003d _"},{"line_number":74,"context_line":"enable-extensions \u003d H106,H203"},{"line_number":75,"context_line":"exclude\u003d.venv,.git,.tox,dist,doc,*lib/python*,*egg,build,demo/,releasenotes"}],"source_content_type":"text/x-properties","patch_set":2,"id":"a7ded3f2_ff3ccba1","line":72,"updated":"2026-07-02 11:41:05.000000000","message":"W504 (line break after binary operator) was added to the flake8 ignore list alongside the existing W503 ignore, which is redundant when W503 is already suppressed.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: With W503 already ignored, W504 does not change behavior since pep8 considers the two mutually exclusive. The addition is harmless but may indicate the changed code introduced a line-break style not previously used.\n\n**Suggestion**:\nVerify whether W504 is truly needed. If the changed code introduced line breaks after binary operators, consider formatting the code to avoid them instead, or document the rationale for ignoring both W503 and W504.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"}],"watcher_tempest_plugin/tests/scenario/test_audit_scope.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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    GOAL \u003d \"dummy\""},{"line_number":52,"context_line":"    STRATEGY \u003d \"dummy\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @decorators.idempotent_id(\u0027a1b2c3d4-e5f6-4789-a012-3456789abcde\u0027)"},{"line_number":55,"context_line":"    @decorators.attr(type\u003d[\u0027scope\u0027])"},{"line_number":56,"context_line":"    def test_audit_scope_with_compute_nodes(self):"},{"line_number":57,"context_line":"        \"\"\"Verify that scope filters data model to specified compute nodes."}],"source_content_type":"text/x-python","patch_set":2,"id":"2bedeb45_04d80339","line":54,"updated":"2026-07-02 11:41:05.000000000","message":"All newly added idempotent_id UUIDs are hand-crafted placeholder patterns (e.g. a1b2c3d4-e5f6-4789-a012-3456789abcde) rather than genuine random UUIDs.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: Tempest idempotent_id relies on globally unique random UUIDs. Placeholder-style sequential UUIDs risk future collisions across plugin installations and conflict with the purpose of the check-uuid pep8 target.\n\n**Priority**: Before merge\n**Why This Matters**: The project runs check-uuid --package in its pep8 job. While these may be technically unique today, the predictable non-random pattern is fragile and against tempest conventions for test identification.\n\n**Recommendation**:\nGenerate proper random UUIDs using the project\u0027s own [testenv:uuidgen] target (check-uuid --fix) or uuidgen, and replace all hand-crafted values across the 8 changed test files.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        # Define scope: exclude the third compute node"},{"line_number":82,"context_line":"        # This effectively limits the scope to the first two nodes"},{"line_number":83,"context_line":"        scoped_nodes \u003d [compute_nodes[0][\u0027host\u0027], compute_nodes[1][\u0027host\u0027]]"},{"line_number":84,"context_line":"        excluded_node \u003d compute_nodes[2][\u0027host\u0027]"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        audit_scope \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"07cb2d17_8269f5d6","line":83,"updated":"2026-07-02 11:41:05.000000000","message":"The same audit_scope exclude dict structure (13 lines) and data-model entity extraction loop are copy-pasted verbatim across 8+ test files, representing hundreds of lines of duplicated logic.\n\n**Severity**: HIGH | **Confidence**: 0.9\n\n**Risk**: Any change to the scope format or model-extraction logic requires editing 8+ files identically, creating a significant maintenance burden and high risk of drift between tests.\n\n**Priority**: Before merge\n**Why This Matters**: The project already has a base.py with shared helpers. The scope dict construction and the for-elem-in-context extraction loop are prime candidates for shared helpers that would eliminate ~200 lines of duplication.\n\n**Recommendation**:\nAdd shared helpers to base.py, e.g. build_host_exclude_scope(host) returning the exclude dict and extract_model_entities(body) returning (nodes_set, instances_list). Extend create_audit_template_for_strategy to accept an optional scope parameter.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"            }"},{"line_number":100,"context_line":"        ]"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        LOG.info(f\"Creating audit excluding node: {excluded_node}\")"},{"line_number":103,"context_line":"        LOG.info(f\"Scoped nodes (via exclusion): {scoped_nodes}\")"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # Create audit template with scope"}],"source_content_type":"text/x-python","patch_set":2,"id":"7e9317b6_29bcc8eb","line":102,"updated":"2026-07-02 11:41:05.000000000","message":"f-strings are used inside LOG.info() calls throughout all new test files instead of the OpenStack-preferred percent-style lazy interpolation.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: f-strings force eager string construction even when the INFO log level is disabled. The percent-style (LOG.info(\u0027msg: %s\u0027, val)) enables lazy evaluation and is the dominant OpenStack/oslo convention.\n\n**Suggestion**:\nReplace f-string LOG calls with percent-style lazy interpolation: LOG.info(\u0027Creating audit excluding node: %s\u0027, excluded_node). There are 15+ such occurrences across test_audit_scope.py, test_execute_basic_optim.py, and all other changed test files.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        LOG.info(f\"Scoped nodes (via exclusion): {scoped_nodes}\")"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        # Create audit template with scope"},{"line_number":106,"context_line":"        _, goal \u003d self.client.show_goal(self.GOAL)"},{"line_number":107,"context_line":"        _, strategy \u003d self.client.show_strategy(self.STRATEGY)"},{"line_number":108,"context_line":"        _, audit_template \u003d self.create_audit_template("},{"line_number":109,"context_line":"            goal[\u0027uuid\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"6b4c477f_0645a2ff","line":106,"updated":"2026-07-02 11:41:05.000000000","message":"The show_goal + show_strategy + create_audit_template triplet is repeated identically in every scope test (~6 lines each, 16 tests).\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Extending the existing create_audit_template_for_strategy() helper in base.py to accept an optional scope parameter would eliminate ~96 lines of boilerplate.\n\n**Recommendation**:\nAdd scope\u003dNone kwarg to create_audit_template_for_strategy in base.py and use it in all scope tests instead of the manual show_goal/show_strategy/create_audit_template sequence.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    @decorators.idempotent_id(\u0027c3d4e5f6-a7b8-4901-c234-56789abcdef0\u0027)"},{"line_number":156,"context_line":"    @decorators.attr(type\u003d[\u0027scope\u0027])"},{"line_number":157,"context_line":"    def test_audit_scope_with_multiple_compute_nodes(self):"},{"line_number":158,"context_line":"        \"\"\"Verify that scope works with multiple compute nodes specified."},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        This test validates that when multiple compute nodes are specified"}],"source_content_type":"text/x-python","patch_set":2,"id":"a358ac9f_d3da686e","line":157,"updated":"2026-07-02 11:41:05.000000000","message":"test_audit_scope_with_multiple_compute_nodes is functionally identical to test_audit_scope_with_compute_nodes: both exclude exactly one node from a 3-node setup with the same assertions.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: The test name implies multi-node exclusion but tests single-node exclusion. It wastes CI resources (instance creation, audit execution) without adding coverage beyond the first test.\n\n**Suggestion**:\nEither make the second test genuinely exclude 2 of 4+ nodes to test real multi-node exclusion, or remove it as redundant.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"}],"watcher_tempest_plugin/tests/scenario/test_execute_host_maintenance.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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @decorators.idempotent_id(\u0027e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b\u0027)"},{"line_number":208,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027host_maintenance\u0027, \u0027scope\u0027])"},{"line_number":209,"context_line":"    def test_execute_host_maintenance_with_instance_scope(self):"},{"line_number":210,"context_line":"        \"\"\"Verify that instance exclusion via scope works (or fails)."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        This test validates whether host_maintenance respects the"}],"source_content_type":"text/x-python","patch_set":2,"id":"591dc957_ba2999d9","line":209,"updated":"2026-07-02 11:41:05.000000000","message":"The three expected-failure tests reference bugs only in docstrings (with the wrong number). Tempest supports machine-readable @decorators.related(\u0027bug\u0027, \u0027NNNNN\u0027) linkage.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Machine-readable bug linkage is more durable than docstring comments and enables automated tracking of when expected failures can be removed once bugs are fixed.\n\n**Recommendation**:\nAfter correcting the bug numbers (critical C2), consider adding @decorators.related(\u0027bug\u0027, \u00272154805\u0027) to each failing test for robust tracking.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    @decorators.idempotent_id(\u0027e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b\u0027)"},{"line_number":208,"context_line":"    @decorators.attr(type\u003d[\u0027strategy\u0027, \u0027host_maintenance\u0027, \u0027scope\u0027])"},{"line_number":209,"context_line":"    def test_execute_host_maintenance_with_instance_scope(self):"},{"line_number":210,"context_line":"        \"\"\"Verify that instance exclusion via scope works (or fails)."},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"        This test validates whether host_maintenance respects the"}],"source_content_type":"text/x-python","patch_set":2,"id":"f987948f_a8711722","line":209,"updated":"2026-07-02 11:41:05.000000000","message":"Three tests documented as \u0027expected to FAIL\u0027 lack the @decorators.expectedFailure decorator. When run_scope_tests\u003dTrue they will fail as hard gate errors instead of xfails.\n\n**Severity**: CRITICAL | **Confidence**: 1.0\n\n**Risk**: Enabling run_scope_tests in any CI job will turn the gate red with hard test failures rather than recording known-bug xfails, defeating the stated purpose of the patch.\n\n**Priority**: Before merge\n**Why This Matters**: The commit message explicitly states \u00273 FAIL and document bugs\u0027. Without expectedFailure the tests cannot serve their intended purpose of documenting bugs without blocking CI.\n\n**Recommendation**:\nAdd @decorators.expectedFailure to test_execute_host_maintenance_with_instance_scope, test_execute_node_resource_consolidation_with_instance_scope, and test_execute_zone_migration_with_instance_scope. Alternatively use @decorators.skip_because(bug\u003d\u0027...\u0027) to skip until the bugs are fixed.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        does NOT check this flag, so this test is expected to FAIL,"},{"line_number":215,"context_line":"        documenting the bug."},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"        Related bug: https://bugs.launchpad.net/watcher/+bug/2151776"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        Steps:"},{"line_number":220,"context_line":"        1. Create 2 instances on maintenance_node"}],"source_content_type":"text/x-python","patch_set":2,"id":"5265dc5a_5c9bfbcb","line":217,"updated":"2026-07-02 11:41:05.000000000","message":"Bug number mismatch: all three failing-test docstrings reference bug #2151776, but the commit message references distinct bugs #2154805, #2154806, #2154807 for each strategy.\n\n**Severity**: CRITICAL | **Confidence**: 0.9\n\n**Risk**: Incorrect bug references mislead developers tracing test failures and break the bug-tracking linkage that these tests are specifically designed to provide.\n\n**Priority**: Before merge\n**Why This Matters**: The tests exist to document specific strategy bugs. Pointing all three at the wrong single bug number (2151776) makes the tracking useless and contradicts the commit message.\n\n**Recommendation**:\nCorrect each docstring to reference the matching bug from the commit message: host_maintenance to #2154805, node_resource_consolidation to #2154806, zone_migration to #2154807. The same wrong reference appears at test_execute_node_resource_consolidation.py:196 and test_execute_zone_migration.py:255.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"},{"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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":222,"context_line":"        3. Create audit with host_maintenance"},{"line_number":223,"context_line":"        4. Verify excluded instance is NOT migrated (will fail - bug)"},{"line_number":224,"context_line":"        \"\"\""},{"line_number":225,"context_line":"        self.check_min_enabled_compute_nodes(2)"},{"line_number":226,"context_line":"        self.addCleanup(self.rollback_compute_nodes_status)"},{"line_number":227,"context_line":"        self.addCleanup(self.wait_delete_instances_from_model)"},{"line_number":228,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7b0efab9_9bb89521","line":225,"updated":"2026-07-02 11:41:05.000000000","message":"test_execute_host_maintenance_with_instance_scope places both instances on a single maintenance_node, unlike the zone_migration and vm_workload_consolidation instance_scope tests which spread instances across two hosts.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Consistent multi-host instance placement across all instance_scope tests would make the suite easier to reason about and provide more thorough coverage of the exclusion path.\n\n**Recommendation**:\nEvaluate whether 2 instances on a single host sufficiently exercises the instance-exclusion path for host_maintenance. If the strategy only migrates from the maintenance node, the current setup may be acceptable, but document the rationale.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"}],"watcher_tempest_plugin/tests/scenario/test_execute_node_resource_consolidation.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":"7de235d482badc6ba0b1f25920edb30c63c6462b","unresolved":false,"context_lines":[{"line_number":263,"context_line":"        _, action_plans \u003d self.client.list_action_plans("},{"line_number":264,"context_line":"            audit_uuid\u003daudit[\u0027uuid\u0027])"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"        if len(action_plans[\u0027action_plans\u0027]) \u003e 0:"},{"line_number":267,"context_line":"            action_plan \u003d action_plans[\u0027action_plans\u0027][0]"},{"line_number":268,"context_line":"            _, action_plan_detail \u003d self.client.show_action_plan("},{"line_number":269,"context_line":"                action_plan[\u0027uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"6996b1c5_0eb665c5","line":266,"updated":"2026-07-02 11:41:05.000000000","message":"node_resource_consolidation instance_scope test nests all assertions inside if-len-greater-than-0 conditionals, so it passes vacuously if no action plan or migrate actions are produced.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: If the strategy produces zero actions (e.g. instances too small to consolidate), the test passes without verifying that the excluded instance was respected. The instance-exclusion bug goes undetected.\n\n**Priority**: Before merge\n**Why This Matters**: A test that can pass without exercising the behavior under test provides false confidence. The same conditional-guard pattern affects host_scope tests in basic_optim, workload_balance, workload_stabilization, and vm_workload_consolidation.\n\n**Recommendation**:\nAssert that an action plan with migrate actions exists before the conditional checks, or restructure to use get_action_plan_and_validate_actions (as host_maintenance does) which fails if no actions are produced.","commit_id":"dbee62ca0aea5de2d23501df78f19fec3effb542"}]}
