)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"e420ffa41b26539dc8fe89155028095fc8b4158b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"80867663_68c93818","updated":"2025-12-14 16:17:37.000000000","message":"recheck","commit_id":"4bd6a9d95b57b9d8985235afad6f9a6d9123da9d"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"94ba95baf481904211f28e176238522da9e1e06f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"856b693e_ccbf91f2","updated":"2026-01-14 13:41:40.000000000","message":"lgtm, just spotted a nit and an outdated comment","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ad66bf51a44e9b1ce0e8a740e892df39219046b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"8c914cdc_edc26749","updated":"2026-01-16 07:15:14.000000000","message":"recheck","commit_id":"03d2c7d71b873bb9637d1832c1621105bbe4c9b4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d158513678f97c5c37a24e434bf568088542de8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"0da8d4b5_fe88e4ab","updated":"2026-01-22 17:54:01.000000000","message":"code looks good, just waiting for the unresolved thread to approve.\nThanks Alfredo","commit_id":"ba1a0a1a2fe9730cb2e3b71df6c45eb8d542ecc5"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ac5e13247ce431045ccd7ac2c55715d1e950b7c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"29d8929c_a9e50195","updated":"2026-01-22 15:40:47.000000000","message":"re-adding vote","commit_id":"ba1a0a1a2fe9730cb2e3b71df6c45eb8d542ecc5"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"953ae2ae8aae694e347383acae3b950b39a34f0c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"562d798a_9c35aa74","updated":"2026-01-27 11:13:16.000000000","message":"LGTM, thanks Alfredo","commit_id":"46f02d527fe4965fd9610456b8fd09a716295be4"}],"watcher/applier/service_monitor.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b0a6d36e51b7790c396d77b4ce52e6401540cd02","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super().__init__(\u0027watcher-applier\u0027, gconfig, **options)"},{"line_number":40,"context_line":"        self.applier_client \u003d rpcapi.ApplierAPI()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _retrigger_pending_actionplans(self, context, host):"},{"line_number":43,"context_line":"        pending_actionplans \u003d objects.ActionPlan.list("},{"line_number":44,"context_line":"            context,"},{"line_number":45,"context_line":"            filters\u003d{\u0027state\u0027: objects.action_plan.State.PENDING,"}],"source_content_type":"text/x-python","patch_set":1,"id":"2baeb619_63d669f9","line":42,"in_reply_to":"545a9d9c_7bde4c89","updated":"2025-12-11 16:05:20.000000000","message":"Done","commit_id":"b2719664ef2fb6e4708ba5cc9d18fc9b67aea48b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7b236ab6208dfdc3b940c51f391d7524091ac68c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2017 Servionica"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":3,"id":"d2046c7d_bb352aa4","line":1,"in_reply_to":"28a09f5e_38453c0f","updated":"2026-01-13 13:01:02.000000000","message":"\u003e Copyright year inconsistency in service_monitor.py header (2017 vs 2025)\n\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.8\n\u003e \n\u003e **Impact**: Inconsistent licensing information across new files\n\u003e \n\u003e **Suggestion**:\n\u003e Update copyright to 2025 to match other new files in this change\n\nDone","commit_id":"d368c9bd82f5b76fbc637be8659a70de4567fb58"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7b236ab6208dfdc3b940c51f391d7524091ac68c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super().__init__(\u0027watcher-applier\u0027, gconfig, **options)"},{"line_number":40,"context_line":"        self.applier_client \u003d rpcapi.ApplierAPI()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _retrigger_pending_actionplans(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Unassign and retrigger pending action plans on a failed host.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        pending_actionplans \u003d objects.ActionPlan.list("}],"source_content_type":"text/x-python","patch_set":3,"id":"ee5041da_c630aee6","line":42,"in_reply_to":"3a8509bb_9c4ec745","updated":"2026-01-13 13:01:02.000000000","message":"\u003e Race condition in pending action plan retriggering - action plan could be picked up by another service before hostname is cleared\n\u003e \n\u003e **Severity**: CRITICAL | **Confidence**: 0.9\n\u003e \n\u003e **Risk**: Action plan duplication or inconsistent state during failover\n\u003e \n\u003e **Priority**: Before merge\n\u003e **Why This Matters**: Could cause the same action plan to be executed by multiple appliers, leading to duplicate operations and resource conflicts\n\u003e \n\u003e **Recommendation**:\n\u003e Clear hostname and save action plan before launching via RPC, or use database transaction to ensure atomicity\n\nThat\u0027s how it is implemented, it\u0027s first clearing the hostname and then sending rpc.","commit_id":"d368c9bd82f5b76fbc637be8659a70de4567fb58"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7b236ab6208dfdc3b940c51f391d7524091ac68c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                if (result \u003d\u003d failed_s):"},{"line_number":82,"context_line":"                    # Cancel ongoing action plans on the failed service using"},{"line_number":83,"context_line":"                    # the existing startup sync method"},{"line_number":84,"context_line":"                    syncer \u003d sync.Syncer()"},{"line_number":85,"context_line":"                    syncer._cancel_ongoing_actionplans(context,"},{"line_number":86,"context_line":"                                                       watcher_service.host)"},{"line_number":87,"context_line":"                    # Pending action plans should be unnasigned and"}],"source_content_type":"text/x-python","patch_set":3,"id":"ae3d2520_6488126e","line":84,"in_reply_to":"389c6464_856ba7fe","updated":"2026-01-13 13:01:02.000000000","message":"\u003e Potential infinite recursion in ApplierMonitor._cancel_ongoing_actionplans call\n\u003e \n\u003e **Severity**: HIGH | **Confidence**: 0.8\n\u003e \n\u003e **Risk**: Service crash due to recursion if Syncer.__init__ calls monitor_services_status\n\u003e \n\u003e **Priority**: Before merge\n\u003e **Why This Matters**: Could cause service crash and make the monitoring system unreliable during failover scenarios\n\u003e \n\u003e **Recommendation**:\n\u003e Pass the existing context to the syncer instance or create syncer once at initialization to avoid recursion\n\nSyncer does not call monitor_services_status","commit_id":"d368c9bd82f5b76fbc637be8659a70de4567fb58"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fac2665edc9775e0308ec97864d2b1de9845c9d","unresolved":true,"context_lines":[{"line_number":35,"context_line":"    for action plans when applier services fail."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self, gconfig\u003d{}, **options):"},{"line_number":39,"context_line":"        super().__init__(\u0027watcher-applier\u0027, gconfig, **options)"},{"line_number":40,"context_line":"        self.applier_client \u003d rpcapi.ApplierAPI()"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"83a55b07_778c09f4","line":38,"in_reply_to":"7d598b67_6514d639","updated":"2026-01-15 15:01:19.000000000","message":"\u003e Add configuration validation in ApplierMonitor.__init__ to ensure required config options exist\n\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.7\n\u003e \n\u003e **Benefit**: Better error messages for misconfigurations\n\u003e \n\u003e **Recommendation**:\n\u003e Add validation for service_down_time and periodic_interval configuration options\n\nthis gconfig is actully the apschder confgi not watchers\n\nwe inherit this api contract form here\nhttps://github.com/agronholm/apscheduler/blob/3.x/src/apscheduler/schedulers/base.py#L115","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b3fb64092b26458449f065913d65829d8b36ab7e","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    for action plans when applier services fail."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def __init__(self, gconfig\u003d{}, **options):"},{"line_number":39,"context_line":"        super().__init__(\u0027watcher-applier\u0027, gconfig, **options)"},{"line_number":40,"context_line":"        self.applier_client \u003d rpcapi.ApplierAPI()"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"03e2a37d_adc46c84","line":38,"in_reply_to":"83a55b07_778c09f4","updated":"2026-01-15 16:42:46.000000000","message":"Acknowledged","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ac5e13247ce431045ccd7ac2c55715d1e950b7c3","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super().__init__(\u0027watcher-applier\u0027, gconfig, **options)"},{"line_number":40,"context_line":"        self.applier_client \u003d rpcapi.ApplierAPI()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _retrigger_pending_actionplans(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Unassign and retrigger pending action plans on a failed host.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        pending_actionplans \u003d objects.ActionPlan.list("}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1c6528_1d18ebd5","line":42,"in_reply_to":"4428631d_6ce48dbe","updated":"2026-01-22 15:40:47.000000000","message":"Done","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fac2665edc9775e0308ec97864d2b1de9845c9d","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        super().__init__(\u0027watcher-applier\u0027, gconfig, **options)"},{"line_number":40,"context_line":"        self.applier_client \u003d rpcapi.ApplierAPI()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _retrigger_pending_actionplans(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Unassign and retrigger pending action plans on a failed host.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        pending_actionplans \u003d objects.ActionPlan.list("}],"source_content_type":"text/x-python","patch_set":4,"id":"c85f84f3_1daba971","line":42,"in_reply_to":"98095a9a_f27e6cfa","updated":"2026-01-15 15:01:19.000000000","message":"\u003e Add more detailed logging in _retrigger_pending_actionplans to track retrigger operations\n\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.7\n\u003e \n\u003e **Benefit**: Better operational visibility for debugging failover scenarios\n\u003e \n\u003e **Recommendation**:\n\u003e Add LOG.info statements before and after retrigger operations with counts of action plans processed\n\n\nthis si not some thign that should need happing in normal operation, if it does we should warn operators that it was required.\n\nao i kind of agree the exsitng debug logs shoudl actully be at warning level\n\ni dont know if we need one before and after but one after at warnign level is fine\n\nper haps we could keep the debug print before and add a log.warning after.","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b3fb64092b26458449f065913d65829d8b36ab7e","unresolved":true,"context_lines":[{"line_number":39,"context_line":"        super().__init__(\u0027watcher-applier\u0027, gconfig, **options)"},{"line_number":40,"context_line":"        self.applier_client \u003d rpcapi.ApplierAPI()"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _retrigger_pending_actionplans(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Unassign and retrigger pending action plans on a failed host.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        pending_actionplans \u003d objects.ActionPlan.list("}],"source_content_type":"text/x-python","patch_set":4,"id":"4428631d_6ce48dbe","line":42,"in_reply_to":"c85f84f3_1daba971","updated":"2026-01-15 16:42:46.000000000","message":"I agree, moving the message to warning level.","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fac2665edc9775e0308ec97864d2b1de9845c9d","unresolved":true,"context_lines":[{"line_number":42,"context_line":"    def _retrigger_pending_actionplans(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Unassign and retrigger pending action plans on a failed host.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        pending_actionplans \u003d objects.ActionPlan.list("},{"line_number":46,"context_line":"            context,"},{"line_number":47,"context_line":"            filters\u003d{\u0027state\u0027: objects.action_plan.State.PENDING,"},{"line_number":48,"context_line":"                     \u0027hostname\u0027: host},"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba25c75e_c7b045cf","line":45,"in_reply_to":"03dee1d4_b3718765","updated":"2026-01-15 15:01:19.000000000","message":"\u003e Add try/except blocks around database operations in service_monitor.py for better error handling\n\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.7\n\u003e \n\u003e **Benefit**: Improved resilience against database errors during failover scenarios\n\u003e \n\u003e **Recommendation**:\n\u003e Wrap ActionPlan.list and actionplan.save operations in try/except blocks to handle potential database connection issues\n\n\nthis makes sense if and only if its a transitive db failure otherwise the next iteration of the loop is also going to fail as well so im not sure that makeing forward progress makes sense in this case.\n\nthis will be runnign in a periodic in the leader so it should revacualte all pending issues on failed nodes in the nex iteration.","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b3fb64092b26458449f065913d65829d8b36ab7e","unresolved":false,"context_lines":[{"line_number":42,"context_line":"    def _retrigger_pending_actionplans(self, context, host):"},{"line_number":43,"context_line":"        \"\"\"Unassign and retrigger pending action plans on a failed host.\"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        pending_actionplans \u003d objects.ActionPlan.list("},{"line_number":46,"context_line":"            context,"},{"line_number":47,"context_line":"            filters\u003d{\u0027state\u0027: objects.action_plan.State.PENDING,"},{"line_number":48,"context_line":"                     \u0027hostname\u0027: host},"}],"source_content_type":"text/x-python","patch_set":4,"id":"18c31a9c_6a987eb9","line":45,"in_reply_to":"ba25c75e_c7b045cf","updated":"2026-01-15 16:42:46.000000000","message":"Acknowledged","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b3fb64092b26458449f065913d65829d8b36ab7e","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        services \u003d self.get_services_status(context)"},{"line_number":60,"context_line":"        leader \u003d self._am_i_leader(services)"},{"line_number":61,"context_line":"        for watcher_service in services:"},{"line_number":62,"context_line":"            result \u003d watcher_service.state"},{"line_number":63,"context_line":"            changed \u003d False"},{"line_number":64,"context_line":"            # This covers both a service change, initial service monitor"},{"line_number":65,"context_line":"            # startup and adding a new service"}],"source_content_type":"text/x-python","patch_set":4,"id":"02eff4a1_069dac6a","line":62,"in_reply_to":"8f0913a5_60676770","updated":"2026-01-15 16:42:46.000000000","message":"\u003e Lines 62-64 in service_monitor.py use undefined variable \u0027result\u0027 instead of \u0027state\u0027\n\u003e \n\u003e **Severity**: CRITICAL | **Confidence**: 0.9\n\u003e \n\u003e **Risk**: Runtime error causing service monitor to fail when detecting service state changes\n\u003e \n\u003e **Priority**: Immediate\n\u003e **Why This Matters**: These variable name mismatches will prevent proper service state tracking and break the failover functionality\n\u003e \n\u003e **Recommendation**:\n\u003e Replace all occurrences of \u0027result\u0027 with \u0027state\u0027 in the monitor_services_status method: line 62, line 66, and line 81\n\nI think this is false positive from AI bot. I don\u0027t see any issue in the implementation.","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"94ba95baf481904211f28e176238522da9e1e06f","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                self.services_status[watcher_service.id] \u003d result"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"                if not leader:"},{"line_number":74,"context_line":"                    # Only leader can manage audits failovers"},{"line_number":75,"context_line":"                    # on services status changes"},{"line_number":76,"context_line":"                    continue"},{"line_number":77,"context_line":"                if changed:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9c60f10f_93cb9791","line":74,"updated":"2026-01-14 13:41:40.000000000","message":"```suggestion\n                    # Only leader can manage action plans failovers\n```","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b3fb64092b26458449f065913d65829d8b36ab7e","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                self.services_status[watcher_service.id] \u003d result"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"                if not leader:"},{"line_number":74,"context_line":"                    # Only leader can manage audits failovers"},{"line_number":75,"context_line":"                    # on services status changes"},{"line_number":76,"context_line":"                    continue"},{"line_number":77,"context_line":"                if changed:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fb4ec5b5_26f91da2","line":74,"in_reply_to":"9c60f10f_93cb9791","updated":"2026-01-15 16:42:46.000000000","message":"Done","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"94ba95baf481904211f28e176238522da9e1e06f","unresolved":true,"context_lines":[{"line_number":78,"context_line":"                    notifications.service.send_service_update(context,"},{"line_number":79,"context_line":"                                                              watcher_service,"},{"line_number":80,"context_line":"                                                              state\u003dresult)"},{"line_number":81,"context_line":"                if (result \u003d\u003d failed_s):"},{"line_number":82,"context_line":"                    # Cancel ongoing action plans on the failed service using"},{"line_number":83,"context_line":"                    # the existing startup sync method"},{"line_number":84,"context_line":"                    syncer \u003d sync.Syncer()"}],"source_content_type":"text/x-python","patch_set":4,"id":"dda03758_656811be","line":81,"updated":"2026-01-14 13:41:40.000000000","message":"nit redundant parenthesis","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b3fb64092b26458449f065913d65829d8b36ab7e","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                    notifications.service.send_service_update(context,"},{"line_number":79,"context_line":"                                                              watcher_service,"},{"line_number":80,"context_line":"                                                              state\u003dresult)"},{"line_number":81,"context_line":"                if (result \u003d\u003d failed_s):"},{"line_number":82,"context_line":"                    # Cancel ongoing action plans on the failed service using"},{"line_number":83,"context_line":"                    # the existing startup sync method"},{"line_number":84,"context_line":"                    syncer \u003d sync.Syncer()"}],"source_content_type":"text/x-python","patch_set":4,"id":"e494cc9c_3cd29bef","line":81,"in_reply_to":"dda03758_656811be","updated":"2026-01-15 16:42:46.000000000","message":"Done","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b3fb64092b26458449f065913d65829d8b36ab7e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                    syncer \u003d sync.Syncer()"},{"line_number":85,"context_line":"                    syncer._cancel_ongoing_actionplans(context,"},{"line_number":86,"context_line":"                                                       watcher_service.host)"},{"line_number":87,"context_line":"                    # Pending action plans should be unnasigned and"},{"line_number":88,"context_line":"                    # re-triggered"},{"line_number":89,"context_line":"                    self._retrigger_pending_actionplans(context,"},{"line_number":90,"context_line":"                                                        watcher_service.host)"}],"source_content_type":"text/x-python","patch_set":4,"id":"24d6f8a7_51fb4349","line":87,"in_reply_to":"274ebe86_e09ae5c0","updated":"2026-01-15 16:42:46.000000000","message":"\u003e Lines 87-88 in service_monitor.py contain typo: \u0027unnasigned\u0027 should be \u0027unassigned\u0027\n\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.9\n\u003e \n\u003e **Impact**: Comment has spelling error that reduces professionalism\n\u003e \n\u003e **Suggestion**:\n\u003e Correct the typo in the comment from \u0027unnasigned\u0027 to \u0027unassigned\u0027\n\nDone","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"}],"watcher/applier/sync.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b0a6d36e51b7790c396d77b4ce52e6401540cd02","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                if action_desc.description !\u003d load_description:"},{"line_number":44,"context_line":"                    action_desc.description \u003d load_description"},{"line_number":45,"context_line":"                    action_desc.save()"},{"line_number":46,"context_line":"            except exception.ActionDescriptionNotFound:"},{"line_number":47,"context_line":"                obj_action_desc \u003d objects.ActionDescription(ctx)"},{"line_number":48,"context_line":"                obj_action_desc.action_type \u003d action_type"},{"line_number":49,"context_line":"                obj_action_desc.description \u003d load_description"}],"source_content_type":"text/x-python","patch_set":1,"id":"305a96c0_fdc64740","line":46,"in_reply_to":"51c65cdb_4707d219","updated":"2025-12-11 16:05:20.000000000","message":"out of the scope and wrong recommendation i think.","commit_id":"b2719664ef2fb6e4708ba5cc9d18fc9b67aea48b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b0a6d36e51b7790c396d77b4ce52e6401540cd02","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            eager\u003dTrue)"},{"line_number":60,"context_line":"        for ap in actions_plans:"},{"line_number":61,"context_line":"            ap.state \u003d objects.action_plan.State.CANCELLED"},{"line_number":62,"context_line":"            ap.status_message \u003d \"Action plan was cancelled because Applier \" \\"},{"line_number":63,"context_line":"                f\"{hostname} was stopped while the action plan was \" \\"},{"line_number":64,"context_line":"                \"ongoing.\""},{"line_number":65,"context_line":"            ap.save()"}],"source_content_type":"text/x-python","patch_set":1,"id":"02df054c_d24e48e3","line":62,"in_reply_to":"02c0de29_fcb9ded4","updated":"2025-12-11 16:05:20.000000000","message":"This is not a log but a string to be uses in status_message","commit_id":"b2719664ef2fb6e4708ba5cc9d18fc9b67aea48b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b0a6d36e51b7790c396d77b4ce52e6401540cd02","unresolved":false,"context_lines":[{"line_number":69,"context_line":"            actions \u003d objects.Action.list(context, filters\u003dfilters, eager\u003dTrue)"},{"line_number":70,"context_line":"            for a in actions:"},{"line_number":71,"context_line":"                a.state \u003d objects.action.State.CANCELLED"},{"line_number":72,"context_line":"                a.status_message \u003d \"Action was cancelled because Applier \" \\"},{"line_number":73,"context_line":"                    f\"{hostname} was stopped while the action plan was \" \\"},{"line_number":74,"context_line":"                    \"ongoing.\""},{"line_number":75,"context_line":"                a.save()"}],"source_content_type":"text/x-python","patch_set":1,"id":"af9e0690_05b025a0","line":72,"in_reply_to":"d4de58ad_81cd72f7","updated":"2025-12-11 16:05:20.000000000","message":"This is not a log but a string to be uses in status_message","commit_id":"b2719664ef2fb6e4708ba5cc9d18fc9b67aea48b"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d158513678f97c5c37a24e434bf568088542de8b","unresolved":true,"context_lines":[{"line_number":59,"context_line":"            eager\u003dTrue)"},{"line_number":60,"context_line":"        for ap in actions_plans:"},{"line_number":61,"context_line":"            ap.state \u003d objects.action_plan.State.CANCELLED"},{"line_number":62,"context_line":"            ap.status_message \u003d (\"Action plan was cancelled because Applier \""},{"line_number":63,"context_line":"                                 f\"{hostname} was stopped while the action \""},{"line_number":64,"context_line":"                                 \"plan was ongoing.\")"},{"line_number":65,"context_line":"            ap.save()"}],"source_content_type":"text/x-python","patch_set":7,"id":"ec9ed8d0_248c53d4","line":62,"updated":"2026-01-22 17:54:01.000000000","message":"I am ok with these messages since this is a state that can only be moved to Deleted afterwards. I always try to check if there is a possibility of getting a status_message disconnected from the status of the resource.","commit_id":"ba1a0a1a2fe9730cb2e3b71df6c45eb8d542ecc5"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2791d1ba0d7693530f1284d12845c1c4da61d14b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            eager\u003dTrue)"},{"line_number":60,"context_line":"        for ap in actions_plans:"},{"line_number":61,"context_line":"            ap.state \u003d objects.action_plan.State.CANCELLED"},{"line_number":62,"context_line":"            ap.status_message \u003d (\"Action plan was cancelled because Applier \""},{"line_number":63,"context_line":"                                 f\"{hostname} was stopped while the action \""},{"line_number":64,"context_line":"                                 \"plan was ongoing.\")"},{"line_number":65,"context_line":"            ap.save()"}],"source_content_type":"text/x-python","patch_set":7,"id":"07c07d1b_e70d8d0d","line":62,"in_reply_to":"ec9ed8d0_248c53d4","updated":"2026-01-26 12:06:36.000000000","message":"Acknowledged","commit_id":"ba1a0a1a2fe9730cb2e3b71df6c45eb8d542ecc5"}],"watcher/tests/applier/test_service_monitor.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fac2665edc9775e0308ec97864d2b1de9845c9d","unresolved":true,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        monitor \u003d service_monitor.ApplierMonitor()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # Mock CONF.host to make this service the leader"},{"line_number":101,"context_line":"        with mock.patch.object(service_monitor.CONF, \u0027host\u0027, \u0027host1\u0027):"},{"line_number":102,"context_line":"            # First call: both ACTIVE"},{"line_number":103,"context_line":"            monitor.monitor_services_status(self.context)"}],"source_content_type":"text/x-python","patch_set":4,"id":"0d83f0a5_2936cd5c","line":100,"updated":"2026-01-15 15:01:19.000000000","message":"in genral this is an anti patern\n\nwe shoudl not mock the gonc we should set teh config value using self.flags using self.conf.set_overide directly\n\n```\n    def flags(self, **kw):\n        \"\"\"Override flag variables for a test.\"\"\"\n        group \u003d kw.pop(\u0027group\u0027, None)\n        for k, v in kw.items():\n            CONF.set_override(k, v, group)\n            # loading and validating alias is cached so if it is reconfigured\n            # we need to reset the cache\n            if k \u003d\u003d \u0027alias\u0027 and group \u003d\u003d \u0027pci\u0027:\n                request.get_alias_from_config.cache_clear()\n```\n\nmocking it means that you are remvoing all ocnfig vlaidation and the data type and valuems used in the test may not actully work in a real deployment so we use the set_overried method on the config to set the value isntead\n\nthis is built into the config fixture and oslo.confing in general.","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d158513678f97c5c37a24e434bf568088542de8b","unresolved":true,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        monitor \u003d service_monitor.ApplierMonitor()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # Mock CONF.host to make this service the leader"},{"line_number":101,"context_line":"        with mock.patch.object(service_monitor.CONF, \u0027host\u0027, \u0027host1\u0027):"},{"line_number":102,"context_line":"            # First call: both ACTIVE"},{"line_number":103,"context_line":"            monitor.monitor_services_status(self.context)"}],"source_content_type":"text/x-python","patch_set":4,"id":"cf2f5d6d_b02a4dc1","line":100,"in_reply_to":"0d83f0a5_2936cd5c","updated":"2026-01-22 17:54:01.000000000","message":"Alfredo, I think that you missed this comment?","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"823df3e7420d5c5c84fc85a2113f3cfff1b7597e","unresolved":false,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        monitor \u003d service_monitor.ApplierMonitor()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # Mock CONF.host to make this service the leader"},{"line_number":101,"context_line":"        with mock.patch.object(service_monitor.CONF, \u0027host\u0027, \u0027host1\u0027):"},{"line_number":102,"context_line":"            # First call: both ACTIVE"},{"line_number":103,"context_line":"            monitor.monitor_services_status(self.context)"}],"source_content_type":"text/x-python","patch_set":4,"id":"0af53b91_4893805f","line":100,"in_reply_to":"0fecd025_169ab73e","updated":"2026-01-26 13:24:26.000000000","message":"Done. I will send follow up patch to change it in other tests too.","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2791d1ba0d7693530f1284d12845c1c4da61d14b","unresolved":true,"context_lines":[{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        monitor \u003d service_monitor.ApplierMonitor()"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        # Mock CONF.host to make this service the leader"},{"line_number":101,"context_line":"        with mock.patch.object(service_monitor.CONF, \u0027host\u0027, \u0027host1\u0027):"},{"line_number":102,"context_line":"            # First call: both ACTIVE"},{"line_number":103,"context_line":"            monitor.monitor_services_status(self.context)"}],"source_content_type":"text/x-python","patch_set":4,"id":"0fecd025_169ab73e","line":100,"in_reply_to":"cf2f5d6d_b02a4dc1","updated":"2026-01-26 12:06:36.000000000","message":"sorry, I will fix it.","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"}],"watcher/tests/applier/test_sync.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fac2665edc9775e0308ec97864d2b1de9845c9d","unresolved":true,"context_lines":[{"line_number":75,"context_line":"                                        m_plan_save, m_action_save):"},{"line_number":76,"context_line":"        m_plan_list.return_value \u003d [self.actionplan]"},{"line_number":77,"context_line":"        m_action_list.return_value \u003d [self.action]"},{"line_number":78,"context_line":"        cfg.CONF.set_override(\"host\", \"hostname1\")"},{"line_number":79,"context_line":"        syncer \u003d sync.Syncer()"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        syncer._cancel_ongoing_actionplans(self.context)"}],"source_content_type":"text/x-python","patch_set":4,"id":"344416f9_578f6c94","line":78,"updated":"2026-01-15 15:01:19.000000000","message":"yep this is the correct way to do it.","commit_id":"9348f4c9be81977d75007baccba8324c3cad8b6b"}]}
