)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"bd9006f442ac0ab5feaeb30f382dc7bf4183ef2b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"77e5065c_d661a5c1","updated":"2025-02-12 14:47:30.000000000","message":"I think this looks Ok as well, but will wait for Rodolfo\u0027s opinion.","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"bc26ce9afaf2dbba6a75f0ffa8351b4236c63bb1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a81f354f_1c789d9c","updated":"2025-03-13 21:50:13.000000000","message":"Pinging reviewers again since this is blocking vpnaas change for RC1","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a4d71716e78ff6bd329444d1f48fba42c780b898","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7dd1e22f_04498ab8","updated":"2025-03-11 18:39:01.000000000","message":"Raising priority since a vpnaas change depends on it, just wondering what Rodolfo\u0027s opinion is","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"9347a9f952af35082ba1b6e5b545405416aab6ac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"19af2d13_bd92d808","updated":"2025-02-12 09:07:40.000000000","message":"looks useful to start maintenance worker for out of tree plugins","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"9ed6f0eba8167611b479f5fb3928990eb207084f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"6e980447_32110806","in_reply_to":"a81f354f_1c789d9c","updated":"2025-03-14 13:16:35.000000000","message":"could you please ping on IRC also to increase attention from folks?","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"81ec1077e768d10b26528f4f7a2a28c3d0285f68","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"79aa96e4_7d9f128d","updated":"2025-11-20 17:09:21.000000000","message":"I fixed the naming of the variable that holds the `plugin.ovn_maintenance_periodics` function reference","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c44d7fa4791a99d9083a64c907215ba223ac473e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"089833e4_9b057056","updated":"2025-11-20 10:43:42.000000000","message":"This patch requires:\n* At least unit tests.\n* A release note.\n* Documentation","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"464d5b44ede84df354a934f7c86e842595a964c8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"1ebb766a_49a5ea25","updated":"2025-11-10 14:38:28.000000000","message":"recheck","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"fcbcc506ada468167a5555e5109cf565100c8600","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3fc43e2d_fdaa536e","updated":"2025-11-21 14:53:37.000000000","message":"I added a unit test and a release note entry","commit_id":"2100f033470285312f36cda9f22069d96ac13d38"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"20e72e5a90d699002d75d8d3b526531d08a82d40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"4647e510_33a56d10","updated":"2025-11-26 10:43:06.000000000","message":"Please, add the documentation. IMO, there should be an additional section in `doc.admin.ovn`, something to describe the ML2 plugin and its particularities, like this one. This could be a good start.","commit_id":"2100f033470285312f36cda9f22069d96ac13d38"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"20e72e5a90d699002d75d8d3b526531d08a82d40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"df2ba0dd_79d92c92","updated":"2025-11-26 10:43:06.000000000","message":"This","commit_id":"2100f033470285312f36cda9f22069d96ac13d38"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b71f44bb9e62a1d3c445e663c86df01a152b6206","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"afb2aaa0_a967a071","updated":"2025-11-26 13:32:39.000000000","message":"I like this proposal in general. It is actually what we have discussed during PTG: https://etherpad.opendev.org/p/oct2025-ptg-neutron#L290 but I was thinking about using entry_points so that we would not need to have loaded plugins or anything like that. Every third party driver/plugin, etc. would be then able to add own maintenance tasks which would be loaded by neutron maintenance worker and executed. It would be similar to what we have with e.g. alembic_migrations currently.","commit_id":"534e485cfcfe176c424fd5121f0e401294cb56ab"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c56af360168aa50ecd55161a5bb092d3ba66c949","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1f0a7386_af99ebd6","in_reply_to":"66c86333_b06ca8dd","updated":"2025-11-26 14:21:46.000000000","message":"yes, we can go with this approach and change it later too","commit_id":"534e485cfcfe176c424fd5121f0e401294cb56ab"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5fc07f1271685208ffae057a9657a847aa471cda","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"66c86333_b06ca8dd","in_reply_to":"afb2aaa0_a967a071","updated":"2025-11-26 13:41:49.000000000","message":"(just thinking loud) This could be an additional add-on for this functionality, but I think that initially we only considered this loading method. I think we can consider both but at least for this feature the one implemented here is enough.","commit_id":"534e485cfcfe176c424fd5121f0e401294cb56ab"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5517c97201b2dd2e91db50f440a40c0877166fb2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"69bdff68_83b501f1","updated":"2025-11-28 12:24:03.000000000","message":"recheck openstack-tox-pep8","commit_id":"26513762c1c904331744bef4109b085d40ee015f"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2151aca0d03e6cd093305afe9701c1fa73412c40","unresolved":true,"context_lines":[{"line_number":432,"context_line":"            # If `ovn_maintenance_periodics` is implemented it\u0027s expected to"},{"line_number":433,"context_line":"            # return a list of periodics objects that will be added here."},{"line_number":434,"context_line":"            for plugin in directory.get_plugins().values():"},{"line_number":435,"context_line":"                if hasattr(plugin, \"ovn_maintenance_periodics\"):"},{"line_number":436,"context_line":"                    periodics_list \u003d plugin.ovn_maintenance_periodics("},{"line_number":437,"context_line":"                        self._ovn_client)"},{"line_number":438,"context_line":"                    for periodics in periodics_list:"}],"source_content_type":"text/x-python","patch_set":1,"id":"089a22b3_9494a1c4","line":435,"range":{"start_line":435,"start_character":16,"end_line":435,"end_character":64},"updated":"2025-03-14 15:02:37.000000000","message":"I have some concerns with this. ``ovn_maintenance_periodics`` can be a member or a property, aka, something not callable. This is not safe. The best way should be to make a base class for the OVN related plugins, but this is now very intrusive. At least check that ``ovn_maintenance_periodics`` is callable.\n\n``\nperiodics \u003d gettatr(plugin, ovn_maintenance_periodics, None)\nif periodics and callable(periodics):\n    for periodic in periodics():\n        self._maintenance_thread.add_periodics(periodic)\n``","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"b3bf4655897fa8724f71f2def2428b67082b0014","unresolved":false,"context_lines":[{"line_number":432,"context_line":"            # If `ovn_maintenance_periodics` is implemented it\u0027s expected to"},{"line_number":433,"context_line":"            # return a list of periodics objects that will be added here."},{"line_number":434,"context_line":"            for plugin in directory.get_plugins().values():"},{"line_number":435,"context_line":"                if hasattr(plugin, \"ovn_maintenance_periodics\"):"},{"line_number":436,"context_line":"                    periodics_list \u003d plugin.ovn_maintenance_periodics("},{"line_number":437,"context_line":"                        self._ovn_client)"},{"line_number":438,"context_line":"                    for periodics in periodics_list:"}],"source_content_type":"text/x-python","patch_set":1,"id":"4809376b_ccaf947c","line":435,"range":{"start_line":435,"start_character":16,"end_line":435,"end_character":64},"in_reply_to":"089a22b3_9494a1c4","updated":"2025-03-14 16:32:26.000000000","message":"added the callable check","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c44d7fa4791a99d9083a64c907215ba223ac473e","unresolved":true,"context_lines":[{"line_number":471,"context_line":"            # If `ovn_maintenance_periodics` is implemented it\u0027s expected to"},{"line_number":472,"context_line":"            # return a list of periodics objects that will be added here."},{"line_number":473,"context_line":"            for plugin in directory.get_plugins().values():"},{"line_number":474,"context_line":"                periodics \u003d getattr(plugin, \"ovn_maintenance_periodics\", None)"},{"line_number":475,"context_line":"                if periodics and callable(periodics):"},{"line_number":476,"context_line":"                    for periodics in periodics(self._ovn_client):"},{"line_number":477,"context_line":"                        self._maintenance_thread.add_periodics(periodics)"}],"source_content_type":"text/x-python","patch_set":3,"id":"637a1001_cb6c0cc4","line":474,"range":{"start_line":474,"start_character":16,"end_line":474,"end_character":78},"updated":"2025-11-20 10:43:42.000000000","message":"Instead of this, we should implement a base method called `maintenance_periodics` (removing the OVN part) for the `ServicePluginBase` derived classes. This loop should check if the plugin inherits from this class and then call it.\n\nThe `VPNDriverPlugin` service plugin inherits from this class.","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"81ec1077e768d10b26528f4f7a2a28c3d0285f68","unresolved":true,"context_lines":[{"line_number":471,"context_line":"            # If `ovn_maintenance_periodics` is implemented it\u0027s expected to"},{"line_number":472,"context_line":"            # return a list of periodics objects that will be added here."},{"line_number":473,"context_line":"            for plugin in directory.get_plugins().values():"},{"line_number":474,"context_line":"                periodics \u003d getattr(plugin, \"ovn_maintenance_periodics\", None)"},{"line_number":475,"context_line":"                if periodics and callable(periodics):"},{"line_number":476,"context_line":"                    for periodics in periodics(self._ovn_client):"},{"line_number":477,"context_line":"                        self._maintenance_thread.add_periodics(periodics)"}],"source_content_type":"text/x-python","patch_set":3,"id":"8680d915_37e575a0","line":474,"range":{"start_line":474,"start_character":16,"end_line":474,"end_character":78},"in_reply_to":"637a1001_cb6c0cc4","updated":"2025-11-20 17:09:21.000000000","message":"These maintenance periodics are specific to OVN. I\u0027m not so sure about adding a `maintenance_periodics` to the generic `ServicePluginBase` because the function expects an ovn client argument.","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c44d7fa4791a99d9083a64c907215ba223ac473e","unresolved":true,"context_lines":[{"line_number":472,"context_line":"            # return a list of periodics objects that will be added here."},{"line_number":473,"context_line":"            for plugin in directory.get_plugins().values():"},{"line_number":474,"context_line":"                periodics \u003d getattr(plugin, \"ovn_maintenance_periodics\", None)"},{"line_number":475,"context_line":"                if periodics and callable(periodics):"},{"line_number":476,"context_line":"                    for periodics in periodics(self._ovn_client):"},{"line_number":477,"context_line":"                        self._maintenance_thread.add_periodics(periodics)"},{"line_number":478,"context_line":"            self._maintenance_thread.start()"}],"source_content_type":"text/x-python","patch_set":3,"id":"4e4ffc89_27d5f809","line":475,"range":{"start_line":475,"start_character":33,"end_line":475,"end_character":52},"updated":"2025-11-20 10:43:42.000000000","message":"Instead of this check, we should enforce all periodic classes to inherit from a base class defined in neutron-lib, a `MaintenancePeriodic` base class (the name is a reference)","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"81ec1077e768d10b26528f4f7a2a28c3d0285f68","unresolved":true,"context_lines":[{"line_number":472,"context_line":"            # return a list of periodics objects that will be added here."},{"line_number":473,"context_line":"            for plugin in directory.get_plugins().values():"},{"line_number":474,"context_line":"                periodics \u003d getattr(plugin, \"ovn_maintenance_periodics\", None)"},{"line_number":475,"context_line":"                if periodics and callable(periodics):"},{"line_number":476,"context_line":"                    for periodics in periodics(self._ovn_client):"},{"line_number":477,"context_line":"                        self._maintenance_thread.add_periodics(periodics)"},{"line_number":478,"context_line":"            self._maintenance_thread.start()"}],"source_content_type":"text/x-python","patch_set":3,"id":"7b5d6184_add91ca5","line":475,"range":{"start_line":475,"start_character":33,"end_line":475,"end_character":52},"in_reply_to":"4e4ffc89_27d5f809","updated":"2025-11-20 17:09:21.000000000","message":"I changed the name of the variable here to `get_periodics_list`, the check makes sure that `plugin.ovn_maintenance_periodics` exists and is callable.a","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c44d7fa4791a99d9083a64c907215ba223ac473e","unresolved":true,"context_lines":[{"line_number":473,"context_line":"            for plugin in directory.get_plugins().values():"},{"line_number":474,"context_line":"                periodics \u003d getattr(plugin, \"ovn_maintenance_periodics\", None)"},{"line_number":475,"context_line":"                if periodics and callable(periodics):"},{"line_number":476,"context_line":"                    for periodics in periodics(self._ovn_client):"},{"line_number":477,"context_line":"                        self._maintenance_thread.add_periodics(periodics)"},{"line_number":478,"context_line":"            self._maintenance_thread.start()"},{"line_number":479,"context_line":"            LOG.info(\"Maintenance task thread has started\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"07f3f604_f2da2b2c","line":476,"range":{"start_line":476,"start_character":20,"end_line":476,"end_character":65},"updated":"2025-11-20 10:43:42.000000000","message":"Why this? `periodics` is already a class, not an iterable.\n\nFrom an real-time code analyser: \"Expected type \u0027collections.Iterable\u0027, got \u0027Callable\u0027 instead\"","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"81ec1077e768d10b26528f4f7a2a28c3d0285f68","unresolved":true,"context_lines":[{"line_number":473,"context_line":"            for plugin in directory.get_plugins().values():"},{"line_number":474,"context_line":"                periodics \u003d getattr(plugin, \"ovn_maintenance_periodics\", None)"},{"line_number":475,"context_line":"                if periodics and callable(periodics):"},{"line_number":476,"context_line":"                    for periodics in periodics(self._ovn_client):"},{"line_number":477,"context_line":"                        self._maintenance_thread.add_periodics(periodics)"},{"line_number":478,"context_line":"            self._maintenance_thread.start()"},{"line_number":479,"context_line":"            LOG.info(\"Maintenance task thread has started\")"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ce3cd37_e45f9699","line":476,"range":{"start_line":476,"start_character":20,"end_line":476,"end_character":65},"in_reply_to":"07f3f604_f2da2b2c","updated":"2025-11-20 17:09:21.000000000","message":"I fixed the naming of the original `periodics`. It\u0027s now `for periodics in get_periodics_list(self._ovn_client)`. If `ovn_maintenance_periodics` exists it\u0027s supposed to be a callable that returns a list of periodics objects.","commit_id":"1d9899a6e7bb61fd6581fbf55e4dd0b7f430332c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"20e72e5a90d699002d75d8d3b526531d08a82d40","unresolved":true,"context_lines":[{"line_number":477,"context_line":"        # If `ovn_maintenance_periodics` is implemented it\u0027s expected to"},{"line_number":478,"context_line":"        # return a list of periodics objects that will be added here."},{"line_number":479,"context_line":"        for plugin in directory.get_plugins().values():"},{"line_number":480,"context_line":"            get_periodics_list \u003d getattr(plugin,"},{"line_number":481,"context_line":"                                            \"ovn_maintenance_periodics\","},{"line_number":482,"context_line":"                                            None)"},{"line_number":483,"context_line":"            if get_periodics_list and callable(get_periodics_list):"},{"line_number":484,"context_line":"                for periodics in get_periodics_list(self._ovn_client):"},{"line_number":485,"context_line":"                    self._maintenance_thread.add_periodics(periodics)"},{"line_number":486,"context_line":"        self._maintenance_thread.start()"},{"line_number":487,"context_line":"        LOG.info(\"Maintenance task thread has started\")"},{"line_number":488,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9bfc21a0_5200f9b7","line":485,"range":{"start_line":480,"start_character":12,"end_line":485,"end_character":69},"updated":"2025-11-26 10:43:06.000000000","message":"I\u0027ve reviewed this again. If I was Terry Wilson, I would say \"better say sorry than ask for permission\", so his (accurate) recommendation will be:\n`\n            try:\n                for periodics in plugin.ovn_maintenance_periodics(\n                        self._ovn_client):\n                    self._maintenance_thread.add_periodics(periodics)\n            except AttributeError:\n                pass\n`","commit_id":"2100f033470285312f36cda9f22069d96ac13d38"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"3f2a0aa43e207bf43ad48705a3926e03bb64f585","unresolved":false,"context_lines":[{"line_number":477,"context_line":"        # If `ovn_maintenance_periodics` is implemented it\u0027s expected to"},{"line_number":478,"context_line":"        # return a list of periodics objects that will be added here."},{"line_number":479,"context_line":"        for plugin in directory.get_plugins().values():"},{"line_number":480,"context_line":"            get_periodics_list \u003d getattr(plugin,"},{"line_number":481,"context_line":"                                            \"ovn_maintenance_periodics\","},{"line_number":482,"context_line":"                                            None)"},{"line_number":483,"context_line":"            if get_periodics_list and callable(get_periodics_list):"},{"line_number":484,"context_line":"                for periodics in get_periodics_list(self._ovn_client):"},{"line_number":485,"context_line":"                    self._maintenance_thread.add_periodics(periodics)"},{"line_number":486,"context_line":"        self._maintenance_thread.start()"},{"line_number":487,"context_line":"        LOG.info(\"Maintenance task thread has started\")"},{"line_number":488,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"92b06ac8_62e81770","line":485,"range":{"start_line":480,"start_character":12,"end_line":485,"end_character":69},"in_reply_to":"9bfc21a0_5200f9b7","updated":"2025-11-26 13:22:15.000000000","message":"I applied this suggestion","commit_id":"2100f033470285312f36cda9f22069d96ac13d38"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/maintenance.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2151aca0d03e6cd093305afe9701c1fa73412c40","unresolved":true,"context_lines":[{"line_number":172,"context_line":"        self._nb_idl \u003d self._ovn_client._nb_idl"},{"line_number":173,"context_line":"        self._sb_idl \u003d self._ovn_client._sb_idl"},{"line_number":174,"context_line":"        self._idl \u003d self._nb_idl.idl"},{"line_number":175,"context_line":"        self._idl.set_lock(MAINTENANCE_NB_IDL_LOCK_NAME)"},{"line_number":176,"context_line":"        self._sync_timer \u003d timeutils.StopWatch()"},{"line_number":177,"context_line":"        super().__init__(ovn_client)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ca7f2402_9040d8b8","line":175,"range":{"start_line":175,"start_character":27,"end_line":175,"end_character":55},"updated":"2025-03-14 15:02:37.000000000","message":"Is this change related?\n\nUpdate: ok, I see this constant is used in https://review.opendev.org/c/openstack/neutron-vpnaas/+/939978/2/neutron_vpnaas/services/vpn/ovn/maintenance.py#39. Anything shared between projects should be in neutron-lib.\n\nFor now that could work but please add a TODO note to move it.","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"b3bf4655897fa8724f71f2def2428b67082b0014","unresolved":false,"context_lines":[{"line_number":172,"context_line":"        self._nb_idl \u003d self._ovn_client._nb_idl"},{"line_number":173,"context_line":"        self._sb_idl \u003d self._ovn_client._sb_idl"},{"line_number":174,"context_line":"        self._idl \u003d self._nb_idl.idl"},{"line_number":175,"context_line":"        self._idl.set_lock(MAINTENANCE_NB_IDL_LOCK_NAME)"},{"line_number":176,"context_line":"        self._sync_timer \u003d timeutils.StopWatch()"},{"line_number":177,"context_line":"        super().__init__(ovn_client)"},{"line_number":178,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"e515858a_fb99371a","line":175,"range":{"start_line":175,"start_character":27,"end_line":175,"end_character":55},"in_reply_to":"ca7f2402_9040d8b8","updated":"2025-03-14 16:32:26.000000000","message":"added TODO","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovsdb_monitor.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2151aca0d03e6cd093305afe9701c1fa73412c40","unresolved":true,"context_lines":[{"line_number":780,"context_line":""},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"class BaseOvnSbIdl(Ml2OvnIdlBase):"},{"line_number":783,"context_line":"    def __init__(self, remote, schema, **kwargs):"},{"line_number":784,"context_line":"        self.notify_handler \u003d row_event.RowEventHandler()"},{"line_number":785,"context_line":"        super().__init__(remote, schema, **kwargs)"},{"line_number":786,"context_line":""},{"line_number":787,"context_line":"    @classmethod"},{"line_number":788,"context_line":"    def from_server(cls, connection_string, helper):"}],"source_content_type":"text/x-python","patch_set":1,"id":"76873d53_df152651","line":785,"range":{"start_line":783,"start_character":4,"end_line":785,"end_character":50},"updated":"2025-03-14 15:02:37.000000000","message":"Why is this change needed? The maintenance method don\u0027t receive/attend events.","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"},{"author":{"_account_id":31976,"name":"Bodo Petermann","email":"b.petermann@syseleven.de","username":"bpetermann"},"change_message_id":"b3bf4655897fa8724f71f2def2428b67082b0014","unresolved":true,"context_lines":[{"line_number":780,"context_line":""},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"class BaseOvnSbIdl(Ml2OvnIdlBase):"},{"line_number":783,"context_line":"    def __init__(self, remote, schema, **kwargs):"},{"line_number":784,"context_line":"        self.notify_handler \u003d row_event.RowEventHandler()"},{"line_number":785,"context_line":"        super().__init__(remote, schema, **kwargs)"},{"line_number":786,"context_line":""},{"line_number":787,"context_line":"    @classmethod"},{"line_number":788,"context_line":"    def from_server(cls, connection_string, helper):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1379e1ca_0c35569d","line":785,"range":{"start_line":783,"start_character":4,"end_line":785,"end_character":50},"in_reply_to":"76873d53_df152651","updated":"2025-03-14 16:32:26.000000000","message":"the maintenance worker in neutron itself doesn\u0027t need row events. But for neutron-vpnaas my intention is to let periodics check VPN agent states. For that a watch is required that looks for chassis updates.","commit_id":"f96b3175d51391cf4906a798dd4fa184d4e4dfd2"}]}
