)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"3bc3ab9c7905c96e3db753aacf01116c5f1c1d41","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"ad632341_463c9e80","updated":"2022-02-25 08:32:51.000000000","message":"Code looks good! Waiting for the testing/documentation","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"2faf3b7c5d82c192e67edc488a6a71d84de5bcc4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"1033173c_70de5061","updated":"2022-02-24 07:50:21.000000000","message":"I know it is a WIP, but got curious about it, just left a nit and one question","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"}],"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":"a578ce4f6a5c77d97f64a31850e529b50684fa2e","unresolved":true,"context_lines":[{"line_number":597,"context_line":"        super().__init__(events, table, None)"},{"line_number":598,"context_line":"        self.event_name \u003d \u0027PortBindingUpdateVirtualPortsEvent\u0027"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":601,"context_line":"        if (row.type !\u003d ovn_const.PB_TYPE_VIRTUAL and"},{"line_number":602,"context_line":"                getattr(old, \u0027type\u0027, None) !\u003d ovn_const.PB_TYPE_VIRTUAL):"},{"line_number":603,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"69b89d35_ff2cdc04","line":600,"range":{"start_line":600,"start_character":38,"end_line":600,"end_character":40},"updated":"2022-02-25 08:40:53.000000000","message":"Comment this logic","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"023975e0e83f0f7ac5aa77ec9a2ea0e69555803e","unresolved":false,"context_lines":[{"line_number":597,"context_line":"        super().__init__(events, table, None)"},{"line_number":598,"context_line":"        self.event_name \u003d \u0027PortBindingUpdateVirtualPortsEvent\u0027"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":601,"context_line":"        if (row.type !\u003d ovn_const.PB_TYPE_VIRTUAL and"},{"line_number":602,"context_line":"                getattr(old, \u0027type\u0027, None) !\u003d ovn_const.PB_TYPE_VIRTUAL):"},{"line_number":603,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":1,"id":"7cada3f2_fa51f905","line":600,"range":{"start_line":600,"start_character":38,"end_line":600,"end_character":40},"in_reply_to":"69b89d35_ff2cdc04","updated":"2022-02-25 17:49:51.000000000","message":"Done","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"2faf3b7c5d82c192e67edc488a6a71d84de5bcc4","unresolved":true,"context_lines":[{"line_number":598,"context_line":"        self.event_name \u003d \u0027PortBindingUpdateVirtualPortsEvent\u0027"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":601,"context_line":"        if (row.type !\u003d ovn_const.PB_TYPE_VIRTUAL and"},{"line_number":602,"context_line":"                getattr(old, \u0027type\u0027, None) !\u003d ovn_const.PB_TYPE_VIRTUAL):"},{"line_number":603,"context_line":"            return False"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        virtual_parents \u003d (row.options or {}).get("}],"source_content_type":"text/x-python","patch_set":1,"id":"3e831d94_d958e000","line":602,"range":{"start_line":601,"start_character":1,"end_line":602,"end_character":73},"updated":"2022-02-24 07:50:21.000000000","message":"what is the reason behind this \"and\", you want to check the port type is virtual and it was virtual before too? So, if it is now virtual and before it was not, there is no need to bind it?","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"32113ec59c787e9a98492b52a2f9f6ce1c79ff58","unresolved":true,"context_lines":[{"line_number":598,"context_line":"        self.event_name \u003d \u0027PortBindingUpdateVirtualPortsEvent\u0027"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":601,"context_line":"        if (row.type !\u003d ovn_const.PB_TYPE_VIRTUAL and"},{"line_number":602,"context_line":"                getattr(old, \u0027type\u0027, None) !\u003d ovn_const.PB_TYPE_VIRTUAL):"},{"line_number":603,"context_line":"            return False"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        virtual_parents \u003d (row.options or {}).get("}],"source_content_type":"text/x-python","patch_set":1,"id":"9122f874_d8c8e342","line":602,"range":{"start_line":601,"start_character":1,"end_line":602,"end_character":73},"in_reply_to":"0be875b2_ff1f095c","updated":"2022-02-25 08:16:35.000000000","message":"Ohh, I see, I think I now understand it! Thanks for the awesome explanation! We only want to react to it once the chassis is added (to add the binding).","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d038876a8f570d379372229724bff7c683743011","unresolved":true,"context_lines":[{"line_number":598,"context_line":"        self.event_name \u003d \u0027PortBindingUpdateVirtualPortsEvent\u0027"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":601,"context_line":"        if (row.type !\u003d ovn_const.PB_TYPE_VIRTUAL and"},{"line_number":602,"context_line":"                getattr(old, \u0027type\u0027, None) !\u003d ovn_const.PB_TYPE_VIRTUAL):"},{"line_number":603,"context_line":"            return False"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        virtual_parents \u003d (row.options or {}).get("}],"source_content_type":"text/x-python","patch_set":1,"id":"59acc174_0ebf96c6","line":602,"range":{"start_line":601,"start_character":1,"end_line":602,"end_character":73},"in_reply_to":"3e831d94_d958e000","updated":"2022-02-24 08:18:31.000000000","message":"I\u0027ll document it. The VIP port, before the IP address is assigned to another one as allowed address pair, has type \"\". When a new virtual parent is assigned, the type \"virtual\" is assigned too. If all virtual parents are removed, the type is removed too.\n\nWe need to detect when the new and old types are \"virtual\"\n\nhttps://paste.opendev.org/show/bAuJO1E747Glx6wTol5N/","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8e1d925363c218214517da7a574d907b273e49ba","unresolved":true,"context_lines":[{"line_number":598,"context_line":"        self.event_name \u003d \u0027PortBindingUpdateVirtualPortsEvent\u0027"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":601,"context_line":"        if (row.type !\u003d ovn_const.PB_TYPE_VIRTUAL and"},{"line_number":602,"context_line":"                getattr(old, \u0027type\u0027, None) !\u003d ovn_const.PB_TYPE_VIRTUAL):"},{"line_number":603,"context_line":"            return False"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        virtual_parents \u003d (row.options or {}).get("}],"source_content_type":"text/x-python","patch_set":1,"id":"0be875b2_ff1f095c","line":602,"range":{"start_line":601,"start_character":1,"end_line":602,"end_character":73},"in_reply_to":"51c1f65d_361b139d","updated":"2022-02-24 17:30:36.000000000","message":"Sorry Luis, I don\u0027t get you here. Let me explain the logic implemented. Ping me in IRC if something is not clear.\n\nThere are three main events here (but we only need two in this feature):\n1) When the allowed address pair is updated. The VIP \"Port_Binding\" register is updated. The \"virtual-parents\" list and the \"type\" are updated at the same time. But we don\u0027t care about it.\n\n2) The other way around, when all allowed address pairs are removed. The \"virtual-parents\" key is removed from \"options\" and \"type\" is unset (actually \"\" is written). We use this event to remove any Neutron DB portbinding \"host\" field (NOTE: actually the portbinding register cannot be updated, we remove it and create a new one with the updated host, but this is irrelevant here).\n\n3) After (1), when \"virtual-parents\" have at least one LSP, if traffic from/to this VIP address is detected, the \"Port_Binding\" register is updated with the \"chassis\" hosting the port receiving/sending this traffic. We use this event to update the Neutron DB portbinding \"host\" field.","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"5edfb730fe18218a86ae46ff10866e92dd30cf0c","unresolved":true,"context_lines":[{"line_number":598,"context_line":"        self.event_name \u003d \u0027PortBindingUpdateVirtualPortsEvent\u0027"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":601,"context_line":"        if (row.type !\u003d ovn_const.PB_TYPE_VIRTUAL and"},{"line_number":602,"context_line":"                getattr(old, \u0027type\u0027, None) !\u003d ovn_const.PB_TYPE_VIRTUAL):"},{"line_number":603,"context_line":"            return False"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        virtual_parents \u003d (row.options or {}).get("}],"source_content_type":"text/x-python","patch_set":1,"id":"51c1f65d_361b139d","line":602,"range":{"start_line":601,"start_character":1,"end_line":602,"end_character":73},"in_reply_to":"59acc174_0ebf96c6","updated":"2022-02-24 08:24:27.000000000","message":"Thanks for the explanation!\n\nI still have a doubt (most probably me missing something again). When the IP is assigned as allowed address pair (and therefore moving from \"\" to \"virtual\", don\u0027t we want to also update the port binding? And the same for the other way around, we would like to remove the binding details in case the port goes from virtual to \"\" (though perhaps that is automatically done by other event noticing the update on the port binding for \"\" type.","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"023975e0e83f0f7ac5aa77ec9a2ea0e69555803e","unresolved":false,"context_lines":[{"line_number":598,"context_line":"        self.event_name \u003d \u0027PortBindingUpdateVirtualPortsEvent\u0027"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def match_fn(self, event, row, old):"},{"line_number":601,"context_line":"        if (row.type !\u003d ovn_const.PB_TYPE_VIRTUAL and"},{"line_number":602,"context_line":"                getattr(old, \u0027type\u0027, None) !\u003d ovn_const.PB_TYPE_VIRTUAL):"},{"line_number":603,"context_line":"            return False"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"        virtual_parents \u003d (row.options or {}).get("}],"source_content_type":"text/x-python","patch_set":1,"id":"6e766cd1_2f5c5686","line":602,"range":{"start_line":601,"start_character":1,"end_line":602,"end_character":73},"in_reply_to":"9122f874_d8c8e342","updated":"2022-02-25 17:49:51.000000000","message":"Done","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a578ce4f6a5c77d97f64a31850e529b50684fa2e","unresolved":true,"context_lines":[{"line_number":611,"context_line":""},{"line_number":612,"context_line":"        if virtual_parents and chassis !\u003d old_chassis:"},{"line_number":613,"context_line":"            # That happens when the chassis is assigned (VIP is first detected"},{"line_number":614,"context_line":"            # in a port), changed (the VIP changes of assigned port and"},{"line_number":615,"context_line":"            # host)."},{"line_number":616,"context_line":"            return True"},{"line_number":617,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"8ca199ca_b669c778","line":614,"range":{"start_line":614,"start_character":24,"end_line":614,"end_character":33},"updated":"2022-02-25 08:40:53.000000000","message":"s/, changed/or changed","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6a05f49213811728b758b9af2281690d7d3424c1","unresolved":false,"context_lines":[{"line_number":611,"context_line":""},{"line_number":612,"context_line":"        if virtual_parents and chassis !\u003d old_chassis:"},{"line_number":613,"context_line":"            # That happens when the chassis is assigned (VIP is first detected"},{"line_number":614,"context_line":"            # in a port), changed (the VIP changes of assigned port and"},{"line_number":615,"context_line":"            # host)."},{"line_number":616,"context_line":"            return True"},{"line_number":617,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9be0c8c2_eb85feb0","line":614,"range":{"start_line":614,"start_character":24,"end_line":614,"end_character":33},"in_reply_to":"8ca199ca_b669c778","updated":"2022-02-25 17:49:27.000000000","message":"Done","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"2faf3b7c5d82c192e67edc488a6a71d84de5bcc4","unresolved":true,"context_lines":[{"line_number":625,"context_line":"            ovn_const.LSP_OPTIONS_VIRTUAL_PARENTS_KEY)"},{"line_number":626,"context_line":"        chassis_uuid \u003d (row.chassis[0].uuid if"},{"line_number":627,"context_line":"                        row.chassis and virtual_parents else None)"},{"line_number":628,"context_line":"        self.driver.bind_virtual_port(row.logical_port, chassis_uuid)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"class FIPAddDeleteEvent(row_event.RowEvent):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ed95374f_e0aabc0f","line":628,"range":{"start_line":628,"start_character":8,"end_line":628,"end_character":69},"updated":"2022-02-24 07:50:21.000000000","message":"this is not always about binding the virtual port, right? perhaps better to name it something like update_virtual_port_binding","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6a05f49213811728b758b9af2281690d7d3424c1","unresolved":false,"context_lines":[{"line_number":625,"context_line":"            ovn_const.LSP_OPTIONS_VIRTUAL_PARENTS_KEY)"},{"line_number":626,"context_line":"        chassis_uuid \u003d (row.chassis[0].uuid if"},{"line_number":627,"context_line":"                        row.chassis and virtual_parents else None)"},{"line_number":628,"context_line":"        self.driver.bind_virtual_port(row.logical_port, chassis_uuid)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"class FIPAddDeleteEvent(row_event.RowEvent):"}],"source_content_type":"text/x-python","patch_set":1,"id":"b6e0e318_587760e0","line":628,"range":{"start_line":628,"start_character":8,"end_line":628,"end_character":69},"in_reply_to":"8dd918dd_bc455da1","updated":"2022-02-25 17:49:27.000000000","message":"Done","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"d038876a8f570d379372229724bff7c683743011","unresolved":true,"context_lines":[{"line_number":625,"context_line":"            ovn_const.LSP_OPTIONS_VIRTUAL_PARENTS_KEY)"},{"line_number":626,"context_line":"        chassis_uuid \u003d (row.chassis[0].uuid if"},{"line_number":627,"context_line":"                        row.chassis and virtual_parents else None)"},{"line_number":628,"context_line":"        self.driver.bind_virtual_port(row.logical_port, chassis_uuid)"},{"line_number":629,"context_line":""},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"class FIPAddDeleteEvent(row_event.RowEvent):"}],"source_content_type":"text/x-python","patch_set":1,"id":"8dd918dd_bc455da1","line":628,"range":{"start_line":628,"start_character":8,"end_line":628,"end_character":69},"in_reply_to":"ed95374f_e0aabc0f","updated":"2022-02-24 08:18:31.000000000","message":"Agree, this name is misleading (this is because I was \"playing\" with the binding port method before that).","commit_id":"cb9d3fdefe593e450d71df6666cd6530b79bf074"}],"neutron/tests/functional/plugins/ml2/drivers/ovn/mech_driver/ovsdb/test_ovsdb_monitor.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"39d4359da4add02025154900d3a36fe765d726e4","unresolved":true,"context_lines":[{"line_number":86,"context_line":"        self.l3_plugin \u003d directory.get_plugin(plugin_constants.L3)"},{"line_number":87,"context_line":"        self.net \u003d self._make_network(self.fmt, \u0027net1\u0027, True)"},{"line_number":88,"context_line":"        self._make_subnet(self.fmt, self.net, \u002720.0.0.1\u0027, \u002720.0.0.0/24\u0027,"},{"line_number":89,"context_line":"                          ip_version\u003d4)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def create_port(self, device_owner\u003d\u0027compute:nova\u0027, host\u003d\u0027ovs-host1\u0027,"},{"line_number":92,"context_line":"                    allowed_address_pairs\u003dNone):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5cd3cd2a_8a29ba48","line":89,"range":{"start_line":89,"start_character":37,"end_line":89,"end_character":38},"updated":"2022-03-14 09:47:47.000000000","message":"nitty nit: please use constant from neutron-lib here 😊\nIt can be changed in the follow-up patch too but would be good to change it","commit_id":"bdbabdf362a0755fa5a86222a7a223c727f0ec4e"}]}
