)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0d914c617de95534b9ee5a5ef711c4daa003a6d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"6009c4de_4aa08e3c","updated":"2026-06-22 19:17:47.000000000","message":"Need to look again, but looks good in general","commit_id":"21b17d286ddbb86697d734cb7d4320831713ff45"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f16646a287d740fa15fbb3efeaae0091e14cf1b7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"f53a81a3_698b3ee3","updated":"2026-06-25 18:34:25.000000000","message":"lgtm, new fixtures looks simple enough for starting the infrastructure, the base test classes and initializations also makes sense. Initial CDM/collector mocking makes sense sinc we would be adding external services emulators as follow ups","commit_id":"9a79329c8babdaf2d71653a23645ff431721a898"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3a053726_92c72aba","updated":"2026-07-02 20:19:50.000000000","message":"CAST_AS_CALL is the main one.\n\nfor some set of timeing related bugs we ahve found we need to disabel this in nova so defaulting it to ON is fine but we show make ti configurable","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b6cc114a335097514fcf9978c040588bab9d39e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f3623d03_67a561f0","updated":"2026-07-06 13:44:37.000000000","message":"looks good, I did not find anything wrong other that things that were already commented and a tiny nit","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f0268e0cdadb8411d7de0c33a273575e31ca575b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"8e443538_bbe7c822","updated":"2026-08-12 13:34:21.000000000","message":"I am happy with the patch, we can improve some points later as follow ups. Gabbi tests are passing[1], ltgm\n\n[1] https://5a1528093e0257bff1b5-0a8a55712d031506235c83f14141b923.ssl.cf5.rackcdn.com/openstack/50d5002ce6c149c0befb7a5304ecde1c/testr_results.html","commit_id":"16ad250b7560bc3ef9b52881c9e91305bf575c71"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"cd830f537f3bfdba969823532041941ee06d92ba","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"5448f5f3_b541eb07","updated":"2026-08-03 10:45:20.000000000","message":"looks good to me, there are a few comments open, but nothing that can\u0027t be address in a follow up imo","commit_id":"16ad250b7560bc3ef9b52881c9e91305bf575c71"}],"doc/source/contributor/testing.rst":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f0268e0cdadb8411d7de0c33a273575e31ca575b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"dd659ccd_eb98954d","updated":"2026-08-12 13:34:21.000000000","message":"Output looks good, and docs for functional tests are really grat, thanks Alfred.\n\nhttps://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_4a8/openstack/4a870b4bec3b4bd0a7944ce36497a929/docs/contributor/testing.html#functional-tests","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":146,"context_line":"Debugging with log files"},{"line_number":147,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"By default, logs are captured in memory and only displayed when a test fails."},{"line_number":150,"context_line":"To write full DEBUG logs to disk for every test, set the"},{"line_number":151,"context_line":"``WATCHER_FUNC_TEST_LOG_DIR`` environment variable::"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    $ WATCHER_FUNC_TEST_LOG_DIR\u003d/tmp/watcher-func-logs tox -e functional"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"This creates one log file per test in the specified directory (e.g."},{"line_number":156,"context_line":"``TestAuditLifecycle.test_dummy_audit_end_to_end.log``), containing"}],"source_content_type":"text/x-rst","patch_set":6,"id":"b14f0560_76400723","line":153,"range":{"start_line":149,"start_character":0,"end_line":153,"end_character":72},"updated":"2026-07-02 20:19:50.000000000","message":"hum intersting i dont think nvoa can do that so this is neat","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":160,"context_line":"You can also enable DEBUG-level output to stderr (shown inline by stestr) with"},{"line_number":161,"context_line":"``OS_DEBUG``::"},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"    $ OS_DEBUG\u003d1 tox -e functional -- test_basic"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"Architecture"},{"line_number":166,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":6,"id":"6c0a6588_ced194a1","line":163,"range":{"start_line":163,"start_character":3,"end_line":163,"end_character":48},"updated":"2026-07-02 20:19:50.000000000","message":"ya this is what i normally do alternitive it is possibel to run them with a debuger with enough workarounds.\n\nbut print debuging is often what i eneded up doing like this","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b6cc114a335097514fcf9978c040588bab9d39e4","unresolved":true,"context_lines":[{"line_number":176,"context_line":"    │                  Test process                       │"},{"line_number":177,"context_line":"    │                                                     │"},{"line_number":178,"context_line":"    │  ┌──────────────────┐   HTTP (wsgi-intercept)       │"},{"line_number":179,"context_line":"    │  │  Test method      │──────────────────────┐       │"},{"line_number":180,"context_line":"    │  │  (WatcherTest     │                      ▼       │"},{"line_number":181,"context_line":"    │  │   Client)         │            ┌─────────────┐   │"},{"line_number":182,"context_line":"    │  └──────────────────┘            │  Pecan WSGI  │   │"}],"source_content_type":"text/x-rst","patch_set":6,"id":"f213c37a_9775b753","line":179,"updated":"2026-07-06 13:44:37.000000000","message":"nit, there are a few spacing issues in the diagram, would be nice to fix if the patch needs a respin","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":413,"context_line":"``tox.ini`` ensures stestr keeps all tests from one YAML file in the same"},{"line_number":414,"context_line":"worker, while allowing different YAML files and Python tests to run in"},{"line_number":415,"context_line":"parallel across workers."},{"line_number":416,"context_line":""},{"line_number":417,"context_line":".. _tempest_tests:"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"Tempest tests"}],"source_content_type":"text/x-rst","patch_set":6,"id":"0b2fa079_dc27ae33","line":416,"updated":"2026-07-02 20:19:50.000000000","message":"this is all very good thanks for updatign the docs.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"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":"69953e449e155a3ca9e6721a6e7b080a3723dd47","unresolved":false,"context_lines":[{"line_number":90,"context_line":"     - Mocked"},{"line_number":91,"context_line":"     - Real API, decision engine, and applier running in-process"},{"line_number":92,"context_line":"   * - Database"},{"line_number":93,"context_line":"     - File-backed SQLite with WAL journaling"},{"line_number":94,"context_line":"     - File-backed SQLite with WAL journaling"},{"line_number":95,"context_line":"   * - RPC"},{"line_number":96,"context_line":"     - Mocked"}],"source_content_type":"text/x-rst","patch_set":7,"id":"d54798d5_6d15de5a","line":93,"updated":"2026-07-30 16:05:22.000000000","message":"The newly added comparison table in testing.rst lists both unit tests and functional tests as using \u0027File-backed SQLite with WAL journaling\u0027 for the Database row. Unit tests actually use in-memory SQLite (sqlite://) per conf_fixture.py, not file-backed WAL databases.\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Developers reading the functional test documentation would be misled about the difference between unit and functional test database setups, potentially causing confusion about concurrency or persistence behavior in unit tests.\n\n**Recommendation**:\nChange the unit tests Database cell to \u0027In-memory SQLite (sqlite://)\u0027 to accurately reflect the actual unit test configuration.","commit_id":"6a389644287b156c4da37e27936c11a50a323e31"},{"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":"69953e449e155a3ca9e6721a6e7b080a3723dd47","unresolved":false,"context_lines":[{"line_number":217,"context_line":"  ``ServiceHeartbeat`` to avoid unnecessary database writes."},{"line_number":218,"context_line":"- **External services**: Keystone is mocked via the ``KeystoneClient``"},{"line_number":219,"context_line":"  fixture. Fixtures for Nova, Placement, Cinder and Prometheus APIs will be"},{"line_number":220,"context_line":"  provided. Until the fixutres are provided, the Cluster data model collectors"},{"line_number":221,"context_line":"  are disabled (``collector_plugins \u003d []``) and a fake empty model is provided."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Fixture setup order"}],"source_content_type":"text/x-rst","patch_set":7,"id":"ae54e23c_39acb563","line":220,"updated":"2026-07-30 16:05:22.000000000","message":"The new documentation text in testing.rst contains \u0027fixutres\u0027 instead of \u0027fixtures\u0027 in the External services bullet point.\n\n**Severity**: SUGGESTION | **Confidence**: 1.0\n\n**Benefit**: Minor spelling error in user-facing developer documentation that reduces polish of an otherwise well-written doc.\n\n**Recommendation**:\nCorrect \u0027fixutres\u0027 to \u0027fixtures\u0027 on line 220 of testing.rst.","commit_id":"6a389644287b156c4da37e27936c11a50a323e31"},{"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":"b9c8aa400e8bb5136320905b5b9771e3637595d4","unresolved":false,"context_lines":[{"line_number":217,"context_line":"  ``ServiceHeartbeat`` to avoid unnecessary database writes."},{"line_number":218,"context_line":"- **External services**: Keystone is mocked via the ``KeystoneClient``"},{"line_number":219,"context_line":"  fixture. Fixtures for Nova, Placement, Cinder and Prometheus APIs will be"},{"line_number":220,"context_line":"  provided. Until the fixutres are provided, the Cluster data model collectors"},{"line_number":221,"context_line":"  are disabled (``collector_plugins \u003d []``) and a fake empty model is provided."},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"Fixture setup order"}],"source_content_type":"text/x-rst","patch_set":9,"id":"930e4f3d_4a9b5f15","line":220,"updated":"2026-07-31 10:22:09.000000000","message":"In the Architecture section of the new functional testing documentation, \"fixtures\" is misspelled as \"fixutres\": \"Until the fixutres are provided, the Cluster data model collectors are disabled\".\n\n**Severity**: SUGGESTION | **Confidence**: 1.0\n\n**Benefit**: Minor: a misspelling in published contributor documentation. The word appears multiple times correctly elsewhere, making this instance stand out.\n\n**Recommendation**:\nChange \"fixutres\" to \"fixtures\" on line 220.","commit_id":"120fe80a1fef68c087e83e8f5f081c93be246222"}],"tox.ini":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"  # asserts are complied out. Disable optimization to allow asserts in"},{"line_number":38,"context_line":"  # nova to fire in unit and functional tests. This can be useful for"},{"line_number":39,"context_line":"  # debugging issue with fixtures and mocks."},{"line_number":40,"context_line":"  PYTHONOPTIMIZE"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"[testenv:py3-eventlet]"},{"line_number":43,"context_line":"setenv \u003d"}],"source_content_type":"text/x-properties","patch_set":6,"id":"9cdb8757_fc91fc6d","line":40,"updated":"2026-07-02 20:19:50.000000000","message":"if this was a cycle or two agoa we might want to add \n\n`OS_WATCHER_DISABLE_EVENTLET_PATCHING`\n\nso that you can enable or deisable it in any of the envs\n\nwith that said threaded is not our default so im not sure we care about eventlet based functioal testsing.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  find . -type f -name \"*.py[c|o]\" -delete"},{"line_number":48,"context_line":"  stestr --test-path\u003d./watcher/tests/unit run {posargs}"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"[testenv:{unit,py3,py310,py311,py312,py313,py314}]"},{"line_number":51,"context_line":"commands \u003d"},{"line_number":52,"context_line":"  rm -f .testrepository/times.dbm"},{"line_number":53,"context_line":"  find . -type f -name \"*.py[c|o]\" -delete"}],"source_content_type":"text/x-properties","patch_set":6,"id":"34cd0148_487b66d6","line":50,"range":{"start_line":50,"start_character":18,"end_line":50,"end_character":24},"updated":"2026-07-02 20:19:50.000000000","message":"we can actully drop 3.10 now but we can clean that up later.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":53,"context_line":"  find . -type f -name \"*.py[c|o]\" -delete"},{"line_number":54,"context_line":"  stestr --test-path\u003d./watcher/tests/unit run {posargs}"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"[testenv:functional{,-py310,-py311,-py312,-py313,-py314}]"},{"line_number":57,"context_line":"passenv \u003d"},{"line_number":58,"context_line":"  {[testenv]passenv}"},{"line_number":59,"context_line":"  WATCHER_FUNC_TEST_LOG_DIR"}],"source_content_type":"text/x-properties","patch_set":6,"id":"11e79ba7_e52fb1f5","line":56,"range":{"start_line":56,"start_character":9,"end_line":56,"end_character":19},"updated":"2026-07-02 20:19:50.000000000","message":"just as an aside when you use unit, funtional or py3 above this runs with your system default python\n\nif you happen to use tox via uvx\n\nyou can do `uvx --python 3.15 tox -e functional` and it will allow you to test with basiclly any version you want also that particlar exampel will likely fail","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"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":"b9c8aa400e8bb5136320905b5b9771e3637595d4","unresolved":false,"context_lines":[{"line_number":60,"context_line":"commands \u003d"},{"line_number":61,"context_line":"  rm -f .testrepository/times.dbm"},{"line_number":62,"context_line":"  find . -type f -name \"*.py[c|o]\" -delete"},{"line_number":63,"context_line":"  # --group-regex: all tests in the same gabbit makes tests faster"},{"line_number":64,"context_line":"  stestr --test-path\u003d./watcher/tests/functional --group-regex\u003d\u0027watcher\\.tests\\.functional\\.test_gabbi\\.[^_]+\u0027 run {posargs}"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"[testenv:pep8]"}],"source_content_type":"text/x-properties","patch_set":9,"id":"dada9383_56175c41","line":63,"updated":"2026-07-31 10:22:09.000000000","message":"The inline comment above the stestr command in the functional tox environment misspells the test framework name: \"all tests in the same gabbit makes tests faster\" should read \"gabbi\".\n\n**Severity**: SUGGESTION | **Confidence**: 1.0\n\n**Benefit**: Minor: misspells the test framework name in a developer-facing comment. Could confuse contributors reading the tox configuration.\n\n**Recommendation**:\nChange \"gabbit\" to \"gabbi\" in the tox.ini comment.","commit_id":"120fe80a1fef68c087e83e8f5f081c93be246222"}],"watcher/tests/functional/__init__.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f16646a287d740fa15fbb3efeaae0091e14cf1b7","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from watcher.common import oslo_service_helper"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"oslo_service_helper.init_oslo_service_backend()"}],"source_content_type":"text/x-python","patch_set":5,"id":"4187dd83_d494716b","line":16,"range":{"start_line":14,"start_character":0,"end_line":16,"end_character":47},"updated":"2026-06-25 18:34:25.000000000","message":"you are not monkey patching here, which is correct since it is deprecated and we don\u0027t need to support it here for the new testing framework","commit_id":"9a79329c8babdaf2d71653a23645ff431721a898"}],"watcher/tests/functional/base.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0d914c617de95534b9ee5a5ef711c4daa003a6d7","unresolved":true,"context_lines":[{"line_number":166,"context_line":"        self.addCleanup(watcher_service.Singleton._instances.clear)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"class WarningsFixture(fixtures.Fixture):"},{"line_number":170,"context_line":"    \"\"\"Filter or escalate warnings during test runs."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    Escalates certain warnings to errors so tests fail loudly"}],"source_content_type":"text/x-python","patch_set":4,"id":"699d4e03_66ad2449","line":169,"range":{"start_line":169,"start_character":6,"end_line":169,"end_character":21},"updated":"2026-06-22 19:17:47.000000000","message":"is this needed? not sure but ok","commit_id":"21b17d286ddbb86697d734cb7d4320831713ff45"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f0268e0cdadb8411d7de0c33a273575e31ca575b","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        self.addCleanup(watcher_service.Singleton._instances.clear)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"class WarningsFixture(fixtures.Fixture):"},{"line_number":170,"context_line":"    \"\"\"Filter or escalate warnings during test runs."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    Escalates certain warnings to errors so tests fail loudly"}],"source_content_type":"text/x-python","patch_set":4,"id":"894cda9d_39b1464d","line":169,"range":{"start_line":169,"start_character":6,"end_line":169,"end_character":21},"in_reply_to":"126afa31_eeabd24a","updated":"2026-08-12 13:34:21.000000000","message":"Acknowledged","commit_id":"21b17d286ddbb86697d734cb7d4320831713ff45"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"e205a22f252506bdb25bd1501577bfcaa8d58d88","unresolved":true,"context_lines":[{"line_number":166,"context_line":"        self.addCleanup(watcher_service.Singleton._instances.clear)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"class WarningsFixture(fixtures.Fixture):"},{"line_number":170,"context_line":"    \"\"\"Filter or escalate warnings during test runs."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    Escalates certain warnings to errors so tests fail loudly"}],"source_content_type":"text/x-python","patch_set":4,"id":"126afa31_eeabd24a","line":169,"range":{"start_line":169,"start_character":6,"end_line":169,"end_character":21},"in_reply_to":"699d4e03_66ad2449","updated":"2026-06-23 11:22:33.000000000","message":"Was done following similar approach as nova https://github.com/openstack/nova/blob/3880295b520794a4e173a9bfce7815036746f187/nova/tests/fixtures/nova.py#L808 . Useful to act on some warnings weather to ignore some warnings or to make sure some warnings are uncovered.","commit_id":"21b17d286ddbb86697d734cb7d4320831713ff45"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f16646a287d740fa15fbb3efeaae0091e14cf1b7","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        # 7. Disable all collectors — functional tests don\u0027t need real"},{"line_number":126,"context_line":"        #    OpenStack services. Provide a fake empty model so strategies"},{"line_number":127,"context_line":"        #    that check self.compute_model in pre_execute() don\u0027t fail."},{"line_number":128,"context_line":"        #    These fake model will be remove once we have nova fixtures"},{"line_number":129,"context_line":"        #    in place."},{"line_number":130,"context_line":"        CONF.set_override(\u0027collector_plugins\u0027, [], group\u003d\u0027collector\u0027)"},{"line_number":131,"context_line":"        fake_model \u003d model_root.ModelRoot(stale\u003dFalse)"},{"line_number":132,"context_line":"        fake_scope_handler \u003d mock.Mock()"}],"source_content_type":"text/x-python","patch_set":5,"id":"38366399_454282c6","line":129,"range":{"start_line":128,"start_character":0,"end_line":129,"end_character":22},"updated":"2026-06-25 18:34:25.000000000","message":"ack, that explain things, thanks!","commit_id":"9a79329c8babdaf2d71653a23645ff431721a898"},{"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":"d1ee3cdda9945754c3a4def80084fef288cfe323","unresolved":false,"context_lines":[{"line_number":49,"context_line":"CONF \u003d cfg.CONF"},{"line_number":50,"context_line":"try:"},{"line_number":51,"context_line":"    log.register_options(CONF)"},{"line_number":52,"context_line":"except cfg.ArgsAlreadyParsedError:"},{"line_number":53,"context_line":"    pass"},{"line_number":54,"context_line":"CONF.set_override(\u0027use_stderr\u0027, False)"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"26a3150e_0e606099","line":52,"updated":"2026-07-02 19:23:53.000000000","message":"The module-level try/except cfg.ArgsAlreadyParsedError: pass silently swallows the \u0027log options already registered\u0027 condition. This is a defensive guard for repeated import, but the bare pass gives no signal if registration fails for a different reason in future oslo_config versions.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: A brief comment clarifying the expected condition makes the intent obvious to future contributors and avoids masking unexpected registration failures.\n\n**Recommendation**:\nAdd a short inline comment noting that ArgsAlreadyParsedError means register_options already ran; keep the behavior otherwise. Low-priority readability note, not a correctness issue.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":54,"context_line":"CONF.set_override(\u0027use_stderr\u0027, False)"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class WatcherEnvironment(fixtures.Fixture):"},{"line_number":58,"context_line":"    \"\"\"Shared Watcher test environment."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    Sets up messaging, configuration, policy, database, OVO classes,"}],"source_content_type":"text/x-python","patch_set":6,"id":"f8e0d169_6160f975","line":57,"range":{"start_line":57,"start_character":0,"end_line":57,"end_character":43},"updated":"2026-07-02 20:19:50.000000000","message":"while this shoudl work it much more convetional to have this not be a fixture but isntead inherit form our base testclass and jsut extend its setUp fucntion","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        super().setUp()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        # 0. Logging, output capture, and warnings"},{"line_number":80,"context_line":"        self.stdlog \u003d self.useFixture(watcher_fixtures.StandardLogging())"},{"line_number":81,"context_line":"        self.useFixture(output.CaptureOutput())"},{"line_number":82,"context_line":"        self.useFixture(logging_error.get_logging_handle_error_fixture())"},{"line_number":83,"context_line":"        self.useFixture(WarningsFixture())"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        log_dir \u003d os.environ.get(\u0027WATCHER_FUNC_TEST_LOG_DIR\u0027)"},{"line_number":86,"context_line":"        if log_dir and self.log_name:"}],"source_content_type":"text/x-python","patch_set":6,"id":"c844d431_7de862d9","line":83,"range":{"start_line":80,"start_character":7,"end_line":83,"end_character":42},"updated":"2026-07-02 20:19:50.000000000","message":"we might need to refien thie later\n\nthis is inspired by how placement configrue its logging but it took a little be if tuning to originally get this so that OS_DEBUG works properly\n\ni think this orderign will work but this can be a little tricky","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2b744a4a07129b0faad11334e98f7e571547531e","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        super().setUp()"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        # 0. Logging, output capture, and warnings"},{"line_number":80,"context_line":"        self.stdlog \u003d self.useFixture(watcher_fixtures.StandardLogging())"},{"line_number":81,"context_line":"        self.useFixture(output.CaptureOutput())"},{"line_number":82,"context_line":"        self.useFixture(logging_error.get_logging_handle_error_fixture())"},{"line_number":83,"context_line":"        self.useFixture(WarningsFixture())"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        log_dir \u003d os.environ.get(\u0027WATCHER_FUNC_TEST_LOG_DIR\u0027)"},{"line_number":86,"context_line":"        if log_dir and self.log_name:"}],"source_content_type":"text/x-python","patch_set":6,"id":"a2327209_260571b2","line":83,"range":{"start_line":80,"start_character":7,"end_line":83,"end_character":42},"in_reply_to":"c844d431_7de862d9","updated":"2026-07-03 15:15:19.000000000","message":"I\u0027d say it works based on my local tests, bu good to get more eyes on it.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"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":"d1ee3cdda9945754c3a4def80084fef288cfe323","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.useFixture(policy_fixture.PolicyFixture())"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # 4. Database"},{"line_number":113,"context_line":"        CONF.set_override(\u0027enable_authentication\u0027, False)"},{"line_number":114,"context_line":"        self._db \u003d self.useFixture(db_fixture.WatcherDatabase())"},{"line_number":115,"context_line":"        self.dbapi \u003d self._db.dbapi"},{"line_number":116,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"c5e8156a_17b671b1","line":113,"updated":"2026-07-02 19:23:53.000000000","message":"CONF.set_override(\u0027enable_authentication\u0027, False) is called without a matching addCleanup in WatcherEnvironment.setUp; cleanup relies entirely on the ConfReloadFixture (a Config fixture) tearing down all overrides at once. The APIFixture does pair this override with an explicit addCleanup, but the base environment does not, so the two are inconsistent.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If a future change removes or reorders the ConfReloadFixture, or if this override is relied upon in a context that does not use the Config fixture, the enable_authentication override would leak across tests. Currently safe only because the Config fixture clears all overrides on cleanup.\n\n**Suggestion**:\nAdd a corresponding self.addCleanup(CONF.clear_override, \u0027enable_authentication\u0027) here to match the pattern already used in local_fixtures/api.py:47, making the override lifecycle explicit and robust against fixture reordering.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":127,"context_line":"        #    that check self.compute_model in pre_execute() don\u0027t fail."},{"line_number":128,"context_line":"        #    These fake model will be remove once we have nova fixtures"},{"line_number":129,"context_line":"        #    in place."},{"line_number":130,"context_line":"        CONF.set_override(\u0027collector_plugins\u0027, [], group\u003d\u0027collector\u0027)"},{"line_number":131,"context_line":"        fake_model \u003d model_root.ModelRoot(stale\u003dFalse)"},{"line_number":132,"context_line":"        fake_scope_handler \u003d mock.Mock()"},{"line_number":133,"context_line":"        fake_scope_handler.get_scoped_model.return_value \u003d fake_model"}],"source_content_type":"text/x-python","patch_set":6,"id":"dd443019_1393034b","line":130,"range":{"start_line":130,"start_character":7,"end_line":130,"end_character":69},"updated":"2026-07-02 20:19:50.000000000","message":"you coudl put this in the config fixture sicne unit test don need this either.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"f0268e0cdadb8411d7de0c33a273575e31ca575b","unresolved":true,"context_lines":[{"line_number":127,"context_line":"        #    that check self.compute_model in pre_execute() don\u0027t fail."},{"line_number":128,"context_line":"        #    These fake model will be remove once we have nova fixtures"},{"line_number":129,"context_line":"        #    in place."},{"line_number":130,"context_line":"        CONF.set_override(\u0027collector_plugins\u0027, [], group\u003d\u0027collector\u0027)"},{"line_number":131,"context_line":"        fake_model \u003d model_root.ModelRoot(stale\u003dFalse)"},{"line_number":132,"context_line":"        fake_scope_handler \u003d mock.Mock()"},{"line_number":133,"context_line":"        fake_scope_handler.get_scoped_model.return_value \u003d fake_model"}],"source_content_type":"text/x-python","patch_set":6,"id":"8c5a8877_f4c95a65","line":130,"range":{"start_line":130,"start_character":7,"end_line":130,"end_character":69},"in_reply_to":"bb175423_809cfa7a","updated":"2026-08-12 13:34:21.000000000","message":"so this is temporary until we get https://review.opendev.org/c/openstack/watcher/+/993352/15/watcher/tests/functional/base.py","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"75b235fb577be89b42cebe35f2e6c39ba635b585","unresolved":true,"context_lines":[{"line_number":127,"context_line":"        #    that check self.compute_model in pre_execute() don\u0027t fail."},{"line_number":128,"context_line":"        #    These fake model will be remove once we have nova fixtures"},{"line_number":129,"context_line":"        #    in place."},{"line_number":130,"context_line":"        CONF.set_override(\u0027collector_plugins\u0027, [], group\u003d\u0027collector\u0027)"},{"line_number":131,"context_line":"        fake_model \u003d model_root.ModelRoot(stale\u003dFalse)"},{"line_number":132,"context_line":"        fake_scope_handler \u003d mock.Mock()"},{"line_number":133,"context_line":"        fake_scope_handler.get_scoped_model.return_value \u003d fake_model"}],"source_content_type":"text/x-python","patch_set":6,"id":"bb175423_809cfa7a","line":130,"range":{"start_line":130,"start_character":7,"end_line":130,"end_character":69},"in_reply_to":"dd443019_1393034b","updated":"2026-07-30 15:55:04.000000000","message":"I\u0027m overriding this in the next patch, actually.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":129,"context_line":"        #    in place."},{"line_number":130,"context_line":"        CONF.set_override(\u0027collector_plugins\u0027, [], group\u003d\u0027collector\u0027)"},{"line_number":131,"context_line":"        fake_model \u003d model_root.ModelRoot(stale\u003dFalse)"},{"line_number":132,"context_line":"        fake_scope_handler \u003d mock.Mock()"},{"line_number":133,"context_line":"        fake_scope_handler.get_scoped_model.return_value \u003d fake_model"},{"line_number":134,"context_line":"        fake_collector \u003d mock.Mock()"},{"line_number":135,"context_line":"        fake_collector.get_latest_cluster_data_model.return_value \u003d fake_model"},{"line_number":136,"context_line":"        fake_collector.get_audit_scope_handler.return_value \u003d ("},{"line_number":137,"context_line":"            fake_scope_handler"}],"source_content_type":"text/x-python","patch_set":6,"id":"c01706db_28d1744f","line":134,"range":{"start_line":132,"start_character":6,"end_line":134,"end_character":36},"updated":"2026-07-02 20:19:50.000000000","message":"in general you shoudl avodi using mock.Mock() like this \n\nif you need to create a fake colelctor you shoudl at a minim use autospec to have it match the implation but it woudl be better to actully use a real collector type\n\neven if its a new fake collector.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2b744a4a07129b0faad11334e98f7e571547531e","unresolved":true,"context_lines":[{"line_number":129,"context_line":"        #    in place."},{"line_number":130,"context_line":"        CONF.set_override(\u0027collector_plugins\u0027, [], group\u003d\u0027collector\u0027)"},{"line_number":131,"context_line":"        fake_model \u003d model_root.ModelRoot(stale\u003dFalse)"},{"line_number":132,"context_line":"        fake_scope_handler \u003d mock.Mock()"},{"line_number":133,"context_line":"        fake_scope_handler.get_scoped_model.return_value \u003d fake_model"},{"line_number":134,"context_line":"        fake_collector \u003d mock.Mock()"},{"line_number":135,"context_line":"        fake_collector.get_latest_cluster_data_model.return_value \u003d fake_model"},{"line_number":136,"context_line":"        fake_collector.get_audit_scope_handler.return_value \u003d ("},{"line_number":137,"context_line":"            fake_scope_handler"}],"source_content_type":"text/x-python","patch_set":6,"id":"de596e99_0733b057","line":134,"range":{"start_line":132,"start_character":6,"end_line":134,"end_character":36},"in_reply_to":"c01706db_28d1744f","updated":"2026-07-03 15:15:19.000000000","message":"All this and the previous override of collector_plugins config is removed in the patch on top of this.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":143,"context_line":"                return_value\u003dfake_collector,"},{"line_number":144,"context_line":"            )"},{"line_number":145,"context_line":"        )"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        # 8. Make RPC casts synchronous for deterministic tests"},{"line_number":148,"context_line":"        self.useFixture(CastAsCallFixture())"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        # 9. Mock Keystone client"},{"line_number":151,"context_line":"        self.useFixture(watcher_fixtures.KeystoneClient())"}],"source_content_type":"text/x-python","patch_set":6,"id":"b4efec76_1b00a20a","line":148,"range":{"start_line":146,"start_character":1,"end_line":148,"end_character":44},"updated":"2026-07-02 20:19:50.000000000","message":"so this shoudl be conifgurabel.\n\nits fien to enabel it by default but we do actully need to test async bevhior sometiem to reproduce some bugs so we need to be able to disabel this via setting \n\n`CAST_AS_CALL\u003dFalse`\n\nas a clase atirbute in the future.\n\n\n\n\n```suggestion\n\n        # 8. Make RPC casts synchronous for deterministic tests\n        if self.CAST_AS_CALL:\n            self.useFixture(CastAsCallFixture())\n```","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2b744a4a07129b0faad11334e98f7e571547531e","unresolved":true,"context_lines":[{"line_number":143,"context_line":"                return_value\u003dfake_collector,"},{"line_number":144,"context_line":"            )"},{"line_number":145,"context_line":"        )"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        # 8. Make RPC casts synchronous for deterministic tests"},{"line_number":148,"context_line":"        self.useFixture(CastAsCallFixture())"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        # 9. Mock Keystone client"},{"line_number":151,"context_line":"        self.useFixture(watcher_fixtures.KeystoneClient())"}],"source_content_type":"text/x-python","patch_set":6,"id":"020db455_029ce038","line":148,"range":{"start_line":146,"start_character":1,"end_line":148,"end_character":44},"in_reply_to":"b4efec76_1b00a20a","updated":"2026-07-03 15:15:19.000000000","message":"I\u0027ll do it.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":207,"context_line":"        warnings.filters[:] \u003d self._original_filters"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"class WatcherFunctionalTestCase("},{"line_number":211,"context_line":"    testscenarios.WithScenarios, base.BaseTestCase"},{"line_number":212,"context_line":"):"},{"line_number":213,"context_line":"    \"\"\"Base class for Watcher functional tests."},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    Provides a fully wired test environment with:"}],"source_content_type":"text/x-python","patch_set":6,"id":"e168093f_707e35a4","line":212,"range":{"start_line":210,"start_character":0,"end_line":212,"end_character":2},"updated":"2026-07-02 20:19:50.000000000","message":"we shoudl have a common based test class for all watcher tests (unit and functional)\n\nand have this extended that. and anything that is comme to all tests shoudl go there","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":228,"context_line":"    START_APPLIER \u003d True"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def setUp(self):"},{"line_number":231,"context_line":"        with fixtures.EnvironmentVariable(\u0027OS_LOG_CAPTURE\u0027, \u00270\u0027):"},{"line_number":232,"context_line":"            super().setUp()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        self.env \u003d self.useFixture("},{"line_number":235,"context_line":"            WatcherEnvironment("}],"source_content_type":"text/x-python","patch_set":6,"id":"9b2503d7_9f22a012","line":232,"range":{"start_line":231,"start_character":1,"end_line":232,"end_character":27},"updated":"2026-07-02 20:19:50.000000000","message":"like this https://github.com/openstack/watcher/blob/master/watcher/tests/unit/base.py#L55\n\ni would move the BaseTestCase to watcher/tests/base.py and move all the log capature fixrue setup there.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2b744a4a07129b0faad11334e98f7e571547531e","unresolved":true,"context_lines":[{"line_number":228,"context_line":"    START_APPLIER \u003d True"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def setUp(self):"},{"line_number":231,"context_line":"        with fixtures.EnvironmentVariable(\u0027OS_LOG_CAPTURE\u0027, \u00270\u0027):"},{"line_number":232,"context_line":"            super().setUp()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        self.env \u003d self.useFixture("},{"line_number":235,"context_line":"            WatcherEnvironment("}],"source_content_type":"text/x-python","patch_set":6,"id":"cc701ee0_f2ec2aaf","line":232,"range":{"start_line":231,"start_character":1,"end_line":232,"end_character":27},"in_reply_to":"9b2503d7_9f22a012","updated":"2026-07-03 15:15:19.000000000","message":"That make sense and we can share some stuff between functional and unit, but for the particular case of the log capture, i have doubts given the special log handling i\u0027m doing for the log file (although i may do it on top of the basic common implementation, i will check).","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"4a1524fd_59420424","line":261,"range":{"start_line":255,"start_character":2,"end_line":261,"end_character":1},"updated":"2026-07-02 20:19:50.000000000","message":"this shoudl be on BaseTestCase","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2b744a4a07129b0faad11334e98f7e571547531e","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f030a967_1abca9c4","line":261,"range":{"start_line":255,"start_character":2,"end_line":261,"end_character":1},"in_reply_to":"4a1524fd_59420424","updated":"2026-07-03 15:15:19.000000000","message":"make sense","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"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":"d43744d30f5485fa42c529fe9dac53c3cf6d87fc","unresolved":false,"context_lines":[{"line_number":166,"context_line":"            self.applier_fixture \u003d self.useFixture("},{"line_number":167,"context_line":"                ServiceFixture(\u0027watcher-applier\u0027)"},{"line_number":168,"context_line":"            )"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        # 11. Admin context for direct DB operations"},{"line_number":171,"context_line":"        self.context \u003d watcher_context.make_context("},{"line_number":172,"context_line":"            user_id\u003dFAKE_USER_UUID, project_id\u003dFAKE_PROJECT_UUID, is_admin\u003dTrue"}],"source_content_type":"text/x-python","patch_set":8,"id":"31e71ff1_35ec318b","line":169,"updated":"2026-07-30 16:20:14.000000000","message":"In WarningsFixture.setUp(), the broad ignore filter for SADeprecationWarning is registered after the watcher-module-specific error filter. Because warnings.filterwarnings inserts at the front of the list (LIFO checking), the ignore filter is checked first and matches ALL SADeprecationWarnings reg...\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Watcher\u0027s own use of deprecated SQLAlchemy APIs will not be caught during functional tests, allowing deprecated patterns to accumulate undetected. The intent described in the comments (\u0027Escalate SQLAlchemy warnings from Watcher code to errors\u0027 followed by \u0027But ignore SA deprecation warnings from...\n\n**Suggestion**:\nSwap the order of the last two filterwarnings calls so the watcher-module-specific error filter is registered after (and thus checked before) the broad ignore filter. Place the ignore filter first, then the watcher-module-specific error filter last so it is checked first due to LIFO insertion order.","commit_id":"19964e566804914eb704a009a6261ffba3c44616"},{"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":"b9c8aa400e8bb5136320905b5b9771e3637595d4","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        # 7. Disable all collectors — functional tests don\u0027t need real"},{"line_number":126,"context_line":"        #    OpenStack services. Provide a fake empty model so strategies"},{"line_number":127,"context_line":"        #    that check self.compute_model in pre_execute() don\u0027t fail."},{"line_number":128,"context_line":"        #    These fake model will be remove once we have nova fixtures"},{"line_number":129,"context_line":"        #    in place."},{"line_number":130,"context_line":"        CONF.set_override(\u0027collector_plugins\u0027, [], group\u003d\u0027collector\u0027)"},{"line_number":131,"context_line":"        fake_model \u003d model_root.ModelRoot(stale\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":9,"id":"a19531d8_b4a8d870","line":128,"updated":"2026-07-31 10:22:09.000000000","message":"In base.py step 7 of WatcherEnvironment.setUp, the comment has grammatical errors: \"These fake model will be remove once we have nova fixtures in place.\" should read \"This fake model will be removed once we have nova fixtures in place.\"\n\n**Severity**: SUGGESTION | **Confidence**: 0.9\n\n**Benefit**: Minor: grammatical errors in a developer-facing comment. Does not affect code behavior.\n\n**Recommendation**:\nRewrite to: \"This fake model will be removed once we have nova fixtures in place.\"","commit_id":"120fe80a1fef68c087e83e8f5f081c93be246222"},{"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":"9986a71bb61227a4b37d72cce7069e08c511a4c1","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        warnings.simplefilter(\u0027once\u0027, DeprecationWarning)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        # Escalate SQLAlchemy warnings from Watcher code to errors"},{"line_number":196,"context_line":"        warnings.filterwarnings(\u0027error\u0027, category\u003dsqla_exc.SAWarning)"},{"line_number":197,"context_line":"        warnings.filterwarnings("},{"line_number":198,"context_line":"            \u0027error\u0027, module\u003d\u0027watcher\u0027, category\u003dsqla_exc.SADeprecationWarning"},{"line_number":199,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":11,"id":"aff00f4c_22692c98","line":196,"updated":"2026-07-31 11:27:41.000000000","message":"The blanket `ignore` filter for SADeprecationWarning is inserted last and therefore checked first by Python\u0027s warnings system, shadowing the watcher-module-specific `error` filter. All SADeprecationWarnings are silently ignored regardless of source, defeating the documented intent to escalate wat...\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: SQLAlchemy deprecation warnings from Watcher\u0027s own ORM code will not be caught during functional test runs. This reduces the suite\u0027s ability to detect and fix SA deprecations before they become hard breaking changes in future SQLAlchemy versions.\n\n**Recommendation**:\nReorder so the module-specific error filter is checked before the blanket ignore. For example, call filterwarnings(\u0027ignore\u0027, category\u003dSADeprecationWarning) first, then filterwarnings(\u0027error\u0027, module\u003d\u0027watcher\u0027, category\u003dSADeprecationWarning) so the watcher-specific filter ends up at the front of the filter list.","commit_id":"16ad250b7560bc3ef9b52881c9e91305bf575c71"}],"watcher/tests/functional/gabbits/audit-lifecycle-skip-action.yaml":[{"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":"b9c8aa400e8bb5136320905b5b9771e3637595d4","unresolved":false,"context_lines":[{"line_number":65,"context_line":"  # --- Microversion gate: PATCH on action must fail without 1.5 ---"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"  - name: skip action rejected without microversion"},{"line_number":68,"context_line":"    xfail: false"},{"line_number":69,"context_line":"    PATCH: /actions/$RESPONSE[\u0027$.actions[0].uuid\u0027]"},{"line_number":70,"context_line":"    request_headers:"},{"line_number":71,"context_line":"      openstack-api-version: infra-optim 1.0"}],"source_content_type":"text/x-yaml","patch_set":9,"id":"29752827_71254692","line":68,"updated":"2026-07-31 10:22:09.000000000","message":"In audit-lifecycle-skip-action.yaml, the test step \"skip action rejected without microversion\" sets `xfail: false`, which is the default behavior and therefore redundant. It appears to be a leftover from development when the test may have been expected to fail.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Minor: the redundant directive may confuse future contributors who see it and wonder if the test has special failure expectations. It has no functional effect on test execution.\n\n**Recommendation**:\nRemove the `xfail: false` line from the test step. If it was intentionally left as documentation, add a comment explaining why.","commit_id":"120fe80a1fef68c087e83e8f5f081c93be246222"}],"watcher/tests/functional/gabbits/audit-lifecycle.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":5,"context_line":"# action plan execution with all three services running in-process."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fixtures:"},{"line_number":8,"context_line":"  - WatcherGabbiFixture"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"defaults:"},{"line_number":11,"context_line":"  request_headers:"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"a6c87559_db3ad336","line":8,"updated":"2026-07-02 20:19:50.000000000","message":"ah this si why your makign it a fixture.\nnormally the gaibi test also inhered form a specific base testclass.","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"cd830f537f3bfdba969823532041941ee06d92ba","unresolved":true,"context_lines":[{"line_number":5,"context_line":"# action plan execution with all three services running in-process."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fixtures:"},{"line_number":8,"context_line":"  - WatcherGabbiFixture"},{"line_number":9,"context_line":""},{"line_number":10,"context_line":"defaults:"},{"line_number":11,"context_line":"  request_headers:"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"80d79149_2f91b065","line":8,"in_reply_to":"a6c87559_db3ad336","updated":"2026-08-03 10:45:20.000000000","message":"this seems to be following the same pattern used in placement https://github.com/openstack/placement/blob/0d503c6df70aa3049c29d4c2d8672703e068463e/placement/tests/functional/fixtures/gabbits.py#L66. I\u0027m looking at the gabbit docs https://gabbi.readthedocs.io/en/latest/loader.html and I\u0027m not sure how to make the gabbi test work via inheritance from a base testclass","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"}],"watcher/tests/local_fixtures/service.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3088f038fbb78dc081c5f2d2a56df3c47291186b","unresolved":true,"context_lines":[{"line_number":28,"context_line":"class ServiceFixture(fixtures.Fixture):"},{"line_number":29,"context_line":"    \"\"\"Run a Watcher service in-process as a test fixture."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    Starts the base Service class (not DecisionEngineService or"},{"line_number":32,"context_line":"    ApplierService) to avoid background schedulers, continuous audit"},{"line_number":33,"context_line":"    handlers, and service monitors that are not needed in Phase 1"},{"line_number":34,"context_line":"    functional tests."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    ServiceHeartbeat is mocked out because its __init__ calls"},{"line_number":37,"context_line":"    send_beat() which writes to the DB."}],"source_content_type":"text/x-python","patch_set":6,"id":"a9f39fed_80d1fdd4","line":34,"range":{"start_line":31,"start_character":0,"end_line":34,"end_character":21},"updated":"2026-07-02 20:19:50.000000000","message":"ok we wil likely want to have a subset of those later but this si fine for now","commit_id":"466757230b9807c1c14366a7b031f737fd74f2a0"}]}
