)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"bb4d03e52493dc4fcac38359bcdd200445ad4bf8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"e0d4d768_6f204b36","updated":"2026-07-29 15:03:18.000000000","message":"recheck","commit_id":"ff40d12df50ac96a48d4a61995b494e6587d3a58"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"05cd66da473edc6784cad9c2ee540f0366688d06","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"34a1f883_b0595063","updated":"2026-07-31 11:11:31.000000000","message":"recheck","commit_id":"3022b43b4d8660a699c04ffe5474888dfe7e4460"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"d88866c7f9f93a796a61c0b072b8944ddc2a64b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"f130ab01_2a565e60","updated":"2026-07-31 09:15:09.000000000","message":"recheck","commit_id":"3022b43b4d8660a699c04ffe5474888dfe7e4460"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"09b958047606dd6ddb97be8f4589cb280299f18c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"66fce90d_87a8b36e","updated":"2026-07-31 14:13:20.000000000","message":"recheck","commit_id":"284816b6eb0c262baa9084bddd81af0e9c3b5a4d"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2c9ba9f0229ec7b79f9adbf8192fe58cd932b882","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"a8338b11_346fcba0","updated":"2026-09-01 04:36:11.000000000","message":"Overall looks good, for all unique test name generation, we can reuse _generate_unique_name method all over the test.","commit_id":"fbd52921180b573e80eae6b949e52a7104c5d98e"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"95c2b71a60cbd963019327eb91353efad9f2725e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"74540306_2152c944","updated":"2026-09-08 17:52:06.000000000","message":"It has a good coverage of filters, thanks for adding these","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"53f0819b781861c711bc4ba9f08146544f36f5e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"b803bc96_24561e6d","updated":"2026-09-01 11:52:41.000000000","message":"lgtm!","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"1436f19fbfd07d83d5c3fa697fe05fa68c8dd483","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"b276f847_8268d86c","updated":"2026-09-09 11:26:13.000000000","message":"TY for updating the patch, lgtm","commit_id":"3e65c8bb0c9066adfbadc1f09f604104c6aeb165"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"53fa9c45fd2cbe4ed94b4bfcbd53df42be375cf3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"a7a89773_c1237619","updated":"2026-09-10 13:04:41.000000000","message":"lgtm!","commit_id":"3e65c8bb0c9066adfbadc1f09f604104c6aeb165"}],"run-tests-crc.sh":[{"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":"11f143c713b311f485a3fe115735f0be7ed97a4b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/bin/bash"},{"line_number":2,"context_line":"# Script to run Playwright tests against CRC OpenStack"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"export OS_AUTH_URL\u003d\"${OS_AUTH_URL:-https://keystone-public-openstack.apps.10.4.209.38.nip.io}\""},{"line_number":5,"context_line":"export OS_USERNAME\u003d\"${OS_USERNAME:-admin}\""},{"line_number":6,"context_line":"export OS_PASSWORD\u003d\"${OS_PASSWORD:-youropenstackisnowmuchmoresecure}\""},{"line_number":7,"context_line":"export OS_PROJECT_NAME\u003d\"${OS_PROJECT_NAME:-admin}\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"fde5e405_e6b52b82","line":4,"updated":"2026-07-22 07:55:03.000000000","message":"The new run-tests-crc.sh script hardcodes a specific internal IP address (10.4.209.38.nip.io) as the default for OS_AUTH_URL and WATCHER_DASHBOARD_URL, along with an infrastructure-specific password. These defaults leak deployment details into a public repository and make the script useless for o...\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: The hardcoded IP exposes internal infrastructure topology. Other contributors cannot use this script without overriding every variable. The defaults are misleading since they reference a host that is not publicly accessible.\n\n**Suggestion**:\nUse generic defaults consistent with tox.ini (e.g., http://localhost/identity and http://localhost/dashboard), or remove the URL/password defaults entirely and require explicit environment variables. If this script is personal-only, consider not committing it or adding it to .gitignore.","commit_id":"98a92d38ad2aef73b471a84f00037e1128811da8"}],"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":"b479387abbdbf3ceba9a36482eec28e23c3f4bc2","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"[testenv:integration{,-playwright}]"},{"line_number":38,"context_line":"# Run integration tests using Playwright"},{"line_number":39,"context_line":"# Set PLAYWRIGHT_BROWSER to choose browser: chromium, firefox, or webkit (default)"},{"line_number":40,"context_line":"# Example: PLAYWRIGHT_BROWSER\u003dfirefox tox -e integration-playwright"},{"line_number":41,"context_line":"# Note: webkit provides Safari-like testing on Linux"},{"line_number":42,"context_line":"# Set PLAYWRIGHT_VIDEO to enable video recording: off (default), on, retain-on-failure"}],"source_content_type":"text/x-properties","patch_set":1,"id":"541aadd3_fbffc60b","line":39,"updated":"2026-07-21 13:04:23.000000000","message":"The default browser was changed from webkit to chromium in this patch, but two comments in tox.ini still state webkit is the default, creating misleading documentation.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Developers following the comments will install the wrong browser binary and may be confused when the default does not match documentation.\n\n**Recommendation**:\nUpdate line 39 to say \u0027chromium (default)\u0027 instead of \u0027webkit (default)\u0027. Update line 93 to say \u0027python -m playwright install chromium\u0027 instead of \u0027webkit\u0027.","commit_id":"714489a9dc2a635ce72265f67135cd339f43857a"}],"watcher_dashboard/test/integration/test_filters.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":"b479387abbdbf3ceba9a36482eec28e23c3f4bc2","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        target_goal_name \u003d \"server_consolidation\""},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        # Create templates with server_consolidation goal"},{"line_number":141,"context_line":"        template_names_target \u003d []"},{"line_number":142,"context_line":"        for i in range(2):"},{"line_number":143,"context_line":"            name \u003d f\"test_filter_sc_{uuid.uuid4().hex[:8]}\""},{"line_number":144,"context_line":"            self.create_audit_template("}],"source_content_type":"text/x-python","patch_set":1,"id":"0c85ff49_6de56a66","line":141,"updated":"2026-07-21 13:04:23.000000000","message":"The variable \u0027template_names_target\u0027 is created and appended to in test_filters_audit_templates_by_goal (line 141) and test_filters_audit_templates_by_strategy (line 240), but is never read afterwards, making it dead code.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Dead code adds confusion for future maintainers who may think the variable is used for verification. It gives a false impression that created template names are being tracked for a purpose.\n\n**Recommendation**:\nRemove the \u0027template_names_target\u0027 variable declarations (lines 141 and 240) and the corresponding \u0027.append(name)\u0027 calls (lines 149 and 248), or use the variable for an assertion verifying the created templates appear in results.","commit_id":"714489a9dc2a635ce72265f67135cd339f43857a"},{"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":"b479387abbdbf3ceba9a36482eec28e23c3f4bc2","unresolved":false,"context_lines":[{"line_number":326,"context_line":"        )"},{"line_number":327,"context_line":"        self.take_screenshot(\"templates_verified\")"},{"line_number":328,"context_line":""},{"line_number":329,"context_line":"    # NOTE: Test for audits filter by audit template is NOT implemented"},{"line_number":330,"context_line":"    # because the Audit model does not include audit_template_uuid field."},{"line_number":331,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":332,"context_line":"    # properly without this field in the API response."}],"source_content_type":"text/x-python","patch_set":1,"id":"997cdbdb_a2a3366b","line":329,"updated":"2026-07-21 13:04:23.000000000","message":"Lines 329-475 contain a large commented-out test method (test_audits_filter_by_audit_template) with extensive inline comments explaining a backend bug. This is 146 lines of dead code that should not be committed to the repository.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: 146 lines of commented-out code significantly increases file noise and maintenance burden. Future contributors may waste time reading dead code, and the code will rot as the surrounding codebase evolves.\n\n**Suggestion**:\nRemove the commented-out test code entirely. The NOTE block (lines 329-334) with the bug reference (https://bugs.launchpad.net/watcher-dashboard/+bug/2161426) is valuable context—keep a brief comment referencing the bug, but delete the commented-out implementation. The test can be re-added when the backend bug is fixed.","commit_id":"714489a9dc2a635ce72265f67135cd339f43857a"},{"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":"b479387abbdbf3ceba9a36482eec28e23c3f4bc2","unresolved":false,"context_lines":[{"line_number":512,"context_line":"            audit_uuids.append(audit_uuid)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        # Wait for audits to complete via API (not UI)"},{"line_number":515,"context_line":"        import time"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"        for audit_uuid in audit_uuids:"},{"line_number":518,"context_line":"            start_time \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":1,"id":"2c94aee9_c5adb90e","line":515,"updated":"2026-07-21 13:04:23.000000000","message":"The \u0027time\u0027 module is imported inline within two test methods (lines 515 and 637) instead of at the module top level as required by PEP 8. This pattern also duplicates the top-level import already present in playwright_base.py.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Inline imports violate PEP 8 and the OpenStack style guide. They create inconsistency with the rest of the codebase and may confuse readers about available dependencies.\n\n**Recommendation**:\nMove \u0027import time\u0027 to the top of test_filters.py alongside the existing imports (uuid, django.test, playwright_base), and remove the two inline import statements.","commit_id":"714489a9dc2a635ce72265f67135cd339f43857a"},{"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":"b479387abbdbf3ceba9a36482eec28e23c3f4bc2","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                )"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        # Get the UUID of the first audit (target for filtering)"},{"line_number":531,"context_line":"        target_audit_uuid \u003d self._get_audit_uuid_via_api(audit_names[0])"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"        # Navigate to Action Plans page"},{"line_number":534,"context_line":"        self.page.goto(f\"{self.dashboard_url}/admin/action_plans/\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"739f8942_39894ae1","line":531,"updated":"2026-07-21 13:04:23.000000000","message":"In test_filters_action_plans_by_audit, line 531 calls self._get_audit_uuid_via_api(audit_names[0]) to re-fetch the first audit\u0027s UUID, but that UUID was already retrieved and stored in audit_uuids[0] at line 511.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Makes an unnecessary API call to the Watcher service, slightly increasing test execution time and adding a potential point of failure if the API is temporarily unavailable.\n\n**Recommendation**:\nReplace line 531 \u0027target_audit_uuid \u003d self._get_audit_uuid_via_api(audit_names[0])\u0027 with \u0027target_audit_uuid \u003d audit_uuids[0]\u0027 to reuse the already-fetched UUID.","commit_id":"714489a9dc2a635ce72265f67135cd339f43857a"},{"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":"c456aba34044859836da2b168235470a0aaf98a4","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        )"},{"line_number":324,"context_line":"        self.take_screenshot(\"templates_verified\")"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # NOTE: Test for audits filter by audit template is NOT implemented"},{"line_number":327,"context_line":"    # because the Audit model does not include audit_template_uuid field."},{"line_number":328,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":329,"context_line":"    # properly without this field in the API response."}],"source_content_type":"text/x-python","patch_set":2,"id":"93c7a547_a3bb03db","line":326,"updated":"2026-07-21 15:14:46.000000000","message":"The new test_filters.py contains approximately 150 lines (lines 326-472) of a fully commented-out test method (test_audits_filter_by_audit_template). While the explanatory NOTE at lines 326-331 documenting why the test is skipped is valuable, the commented-out implementation code is dead weight t...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Commented-out code creates maintenance noise and can mislead future contributors into thinking the code is temporarily disabled rather than intentionally omitted. It also adds ~140 lines to review for no executable value.\n\n**Recommendation**:\nKeep the explanatory NOTE comment (lines 326-331) with the bug reference, and delete the commented-out test body (lines 333-472). When the backend bug is fixed, the test can be written fresh based on the working API at that time.","commit_id":"44c1343e247e06040b3742cc2b0a81cbb1a0e582"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"02646968fcdb2ddbba5d1160902f5c68cdd6d17c","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        )"},{"line_number":324,"context_line":"        self.take_screenshot(\"templates_verified\")"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # NOTE: Test for audits filter by audit template is NOT implemented"},{"line_number":327,"context_line":"    # because the Audit model does not include audit_template_uuid field."},{"line_number":328,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":329,"context_line":"    # properly without this field in the API response."}],"source_content_type":"text/x-python","patch_set":2,"id":"663e2005_e5492407","line":326,"in_reply_to":"93c7a547_a3bb03db","updated":"2026-07-21 15:53:26.000000000","message":"It is commented so we can merge this code without depending on the bug to be fixed. we will uncomment when fixed","commit_id":"44c1343e247e06040b3742cc2b0a81cbb1a0e582"},{"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":"11f143c713b311f485a3fe115735f0be7ed97a4b","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        audit_uuids \u003d []"},{"line_number":504,"context_line":"        for i in range(2):"},{"line_number":505,"context_line":"            audit_name \u003d f\"test_filter_ap_audit_{uuid.uuid4().hex[:8]}\""},{"line_number":506,"context_line":"            self.create_audit(template_name, audit_name)"},{"line_number":507,"context_line":"            audit_names.append(audit_name)"},{"line_number":508,"context_line":"            audit_uuid \u003d self._get_audit_uuid_via_api(audit_name)"},{"line_number":509,"context_line":"            audit_uuids.append(audit_uuid)"}],"source_content_type":"text/x-python","patch_set":3,"id":"379ff1bf_f6755588","line":506,"updated":"2026-07-22 07:55:03.000000000","message":"In test_filters_action_plans_by_audit and test_filters_actions_by_action_plan, the create_audit() method already resolves and returns the audit UUID, but the tests discard the return value and call _get_audit_uuid_via_api() again. This is a redundant API call that can return None on transient fai...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Each redundant API call adds latency and a potential failure point. If _get_audit_uuid_via_api returns None (e.g., API propagation delay), the subsequent watcher_client.audit.get(None) call will produce an opaque error instead of a clear test failure.\n\n**Recommendation**:\nCapture the return value: \u0027audit_uuid \u003d self.create_audit(template_name, audit_name)\u0027 and append directly to audit_uuids, eliminating the separate _get_audit_uuid_via_api call.","commit_id":"98a92d38ad2aef73b471a84f00037e1128811da8"},{"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":"fadf70e5c70f8c0838ce12a3f806451ea83d7371","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        )"},{"line_number":324,"context_line":"        self.take_screenshot(\"templates_verified\")"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # NOTE: Test for audits filter by audit template is NOT implemented"},{"line_number":327,"context_line":"    # because the Audit model does not include audit_template_uuid field."},{"line_number":328,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":329,"context_line":"    # properly without this field in the API response."}],"source_content_type":"text/x-python","patch_set":5,"id":"5dc3aea7_f6d5cbcd","line":326,"updated":"2026-07-22 08:10:18.000000000","message":"Lines 326-472 contain a fully commented-out test method (test_audits_filter_by_audit_template) with debug print statements and incomplete logic. This is 20% of the file\u0027s total line count and represents dead code that adds maintenance burden.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: 147 lines of dead code inflate the file, confuse readers, and create ongoing maintenance noise. The useful information (backend bug reference and explanation) could be conveyed in 5-10 lines.\n\n**Suggestion**:\nRemove the commented-out test method. Keep only the NOTE comment block (lines 326-331) that references the backend bug and explains why the test is not implemented. When the backend bug is fixed, the test can be written fresh.","commit_id":"158114069b3c0b966df8e2870027ac9686ba159a"},{"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":"fadf70e5c70f8c0838ce12a3f806451ea83d7371","unresolved":false,"context_lines":[{"line_number":637,"context_line":"            timeout \u003d 120"},{"line_number":638,"context_line":"            while time.time() - start_time \u003c timeout:"},{"line_number":639,"context_line":"                audit \u003d self.watcher_client.audit.get(audit_uuid)"},{"line_number":640,"context_line":"                if audit.state \u003d\u003d \u0027SUCCEEDED\u0027:"},{"line_number":641,"context_line":"                    # Get the action plan for this audit"},{"line_number":642,"context_line":"                    all_aps \u003d self.watcher_client.action_plan.list(detail\u003dTrue)"},{"line_number":643,"context_line":"                    audit_aps \u003d ["}],"source_content_type":"text/x-python","patch_set":5,"id":"093441ca_e5ada1ba","line":640,"updated":"2026-07-22 08:10:18.000000000","message":"In test_filters_actions_by_action_plan, when an audit transitions to SUCCEEDED state, the code queries action plans exactly once and breaks regardless of whether any were found. If the action plan has not yet been generated at the moment the audit state changes, the UUID is silently skipped.\n\n**Severity**: HIGH | **Confidence**: 0.8\n\n**Risk**: When the action plan is not yet generated at the moment the audit reaches SUCCEEDED, the test will fail the assertGreater at line 655 with a confusing \u0027No action plans were generated from audits\u0027 error, even though the action plans do exist — they just weren\u0027t ready yet. This leads to intermitten...\n\n**Priority**: Before merge\n**Why This Matters**: When the action plan is not yet generated at the moment the audit reaches SUCCEEDED, the test will fail the assertGreater at line 655 with a confusing \u0027No action plans were generated from audits\u0027 error, even though the action plans do exist — they just weren\u0027t ready yet. This leads to intermitten...\n\n**Recommendation**:\nAdd a secondary retry loop for action plan availability after the audit reaches SUCCEEDED. For example, continue polling for action plans within the timeout window rather than breaking immediately. Alternatively, restructure to wait for all audits to complete first, then query action plans once (as test_filters_action_plans_by_audit does).","commit_id":"158114069b3c0b966df8e2870027ac9686ba159a"},{"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":"fcd7d83959a24eb16a7f7f5d0d67cfda9ef2e324","unresolved":false,"context_lines":[{"line_number":330,"context_line":"    # This is a backend bug that should be fixed in Watcher API."},{"line_number":331,"context_line":"    # Bug: https://bugs.launchpad.net/watcher-dashboard/+bug/2161426"},{"line_number":332,"context_line":"    #"},{"line_number":333,"context_line":"    #     # def test_audits_filter_by_audit_template(self):"},{"line_number":334,"context_line":"    #         \"\"\"Test that audits can be filtered by audit template."},{"line_number":335,"context_line":"    #"},{"line_number":336,"context_line":"    #         This test verifies that the filter functionality on the Audits"}],"source_content_type":"text/x-python","patch_set":6,"id":"11cd2414_5b1fa07a","line":333,"updated":"2026-07-22 08:23:56.000000000","message":"The file contains approximately 140 lines of commented-out test code (lines 333-472) for a disabled test_audits_filter_by_audit_template method. This dead code clutters the file and creates maintenance risk, as future developers may be unsure whether to maintain or remove it.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: 140 lines of commented-out code increases the file size by ~20%, makes the file harder to navigate, and creates confusion about whether the code is work-in-progress or permanently disabled. It sets a poor precedent for code hygiene in the test suite.\n\n**Suggestion**:\nRemove the commented-out test method body (lines 333-472). Keep only the NOTE comment (lines 326-331) explaining why the test is not implemented, with the bug reference. If a draft of the test is needed for future work, it can be tracked via the Launchpad bug or a follow-up change.","commit_id":"33e7d2b70ff8c8dda0d1f719094ece16abda57a8"},{"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":"f7c232e3a1e8b05472d6f373e65a45ed75cc924a","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        )"},{"line_number":324,"context_line":"        self.take_screenshot(\"templates_verified\")"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # NOTE: Test for audits filter by audit template is NOT implemented"},{"line_number":327,"context_line":"    # because the Audit model does not include audit_template_uuid field."},{"line_number":328,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":329,"context_line":"    # properly without this field in the API response."}],"source_content_type":"text/x-python","patch_set":7,"id":"614f1fad_2a17fbde","line":326,"updated":"2026-07-24 11:11:33.000000000","message":"Lines 326-472 contain an entire commented-out test function (test_audits_filter_by_audit_template) including full implementation, docstrings, and assertions. This constitutes ~20% of the file\u0027s total 726 lines and is dead code that adds noise and maintenance burden.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: 146 lines of commented-out code makes the file harder to read, review, and maintain. It creates confusion about whether the code is intended to be uncommented, and increases the cost of future modifications to the file. The bug reference URL and a brief NOTE comment are sufficient to document the...\n\n**Suggestion**:\nRemove the commented-out code block (lines 333-472). Keep the NOTE comment (lines 326-331) that references the bug. If the implementation details are valuable for future reference, link to them in the bug report instead.","commit_id":"31639bccd8e33ca011cb626a2fc43ca19d54e4a1"},{"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":"f7c232e3a1e8b05472d6f373e65a45ed75cc924a","unresolved":false,"context_lines":[{"line_number":503,"context_line":"        audit_uuids \u003d []"},{"line_number":504,"context_line":"        for i in range(2):"},{"line_number":505,"context_line":"            audit_name \u003d f\"test_filter_ap_audit_{uuid.uuid4().hex[:8]}\""},{"line_number":506,"context_line":"            self.create_audit(template_name, audit_name)"},{"line_number":507,"context_line":"            audit_names.append(audit_name)"},{"line_number":508,"context_line":"            audit_uuid \u003d self._get_audit_uuid_via_api(audit_name)"},{"line_number":509,"context_line":"            audit_uuids.append(audit_uuid)"}],"source_content_type":"text/x-python","patch_set":7,"id":"36fc567b_124c9f3e","line":506,"updated":"2026-07-24 11:11:33.000000000","message":"In test_filters_action_plans_by_audit and test_filters_actions_by_action_plan, create_audit() is called but its return value (the audit UUID) is ignored, and then _get_audit_uuid_via_api() is called separately to retrieve the same UUID. This is a redundant extra API call and misses an opportunity...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Each redundant _get_audit_uuid_via_api call adds an unnecessary Watcher API round-trip. Additionally, _get_audit_uuid_via_api can return None (per base class line 497), and the test does not check for None before appending to audit_uuids, which could lead to confusing failures later when None is...\n\n**Recommendation**:\nUse the return value from create_audit() directly: \u0027audit_uuid \u003d self.create_audit(template_name, audit_name)\u0027 instead of ignoring it and calling _get_audit_uuid_via_api separately. This eliminates redundant API calls and makes the data flow clearer.","commit_id":"31639bccd8e33ca011cb626a2fc43ca19d54e4a1"},{"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":"212eb264bf5379f0c91a1a1e3d11290b130fa230","unresolved":false,"context_lines":[{"line_number":323,"context_line":"        )"},{"line_number":324,"context_line":"        self.take_screenshot(\"templates_verified\")"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    # NOTE: Test for audits filter by audit template is NOT implemented"},{"line_number":327,"context_line":"    # because the Audit model does not include audit_template_uuid field."},{"line_number":328,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":329,"context_line":"    # properly without this field in the API response."}],"source_content_type":"text/x-python","patch_set":8,"id":"d8c8182c_9c4ad18e","line":326,"updated":"2026-07-24 11:43:25.000000000","message":"The file contains approximately 147 lines of commented-out code for a test that was not implemented due to a backend API bug. While a NOTE explains the reason, this volume of dead code creates maintenance noise and should be tracked via the linked bug report instead.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: 147 lines of dead code in a 724-line file increases cognitive load for reviewers and future maintainers. It can become stale, diverge from the actual API as it evolves, and be mistakenly uncommented without understanding the original constraints.\n\n**Recommendation**:\nRemove the commented-out test code entirely. The NOTE at lines 326-331 with the bug reference (https://bugs.launchpad.net/watcher-dashboard/+bug/2161426) is sufficient to document why this test is not implemented. The full test implementation can be referenced from the bug report or a future patch when the backend issue is resolved.","commit_id":"35271ae1cf1e1d8fe2a66cb975fd63190f904014"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"63fa06046ab6144dfad4b4120009ce4a9cecf76d","unresolved":true,"context_lines":[{"line_number":328,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":329,"context_line":"    # properly without this field in the API response."},{"line_number":330,"context_line":"    # This is a backend bug that should be fixed in Watcher API."},{"line_number":331,"context_line":"    # Bug: https://bugs.launchpad.net/watcher-dashboard/+bug/2161426"},{"line_number":332,"context_line":"    #"},{"line_number":333,"context_line":"    #     # def test_audits_filter_by_audit_template(self):"},{"line_number":334,"context_line":"    #         \"\"\"Test that audits can be filtered by audit template."}],"source_content_type":"text/x-python","patch_set":8,"id":"01a73999_60d30d53","line":331,"range":{"start_line":331,"start_character":11,"end_line":331,"end_character":68},"updated":"2026-07-29 05:05:44.000000000","message":"I have fixed this bug with https://review.opendev.org/c/openstack/watcher-dashboard/+/999043 , Now we can filter it based on Goal and strategy.","commit_id":"35271ae1cf1e1d8fe2a66cb975fd63190f904014"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"7474f7b65dbe82307c0047efa0d4d5cd878fb9b7","unresolved":true,"context_lines":[{"line_number":328,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":329,"context_line":"    # properly without this field in the API response."},{"line_number":330,"context_line":"    # This is a backend bug that should be fixed in Watcher API."},{"line_number":331,"context_line":"    # Bug: https://bugs.launchpad.net/watcher-dashboard/+bug/2161426"},{"line_number":332,"context_line":"    #"},{"line_number":333,"context_line":"    #     # def test_audits_filter_by_audit_template(self):"},{"line_number":334,"context_line":"    #         \"\"\"Test that audits can be filtered by audit template."}],"source_content_type":"text/x-python","patch_set":8,"id":"6925e546_5f1cc99b","line":331,"range":{"start_line":331,"start_character":11,"end_line":331,"end_character":68},"in_reply_to":"01a73999_60d30d53","updated":"2026-07-29 08:20:42.000000000","message":"ok, I have uncommented the tests for the audit page, and rebased your fix on this review. lets see how it goes","commit_id":"35271ae1cf1e1d8fe2a66cb975fd63190f904014"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"1bc91a76f38e8af53e69860e392602d8d65935e1","unresolved":false,"context_lines":[{"line_number":328,"context_line":"    # The UI has a \"Audit Template \u003d\" filter dropdown, but it cannot work"},{"line_number":329,"context_line":"    # properly without this field in the API response."},{"line_number":330,"context_line":"    # This is a backend bug that should be fixed in Watcher API."},{"line_number":331,"context_line":"    # Bug: https://bugs.launchpad.net/watcher-dashboard/+bug/2161426"},{"line_number":332,"context_line":"    #"},{"line_number":333,"context_line":"    #     # def test_audits_filter_by_audit_template(self):"},{"line_number":334,"context_line":"    #         \"\"\"Test that audits can be filtered by audit template."}],"source_content_type":"text/x-python","patch_set":8,"id":"9539233b_bc7ded9a","line":331,"range":{"start_line":331,"start_character":11,"end_line":331,"end_character":68},"in_reply_to":"6925e546_5f1cc99b","updated":"2026-08-06 12:36:51.000000000","message":"Done","commit_id":"35271ae1cf1e1d8fe2a66cb975fd63190f904014"},{"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":"f22183714a2aae85f5f1c6005a784878e9a8f261","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            values.add(text)"},{"line_number":70,"context_line":"        return values"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d120):"},{"line_number":73,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":14,"id":"2efa57fc_49be3567","line":72,"updated":"2026-07-29 09:55:13.000000000","message":"The _wait_for_audit_completion polling loop only breaks when audit.state \u003d\u003d \u0027SUCCEEDED\u0027. If an audit transitions to a FAILED (or CANCELLED) state, the loop continues polling until the per-audit timeout expires, wasting up to 120 seconds per failed audit before raising a generic TimeoutError inste...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Failed audits cause up to 120 seconds of unnecessary polling per audit, slowing CI feedback. The TimeoutError message is also misleading when the audit has already reached a terminal failure state.\n\n**Recommendation**:\nAdd a check for terminal failure states inside the polling loop, e.g.: if audit.state in (\u0027FAILED\u0027, \u0027CANCELLED\u0027): raise AssertionError(f\u0027Audit {audit_uuid} reached {audit.state} state\u0027). This allows tests to fail fast with an actionable error message.","commit_id":"4aea6d116254824c79d04201961c220f5a15762d"},{"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":"e180b7aa21de0708d844aacc867c0031a6f79d64","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            option.click()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        filter_input \u003d self.page.locator(\"input[type\u003d\u0027text\u0027]\").last"},{"line_number":43,"context_line":"        self.expect(filter_input).to_be_visible(timeout\u003d5000)"},{"line_number":44,"context_line":"        filter_input.fill(value)"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        filter_button \u003d self.page.get_by_role(\"button\", name\u003d\"Filter\")"}],"source_content_type":"text/x-python","patch_set":17,"id":"b7e047b8_e5818971","line":43,"updated":"2026-07-31 09:24:09.000000000","message":"The _apply_filter helper method uses hardcoded timeout values (5000ms for filter input visibility, 10000ms for networkidle) instead of the config.get_timeout() pattern used consistently throughout playwright_base.py. Since this method is called by all seven tests in the file, these values below t...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: All seven test methods depend on _apply_filter. In slow CI environments, the 5000ms visibility timeout and 10000ms networkidle timeout may be too short, causing intermittent test failures. The configured default is now 60000ms, making these hardcoded values 6x-12x lower than intended.\n\n**Suggestion**:\nReplace the hardcoded timeout values with config.get_timeout(). Import playwright_config as config at the top of the file (as done in test_existing_goals.py) and use it for both the expect and wait_for_load_state calls. Alternatively, accept a timeout parameter with config.get_timeout() as default.","commit_id":"3022b43b4d8660a699c04ffe5474888dfe7e4460"},{"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":"4bc1c74b12696b72ec1a46d5c7ff167487c3a05a","unresolved":false,"context_lines":[{"line_number":372,"context_line":"                target_ap_uuid \u003d ap.uuid"},{"line_number":373,"context_line":"            elif ap.audit_uuid \u003d\u003d audit_uuids[1]:"},{"line_number":374,"context_line":"                excluded_ap_uuid \u003d ap.uuid"},{"line_number":375,"context_line":"        self.assertIsNotNone("},{"line_number":376,"context_line":"            target_ap_uuid, \"No action plan generated for target audit\""},{"line_number":377,"context_line":"        )"},{"line_number":378,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"256074c4_fb7b3839","line":375,"updated":"2026-07-31 08:47:34.000000000","message":"Both test_filters_action_plans_by_audit and test_filters_actions_by_action_plan create two audits specifically to verify that non-matching items are excluded by the filter. However, neither test verifies that the \u0027excluded\u0027 audit actually produced action plans or actions. If the second audit does...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: The tests give false confidence that the filter correctly excludes non-matching items. If the Watcher environment changes such that the second audit no longer generates an action plan (e.g., no recommendations), the exclusion test will still pass without actually testing exclusion behavior, maski...\n\n**Recommendation**:\nAdd an assertion that the excluded set is non-empty before the exclusion check. For test_filters_action_plans_by_audit: assertGreater(len(excluded_ap_uuids), 0, ...) after line 326. For test_filters_actions_by_action_plan: add assertIsNotNone(excluded_ap_uuid, ...) alongside the existing target_ap_uuid assertion at line 375.","commit_id":"3022b43b4d8660a699c04ffe5474888dfe7e4460"},{"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":"8ab9f4d9c71a4f8f6ce66a52a781ea3d109d6f2d","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            values.add(text)"},{"line_number":80,"context_line":"        return values"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":83,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":20,"id":"21918235_9e09fdab","line":82,"updated":"2026-07-31 14:49:33.000000000","message":"The _wait_for_audit_completion method polls for the SUCCEEDED state but does not check for FAILED or other terminal failure states. If an audit transitions to FAILED, the method will continue polling for the full 180-second timeout per audit before raising a generic TimeoutError, wasting CI time...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: When an audit fails, CI wastes up to 180 seconds per audit polling unnecessarily. The resulting TimeoutError message is also misleading — it says the audit did not reach SUCCEEDED rather than reporting the actual FAILED state.\n\n**Recommendation**:\nAdd a check for terminal failure states inside the polling loop, e.g.: if audit.state in (\u0027FAILED\u0027, \u0027CANCELLED\u0027): raise AssertionError(f\u0027Audit {audit_uuid} ended in {audit.state} state\u0027). This provides faster, clearer test feedback.","commit_id":"20197894b5076102344129bade48f00d29e4ae53"},{"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":"64588953f585e4cebdce1a19b42c820582d0d6e9","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            values.add(text)"},{"line_number":80,"context_line":"        return values"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":83,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":22,"id":"becfdc06_d13043ae","line":82,"updated":"2026-08-03 11:41:04.000000000","message":"The _wait_for_audit_completion helper polls for the \u0027SUCCEEDED\u0027 state but does not detect terminal failure states like \u0027FAILED\u0027 or \u0027CANCELLED\u0027. If an audit fails, the method will poll until the full 180-second timeout expires before raising a misleading TimeoutError rather than failing fast with...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: When an audit transitions to FAILED or CANCELLED, the test wastes up to 180 seconds polling unnecessarily, slowing CI feedback. The TimeoutError message (\u0027did not reach SUCCEEDED in 180s\u0027) is misleading because the audit actually reached a terminal state, masking the real failure reason.\n\n**Recommendation**:\nAdd a check for known terminal failure states inside the polling loop so the method can raise immediately with a descriptive error, e.g.: `if audit.state in (\u0027FAILED\u0027, \u0027CANCELLED\u0027): raise AssertionError(f\u0027Audit {audit_uuid} reached state {audit.state}\u0027)`","commit_id":"01bc5ec09944a6bbaf101ce1350f8ca283b0d768"},{"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":"0336fea70e6b9f1fce94b61f0cc4f572845708fd","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        for i in range(count):"},{"line_number":74,"context_line":"            cell \u003d rows.nth(i).locator(\"td\").nth(column_index)"},{"line_number":75,"context_line":"            if use_link:"},{"line_number":76,"context_line":"                text \u003d cell.locator(\"a\").text_content().strip()"},{"line_number":77,"context_line":"            else:"},{"line_number":78,"context_line":"                text \u003d cell.text_content().strip()"},{"line_number":79,"context_line":"            values.add(text)"}],"source_content_type":"text/x-python","patch_set":26,"id":"fb3e332b_30b5765c","line":76,"updated":"2026-08-04 08:33:38.000000000","message":"The _get_column_values helper calls .strip() directly on the return value of text_content() (or cell.locator(\"a\").text_content()). Playwright\u0027s text_content() returns Optional[str] and yields None when an element has no text content, which would raise AttributeError and mask the real assertion fa...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: If a filtered table cell has no text content, the test fails with a confusing AttributeError instead of a meaningful assertion message, making diagnosis harder.\n\n**Recommendation**:\nStore the result in a variable and handle None, e.g.: `text \u003d cell.text_content(); text \u003d text.strip() if text else \u0027\u0027` or use `(cell.text_content() or \u0027\u0027).strip()`.","commit_id":"309b2a092ffe773fc60c0bdeb8ef102ce95c5a3c"},{"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":"66abdc1a849b8ff89454ebdf41b7e3090e32f1de","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \"\"\""},{"line_number":88,"context_line":"        for audit_uuid in audit_uuids:"},{"line_number":89,"context_line":"            start_time \u003d time.time()"},{"line_number":90,"context_line":"            while time.time() - start_time \u003c timeout:"},{"line_number":91,"context_line":"                audit \u003d self.watcher_client.audit.get(audit_uuid)"},{"line_number":92,"context_line":"                if audit.state \u003d\u003d \u0027SUCCEEDED\u0027:"},{"line_number":93,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":27,"id":"ebbd218f_9bf7c769","line":90,"updated":"2026-08-04 10:24:30.000000000","message":"The _wait_for_audit_completion polling loop only checks for the \u0027SUCCEEDED\u0027 state. If an audit transitions to \u0027FAILED\u0027 or another terminal state, the loop will continue polling every 5 seconds for the full 180-second timeout per audit before raising a generic TimeoutError. This wastes significant...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: When an audit fails (e.g., due to insufficient compute resources or watcher decision-engine errors in CI), each failed audit burns 180 seconds of CI time before timing out. With two audits per test, that is up to 360 seconds of wasted time with a confusing error message.\n\n**Suggestion**:\nAdd a check for known failure states inside the polling loop, e.g.: `if audit.state in (\u0027FAILED\u0027, \u0027CANCELLED\u0027): raise AssertionError(f\u0027Audit {audit_uuid} entered terminal state {audit.state}\u0027)` before the SUCCEEDED check. This provides an immediate, actionable failure message.","commit_id":"7b4be8749b3f5868b404ce122452dc58eebfe20f"},{"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":"316ccfcb0061df8bc36060721e5dffbdd5401014","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."},{"line_number":86,"context_line":"        :param timeout: Maximum wait time in seconds per audit."},{"line_number":87,"context_line":"        \"\"\""},{"line_number":88,"context_line":"        for audit_uuid in audit_uuids:"},{"line_number":89,"context_line":"            start_time \u003d time.time()"},{"line_number":90,"context_line":"            while time.time() - start_time \u003c timeout:"},{"line_number":91,"context_line":"                audit \u003d self.watcher_client.audit.get(audit_uuid)"}],"source_content_type":"text/x-python","patch_set":28,"id":"7a06ca41_b05d06d5","line":88,"updated":"2026-08-04 11:11:02.000000000","message":"The _wait_for_audit_completion helper polls the Watcher API checking only for \u0027SUCCEEDED\u0027 state. If an audit transitions to a terminal failure state (FAILED, CANCELLED), the method continues polling for the full 180-second timeout before raising a generic TimeoutError, wasting CI time and produci...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: In CI environments, audits can fail due to environment issues (e.g., insufficient compute resources, Watcher decision engine errors). When this happens, each failed audit wastes 180 seconds before timing out. With 2 audits per test, this means up to 360 seconds of wasted CI time, and the TimeoutE...\n\n**Suggestion**:\nAdd a check for terminal failure states inside the polling loop. For example: `if audit.state in (\u0027FAILED\u0027, \u0027CANCELLED\u0027): raise AssertionError(f\u0027Audit {audit_uuid} reached terminal state {audit.state}\u0027)` before the `time.sleep(5)` call.","commit_id":"0cc6c9f6a7d0317a61672187fbe405ffabaeec83"},{"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":"c85d4c004cfebc46de6387eb8ae74f7a09f026f4","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            values.add(text)"},{"line_number":82,"context_line":"        return values"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":85,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":29,"id":"15958006_11eab3b3","line":84,"updated":"2026-08-04 12:14:47.000000000","message":"The _wait_for_audit_completion polling loop only checks for the \u0027SUCCEEDED\u0027 state. If an audit enters a terminal failure state such as \u0027FAILED\u0027 or \u0027CANCELLED\u0027, the loop continues polling for the full 180-second timeout before raising a misleading TimeoutError instead of failing fast with a clear...\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: When an audit fails during CI runs, the test suite wastes up to 180 seconds per failed audit and emits a misleading \u0027did not reach SUCCEEDED in 180s\u0027 timeout error instead of a clear \u0027audit entered FAILED state\u0027 message. This degrades CI efficiency and makes debugging harder.\n\n**Suggestion**:\nAdd a check for terminal failure states inside the polling loop. For example: `if audit.state in (\u0027FAILED\u0027, \u0027CANCELLED\u0027): raise AssertionError(f\u0027Audit {audit_uuid} entered terminal state {audit.state}\u0027)` before the `time.sleep(5)` call.","commit_id":"2dc270f48680355585524310db52931f0add1ddd"},{"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":"979e192fc38ef224245dff54509b52adf70c01c2","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            values.add(text)"},{"line_number":82,"context_line":"        return values"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":85,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":33,"id":"663bdebb_1eb1fc74","line":84,"updated":"2026-08-06 12:44:41.000000000","message":"The _wait_for_audit_completion helper only checks for the \u0027SUCCEEDED\u0027 state. If an audit enters a terminal failure state (e.g. FAILED, CANCELLED), the method will keep polling every 5 seconds until the full 180-second per-audit timeout elapses, wasting CI time before the test fails.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: When an audit fails or is cancelled, the test waits the full 180-second timeout per audit instead of failing fast. With two audits, this can add up to 360 seconds of wasted CI time on a single test before reporting the failure.\n\n**Recommendation**:\nAdd a check for terminal failure states inside the polling loop, e.g.: `if audit.state in (\u0027FAILED\u0027, \u0027CANCELLED\u0027, \u0027SUPERSEDED\u0027): raise AssertionError(f\u0027Audit {audit_uuid} entered terminal state {audit.state}\u0027)` before the sleep. This provides faster, clearer test failure feedback.","commit_id":"6f770ce7d09a3dfef4979b2576b3eeced08712a6"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"2c9ba9f0229ec7b79f9adbf8192fe58cd932b882","unresolved":true,"context_lines":[{"line_number":137,"context_line":"        target_goal_name \u003d \"server_consolidation\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        for i in range(2):"},{"line_number":140,"context_line":"            name \u003d f\"test_filter_sc_{uuid.uuid4().hex[:8]}\""},{"line_number":141,"context_line":"            self.create_audit_template("},{"line_number":142,"context_line":"                name,"},{"line_number":143,"context_line":"                goal_name\u003d\"Server Consolidation\","}],"source_content_type":"text/x-python","patch_set":34,"id":"a57f5e70_01384eb7","line":140,"range":{"start_line":140,"start_character":11,"end_line":140,"end_character":59},"updated":"2026-09-01 04:36:11.000000000","message":"Here https://github.com/openstack/watcher-dashboard/blob/master/watcher_dashboard/test/integration/playwright_base.py#L334, we provide \n```\ndef _generate_unique_name(self, prefix):\n        \"\"\"Generate a unique resource name for test isolation.\"\"\"\n        return f\"{prefix}_{uuid.uuid4().hex[:8]}\"\n```\nWe can reuse here like this:\n\n\n```suggestion\n            name \u003d self._generate_unique_name(\"test_filter_sc\")\n```","commit_id":"fbd52921180b573e80eae6b949e52a7104c5d98e"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"53fa9c45fd2cbe4ed94b4bfcbd53df42be375cf3","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        target_goal_name \u003d \"server_consolidation\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        for i in range(2):"},{"line_number":140,"context_line":"            name \u003d f\"test_filter_sc_{uuid.uuid4().hex[:8]}\""},{"line_number":141,"context_line":"            self.create_audit_template("},{"line_number":142,"context_line":"                name,"},{"line_number":143,"context_line":"                goal_name\u003d\"Server Consolidation\","}],"source_content_type":"text/x-python","patch_set":34,"id":"e28ef179_bad50ff1","line":140,"range":{"start_line":140,"start_character":11,"end_line":140,"end_character":59},"in_reply_to":"9ea3c46d_7f19099f","updated":"2026-09-10 13:04:41.000000000","message":"Done","commit_id":"fbd52921180b573e80eae6b949e52a7104c5d98e"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"9a2daca7191f0c7fcee8b0e290e8f6f8169d885e","unresolved":true,"context_lines":[{"line_number":137,"context_line":"        target_goal_name \u003d \"server_consolidation\""},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        for i in range(2):"},{"line_number":140,"context_line":"            name \u003d f\"test_filter_sc_{uuid.uuid4().hex[:8]}\""},{"line_number":141,"context_line":"            self.create_audit_template("},{"line_number":142,"context_line":"                name,"},{"line_number":143,"context_line":"                goal_name\u003d\"Server Consolidation\","}],"source_content_type":"text/x-python","patch_set":34,"id":"9ea3c46d_7f19099f","line":140,"range":{"start_line":140,"start_character":11,"end_line":140,"end_character":59},"in_reply_to":"a57f5e70_01384eb7","updated":"2026-09-01 08:15:58.000000000","message":"That is a good point, I have changed all of them, thanks for catching it","commit_id":"fbd52921180b573e80eae6b949e52a7104c5d98e"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"95c2b71a60cbd963019327eb91353efad9f2725e","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@test.tag(\u0027integration\u0027)"},{"line_number":23,"context_line":"class FiltersTests(playwright_base.PlaywrightTestCase):"},{"line_number":24,"context_line":"    \"\"\"Integration tests for Filters using Playwright.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def _apply_filter(self, value, switch_to\u003dNone, current_filter\u003d\"Goal \u003d \"):"}],"source_content_type":"text/x-python","patch_set":35,"id":"b3b74519_c688eee1","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":18},"updated":"2026-09-08 17:52:06.000000000","message":"I miss some additional screenshots for these tests, the last screenshot is around audit_template or audit creation[1]. Filtering strategies doesn\u0027t have any additional screenshot[2].\n\n[1] https://7c401fe0d1e79c1668ce-fe6204f2df35682c06de56a815eb4773.ssl.cf1.rackcdn.com/openstack/6a801d257c3a422883ad0c5ec46bb5cb/controller/logs/playwright/screenshots/index.html\n[2] https://7c401fe0d1e79c1668ce-fe6204f2df35682c06de56a815eb4773.ssl.cf1.rackcdn.com/openstack/6a801d257c3a422883ad0c5ec46bb5cb/controller/logs/playwright/screenshots/watcher_dashboard.test.integration.test_filters.FiltersTests.test_filters_strategies_by_goal/index.html","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"1436f19fbfd07d83d5c3fa697fe05fa68c8dd483","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@test.tag(\u0027integration\u0027)"},{"line_number":23,"context_line":"class FiltersTests(playwright_base.PlaywrightTestCase):"},{"line_number":24,"context_line":"    \"\"\"Integration tests for Filters using Playwright.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def _apply_filter(self, value, switch_to\u003dNone, current_filter\u003d\"Goal \u003d \"):"}],"source_content_type":"text/x-python","patch_set":35,"id":"07b79b19_9c78326f","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":18},"in_reply_to":"b18bc4fd_16e373a4","updated":"2026-09-09 11:26:13.000000000","message":"Thanks! much better now!","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"b7e4a3b34d508b41dfeafeb5a011399f64adbbd8","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@test.tag(\u0027integration\u0027)"},{"line_number":23,"context_line":"class FiltersTests(playwright_base.PlaywrightTestCase):"},{"line_number":24,"context_line":"    \"\"\"Integration tests for Filters using Playwright.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def _apply_filter(self, value, switch_to\u003dNone, current_filter\u003d\"Goal \u003d \"):"}],"source_content_type":"text/x-python","patch_set":35,"id":"b18bc4fd_16e373a4","line":23,"range":{"start_line":23,"start_character":6,"end_line":23,"end_character":18},"in_reply_to":"b3b74519_c688eee1","updated":"2026-09-09 10:23:48.000000000","message":"Added 2 more screenshots, one before applying the filter (with the filter already on the box so we can see what is going to be applied) and another after applying it","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"ad753233c7c77ae855138fd01dff435c1c219489","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            values.add(text)"},{"line_number":81,"context_line":"        return values"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":84,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":35,"id":"1a80decb_296b956f","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":34},"updated":"2026-09-01 09:36:03.000000000","message":"We have `wait_for_audit_terminal_state` which does similar thing but here we can specify which state we want to reach, https://github.com/openstack/watcher-dashboard/blob/master/watcher_dashboard/test/integration/playwright_base.py#L350 is it possible to reuse here?","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"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":"3fec6289cf0ccf5024305ecfa20c60aea431adc5","unresolved":false,"context_lines":[{"line_number":80,"context_line":"            values.add(text)"},{"line_number":81,"context_line":"        return values"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":84,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":35,"id":"4708d8a5_766e17d0","line":83,"updated":"2026-09-01 08:24:45.000000000","message":"_wait_for_audit_completion polls watcher_client.audit.get(audit_uuid) every 5 seconds and only breaks when audit.state \u003d\u003d \u0027SUCCEEDED\u0027. FAILED, CANCELLED and DELETED are terminal states that can never transition to SUCCEEDED, so an audit that legitimately fails keeps the loop polling until the 180 s per-audit timeout expires, after which the test raises TimeoutError(\u0027Audit ... did not reach SUCCEEDED\u0027), hiding the actual FAILED state. The base class in the same test package already models this correctly: wait_for_audit_terminal_state() treats SUCCEEDED/FAILED/CANCELLED/DELETED as terminal.\n\n**Severity**: WARNING | **Confidence**: 0.85\n\n**Impact**: When an audit fails (exactly the regression this suite exists to catch), the test spends up to 180 s per audit polling a state that can never change and then reports a timeout instead of the audit\u0027s actual FAILED state, wasting CI time and misleading whoever diagnoses the failure.\n\n**Suggestion**:\nTreat any terminal state as the end of polling: break when audit.state in (\u0027SUCCEEDED\u0027, \u0027FAILED\u0027, \u0027CANCELLED\u0027, \u0027DELETED\u0027), then assert on the observed state (or include it in the raised error message) so a FAILED audit fails fast with an accurate diagnostic, mirroring the base class terminal-state pattern.","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"6b31584b68cf93bcbf211fe320b0fef4ba20ac23","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            values.add(text)"},{"line_number":81,"context_line":"        return values"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":84,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":35,"id":"eadce22a_55b03820","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":34},"in_reply_to":"1a80decb_296b956f","updated":"2026-09-01 11:18:55.000000000","message":"Good point, thanks. They look similar but they actually work in different ways:\n\n_wait_for_audit_completion polls the Watcher API for a specific list of audit UUIDs and waits until each one reaches SUCCEEDED.\n\nwait_for_audit_terminal_state is UI-based: it reloads the current page and does a text match (page.get_by_text(state)), so it\u0027s tied to whatever is rendered on the current page rather than to a specific audit.\n\nAs this wait is not part of the test, I prefer to use the API on the helper functions.\n\n\nIn test_filters_action_plans_by_audit we create two audits and both must reach SUCCEEDED before we can list their action plans via the API. Since the browser isn\u0027t necessarily on those audits\u0027 detail page and there can be several audits in the table, a text match would be ambiguous and non-deterministic — that\u0027s why the API polling by UUID is used here.\n\nThat said, I agree we shouldn\u0027t keep two parallel wait mechanisms. I\u0027d rather not fix it in this change to keep it focused, but we can create another patch to refactor wait_for_audit_terminal_state (and any other wait_for_* helper) to poll the API instead of the UI, so this test can reuse a single shared helper.\n\nDoes that work for you?","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"b7e4a3b34d508b41dfeafeb5a011399f64adbbd8","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            values.add(text)"},{"line_number":81,"context_line":"        return values"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":84,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":35,"id":"800b016c_ee6c35f3","line":83,"in_reply_to":"439e1298_37ef5e70","updated":"2026-09-09 10:23:48.000000000","message":"refactored _wait_for_audit_completion to allow custom state (defaulted to SUCCEDED) and a list of terminal states to be considered to end the the loop","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"95c2b71a60cbd963019327eb91353efad9f2725e","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            values.add(text)"},{"line_number":81,"context_line":"        return values"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":84,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":35,"id":"439e1298_37ef5e70","line":83,"in_reply_to":"4708d8a5_766e17d0","updated":"2026-09-08 17:52:06.000000000","message":"I think that this is a valid improvement. There are some states that are final and we don\u0027t expected they to change after that. I would rework this method to accept other states, other than SUCEEDDED, and also check for terminal states and break earlier. We can consider this as an improvemente for a follow up, and also move this to a common helper class that can be reused by other tests?","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"1436f19fbfd07d83d5c3fa697fe05fa68c8dd483","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            values.add(text)"},{"line_number":81,"context_line":"        return values"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":84,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":35,"id":"57fcf69f_73eb977d","line":83,"in_reply_to":"800b016c_ee6c35f3","updated":"2026-09-09 11:26:13.000000000","message":"Thanks for the updates! \nWe may consider moving this method to a helper class since it can be used by other tests.","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"53f0819b781861c711bc4ba9f08146544f36f5e3","unresolved":true,"context_lines":[{"line_number":80,"context_line":"            values.add(text)"},{"line_number":81,"context_line":"        return values"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _wait_for_audit_completion(self, audit_uuids, timeout\u003d180):"},{"line_number":84,"context_line":"        \"\"\"Wait for audits to reach SUCCEEDED state via API polling."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :param audit_uuids: List of audit UUIDs to wait for."}],"source_content_type":"text/x-python","patch_set":35,"id":"2ac0d3b2_95e5a21b","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":34},"in_reply_to":"eadce22a_55b03820","updated":"2026-09-01 11:52:41.000000000","message":"Yes, works for me. We can refactor it in a follow up patch.","commit_id":"13428a742c5404c7b9a8641b328c1520b2648c3f"}]}
