)]}'
{".zuul.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"916f9e15c76c4e0ac6367dcebbbf965d80606a9e","unresolved":true,"context_lines":[{"line_number":34,"context_line":"        PLAYWRIGHT_VIDEO: retain-on-failure"},{"line_number":35,"context_line":"        PLAYWRIGHT_TRACE: retain-on-failure"},{"line_number":36,"context_line":"        PLAYWRIGHT_HEADLESS: true"},{"line_number":37,"context_line":"        PLAYWRIGHT_IGNORE_HTTPS_ERRORS: true"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"- project:"},{"line_number":40,"context_line":"    templates:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"ed05c6fd_2307aff4","line":37,"updated":"2026-07-09 13:29:06.000000000","message":"so this really shoudl not be required\n\nhttps://zuul.opendev.org/t/openstack/build/4fd39452304d4db08b999a0aef7b4704/log/controller/logs/local_conf.txt#35\n\nwe can do this for now but the certs should be tursted on the host because we enrole them in the host tursted ca when we enabel the tls-proxy\n\nso at some point we shoudl figure out why the borwser is not trusting them","commit_id":"867b425f3eb33891a203624911c28308a0dabf6e"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"734c4877ebbc03753e8d177d60aca97daf17e837","unresolved":true,"context_lines":[{"line_number":34,"context_line":"        PLAYWRIGHT_VIDEO: retain-on-failure"},{"line_number":35,"context_line":"        PLAYWRIGHT_TRACE: retain-on-failure"},{"line_number":36,"context_line":"        PLAYWRIGHT_HEADLESS: true"},{"line_number":37,"context_line":"        PLAYWRIGHT_IGNORE_HTTPS_ERRORS: true"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"- project:"},{"line_number":40,"context_line":"    templates:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"6741401f_7ef6dd75","line":37,"in_reply_to":"330b638b_243fd404","updated":"2026-07-16 09:05:31.000000000","message":"ok, I have removed the ignore from the zuul configuration, so now you can disable HTTPS on your test environment, but zuul tests will still verify HTTPS","commit_id":"867b425f3eb33891a203624911c28308a0dabf6e"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d8be682097e49e4739a230067a31b76a2dfd32f8","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        PLAYWRIGHT_VIDEO: retain-on-failure"},{"line_number":35,"context_line":"        PLAYWRIGHT_TRACE: retain-on-failure"},{"line_number":36,"context_line":"        PLAYWRIGHT_HEADLESS: true"},{"line_number":37,"context_line":"        PLAYWRIGHT_IGNORE_HTTPS_ERRORS: true"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"- project:"},{"line_number":40,"context_line":"    templates:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"65922512_ce11ba4f","line":37,"in_reply_to":"6741401f_7ef6dd75","updated":"2026-07-16 11:34:24.000000000","message":"Acknowledged","commit_id":"867b425f3eb33891a203624911c28308a0dabf6e"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"756c1ad3be7a1cf6eb3ba5a94de4cd69dc0d8345","unresolved":true,"context_lines":[{"line_number":34,"context_line":"        PLAYWRIGHT_VIDEO: retain-on-failure"},{"line_number":35,"context_line":"        PLAYWRIGHT_TRACE: retain-on-failure"},{"line_number":36,"context_line":"        PLAYWRIGHT_HEADLESS: true"},{"line_number":37,"context_line":"        PLAYWRIGHT_IGNORE_HTTPS_ERRORS: true"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"- project:"},{"line_number":40,"context_line":"    templates:"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"330b638b_243fd404","line":37,"in_reply_to":"ed05c6fd_2307aff4","updated":"2026-07-15 17:33:00.000000000","message":"Was it failing in ci before? or are we just adding it here without need?","commit_id":"867b425f3eb33891a203624911c28308a0dabf6e"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"7d7b9c332445f85cf3e5579785b479f5ac1cbf99","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"2ce2e336_dd0e7159","updated":"2026-07-08 13:54:25.000000000","message":"recheck","commit_id":"7474afdc1e34bf539ca513528ab1422a07e581fa"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b3bab50807070ff4f513df5555b334f2a1e6afc8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1618d106_37142e56","updated":"2026-07-14 06:32:17.000000000","message":"lgtm!\n\nNew var default added in tox.ini as well as in docs.","commit_id":"867b425f3eb33891a203624911c28308a0dabf6e"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d8be682097e49e4739a230067a31b76a2dfd32f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"9e0a1954_b83c3317","updated":"2026-07-16 11:34:24.000000000","message":"Thanks","commit_id":"fe1dc3773739807e990bfeb5fd5e0aba13c057d0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bcf987bb250cbfdbce99d9c4959671803710c02a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"c09a9754_f3960a65","updated":"2026-07-16 11:24:48.000000000","message":"thanks we shoudl test with tls in the gate but im fine with having the opt out of local dev","commit_id":"fe1dc3773739807e990bfeb5fd5e0aba13c057d0"}],"tox.ini":[{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b5ca710d664b731206647dbed27e4d4a4a160a88","unresolved":true,"context_lines":[{"line_number":53,"context_line":"  PLAYWRIGHT_VIDEO"},{"line_number":54,"context_line":"  PLAYWRIGHT_TRACE"},{"line_number":55,"context_line":"  PLAYWRIGHT_AUTH_REUSE"},{"line_number":56,"context_line":"  PLAYWRIGHT_IGNORE_HTTPS_ERRORS"},{"line_number":57,"context_line":"setenv \u003d"},{"line_number":58,"context_line":"  DJANGO_SETTINGS_MODULE\u003dwatcher_dashboard.test.settings"},{"line_number":59,"context_line":"  DEBUG \u003d pw:api"}],"source_content_type":"text/x-properties","patch_set":2,"id":"d09781de_e79590d2","line":56,"updated":"2026-07-07 07:09:30.000000000","message":"I can alaos add the environment variable here https://github.com/openstack/watcher-dashboard/blob/master/doc/source/contributor/playwright-testing.rst#environment-variables for end user.\n\nDonot we also need to add this var under setenv?","commit_id":"f1ad2e61f4a03b2146debcfebb29c1a26147c281"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b3bab50807070ff4f513df5555b334f2a1e6afc8","unresolved":false,"context_lines":[{"line_number":53,"context_line":"  PLAYWRIGHT_VIDEO"},{"line_number":54,"context_line":"  PLAYWRIGHT_TRACE"},{"line_number":55,"context_line":"  PLAYWRIGHT_AUTH_REUSE"},{"line_number":56,"context_line":"  PLAYWRIGHT_IGNORE_HTTPS_ERRORS"},{"line_number":57,"context_line":"setenv \u003d"},{"line_number":58,"context_line":"  DJANGO_SETTINGS_MODULE\u003dwatcher_dashboard.test.settings"},{"line_number":59,"context_line":"  DEBUG \u003d pw:api"}],"source_content_type":"text/x-properties","patch_set":2,"id":"59503be9_6ccdb22f","line":56,"in_reply_to":"a6a2a848_15d4ee3a","updated":"2026-07-14 06:32:17.000000000","message":"Done","commit_id":"f1ad2e61f4a03b2146debcfebb29c1a26147c281"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"f285a6f74a4d40e9bbb15b825024fa4cce539b3a","unresolved":true,"context_lines":[{"line_number":53,"context_line":"  PLAYWRIGHT_VIDEO"},{"line_number":54,"context_line":"  PLAYWRIGHT_TRACE"},{"line_number":55,"context_line":"  PLAYWRIGHT_AUTH_REUSE"},{"line_number":56,"context_line":"  PLAYWRIGHT_IGNORE_HTTPS_ERRORS"},{"line_number":57,"context_line":"setenv \u003d"},{"line_number":58,"context_line":"  DJANGO_SETTINGS_MODULE\u003dwatcher_dashboard.test.settings"},{"line_number":59,"context_line":"  DEBUG \u003d pw:api"}],"source_content_type":"text/x-properties","patch_set":2,"id":"a6a2a848_15d4ee3a","line":56,"in_reply_to":"d09781de_e79590d2","updated":"2026-07-07 07:42:50.000000000","message":"ok, I have added the var to the doc, and set False by default. only on the definition of the job in .zuul.yaml is set to True","commit_id":"f1ad2e61f4a03b2146debcfebb29c1a26147c281"}],"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":"722494df62b32e769a65abdcf8f192504ae14177","unresolved":false,"context_lines":[{"line_number":234,"context_line":"        # Try to find the login button - some deployments use different selectors"},{"line_number":235,"context_line":"        # for the submit button. Try role-based selector first, fall back to ID."},{"line_number":236,"context_line":"        try:"},{"line_number":237,"context_line":"            self.page.get_by_role(\"button\", name\u003d\"Sign In\").click(timeout\u003d2000)"},{"line_number":238,"context_line":"        except sync_api.TimeoutError:"},{"line_number":239,"context_line":"            self.page.locator(\"#loginBtn\").click()"},{"line_number":240,"context_line":"        self.take_screenshot(\"login_submit\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"5be73729_4c178142","line":237,"updated":"2026-07-06 10:01:58.000000000","message":"The login-button probe uses a hardcoded timeout\u003d2000 magic number (ms). Every other timeout in this module is derived from config.get_timeout(), making this literal inconsistent and not tunable.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Deriving the probe timeout from config.get_timeout() (or a named module constant) keeps timeout configuration in one place and lets operators tune the login fallback without editing code.\n\n**Recommendation**:\nReplace the literal with a fraction of config.get_timeout() (e.g. timeout\u003dconfig.get_timeout() // 4) or define a module-level constant such as LOGIN_PROBE_TIMEOUT_MS \u003d 2000. A short probe is intentional, but the value should remain configurable and consistent with the module\u0027s timeout conventions.","commit_id":"d42edfc2af0c43bbc9c8f41b98dd68e846eae467"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b5ca710d664b731206647dbed27e4d4a4a160a88","unresolved":true,"context_lines":[{"line_number":230,"context_line":"        self.take_screenshot(\"login_username_filled\")"},{"line_number":231,"context_line":"        self.page.get_by_label(\"Password\").fill(config.get_password())"},{"line_number":232,"context_line":"        self.take_screenshot(\"login_password_filled\")"},{"line_number":233,"context_line":"        self.page.locator(\"#loginBtn\").click()"},{"line_number":234,"context_line":"        self.take_screenshot(\"login_submit\")"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        # Wait for login to complete"}],"source_content_type":"text/x-python","patch_set":2,"id":"cbdc1a4a_585db6a0","line":233,"range":{"start_line":233,"start_character":8,"end_line":233,"end_character":46},"updated":"2026-07-07 07:09:30.000000000","message":"```suggestion\n        # In Downstream, Button name is Connect\tand Sign in in Devstack\n        # Using locator will help to avoid checking for specific button\n        # label.\n        self.page.locator(\"#loginBtn\").click()\n```","commit_id":"f1ad2e61f4a03b2146debcfebb29c1a26147c281"},{"author":{"_account_id":12393,"name":"chandan kumar","display_name":"Chandan Kumar","email":"chkumar@redhat.com","username":"chkumar246"},"change_message_id":"b3bab50807070ff4f513df5555b334f2a1e6afc8","unresolved":false,"context_lines":[{"line_number":230,"context_line":"        self.take_screenshot(\"login_username_filled\")"},{"line_number":231,"context_line":"        self.page.get_by_label(\"Password\").fill(config.get_password())"},{"line_number":232,"context_line":"        self.take_screenshot(\"login_password_filled\")"},{"line_number":233,"context_line":"        self.page.locator(\"#loginBtn\").click()"},{"line_number":234,"context_line":"        self.take_screenshot(\"login_submit\")"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        # Wait for login to complete"}],"source_content_type":"text/x-python","patch_set":2,"id":"568ceca0_a09107f9","line":233,"range":{"start_line":233,"start_character":8,"end_line":233,"end_character":46},"in_reply_to":"18cacb77_e229e3ec","updated":"2026-07-14 06:32:17.000000000","message":"Done","commit_id":"f1ad2e61f4a03b2146debcfebb29c1a26147c281"},{"author":{"_account_id":28647,"name":"David","display_name":"morenod","email":"dsanzmor@redhat.com","username":"morenod"},"change_message_id":"92b4132778388044f8e02bb00a40a04fefb502d6","unresolved":true,"context_lines":[{"line_number":230,"context_line":"        self.take_screenshot(\"login_username_filled\")"},{"line_number":231,"context_line":"        self.page.get_by_label(\"Password\").fill(config.get_password())"},{"line_number":232,"context_line":"        self.take_screenshot(\"login_password_filled\")"},{"line_number":233,"context_line":"        self.page.locator(\"#loginBtn\").click()"},{"line_number":234,"context_line":"        self.take_screenshot(\"login_submit\")"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        # Wait for login to complete"}],"source_content_type":"text/x-python","patch_set":2,"id":"18cacb77_e229e3ec","line":233,"range":{"start_line":233,"start_character":8,"end_line":233,"end_character":46},"in_reply_to":"cbdc1a4a_585db6a0","updated":"2026-07-07 07:35:14.000000000","message":"moved to review https://review.opendev.org/c/openstack/watcher-dashboard/+/996215","commit_id":"f1ad2e61f4a03b2146debcfebb29c1a26147c281"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"756c1ad3be7a1cf6eb3ba5a94de4cd69dc0d8345","unresolved":true,"context_lines":[{"line_number":67,"context_line":"        # 3. Configure Context (Video, Viewport, Auth)"},{"line_number":68,"context_line":"        video_dir \u003d self._get_video_dir()"},{"line_number":69,"context_line":"        context_kwargs \u003d {"},{"line_number":70,"context_line":"            \u0027viewport\u0027: {\u0027width\u0027: 1920, \u0027height\u0027: 1080},"},{"line_number":71,"context_line":"            \u0027ignore_https_errors\u0027: config.ignore_https_errors(),"},{"line_number":72,"context_line":"        }"},{"line_number":73,"context_line":"        if video_dir:"},{"line_number":74,"context_line":"            context_kwargs.update("},{"line_number":75,"context_line":"                {"}],"source_content_type":"text/x-python","patch_set":10,"id":"99062003_3df81513","line":72,"range":{"start_line":70,"start_character":1,"end_line":72,"end_character":9},"updated":"2026-07-15 17:33:00.000000000","message":"ack, I think that it is fine for a testing framework, as mentioned in the commit message.","commit_id":"867b425f3eb33891a203624911c28308a0dabf6e"}],"watcher_dashboard/test/integration/playwright_config.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":"722494df62b32e769a65abdcf8f192504ae14177","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    :returns: True if auth state reuse is enabled (default: True)"},{"line_number":232,"context_line":"    \"\"\""},{"line_number":233,"context_line":"    value \u003d os.environ.get(\u0027PLAYWRIGHT_AUTH_REUSE\u0027, \u0027True\u0027)"},{"line_number":234,"context_line":"    return strutils.bool_from_string(value, default\u003dTrue)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"2be342c1_ce2159c7","line":233,"updated":"2026-07-06 10:01:58.000000000","message":"bool_from_string(value, default\u003d...) is now used without strict\u003dTrue in is_auth_reuse_enabled() and ignore_https_errors(), so a malformed value silently coerces to the default instead of raising. The os.environ.get() default already covers the unset case.\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: A typo such as PLAYWRIGHT_AUTH_REUSE\u003dtru no longer fails fast; it silently resolves to the True default and enables auth reuse, masking the misconfiguration. The same silent-coercion applies to ignore_https_errors() at lines 255-256.\n\n**Suggestion**:\nRestore fail-fast validation by passing strict\u003dTrue: bool_from_string(value, strict\u003dTrue). The os.environ.get(..., \u0027True\u0027) call already supplies the default for the unset case, so strict\u003dTrue preserves the new default while still raising ValueError on malformed input. Apply the same pattern to ignore_https_errors() for consistency with is_headless, is_screenshot_enabled, and is_insecure, which all use strict\u003dTrue.","commit_id":"d42edfc2af0c43bbc9c8f41b98dd68e846eae467"},{"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":"722494df62b32e769a65abdcf8f192504ae14177","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    :returns: True if HTTPS errors should be ignored (default: False)"},{"line_number":254,"context_line":"    \"\"\""},{"line_number":255,"context_line":"    value \u003d os.environ.get(\u0027PLAYWRIGHT_IGNORE_HTTPS_ERRORS\u0027, \u0027False\u0027)"},{"line_number":256,"context_line":"    return strutils.bool_from_string(value, default\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffde2e8f_03c51f1b","line":255,"updated":"2026-07-06 10:01:58.000000000","message":"Two overlapping certificate-validation flags now exist: is_insecure() (OS_INSECURE) for the keystone/API client and ignore_https_errors() (PLAYWRIGHT_IGNORE_HTTPS_ERRORS) for the browser. The tox integration env defaults OS_INSECURE\u003dTrue but sets no default for the browser flag.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Operators testing against a self-signed HTTPS dashboard would need only OS_INSECURE\u003dTrue instead of discovering a second, separate flag after the browser context still fails certificate validation.\n\n**Recommendation**:\nConsider deriving the browser ignore_https_errors default from is_insecure() so a single OS_INSECURE\u003dTrue covers both the API client and the Playwright browser context, e.g. fall back to is_insecure() when PLAYWRIGHT_IGNORE_HTTPS_ERRORS is unset. Document the relationship in the docstring either way.","commit_id":"d42edfc2af0c43bbc9c8f41b98dd68e846eae467"},{"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":"78052423af9f1d67006a3061252d8b91e12f61c4","unresolved":false,"context_lines":[{"line_number":230,"context_line":""},{"line_number":231,"context_line":"    :returns: True if auth state reuse is enabled (default: True)"},{"line_number":232,"context_line":"    \"\"\""},{"line_number":233,"context_line":"    value \u003d os.environ.get(\u0027PLAYWRIGHT_AUTH_REUSE\u0027, \u0027True\u0027)"},{"line_number":234,"context_line":"    return strutils.bool_from_string(value, default\u003dTrue)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7f947507_1bb4a640","line":233,"updated":"2026-07-08 08:47:24.000000000","message":"The modified is_auth_reuse_enabled() and the new ignore_https_errors() call strutils.bool_from_string(value, default\u003d...) without strict\u003dTrue. This means that if a user sets an invalid value for PLAYWRIGHT_AUTH_REUSE or PLAYWRIGHT_IGNORE_HTTPS_ERRORS (e.g., a typo), the function silently returns...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Invalid environment variable values (e.g., PLAYWRIGHT_AUTH_REUSE\u003dyes, PLAYWRIGHT_IGNORE_HTTPS_ERRORS\u003d1) are silently coerced to the default instead of raising an error, making misconfiguration harder to diagnose. The impact is limited since tox.ini always provides valid defaults.\n\n**Recommendation**:\nKeep strict\u003dTrue for validation while still using os.environ.get() for the default-on-missing behavior. For example: value \u003d os.environ.get(\u0027PLAYWRIGHT_AUTH_REUSE\u0027, \u0027True\u0027) return strutils.bool_from_string(value, strict\u003dTrue) This provides a default when the env var is unset but still rejects invalid values, matching the pattern used by is_headless(), is_screenshot_enabled(), and is_insecure().","commit_id":"51c72bf14d1f84a9f8d9e580258b59b95e68ab62"}]}
