)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"f3f49781800427f760b04884c21ea6c842bc2bc0","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Improvements to Playwright artifacts"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Use test name for artifact file naming:"},{"line_number":10,"context_line":"  Replace id(self) with sanitized self.id() for trace and video"},{"line_number":11,"context_line":"  filenames. Also use page.video.save_as() for explicit video"},{"line_number":12,"context_line":"  naming instead of relying on auto-generated paths."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"e7e4f03b_177988e8","line":9,"range":{"start_line":9,"start_character":2,"end_line":9,"end_character":41},"updated":"2026-07-20 05:34:50.000000000","message":"traces now uses testname: https://a21c4205282e4de8b5b5-316ead88afa2be91e0f5b80937dadc42.ssl.cf5.rackcdn.com/openstack/b6de40d5cd394e949631930250e6eddd/controller/logs/playwright/traces/index.html  \n\nvideo files are also using testname:\nhttps://a21c4205282e4de8b5b5-316ead88afa2be91e0f5b80937dadc42.ssl.cf5.rackcdn.com/openstack/b6de40d5cd394e949631930250e6eddd/controller/logs/playwright/videos/index.html","commit_id":"b4d36912e8beb4225bcd602ae0bc6c622e9ac985"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b3ec6a7871704b7aca017813409ec13b9b53cc82","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Other cleanups from Playwright POC"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"* Remove unused OS_CLOUD from run.yaml"},{"line_number":17,"context_line":"  Playwright tests authenticate via individual OS_* env vars"},{"line_number":18,"context_line":"  with tox.ini defaults, not via OS_CLOUD/clouds.yaml."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"* Simplify _get_audit_uuid_via_api"},{"line_number":21,"context_line":"  Remove defensive try/except that could return None, causing"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"defec246_3c2fc7d2","line":18,"range":{"start_line":16,"start_character":0,"end_line":18,"end_character":54},"updated":"2026-08-05 11:36:31.000000000","message":"that proably should have been done seperatly but sure","commit_id":"768b650859fc6ce5f46a61624cbe178a94fc682a"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"58a1fc02faaabdde1dec6cf05246789c70f7a385","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"971df1b2_390c3cf9","updated":"2026-07-29 10:12:01.000000000","message":"this is totally necessary to match tests and videos","commit_id":"b4d36912e8beb4225bcd602ae0bc6c622e9ac985"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"0a3060df1d8273d8df32e3153b69e14af2b1b801","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"23df8c50_b19568e2","updated":"2026-08-06 08:34:09.000000000","message":"recheck","commit_id":"768b650859fc6ce5f46a61624cbe178a94fc682a"}],"watcher_dashboard/test/integration/playwright_base.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":"0cdaf13afe21c741787a5ed64f4be6192eb83450","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        if trace_mode !\u003d \u0027off\u0027:"},{"line_number":122,"context_line":"            trace_dir \u003d config.get_trace_dir()"},{"line_number":123,"context_line":"            os.makedirs(trace_dir, exist_ok\u003dTrue)"},{"line_number":124,"context_line":"            safe_name \u003d re.sub("},{"line_number":125,"context_line":"                r\u0027[^A-Za-z0-9_.-]+\u0027, \u0027_\u0027, self.test_name or str(id(self))"},{"line_number":126,"context_line":"            )"},{"line_number":127,"context_line":"            trace_path \u003d os.path.join(trace_dir, f\"trace_{safe_name}.zip\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"ac286f95_5d302df8","line":124,"updated":"2026-07-06 08:44:02.000000000","message":"The test-name sanitization regex r\u0027[^A-Za-z0-9_.-]+\u0027 is now duplicated: once for the trace filename and once in _get_test_screenshot_dir.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: A single helper keeps both call sites consistent and makes future naming changes a one-line edit instead of a two-place change.\n\n**Recommendation**:\nAdd a small helper, e.g. def _sanitize_for_path(name): return re.sub(r\u0027[^A-Za-z0-9_.-]+\u0027, \u0027_\u0027, name), and call it both when building the trace filename and inside _get_test_screenshot_dir.","commit_id":"bb43883dd40114ad72fe6c9b788ae40dddd9b1ce"},{"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":"797323d0f140073229e25d1c99353984574098e1","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        self.context.close()"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        if self.page.video:"},{"line_number":138,"context_line":"            safe_name \u003d re.sub("},{"line_number":139,"context_line":"                r\u0027[^A-Za-z0-9_.-]+\u0027, \u0027_\u0027, self.test_name or str(id(self))"},{"line_number":140,"context_line":"            )"}],"source_content_type":"text/x-python","patch_set":4,"id":"ef689fad_7f8e4681","line":137,"updated":"2026-08-06 08:49:35.000000000","message":"The video save block in _close_context_and_finalize_artifacts calls save_as() and delete() without a try/except guard, unlike the trace block immediately above it which catches OSError and AttributeError. Since this runs inside a fixture cleanup (self.addCleanup), an unhandled exception from save...\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If save_as() fails (e.g., disk full, permissions, Playwright internal error) or delete() fails during cleanup, the exception will propagate from the fixture cleanup. This can mask the real test failure or produce a confusing double-failure traceback, making CI triage difficult.\n\n**Suggestion**:\nWrap the save_as/delete calls in a try/except matching the trace block pattern: try: self.page.video.save_as(video_path); self.page.video.delete(); LOG.info(\u0027Video saved to: %s\u0027, video_path) except (OSError, AttributeError) as e: LOG.warning(\u0027Failed to save video: %s\u0027, e)","commit_id":"768b650859fc6ce5f46a61624cbe178a94fc682a"},{"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":"08ea7a4c62d9675aa4a410f5680dbb5d91200250","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            )"},{"line_number":141,"context_line":"            video_dir \u003d config.get_video_dir()"},{"line_number":142,"context_line":"            video_path \u003d os.path.join(video_dir, f\"video_{safe_name}.webm\")"},{"line_number":143,"context_line":"            self.page.video.save_as(video_path)"},{"line_number":144,"context_line":"            self.page.video.delete()"},{"line_number":145,"context_line":"            LOG.info(\"Video saved to: %s\", video_path)"},{"line_number":146,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ef1c1b4c_3f7675cd","line":143,"updated":"2026-08-05 07:36:09.000000000","message":"In _close_context_and_finalize_artifacts, the trace stop (lines 130-133) is wrapped in try/except (OSError, AttributeError) but the video save_as and delete calls (lines 143-144) are not. An unhandled exception from save_as or delete will propagate as a cleanup error from the fixture\u0027s addCleanup...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: If save_as or delete raises (e.g., disk full, permissions, transient I/O error), the exception propagates from the fixture cleanup registered via addCleanup. In testtools/fixtures, this stores a cleanup error that may mask or confuse the actual test failure result, making CI debugging harder.\n\n**Recommendation**:\nWrap the save_as and delete calls in try/except (OSError, AttributeError) matching the pattern already used for trace stop on lines 130-133, logging a warning on failure instead of letting the exception propagate from cleanup.","commit_id":"768b650859fc6ce5f46a61624cbe178a94fc682a"}]}
