)]}'
{"id":"openstack%2Fwatcher-dashboard~978310","triplet_id":"openstack%2Fwatcher-dashboard~master~Ie893505bd472beb0262082c50dd7caaae89211ea","project":"openstack/watcher-dashboard","branch":"master","topic":"service-layer-refactor","attention_set":{"11604":{"account":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"last_update":"2026-04-30 20:58:11.000000000","reason":"A robot voted negatively on a label"},"26471":{"account":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"last_update":"2026-04-30 20:42:49.000000000","reason":"Vote got outdated and was removed: Code-Review+1"}},"removed_from_attention_set":{},"hashtags":[],"change_id":"Ie893505bd472beb0262082c50dd7caaae89211ea","subject":"feat: add service-layer functions to api/watcher.py","status":"NEW","created":"2026-02-28 12:22:05.000000000","updated":"2026-04-30 20:58:11.000000000","submit_type":"MERGE_IF_NECESSARY","mergeable":true,"submittable":false,"total_comment_count":7,"unresolved_comment_count":0,"has_review_started":true,"meta_rev_id":"85e7d4e4726a2942d4f2df4535b0f1231ec6e0ed","_number":978310,"virtual_id_number":978310,"owner":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"actions":{},"labels":{"Verified":{"disliked":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"all":[{"tag":"autogenerated:zuul:check","value":-1,"date":"2026-04-30 20:58:11.000000000","permitted_voting_range":{"min":-2,"max":2},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"}],"values":{"-2":"Fails","-1":"Doesn\u0027t seem to work"," 0":"No score","+1":"Works for me","+2":"Verified"},"description":"","value":-1,"default_value":0,"optional":true},"Code-Review":{"all":[{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"value":0,"permitted_voting_range":{"min":-1,"max":1},"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"}],"values":{"-2":"Do not merge","-1":"This patch needs further work before it can be merged"," 0":"No score","+1":"Looks good to me, but someone else must approve","+2":"Looks good to me (core reviewer)"},"description":"","default_value":0,"optional":true},"Workflow":{"all":[{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"}],"values":{"-1":"Work in progress"," 0":"Ready for reviews","+1":"Approved"},"description":"","default_value":0,"optional":true}},"removable_reviewers":[],"reviewers":{"CC":[{"_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"}],"REVIEWER":[{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"}]},"pending_reviewers":{},"reviewer_updates":[{"updated":"2026-02-28 12:24:44.000000000","updated_by":{"_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"},"reviewer":{"_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"},"state":"CC"},{"updated":"2026-02-28 12:36:47.000000000","updated_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"reviewer":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"state":"REVIEWER"},{"updated":"2026-02-28 15:31:56.000000000","updated_by":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"reviewer":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"state":"REVIEWER"}],"messages":[{"id":"9d467e8c7fa507ec6c4d91a20ddd6391ccb095a5","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-02-28 12:22:05.000000000","message":"Uploaded patch set 1.","accounts_in_message":[],"_revision_number":1},{"id":"ed43987d97f97200939f0029dfb975601cabe2e0","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-02-28 12:24:44.000000000","message":"Patch Set 1:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":1},{"id":"62220fc313715f3116c4f7538ffb8967318671bc","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-02-28 12:35:58.000000000","message":"Patch Set 1:\n\n(3 comments)\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/50f3ce190b084af58f6e231bdccf0176\n\n- teim-code-review https://zuul.teim.app/t/main/build/860a0beb842b4edaa348a4f390866385 : SUCCESS in 11m 02s","accounts_in_message":[],"_revision_number":1},{"id":"d9cb58937710df59b4c7e45e7fe6dd015047d377","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-02-28 12:36:47.000000000","message":"Patch Set 1: Verified+1\n\nBuild succeeded (check pipeline).\nhttps://zuul.opendev.org/t/openstack/buildset/458296f4434940dca1645f4d51a8124b\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/2ff2fade52ca43ac8269ec778fd2f3c8 : SUCCESS in 5m 36s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/33e695f2928f494aa40d3cd319b1d887 : SUCCESS in 2m 37s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/0e102c7a2c5b44938e3058d1fed980fe : SUCCESS in 4m 43s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/862460f5d161498d8eb76ba541bd8e99 : SUCCESS in 5m 09s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/6f3d3e67bbed4233b62425eb26e6ede7 : SUCCESS in 4m 52s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/640c48c7957e4f6ab2ae502e5d45d4e9 : FAILURE in 8m 06s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/e4e502138ee5451ea4ed7faddd6b164a : SUCCESS in 2m 26s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/0b3cbbbc87c9484ba128995fa97a69ce : SUCCESS in 7m 41s","accounts_in_message":[],"_revision_number":1},{"id":"ad3bc0f2acdada1cbbb20abd251121f767381b05","author":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"date":"2026-02-28 15:31:56.000000000","message":"Patch Set 1: Code-Review+1\n\nBuild succeeded (check pipeline).\nhttps://softwarefactory-project.io/zuul/t/rdoproject.org/buildset/e93bc205a3fe4489bb83ddc652ae74d7\n\n- openstack-meta-content-provider-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/30d80e748b19420b8cf615693e3c4299 : SUCCESS in 3h 08m 06s\n- watcher-operator-validation-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/4c92e3ca1cba46e5908ae72ed0db3a13 : SUCCESS in 2h 14m 30s","accounts_in_message":[],"_revision_number":1},{"id":"f9fecd01332607ee9deb5a46f720987d52c407ad","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-03-30 15:53:53.000000000","message":"Uploaded patch set 2.\n\nOutdated Votes:\n* Code-Review+1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified+1\n","accounts_in_message":[],"_revision_number":2},{"id":"db3c7f95fa50138608024439dbda20503e0a293d","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-03-30 15:54:44.000000000","message":"Patch Set 2:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":2},{"id":"b5cc217e82b43a6362f7766852d1f004ce21d94b","author":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"date":"2026-03-30 16:03:02.000000000","message":"Patch Set 2: Code-Review-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttp://docs.openstack.org/infra/manual/developers.html#automated-testing\n\nhttps://softwarefactory-project.io/zuul/t/rdoproject.org/buildset/269675203b8547c28f919aeb5f3a2c96\n\n- openstack-meta-content-provider-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/8990647c25f44af2ada9ba9fd2e4b79a : FAILURE in 7m 50s\n- watcher-operator-validation-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/012526d2be354528a88af8df63724cb3 : SKIPPED Skipped due to failed job openstack-meta-content-provider-master","accounts_in_message":[],"_revision_number":2},{"id":"5e6d18d6bfcf75b0df531df6859fe4fda5c1c044","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-03-30 16:09:06.000000000","message":"Patch Set 2: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/bfc72810f0b646d78237f281d68a82aa\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/8eaa0c7a2aca44558a6b712d09ba8642 : SUCCESS in 5m 14s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/9e61544f04fe4dde98005e9fe0101f96 : SUCCESS in 4m 29s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/0f46a49541ab4aa6a1c6426582703311 : SUCCESS in 3m 50s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/b6a66eb39a6e4d39a8b0b734a9f0195b : SUCCESS in 2m 26s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/db9a3c680736423f8eaca654ec6ef0d6 : SUCCESS in 6m 07s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/09f1261ba80e491e85295736e4cae2f7 : FAILURE in 6m 06s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/913b938e40944731a6a9229526ead96b : SUCCESS in 2m 45s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/c64c8c7832174a5f99639f31441607fa : FAILURE in 6m 35s","accounts_in_message":[],"_revision_number":2},{"id":"d1f737c81332694ec45b3a54df2fee8438483dde","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-03-30 16:27:56.000000000","message":"Patch Set 2:\n\n(2 comments)\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/a171b330dd074c0d9f36e1180cdbe56c\n\n- teim-code-review https://zuul.teim.app/t/main/build/fe8568d16df444f8a21888cb701bb867 : SUCCESS in 9m 10s","accounts_in_message":[],"_revision_number":2},{"id":"d646c0d0a0f4f03bcdada42d4d9198626107c9de","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-04-04 00:52:13.000000000","message":"Uploaded patch set 3.\n\nOutdated Votes:\n* Code-Review-1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified-1\n","accounts_in_message":[],"_revision_number":3},{"id":"da89d7d893361239555009542723da2fcc9c7447","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-04-04 00:54:32.000000000","message":"Patch Set 3:\n\nStarting automatic-ci jobs.","accounts_in_message":[],"_revision_number":3},{"id":"922a95d7083ef8ccfdbaa6f695dee9f5b9d4f830","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-04-04 01:13:10.000000000","message":"Patch Set 3: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/0bc3c70ab6f24aa5bf0fe82b9f44ad42\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/9f0aba629a6c4f789958a16c3a020076 : SUCCESS in 4m 19s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/6b69b9ef64504f12aea08f21c19d4bc6 : SUCCESS in 4m 23s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/9af6c287ab3b46d0b7c6d938ec9e0064 : SUCCESS in 4m 36s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/51ed62a6fa4b4fdf99488b197f8e29ad : FAILURE in 4m 34s\n- openstack-tox-py310 https://zuul.opendev.org/t/openstack/build/5bf234e0c1624fd7856a7dfae545d631 : SUCCESS in 4m 22s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/f276006b37484e3f923e17136a2757f6 : FAILURE in 6m 01s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/e4ebc9d284ff45a1be12d120a0d7d597 : SUCCESS in 4m 49s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/394c6dcfd0664b2d8b898914f7922d42 : SUCCESS in 3m 52s","accounts_in_message":[],"_revision_number":3},{"id":"003fb7b22af3fcbd857ea354c72bd3364748ba70","tag":"autogenerated:zuul:automatic-ci","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"},"date":"2026-04-04 02:30:24.000000000","message":"Patch Set 3:\n\n(2 comments)\n\nBuild succeeded (automatic-ci pipeline).\nhttps://zuul.teim.app/t/main/buildset/17178e63bf9d43ccadcf0ed08fd2a6a4\n\n- teim-code-review https://zuul.teim.app/t/main/build/0bd525ef119f4008bf06629f536e0780 : SUCCESS in 8m 33s","accounts_in_message":[],"_revision_number":3},{"id":"980650480aeae69817486365d7017abdc68e553a","author":{"_account_id":26471,"name":"Software Factory CI","email":"softwarefactory-operations-team@redhat.com","username":"sf-project-io"},"date":"2026-04-04 03:49:50.000000000","message":"Patch Set 3: Code-Review+1\n\nBuild succeeded (check pipeline).\nhttps://softwarefactory-project.io/zuul/t/rdoproject.org/buildset/b9f8cb8f1b294278a07a5b505aec395a\n\n- openstack-meta-content-provider-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/06b9ed60e9004656aaf31876b44d4ecb : SUCCESS in 2h 54m 56s\n- watcher-operator-validation-master https://softwarefactory-project.io/zuul/t/rdoproject.org/build/30e1bd8ce4c94ce19ef8e8ad628ff4c7 : SUCCESS in 2h 09m 53s","accounts_in_message":[],"_revision_number":3},{"id":"60a286f68e0eb6711683ddaa3e25f2bc824b12a7","tag":"autogenerated:gerrit:newPatchSet","author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"date":"2026-04-30 20:42:49.000000000","message":"Uploaded patch set 4.\n\nOutdated Votes:\n* Code-Review+1 (copy condition: \"changekind:TRIVIAL_REBASE OR is:MIN\")\n* Verified-1 (copy condition: \"NEVER\")\n","accounts_in_message":[],"_revision_number":4},{"id":"85e7d4e4726a2942d4f2df4535b0f1231ec6e0ed","tag":"autogenerated:zuul:check","author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"date":"2026-04-30 20:58:11.000000000","message":"Patch Set 4: Verified-1\n\nBuild failed (check pipeline).  For information on how to proceed, see\nhttps://docs.opendev.org/opendev/infra-manual/latest/developers.html#automated-testing\nand https://docs.openstack.org/project-team-guide/testing.html#how-to-handle-test-failures\n\nhttps://zuul.opendev.org/t/openstack/buildset/e763f120ead145bf80e8c3c2c2363f72\n\n- openstack-tox-py313 https://zuul.opendev.org/t/openstack/build/b5ec2021b317498481bddaf7f57634e7 : SUCCESS in 2m 43s\n- horizon-tox-python3-django42 https://zuul.opendev.org/t/openstack/build/1e1904dafe454d13b37233445abdf359 : SUCCESS in 3m 50s\n- horizon-tox-python3-django52 https://zuul.opendev.org/t/openstack/build/24d62d8a5c17425f94f84a0f0a3c06fc : SUCCESS in 4m 10s (non-voting)\n- openstack-tox-pep8 https://zuul.opendev.org/t/openstack/build/6aee185d148d42f29aeb7ba756857ee3 : FAILURE in 3m 55s\n- openstack-tox-py311 https://zuul.opendev.org/t/openstack/build/bf099a1a439146468c98ad6c3955836f : SUCCESS in 2m 32s\n- openstack-tox-py314 https://zuul.opendev.org/t/openstack/build/a2a76b4d243549d5951aa97132442499 : FAILURE in 4m 21s (non-voting)\n- openstack-tox-cover https://zuul.opendev.org/t/openstack/build/485cc395e54b4d01bd76f629ccd67192 : SUCCESS in 4m 57s\n- openstack-tox-docs https://zuul.opendev.org/t/openstack/build/04ddd6dde0f044a5af0507c67cff9a08 : SUCCESS in 8m 30s","accounts_in_message":[],"_revision_number":4}],"current_revision_number":4,"current_revision":"e5465105e4559efb415792d1488fa9fa2877f5f1","revisions":{"3219a2b7349bbcd79601d97f79c06595541bdeae":{"kind":"REWORK","_number":1,"created":"2026-02-28 12:22:05.000000000","uploader":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"ref":"refs/changes/10/978310/1","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/10/978310/1","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/1 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/1 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/1 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/1"}}},"commit":{"parents":[{"commit":"c0b5ccb2483467a5adb8a785572bf023597124c5","subject":"test: improve coverage to 100% on api, client, errors, exceptions","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/c0b5ccb2483467a5adb8a785572bf023597124c5"}]}],"author":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-02-28 12:03:43.000000000","tz":0},"committer":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-02-28 12:21:00.000000000","tz":0},"subject":"feat(B): add service-layer functions to api/watcher.py","message":"feat(B): add service-layer functions to api/watcher.py\n\nIntroduce module-level service functions that wrap every class method on the\nWatcher API wrapper classes (Audit, AuditTemplate, ActionPlan, Action, Goal,\nStrategy, EfficacyIndicator). Each function delegates to the corresponding\nclass method so callers no longer need to import and reference the classes\ndirectly.\n\nAdd comprehensive unit tests for all new service functions.\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id: Ie893505bd472beb0262082c50dd7caaae89211ea\nSigned-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/3219a2b7349bbcd79601d97f79c06595541bdeae"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/3219a2b7349bbcd79601d97f79c06595541bdeae"}]},"branch":"refs/heads/master"},"3e7884df69fbe726e0a3598f477ff15753fa382b":{"kind":"REWORK","_number":2,"created":"2026-03-30 15:53:53.000000000","uploader":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"ref":"refs/changes/10/978310/2","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/10/978310/2","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/2 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/2 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/2 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/2"}}},"commit":{"parents":[{"commit":"99c2242ccda249964a3fe56346a20473ddb84e49","subject":"test: improve coverage to 100% on api, client, errors, exceptions","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/99c2242ccda249964a3fe56346a20473ddb84e49"}]}],"author":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-02-28 12:03:43.000000000","tz":0},"committer":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-03-30 15:23:30.000000000","tz":60},"subject":"add service-layer functions to api/watcher.py","message":"add service-layer functions to api/watcher.py\n\nIntroduce module-level service functions that wrap every class method on the\nWatcher API wrapper classes (Audit, AuditTemplate, ActionPlan, Action, Goal,\nStrategy, EfficacyIndicator). Each function delegates to the corresponding\nclass method so callers no longer need to import and reference the classes\ndirectly.\n\nAdd comprehensive unit tests for all new service functions.\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id: Ie893505bd472beb0262082c50dd7caaae89211ea\nSigned-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/3e7884df69fbe726e0a3598f477ff15753fa382b"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/3e7884df69fbe726e0a3598f477ff15753fa382b"}]},"branch":"refs/heads/master"},"bb7110c4b2b29016a9e2d31571feddc516de1470":{"kind":"REWORK","_number":3,"created":"2026-04-04 00:52:13.000000000","uploader":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"ref":"refs/changes/10/978310/3","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/10/978310/3","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/3 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/3 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/3 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/3"}}},"commit":{"parents":[{"commit":"1dd5fbf425bc742fb11a1c948cb6cbd0e0554340","subject":"test: improve coverage to 100% on api, client, errors, exceptions","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/1dd5fbf425bc742fb11a1c948cb6cbd0e0554340"}]}],"author":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-02-28 12:03:43.000000000","tz":0},"committer":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-04-04 00:49:03.000000000","tz":60},"subject":"feat: add service-layer functions to api/watcher.py","message":"feat: add service-layer functions to api/watcher.py\n\nIntroduce module-level service functions that wrap every class method on the\nWatcher API wrapper classes (Audit, AuditTemplate, ActionPlan, Action, Goal,\nStrategy, EfficacyIndicator). Each function delegates to the corresponding\nclass method so callers no longer need to import and reference the classes\ndirectly.\n\nAdd comprehensive unit tests for all new service functions.\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id: Ie893505bd472beb0262082c50dd7caaae89211ea\nSigned-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/bb7110c4b2b29016a9e2d31571feddc516de1470"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/bb7110c4b2b29016a9e2d31571feddc516de1470"}]},"branch":"refs/heads/master"},"e5465105e4559efb415792d1488fa9fa2877f5f1":{"kind":"REWORK","_number":4,"created":"2026-04-30 20:42:49.000000000","uploader":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"ref":"refs/changes/10/978310/4","fetch":{"anonymous http":{"url":"https://review.opendev.org/openstack/watcher-dashboard","ref":"refs/changes/10/978310/4","commands":{"Checkout":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/4 \u0026\u0026 git checkout FETCH_HEAD","Cherry Pick":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/4 \u0026\u0026 git cherry-pick FETCH_HEAD","Format Patch":"git fetch https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/4 \u0026\u0026 git format-patch -1 --stdout FETCH_HEAD","Pull":"git pull https://review.opendev.org/openstack/watcher-dashboard refs/changes/10/978310/4"}}},"commit":{"parents":[{"commit":"605192c405fa672c78e4ba2be43d0ab5f9670367","subject":"test: improve coverage to 100% on api, client, errors, exceptions","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/605192c405fa672c78e4ba2be43d0ab5f9670367"}]}],"author":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-02-28 12:03:43.000000000","tz":0},"committer":{"name":"Sean Mooney","email":"work@seanmooney.info","date":"2026-04-30 20:32:33.000000000","tz":60},"subject":"feat: add service-layer functions to api/watcher.py","message":"feat: add service-layer functions to api/watcher.py\n\nIntroduce module-level service functions that wrap every class method on the\nWatcher API wrapper classes (Audit, AuditTemplate, ActionPlan, Action, Goal,\nStrategy, EfficacyIndicator). Each function delegates to the corresponding\nclass method so callers no longer need to import and reference the classes\ndirectly.\n\nAdd comprehensive unit tests for all new service functions.\n\nGenerated-By: claude-code sonnet 4.6\nChange-Id: Ie893505bd472beb0262082c50dd7caaae89211ea\nSigned-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e\n","web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/e5465105e4559efb415792d1488fa9fa2877f5f1"}],"resolve_conflicts_web_links":[{"name":"gitea","tooltip":"Open in GitWeb","url":"https://opendev.org/openstack/watcher-dashboard/commit/e5465105e4559efb415792d1488fa9fa2877f5f1"}]},"branch":"refs/heads/master"}},"requirements":[],"submit_records":[{"rule_name":"gerrit~DefaultSubmitRule","status":"OK","labels":[{"label":"Verified","status":"MAY","applied_by":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]}},{"label":"Code-Review","status":"MAY"},{"label":"Workflow","status":"MAY"}]}],"submit_requirements":[{"name":"Verified","description":"Verified in gate by CI","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Verified\u003dMAX AND -label:Verified\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Verified\u003dMAX","label:Verified\u003dMIN"],"atom_explanations":{"label:Verified\u003dMAX":"","label:Verified\u003dMIN":""}}},{"name":"Code-Review","description":"Code reviewed by core reviewer","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Code-Review\u003dMAX AND -label:Code-Review\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Code-Review\u003dMAX","label:Code-Review\u003dMIN"],"atom_explanations":{"label:Code-Review\u003dMAX":"","label:Code-Review\u003dMIN":""}}},{"name":"Workflow","description":"Approved for gate by core reviewer","status":"UNSATISFIED","is_legacy":false,"submittability_expression_result":{"expression":"label:Workflow\u003dMAX AND -label:Workflow\u003dMIN","fulfilled":false,"status":"FAIL","passing_atoms":[],"failing_atoms":["label:Workflow\u003dMAX","label:Workflow\u003dMIN"],"atom_explanations":{"label:Workflow\u003dMAX":"","label:Workflow\u003dMIN":""}}}]}
