)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"dd81d972940e9d5637b99ef1e286b9d491b3d757","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"babf8c57_5b0af646","updated":"2025-10-08 10:02:34.000000000","message":"recheck","commit_id":"cf1e9f5fdb6dd9144656670ab6ed05cf7c211c8f"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"db50c2e8ef795a4fb868c44f3dcc6b41c16fb75f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"18c19b4e_153c1f9e","updated":"2025-10-23 15:53:33.000000000","message":"Tested with two decision-engine instances in https://review.opendev.org/c/openstack/watcher/+/964546/\n\n1.- https://e167b94f02ef3b398ee9-0fec5ce1527809b443817b617c225254.ssl.cf2.rackcdn.com/openstack/a4e9af79657a4ac7a7b57d8d4bd6ba81/controller/logs/screen-watcher-decision-engine.txt\n\nOct 23 14:23:57.474502 np9f5bf7d502444 watcher-decision-engine[100016]: INFO watcher.decision_engine.service_monitor [None req-79701206-ab3b-4b1d-ba3b-8c2ba3ee63e5 None None] Starting decision-engine service monitoring service\n\nOct 23 14:23:57.485002 np9f5bf7d502444 watcher-decision-engine[100016]: 2025-10-23 14:23:57.484 100016 INFO watcher.decision_engine.service_monitor [-] Leader election completed: None -\u003e np9f5bf7d502444. Selected as leader: True\n\nOct 23 14:30:57.478830 np9f5bf7d502444 watcher-decision-engine[100016]: INFO watcher.decision_engine.service_monitor [None req-2674c830-301e-420c-97e9-18274e5bda71 None None] Leader election completed: np9f5bf7d502444 -\u003e np13514420ab914. Selected as leader: False\n\n\n2.- https://e167b94f02ef3b398ee9-0fec5ce1527809b443817b617c225254.ssl.cf2.rackcdn.com/openstack/a4e9af79657a4ac7a7b57d8d4bd6ba81/compute1/logs/screen-watcher-decision-engine.txt\n\nOct 23 14:30:47.053182 np13514420ab914 watcher-decision-engine[52929]: INFO watcher.decision_engine.service_monitor [None req-507f7e1c-bb53-4142-a7c1-052d0058b9c6 None None] Starting decision-engine service monitoring service\n\nOct 23 14:30:47.081104 np13514420ab914 watcher-decision-engine[52929]: INFO watcher.decision_engine.service_monitor [None req-0436a278-ac20-472c-9e79-59840affd938 None None] Leader election completed: None -\u003e np13514420ab914. Selected as leader: True\n\nNote leader transition in the first service when the second is started.","commit_id":"a759959f4c1f5bd8fa50ff94c07657f90ddc2575"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"e87fc719ce9b980efdb49ed2a9c788ec352d35c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"2ef77b1c_f80ad079","updated":"2025-10-29 09:33:49.000000000","message":"recheck","commit_id":"cf272ee62edc97f3b6332a06c91ff35b783b21b4"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"27c4e0be010049a27423a4ded996aceda8d54cd5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"beae13d7_52b4da9e","updated":"2025-10-30 08:24:57.000000000","message":"recheck","commit_id":"cf272ee62edc97f3b6332a06c91ff35b783b21b4"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"2a0d68acf2d4b7aec93d7347ba01515c34745a85","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"92406ca5_42bd73d5","updated":"2025-11-19 14:32:12.000000000","message":"overall looks good, left a couple of comments, will come back to review the tests properly once we\u0027ve merged the parent commit in the chaing","commit_id":"3a0a3fc26ccf10ae98f8b4c64ba45721014409d0"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f4bc4fe6e50ee2285a180962047c26150b5a6c10","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"13c279ac_330720e8","updated":"2025-11-21 13:54:07.000000000","message":"I\u0027m almost +2 on this patch, the implemention lgmt, just left a few small comments on the unit tests","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"c139f550e5821f5b18021bb48b5aba794eb5c02f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"b7917b95_4cce47b2","updated":"2025-11-21 13:06:57.000000000","message":"check-rdo","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"6ce70f9e04a00c40c175067ee23b6466ad3a5e8a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8af1f7e9_1d3ff630","updated":"2025-11-24 09:46:49.000000000","message":"I think this is good to go in the current form, thanks Alfredo!","commit_id":"2a7aa6633c46583b84a38786c3a07fee2dd9bb64"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5d245f859ddf61035e7dc690a41ee7a86910bbde","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"06c4d3de_0c8e23ad","updated":"2025-12-11 15:17:48.000000000","message":"This change looks good to me, ci results are also good. Since this change is open for a while now, I will +2w. Thanks Alfredo.","commit_id":"ebdbec99eb446dc942727432182d0d7af50bbdc8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"c0bfe0d8c7ff7abdbf10dc442b9fa31d915f6989","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"66a8f212_7c87254e","updated":"2025-12-13 08:59:04.000000000","message":"recheck","commit_id":"ebdbec99eb446dc942727432182d0d7af50bbdc8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"c27358b49d14f62e45faa946b15e655771d992f7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"857fc22c_54440032","updated":"2025-12-11 22:07:23.000000000","message":"recheck","commit_id":"ebdbec99eb446dc942727432182d0d7af50bbdc8"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"178f1fba9f9eefad45decd18cec0231f5645b629","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"b2fbcaca_a4e6e33d","updated":"2025-12-12 07:25:36.000000000","message":"recheck","commit_id":"ebdbec99eb446dc942727432182d0d7af50bbdc8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"80366d6efeadc265e9a11afac02452741ee9c606","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"be111c04_3a468200","updated":"2025-11-27 12:56:00.000000000","message":"teim-ci: manual","commit_id":"ebdbec99eb446dc942727432182d0d7af50bbdc8"}],"releasenotes/notes/bug-2126767-d0a2911d1e046805.yaml":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5d245f859ddf61035e7dc690a41ee7a86910bbde","unresolved":true,"context_lines":[{"line_number":8,"context_line":"    be executed as soon as any decision-engine is running."},{"line_number":9,"context_line":"deprecations:"},{"line_number":10,"context_line":"  - |"},{"line_number":11,"context_line":"    The APISchedulingService has been removed from the Watcher API service."},{"line_number":12,"context_line":"    It is replaced functionally by the ServiceMonitoringService included"},{"line_number":13,"context_line":"    in the watcher-decision-engine."},{"line_number":14,"context_line":"features:"},{"line_number":15,"context_line":"  - |"},{"line_number":16,"context_line":"    A leader election mechanism has been added to the ServiceMonitoringService"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"77620eaa_2153ccbc","line":13,"range":{"start_line":11,"start_character":0,"end_line":13,"end_character":35},"updated":"2025-12-11 15:17:48.000000000","message":"we don\u0027t usually mention implementation details in release notes","commit_id":"ebdbec99eb446dc942727432182d0d7af50bbdc8"}],"watcher/decision_engine/service_monitor.py":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"3df1846dce24394d1d40c36505a474837623ac38","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ServiceMonitoringService(scheduling.BackgroundSchedulerService):"},{"line_number":34,"context_line":"    \"\"\"Service to monitor the status of Watcher services."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    This service monitors all Watcher services and handles failover"},{"line_number":37,"context_line":"    for continuous audits when decision-engine services fail."}],"source_content_type":"text/x-python","patch_set":5,"id":"bb0b77e0_725b29be","line":34,"updated":"2025-10-24 15:02:10.000000000","message":"missing Decision Engine?\n\n```suggestion\n    \"\"\"Service to monitor the status of Watcher Decision Engine services.\n```","commit_id":"a759959f4c1f5bd8fa50ff94c07657f90ddc2575"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"2a0d68acf2d4b7aec93d7347ba01515c34745a85","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ServiceMonitoringService(scheduling.BackgroundSchedulerService):"},{"line_number":34,"context_line":"    \"\"\"Service to monitor the status of Watcher services."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    This service monitors all Watcher services and handles failover"},{"line_number":37,"context_line":"    for continuous audits when decision-engine services fail."}],"source_content_type":"text/x-python","patch_set":5,"id":"8fb816c9_9ceee651","line":34,"in_reply_to":"9136cf10_36a76266","updated":"2025-11-19 14:32:12.000000000","message":"Acknowledged","commit_id":"a759959f4c1f5bd8fa50ff94c07657f90ddc2575"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"f93c516426b8334185707084d81bf319c4a05b7f","unresolved":true,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ServiceMonitoringService(scheduling.BackgroundSchedulerService):"},{"line_number":34,"context_line":"    \"\"\"Service to monitor the status of Watcher services."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    This service monitors all Watcher services and handles failover"},{"line_number":37,"context_line":"    for continuous audits when decision-engine services fail."}],"source_content_type":"text/x-python","patch_set":5,"id":"9136cf10_36a76266","line":34,"in_reply_to":"bb0b77e0_725b29be","updated":"2025-10-28 08:25:58.000000000","message":"Actually, note that, although it only migrate audits for decision-engine services, it checks the status of all the services (also appliers and will send notification for service update for them too). That\u0027s how it worked and i didn\u0027t want to change that from the initial implementation.","commit_id":"a759959f4c1f5bd8fa50ff94c07657f90ddc2575"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"2a0d68acf2d4b7aec93d7347ba01515c34745a85","unresolved":true,"context_lines":[{"line_number":81,"context_line":"                f\"Leader election completed: {self.last_leader} -\u003e {leader}. \""},{"line_number":82,"context_line":"                f\"Selected as leader: {CONF.host \u003d\u003d leader}\")"},{"line_number":83,"context_line":"            self.last_leader \u003d leader"},{"line_number":84,"context_line":"        if CONF.host !\u003d leader:"},{"line_number":85,"context_line":"            return False"},{"line_number":86,"context_line":"        return True"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"eafff87f_f5852db1","line":84,"updated":"2025-11-19 14:32:12.000000000","message":"nit, this can simply be, without the if\n```suggestion\n        return CONF.host !\u003d leader\n```","commit_id":"3a0a3fc26ccf10ae98f8b4c64ba45721014409d0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3d3d88a2865f08a5c59c61caa2281a013caae7cf","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                f\"Leader election completed: {self.last_leader} -\u003e {leader}. \""},{"line_number":82,"context_line":"                f\"Selected as leader: {CONF.host \u003d\u003d leader}\")"},{"line_number":83,"context_line":"            self.last_leader \u003d leader"},{"line_number":84,"context_line":"        if CONF.host !\u003d leader:"},{"line_number":85,"context_line":"            return False"},{"line_number":86,"context_line":"        return True"},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"55a391a5_5b590dfa","line":84,"in_reply_to":"eafff87f_f5852db1","updated":"2025-11-20 15:50:41.000000000","message":"Done","commit_id":"3a0a3fc26ccf10ae98f8b4c64ba45721014409d0"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"2a0d68acf2d4b7aec93d7347ba01515c34745a85","unresolved":true,"context_lines":[{"line_number":101,"context_line":"                    changed \u003d True"},{"line_number":102,"context_line":"                self.services_status[service.id] \u003d result"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"                if not leader:"},{"line_number":105,"context_line":"                    # Only leader can manage audits failovers"},{"line_number":106,"context_line":"                    # on services status changes"},{"line_number":107,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"87727db7_3cafbadd","line":104,"updated":"2025-11-19 14:32:12.000000000","message":"can\u0027t we move this early return outside of the loop? IIUC only the leader decision engine will actually do anything in this methods since each service has its own copy of `self.services_status` so we don\u0027t need to update that at all in the non-leader services. That way we can also remove the `changed` boolean and keep the loop unchanged.","commit_id":"3a0a3fc26ccf10ae98f8b4c64ba45721014409d0"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"6ce70f9e04a00c40c175067ee23b6466ad3a5e8a","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                    changed \u003d True"},{"line_number":102,"context_line":"                self.services_status[service.id] \u003d result"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"                if not leader:"},{"line_number":105,"context_line":"                    # Only leader can manage audits failovers"},{"line_number":106,"context_line":"                    # on services status changes"},{"line_number":107,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"4a2ae86a_0ac4404b","line":104,"in_reply_to":"27231dfa_6e2f64d8","updated":"2025-11-24 09:46:49.000000000","message":"agreed, after giving it some thought, the current implementation seems good","commit_id":"3a0a3fc26ccf10ae98f8b4c64ba45721014409d0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"3d3d88a2865f08a5c59c61caa2281a013caae7cf","unresolved":true,"context_lines":[{"line_number":101,"context_line":"                    changed \u003d True"},{"line_number":102,"context_line":"                self.services_status[service.id] \u003d result"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"                if not leader:"},{"line_number":105,"context_line":"                    # Only leader can manage audits failovers"},{"line_number":106,"context_line":"                    # on services status changes"},{"line_number":107,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"d152ba2c_c23a4edb","line":104,"in_reply_to":"87727db7_3cafbadd","updated":"2025-11-20 15:50:41.000000000","message":"Not really, we want to maintain the list service_status updated both in the leader and the rest of nodes, so that, in a leader transition, the new leader knows the previous state of the services and migrate the audits in failed computes if needed.","commit_id":"3a0a3fc26ccf10ae98f8b4c64ba45721014409d0"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"5b375aa69527bbfa8f834d255ad9df59eb3c8c6b","unresolved":true,"context_lines":[{"line_number":101,"context_line":"                    changed \u003d True"},{"line_number":102,"context_line":"                self.services_status[service.id] \u003d result"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"                if not leader:"},{"line_number":105,"context_line":"                    # Only leader can manage audits failovers"},{"line_number":106,"context_line":"                    # on services status changes"},{"line_number":107,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"27231dfa_6e2f64d8","line":104,"in_reply_to":"c7e7c5e4_b792b13d","updated":"2025-11-21 16:34:38.000000000","message":"Actually, I was also considering the same but then we would need to keep the service_status empty for non-leader as you said, including empty it in transitions from leader to non-leader. I thought current implementation is simpler and less error prone.","commit_id":"3a0a3fc26ccf10ae98f8b4c64ba45721014409d0"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f4bc4fe6e50ee2285a180962047c26150b5a6c10","unresolved":true,"context_lines":[{"line_number":101,"context_line":"                    changed \u003d True"},{"line_number":102,"context_line":"                self.services_status[service.id] \u003d result"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"                if not leader:"},{"line_number":105,"context_line":"                    # Only leader can manage audits failovers"},{"line_number":106,"context_line":"                    # on services status changes"},{"line_number":107,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":7,"id":"c7e7c5e4_b792b13d","line":104,"in_reply_to":"d152ba2c_c23a4edb","updated":"2025-11-21 13:54:07.000000000","message":"I see, that could lead to missing transitions ACTIVE-\u003eFAILED due to stale data, unless we keep a null `self.service_status` for non-leader services. I was thinking if the current approach could also miss some transitions, but I could not think of any problematic scenario, so we can go with the current implementation","commit_id":"3a0a3fc26ccf10ae98f8b4c64ba45721014409d0"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5d245f859ddf61035e7dc690a41ee7a86910bbde","unresolved":true,"context_lines":[{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class ServiceMonitoringService(scheduling.BackgroundSchedulerService):"},{"line_number":34,"context_line":"    \"\"\"Service to monitor the status of Watcher services."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    This service monitors all Watcher services and handles failover"}],"source_content_type":"text/x-python","patch_set":11,"id":"203b9d30_d947f4bb","line":33,"range":{"start_line":33,"start_character":42,"end_line":33,"end_character":68},"updated":"2025-12-11 15:17:48.000000000","message":"ack, since it is using the same background service, which has enough threads to handle the service. From threading job:\n``\nNov 24 10:42:25.442158 np389094ff00f84 watcher-decision-engine[101029]: INFO watcher.decision_engine.service_monitor [None req-e13328b0-21cb-4c6f-9cf4-39bcbfeb3fe0 None None] Starting decision-engine service monitoring service\nNov 24 10:42:25.442661 np389094ff00f84 watcher-decision-engine[101029]: DEBUG watcher.common.executor [None req-e13328b0-21cb-4c6f-9cf4-39bcbfeb3fe0 None None] State of background-scheduler-pool ThreadPoolExecutor when submitting a new task: max_workers: 10, workers: 5, idle workers: 3, queued work: 0, stats: \u003cExecutorStatistics object at 0x77f64cccd240 (failures\u003d0, executed\u003d3, runtime\u003d0.07, cancelled\u003d0)\u003e {{(pid\u003d101029) log_executor_stats /opt/stack/watcher/watcher/common/executor.py:52}}\n```","commit_id":"ebdbec99eb446dc942727432182d0d7af50bbdc8"}],"watcher/tests/decision_engine/test_service_monitor.py":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f4bc4fe6e50ee2285a180962047c26150b5a6c10","unresolved":true,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        monitor \u003d service_monitor.ServiceMonitoringService()"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # Mock CONF.host to make this service the leader"},{"line_number":144,"context_line":"        with mock.patch.object(service_monitor.CONF, \u0027host\u0027, \u0027host2\u0027):"},{"line_number":145,"context_line":"            # First call: both ACTIVE"},{"line_number":146,"context_line":"            monitor.monitor_services_status(self.context)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1bbc45e6_7f4a62ca","line":143,"updated":"2025-11-21 13:54:07.000000000","message":"this comment confused me at first, the monitor service becomes the leader in the second call, after `fake_de_service_obj1` is set as `FAILED`, I think we should update it to clarify","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"5b375aa69527bbfa8f834d255ad9df59eb3c8c6b","unresolved":true,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        monitor \u003d service_monitor.ServiceMonitoringService()"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # Mock CONF.host to make this service the leader"},{"line_number":144,"context_line":"        with mock.patch.object(service_monitor.CONF, \u0027host\u0027, \u0027host2\u0027):"},{"line_number":145,"context_line":"            # First call: both ACTIVE"},{"line_number":146,"context_line":"            monitor.monitor_services_status(self.context)"}],"source_content_type":"text/x-python","patch_set":8,"id":"f66d4a5d_4cd1f3a1","line":143,"in_reply_to":"1bbc45e6_7f4a62ca","updated":"2025-11-21 16:34:38.000000000","message":"I\u0027ll make the comment more clear.","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"6ce70f9e04a00c40c175067ee23b6466ad3a5e8a","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        monitor \u003d service_monitor.ServiceMonitoringService()"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        # Mock CONF.host to make this service the leader"},{"line_number":144,"context_line":"        with mock.patch.object(service_monitor.CONF, \u0027host\u0027, \u0027host2\u0027):"},{"line_number":145,"context_line":"            # First call: both ACTIVE"},{"line_number":146,"context_line":"            monitor.monitor_services_status(self.context)"}],"source_content_type":"text/x-python","patch_set":8,"id":"b257d452_09e74f29","line":143,"in_reply_to":"f66d4a5d_4cd1f3a1","updated":"2025-11-24 09:46:49.000000000","message":"Done","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f4bc4fe6e50ee2285a180962047c26150b5a6c10","unresolved":true,"context_lines":[{"line_number":278,"context_line":"                                                        m_send_notif,"},{"line_number":279,"context_line":"                                                        m_service_list,"},{"line_number":280,"context_line":"                                                        m_get_service_status):"},{"line_number":281,"context_line":"        # Create two decision-engine services"},{"line_number":282,"context_line":"        fake_de_service1 \u003d utils.get_test_service("},{"line_number":283,"context_line":"            id\u003d1, name\u003d\u0027watcher-decision-engine\u0027, host\u003d\u0027host1\u0027)"},{"line_number":284,"context_line":"        fake_de_service2 \u003d utils.get_test_service("}],"source_content_type":"text/x-python","patch_set":8,"id":"105f9c7a_2f07222a","line":281,"updated":"2025-11-21 13:54:07.000000000","message":"nit, there are a few comments that refer to `two` services when actually three are created","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"5b375aa69527bbfa8f834d255ad9df59eb3c8c6b","unresolved":false,"context_lines":[{"line_number":278,"context_line":"                                                        m_send_notif,"},{"line_number":279,"context_line":"                                                        m_service_list,"},{"line_number":280,"context_line":"                                                        m_get_service_status):"},{"line_number":281,"context_line":"        # Create two decision-engine services"},{"line_number":282,"context_line":"        fake_de_service1 \u003d utils.get_test_service("},{"line_number":283,"context_line":"            id\u003d1, name\u003d\u0027watcher-decision-engine\u0027, host\u003d\u0027host1\u0027)"},{"line_number":284,"context_line":"        fake_de_service2 \u003d utils.get_test_service("}],"source_content_type":"text/x-python","patch_set":8,"id":"273d8b0f_7496345d","line":281,"in_reply_to":"105f9c7a_2f07222a","updated":"2025-11-21 16:34:38.000000000","message":"Done","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f4bc4fe6e50ee2285a180962047c26150b5a6c10","unresolved":true,"context_lines":[{"line_number":480,"context_line":"    @mock.patch.object(objects.Service, \u0027list\u0027)"},{"line_number":481,"context_line":"    def test_get_services_status_with_services_in_list("},{"line_number":482,"context_line":"            self, m_service_list, m_get_service_status):"},{"line_number":483,"context_line":"        \"\"\"Test that get_services_status returns only decision-engines.\"\"\""},{"line_number":484,"context_line":"        # Create various services"},{"line_number":485,"context_line":"        de_service1 \u003d utils.get_test_service("},{"line_number":486,"context_line":"            id\u003d1, name\u003d\u0027watcher-decision-engine\u0027, host\u003d\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"35181cb2_85970bd4","line":483,"updated":"2025-11-21 13:54:07.000000000","message":"isn\u0027t this the opposite of what the test does? i.e. the test checks that get_services_status returns all services, not only decision-engines","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"5b375aa69527bbfa8f834d255ad9df59eb3c8c6b","unresolved":true,"context_lines":[{"line_number":480,"context_line":"    @mock.patch.object(objects.Service, \u0027list\u0027)"},{"line_number":481,"context_line":"    def test_get_services_status_with_services_in_list("},{"line_number":482,"context_line":"            self, m_service_list, m_get_service_status):"},{"line_number":483,"context_line":"        \"\"\"Test that get_services_status returns only decision-engines.\"\"\""},{"line_number":484,"context_line":"        # Create various services"},{"line_number":485,"context_line":"        de_service1 \u003d utils.get_test_service("},{"line_number":486,"context_line":"            id\u003d1, name\u003d\u0027watcher-decision-engine\u0027, host\u003d\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"521e1ce3_7a4242ca","line":483,"in_reply_to":"35181cb2_85970bd4","updated":"2025-11-21 16:34:38.000000000","message":"Right, this comes from a previous implementation worked on.","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"6ce70f9e04a00c40c175067ee23b6466ad3a5e8a","unresolved":false,"context_lines":[{"line_number":480,"context_line":"    @mock.patch.object(objects.Service, \u0027list\u0027)"},{"line_number":481,"context_line":"    def test_get_services_status_with_services_in_list("},{"line_number":482,"context_line":"            self, m_service_list, m_get_service_status):"},{"line_number":483,"context_line":"        \"\"\"Test that get_services_status returns only decision-engines.\"\"\""},{"line_number":484,"context_line":"        # Create various services"},{"line_number":485,"context_line":"        de_service1 \u003d utils.get_test_service("},{"line_number":486,"context_line":"            id\u003d1, name\u003d\u0027watcher-decision-engine\u0027, host\u003d\u0027host1\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dee515e6_dd284713","line":483,"in_reply_to":"521e1ce3_7a4242ca","updated":"2025-11-24 09:46:49.000000000","message":"Done","commit_id":"7c9c091280c45b982a851f9e96813aed40a65651"}]}
