)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d0628187534488e36140df5060cabf5c91ccf171","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c86ebfd9_e89fe106","updated":"2025-12-09 15:28:26.000000000","message":"Soft -1","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f042da584cef89e109e07d6c5c898fbec3a320a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e696b272_c2323195","updated":"2025-12-12 08:24:08.000000000","message":"recheck unrelated neutron-tempest-plugin-ovn","commit_id":"62a07e9a89207afaf2614a89b1babba3ad7054c1"}],"neutron_lib/ovn/db_sync.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"72d6edcbbd6c51052abe1d661fe7e78827b2f7b4","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        self._thread \u003d threading.Thread(target\u003dself.do_sync)"},{"line_number":46,"context_line":"        self._thread.start()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_required_mechanism_drivers(cls):"},{"line_number":50,"context_line":"        parent_mech_drivers \u003d set()"},{"line_number":51,"context_line":"        for parent in cls.__bases__:"},{"line_number":52,"context_line":"            parent_mech_drivers |\u003d set(parent._required_mechanism_drivers)"},{"line_number":53,"context_line":"        return list(parent_mech_drivers | set(cls._required_mechanism_drivers))"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @classmethod"},{"line_number":56,"context_line":"    def get_required_service_plugins(cls):"},{"line_number":57,"context_line":"        parent_svc_plugins \u003d set()"},{"line_number":58,"context_line":"        for parent in cls.__bases__:"},{"line_number":59,"context_line":"            parent_svc_plugins |\u003d set(parent._required_service_plugins)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return list(parent_svc_plugins | set(cls._required_service_plugins))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @classmethod"},{"line_number":64,"context_line":"    def get_required_ml2_extension_drivers(cls):"},{"line_number":65,"context_line":"        parent_ext_drivers \u003d set()"},{"line_number":66,"context_line":"        for parent in cls.__bases__:"},{"line_number":67,"context_line":"            parent_ext_drivers |\u003d set(parent._required_ml2_ext_drivers)"},{"line_number":68,"context_line":"        return list(parent_ext_drivers | set(cls._required_ml2_ext_drivers))"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    @abc.abstractmethod"},{"line_number":71,"context_line":"    def do_sync(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"b699afe9_20aacea2","line":68,"range":{"start_line":48,"start_character":0,"end_line":68,"end_character":76},"updated":"2025-12-10 14:03:03.000000000","message":"There is some code duplication, maybe a generic parametrized method and then call that\n```\n@classmethod\ndef _get_parent_class_attribute(cls, cls_attr):\n    parent_ext_drivers \u003d set()\n        for parent in cls.__bases__:\n            parent_ext_drivers |\u003d set(getattr(parent, cls_attr, set()))\n        return list(parent_ext_drivers | getattr(cls, cls_attr, set()))\n        \n@classmethod\ndef get_required_mechanism_drivers(cls):\n    return cls._get_parent_class_attributes(\u0027_required_mechanism_drivers\u0027)\n    \n@classmethod\ndef get_required_service_plugins(cls):\n    return cls._get_parent_class_attributes(\u0027_required_service_plugins)\u0027)    \n```","commit_id":"de12965091e1a15609fa40f4c84993f179d985d8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"47f8ccd226a5385f46e48e16969466338423164b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self._thread \u003d threading.Thread(target\u003dself.do_sync)"},{"line_number":46,"context_line":"        self._thread.start()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_required_mechanism_drivers(cls):"},{"line_number":50,"context_line":"        parent_mech_drivers \u003d set()"},{"line_number":51,"context_line":"        for parent in cls.__bases__:"},{"line_number":52,"context_line":"            parent_mech_drivers |\u003d set(parent._required_mechanism_drivers)"},{"line_number":53,"context_line":"        return list(parent_mech_drivers | set(cls._required_mechanism_drivers))"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    @classmethod"},{"line_number":56,"context_line":"    def get_required_service_plugins(cls):"},{"line_number":57,"context_line":"        parent_svc_plugins \u003d set()"},{"line_number":58,"context_line":"        for parent in cls.__bases__:"},{"line_number":59,"context_line":"            parent_svc_plugins |\u003d set(parent._required_service_plugins)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return list(parent_svc_plugins | set(cls._required_service_plugins))"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @classmethod"},{"line_number":64,"context_line":"    def get_required_ml2_extension_drivers(cls):"},{"line_number":65,"context_line":"        parent_ext_drivers \u003d set()"},{"line_number":66,"context_line":"        for parent in cls.__bases__:"},{"line_number":67,"context_line":"            parent_ext_drivers |\u003d set(parent._required_ml2_ext_drivers)"},{"line_number":68,"context_line":"        return list(parent_ext_drivers | set(cls._required_ml2_ext_drivers))"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    @abc.abstractmethod"},{"line_number":71,"context_line":"    def do_sync(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"cb2900e2_85d1e8f1","line":68,"range":{"start_line":48,"start_character":0,"end_line":68,"end_character":76},"in_reply_to":"b699afe9_20aacea2","updated":"2025-12-10 15:35:38.000000000","message":"Done","commit_id":"de12965091e1a15609fa40f4c84993f179d985d8"}],"neutron_lib/ovn/ovn_db_sync.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c04d61622d8eeef0e8ac2d9a3719d31e1b9d65c3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d5c7db26_f8f4a365","updated":"2025-12-09 17:05:03.000000000","message":"supernit: Maybe remove `ovn_` from the module name as it\u0027s already in the `ovn` package.","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"29a88c3413fef2fc9bbc7bfa9381e98c8301e00d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c67478af_947b55f3","in_reply_to":"d5c7db26_f8f4a365","updated":"2025-12-10 13:51:09.000000000","message":"Done","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d0628187534488e36140df5060cabf5c91ccf171","unresolved":true,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class BaseOvnDbSynchronizer(metaclass\u003dabc.ABCMeta):"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    _required_mechanism_drivers \u003d []"},{"line_number":21,"context_line":"    _required_service_plugins \u003d []"},{"line_number":22,"context_line":"    _required_ml2_ext_drivers \u003d []"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"64b3384c_cd172815","line":20,"range":{"start_line":20,"start_character":4,"end_line":20,"end_character":31},"updated":"2025-12-09 15:28:26.000000000","message":"nit: should this have, by default, `[\u0027ovn\u0027]`?","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"29a88c3413fef2fc9bbc7bfa9381e98c8301e00d","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"class BaseOvnDbSynchronizer(metaclass\u003dabc.ABCMeta):"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"    _required_mechanism_drivers \u003d []"},{"line_number":21,"context_line":"    _required_service_plugins \u003d []"},{"line_number":22,"context_line":"    _required_ml2_ext_drivers \u003d []"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5aae8e02_d136c1ad","line":20,"range":{"start_line":20,"start_character":4,"end_line":20,"end_character":31},"in_reply_to":"64b3384c_cd172815","updated":"2025-12-10 13:51:09.000000000","message":"actually if you look at the existing code: https://github.com/openstack/neutron/blob/master/neutron/cmd/ovn/neutron_ovn_db_sync_util.py#L204 you will see that \u0027ovn\u0027 is not needed. It only requires \u0027ovn-sync\u0027 mech driver. But I can add it here","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d0628187534488e36140df5060cabf5c91ccf171","unresolved":true,"context_lines":[{"line_number":21,"context_line":"    _required_service_plugins \u003d []"},{"line_number":22,"context_line":"    _required_ml2_ext_drivers \u003d []"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def __init__(self, core_plugin, ovn_driver, mode, is_maintenance\u003dFalse):"},{"line_number":25,"context_line":"        self.core_plugin \u003d core_plugin"},{"line_number":26,"context_line":"        self.ovn_nb_api \u003d ovn_driver.nb_ovn"},{"line_number":27,"context_line":"        self.ovn_sb_api \u003d ovn_driver.sb_ovn"}],"source_content_type":"text/x-python","patch_set":1,"id":"5e681163_5954aaf3","line":24,"range":{"start_line":24,"start_character":48,"end_line":24,"end_character":52},"updated":"2025-12-09 15:28:26.000000000","message":"What is this parameter? Can you add a signature description in this method?","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"29a88c3413fef2fc9bbc7bfa9381e98c8301e00d","unresolved":true,"context_lines":[{"line_number":21,"context_line":"    _required_service_plugins \u003d []"},{"line_number":22,"context_line":"    _required_ml2_ext_drivers \u003d []"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def __init__(self, core_plugin, ovn_driver, mode, is_maintenance\u003dFalse):"},{"line_number":25,"context_line":"        self.core_plugin \u003d core_plugin"},{"line_number":26,"context_line":"        self.ovn_nb_api \u003d ovn_driver.nb_ovn"},{"line_number":27,"context_line":"        self.ovn_sb_api \u003d ovn_driver.sb_ovn"}],"source_content_type":"text/x-python","patch_set":1,"id":"820a81aa_78a77759","line":24,"range":{"start_line":24,"start_character":48,"end_line":24,"end_character":52},"in_reply_to":"5e681163_5954aaf3","updated":"2025-12-10 13:51:09.000000000","message":"This is mode in which script is run, like \"log\", \"repair\", \"off\" or \"migrate. Basically those are parameters which were previously defined in https://github.com/openstack/neutron/blob/master/neutron/plugins/ml2/drivers/ovn/mech_driver/ovsdb/ovn_db_sync.py#L76\nThe difference is that in classes in Neutron, we had \"ovn_api\", \"sb_ovn\" and \"ovn_driver\" but actually those two clients for the ovn_nb and sb dbs are in ovn_driver so I shortened list of the parameters a bit.\nI added doc string to the __init__ method.","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0d0bf8070f4546d7f11cf15dbc522ff27629a290","unresolved":false,"context_lines":[{"line_number":21,"context_line":"    _required_service_plugins \u003d []"},{"line_number":22,"context_line":"    _required_ml2_ext_drivers \u003d []"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    def __init__(self, core_plugin, ovn_driver, mode, is_maintenance\u003dFalse):"},{"line_number":25,"context_line":"        self.core_plugin \u003d core_plugin"},{"line_number":26,"context_line":"        self.ovn_nb_api \u003d ovn_driver.nb_ovn"},{"line_number":27,"context_line":"        self.ovn_sb_api \u003d ovn_driver.sb_ovn"}],"source_content_type":"text/x-python","patch_set":1,"id":"3148c881_12881870","line":24,"range":{"start_line":24,"start_character":48,"end_line":24,"end_character":52},"in_reply_to":"820a81aa_78a77759","updated":"2025-12-11 12:08:53.000000000","message":"Done","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"c04d61622d8eeef0e8ac2d9a3719d31e1b9d65c3","unresolved":true,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def get_required_mechanism_drivers(cls):"},{"line_number":40,"context_line":"        return cls._required_mechanism_drivers"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @classmethod"},{"line_number":43,"context_line":"    def get_required_service_plugins(cls):"}],"source_content_type":"text/x-python","patch_set":1,"id":"23342af2_980cf2f0","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":8},"updated":"2025-12-09 17:05:03.000000000","message":"Should this iterate over all parent classes and return a merge of all lists? Example:\n```\nclass MySync(BaseOvnDbSynchronizer):\n    _required_mechanism_drivers \u003d [\u0027ovn\u0027]\n    \nclass MyMyDriverSync(MySync):\n    _required_mechanism_drivers \u003d [\u0027my-driver\u0027]\n```\n\nThe `MyMyDriverSync.get_required_mechanism_drivers()` now returns `[\u0027my-driver\u0027]` only but since the class inherited from `MySync` it would make sense to include `ovn` there too?","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"29a88c3413fef2fc9bbc7bfa9381e98c8301e00d","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    @classmethod"},{"line_number":39,"context_line":"    def get_required_mechanism_drivers(cls):"},{"line_number":40,"context_line":"        return cls._required_mechanism_drivers"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @classmethod"},{"line_number":43,"context_line":"    def get_required_service_plugins(cls):"}],"source_content_type":"text/x-python","patch_set":1,"id":"0e65f4cc_cd8cdb58","line":40,"range":{"start_line":40,"start_character":0,"end_line":40,"end_character":8},"in_reply_to":"23342af2_980cf2f0","updated":"2025-12-10 13:51:09.000000000","message":"Done","commit_id":"051fc2052c1fe213a26f4c9880f78523d201e595"}],"neutron_lib/tests/unit/ovn/test_db_sync.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0d0bf8070f4546d7f11cf15dbc522ff27629a290","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                         DummySynchronizer."},{"line_number":101,"context_line":"                         get_required_ml2_extension_drivers())"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    def test_multi_level_inheritance(self):"},{"line_number":104,"context_line":"        class FirstLevelSynchronizer(db_sync.BaseOvnDbSynchronizer):"},{"line_number":105,"context_line":"            _required_mechanism_drivers \u003d [\u0027driver1\u0027, \u0027driver2\u0027]"},{"line_number":106,"context_line":"            _required_service_plugins \u003d [\u0027plugin1\u0027]"}],"source_content_type":"text/x-python","patch_set":5,"id":"146bba4f_96526f6a","line":103,"range":{"start_line":103,"start_character":8,"end_line":103,"end_character":36},"updated":"2025-12-11 12:08:53.000000000","message":"+1","commit_id":"35173adfb989f08e7fc2fe55b355a5def9814d5c"}],"releasenotes/notes/Add-base-ovn-db-synchronizer-class-ad5416b650dc96d5.yaml":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"abf95329f7e3df373f29c3b7bccd7fba05f24593","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    New base class ``ovn.ovn_db_sync.BaseOvnDbSynchronizer`` was added. This new"},{"line_number":5,"context_line":"    class should be used by the projects providing sync plugins for the"},{"line_number":6,"context_line":"    ovn_db_sync CLI tool."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"324034f0_a468c926","line":4,"range":{"start_line":4,"start_character":25,"end_line":4,"end_character":36},"updated":"2025-12-10 15:38:50.000000000","message":"`db_sync` :-p","commit_id":"28e48e77f97d97b8075aa975d3ce7d9388a5b933"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"0d0bf8070f4546d7f11cf15dbc522ff27629a290","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    New base class ``ovn.ovn_db_sync.BaseOvnDbSynchronizer`` was added. This new"},{"line_number":5,"context_line":"    class should be used by the projects providing sync plugins for the"},{"line_number":6,"context_line":"    ovn_db_sync CLI tool."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"5eff138c_3ba892f8","line":4,"range":{"start_line":4,"start_character":25,"end_line":4,"end_character":36},"in_reply_to":"324034f0_a468c926","updated":"2025-12-11 12:08:53.000000000","message":"Done","commit_id":"28e48e77f97d97b8075aa975d3ce7d9388a5b933"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"047adcfb47ef21e1d4cd63397eaac0b5e372f20f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    New base class ``ovn.ovn_db_sync.BaseOvnDbSynchronizer`` was added. This new"},{"line_number":5,"context_line":"    class should be used by the projects providing sync plugins for the"},{"line_number":6,"context_line":"    ovn_db_sync CLI tool."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"82afcbf4_a76b3f4e","line":4,"range":{"start_line":4,"start_character":25,"end_line":4,"end_character":36},"in_reply_to":"5eff138c_3ba892f8","updated":"2025-12-11 12:53:22.000000000","message":"was not done, but ok 😄","commit_id":"28e48e77f97d97b8075aa975d3ce7d9388a5b933"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4f4a517968d784d07d4a18b807d33242143cde4b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    New base class ``ovn.ovn_db_sync.BaseOvnDbSynchronizer`` was added. This new"},{"line_number":5,"context_line":"    class should be used by the projects providing sync plugins for the"},{"line_number":6,"context_line":"    ovn_db_sync CLI tool."}],"source_content_type":"text/x-yaml","patch_set":3,"id":"2e900a30_1271db10","line":4,"range":{"start_line":4,"start_character":25,"end_line":4,"end_character":36},"in_reply_to":"82afcbf4_a76b3f4e","updated":"2025-12-11 13:00:48.000000000","message":"sorry, I forgot about it 😊","commit_id":"28e48e77f97d97b8075aa975d3ce7d9388a5b933"}]}
