)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"cccd59266a1c4533729cca401f62023f5451faef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"c759af02_08d68100","updated":"2021-10-22 15:00:25.000000000","message":"This can be implemented inside a ovs-agent extension without changing any existing code in ovs_neutron_agent and rpc. Something similart to the port forwarding implementation:\nhttps://review.opendev.org/c/openstack/neutron/+/533850/35/neutron/agent/l3/extensions/port_forwarding.py#135","commit_id":"d7f243a71a6d22ac8e99e9c530d94271472766c0"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"5d5303903910394ae1397a147b054e81516bddb7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"cf5b7a1e_21a4ec67","in_reply_to":"c759af02_08d68100","updated":"2021-10-22 15:11:15.000000000","message":"Hey Yulong, port forwarding is an l3 agent extension. For l2 agent extension it\u0027s interface is not quite suitable here as it\u0027s about port\u0027s updates. Here we need to handle new resource updates: Local IP Association. It allows to avoid overload port related logic (which is already quite overloaded). Another benefit is that nothing needs to be configured on agent side - if local ip service is not enabled on the server - no local ip updates will be issued.","commit_id":"d7f243a71a6d22ac8e99e9c530d94271472766c0"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"fe5f5f8084f13efb76bf373226e00933a81a43f9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"d0a1bb75_81c46f6c","in_reply_to":"cf5b7a1e_21a4ec67","updated":"2021-10-22 16:23:27.000000000","message":"Port forwarding is an example that can handle resource notifications. I should use L2 agent extension to explain the approach. Ovs-agent has similar extensions, like log [1] and qos [2]. Just adds the new ovo resource to the list [3], then all you need is to receive the update event. No extra changes for RPC files and No new callback methods for ovs-agent main code. So again, port forwarding implementation is a really good example.\n\nThis is a new feature for ovs-agent, so it should be configurable as an agent extension. New features are usually buggy, we can disable it by default. So a service plugin in neutron-server side, and an agent extension in agent side. That\u0027s we had done for many new features, such as port forwarding, log, qos.\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/services/logapi/agent/log_extension.py#L82\n[2] https://github.com/openstack/neutron/blob/master/neutron/agent/l2/extensions/qos.py#L196\n[3] https://github.com/openstack/neutron/blob/master/neutron/api/rpc/callbacks/resources.py#L41","commit_id":"d7f243a71a6d22ac8e99e9c530d94271472766c0"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"806cddce10cb79a53a5217bc2e16a77305fd5655","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"6efe28d6_e796130f","in_reply_to":"d0a1bb75_81c46f6c","updated":"2021-10-26 08:44:27.000000000","message":"Thanks Yulong, I\u0027m checking if agent extension can cover all needed changes for local ip functioning. I\u0027ll come back with results later","commit_id":"d7f243a71a6d22ac8e99e9c530d94271472766c0"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"52e4f2f0409cc5c6a7e918c2b03aaa6c8d5f65a4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"b2b3aa26_a96029d3","updated":"2021-10-28 01:12:18.000000000","message":"One little thing, one same topic is fine to track all related patches. This features now have too many patch topics. I will change all these feature related patches with topic \"local_ip\" which is consistent with the spec: https://review.opendev.org/c/openstack/neutron-specs/+/797798. So everytime new patch set uploaded, please do not forget to update the topic.","commit_id":"4eb06512f1628be43abf6913aabd3a4f96574d09"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"5f3d492fdedbc5c028fa6d94d4018be4a70d6c4b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"7b1aa102_3bcaa04b","updated":"2021-10-27 12:55:49.000000000","message":"Yulong, please check latest version. I agree it looks more clean now, thanks!","commit_id":"4eb06512f1628be43abf6913aabd3a4f96574d09"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"7cf1a0f09e2973371abedf48f40f64bc9979a934","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"9c935df4_4ed2fb98","in_reply_to":"7b1aa102_3bcaa04b","updated":"2021-10-28 01:09:07.000000000","message":"Thanks for updating, yes, it looks better now. Do not forget to add test cases. 😊","commit_id":"4eb06512f1628be43abf6913aabd3a4f96574d09"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"81dcc27bc1ca0f5aa22078029bcd07f3fe0c68a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"51d00a15_6a63158f","in_reply_to":"b2b3aa26_a96029d3","updated":"2021-10-28 01:16:43.000000000","message":"Sorry, there are 2 patches which have \"bug/1930200\". Since spec is not the real working code, so topic \"bug/1930200\" should be fine to trace all code.","commit_id":"4eb06512f1628be43abf6913aabd3a4f96574d09"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"5649d044685763df1433c58fa7848db6ffe6114b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"c6f7ed83_17e27a81","updated":"2021-10-28 13:06:44.000000000","message":"UT to be added","commit_id":"91073d6349808133ff00bb6112660cb4e0b3aee7"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"de8558e8a8aadca428bd18898cac4bd764d0fe39","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"a7f1234f_f13dd831","updated":"2021-11-02 15:02:28.000000000","message":"recheck","commit_id":"0d1707d3a484a9e68329046a8511838b086f29a6"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3259b3e6e8d6a18e76100230ab9f33d5c4a4ec94","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"3eb11ae4_fe238f42","updated":"2021-11-09 08:37:25.000000000","message":"The entire implementation order should be:\n1. neutron-server side (API/DB/plugin) works with some resource notification changes\n2. \"Add Local IP L2 extension flows\" which only added helper functions on br-int\n3. \"Add Local IP L2 extension\" which add the whole extension, the new extension will use the flow functions on br-int\n4. policy works\n5. test works\n...","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"6d9496aa89c7ce5414b2396d420f3669348d32da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"6ed522cd_357d5d1c","updated":"2021-11-09 07:25:15.000000000","message":"recheck","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"573e96571a4c06779c340e4e92c7f7ca4b6a00a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"f482c71f_7959da04","updated":"2021-11-09 09:50:24.000000000","message":"recheck","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"f5462258fd8bd26233b9a7a9b5fee115ae9d0938","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":23,"id":"c119fdb0_6a1cb577","in_reply_to":"3eb11ae4_fe238f42","updated":"2021-11-09 09:14:03.000000000","message":"Hi Yulong. In implementation I tend to stick to the following principle: only add code that is needed in current patch. This makes review easier IMO - you don\u0027t need to open other patches to figure out how this code will be used. Thus I\u0027d prefer to stay with current order: \n\n 1) API/DB patch only has code needed for API/DB to work\n 2) Agent extension patch adds mechanism for server \u003c-\u003e agent communication on Local IPs\n 3) Agent flows patch: fills agent extension with actual flows logic.\n\nPlease share your opinion, what are major drawbacks with this approach? Is it a blocking issue?","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"c804991e8057fb4db08efc2a08cf6852587d998a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"68ab92a5_b350ef29","updated":"2021-11-11 07:27:20.000000000","message":"Commit message was updated to better explain my intent of this patch chain.","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d4097afd1540354bf58802c188440045f1a80d96","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"756cb938_d794234b","updated":"2021-11-30 10:25:04.000000000","message":"Nice :)","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"5f8ecc67dd6562c362b9a8e2517f1b4763bc34a6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"18bdeb35_58fead95","updated":"2021-11-30 13:07:32.000000000","message":"recheck","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"d9fb9b8a52befadf51cc5f287820a573399ead88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"310837a6_1fac6966","updated":"2021-11-12 07:33:50.000000000","message":"recheck","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"4468fbc11ff52f70f21507f11fb3468554be5a27","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"42495d09_9518acf9","updated":"2021-11-12 14:23:02.000000000","message":"recheck","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"37f5e3782650f254c83cfc699d2da0667a6c7980","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"d22c0aa8_6348e74d","updated":"2021-11-11 10:59:49.000000000","message":"recheck","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"b43a029b0a04bac0ec359a695334ff8f46c21bd1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"d88b1b80_38c744ad","updated":"2021-11-11 15:08:56.000000000","message":"recheck","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"}],"neutron/agent/l2/extensions/local_ip.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8593e0e446e38a96c05724b1b0a3c53b12b8eaa6","unresolved":true,"context_lines":[{"line_number":87,"context_line":"    def _handle_notification(self, context, resource_type,"},{"line_number":88,"context_line":"                             local_ip_associations, event_type):"},{"line_number":89,"context_line":"        if resource_type !\u003d resources.LOCAL_IP_ASSOCIATION:"},{"line_number":90,"context_line":"            LOG.warning(\"Only Local IP Association notifications supported, \""},{"line_number":91,"context_line":"                        \" got: %s\", resource_type)"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"4799ccd7_d83f64ed","line":90,"range":{"start_line":90,"start_character":64,"end_line":90,"end_character":74},"updated":"2021-11-08 10:54:00.000000000","message":"nitty nit: shouldn\u0027t be \"are supported\"?","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"624f55a1e70ca5c121e938ddc0589fec59ebbda8","unresolved":false,"context_lines":[{"line_number":87,"context_line":"    def _handle_notification(self, context, resource_type,"},{"line_number":88,"context_line":"                             local_ip_associations, event_type):"},{"line_number":89,"context_line":"        if resource_type !\u003d resources.LOCAL_IP_ASSOCIATION:"},{"line_number":90,"context_line":"            LOG.warning(\"Only Local IP Association notifications supported, \""},{"line_number":91,"context_line":"                        \" got: %s\", resource_type)"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"cfe1e1ce_e6c3dbe3","line":90,"range":{"start_line":90,"start_character":64,"end_line":90,"end_character":74},"in_reply_to":"4799ccd7_d83f64ed","updated":"2021-11-08 11:56:01.000000000","message":"Done","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8593e0e446e38a96c05724b1b0a3c53b12b8eaa6","unresolved":true,"context_lines":[{"line_number":88,"context_line":"                             local_ip_associations, event_type):"},{"line_number":89,"context_line":"        if resource_type !\u003d resources.LOCAL_IP_ASSOCIATION:"},{"line_number":90,"context_line":"            LOG.warning(\"Only Local IP Association notifications supported, \""},{"line_number":91,"context_line":"                        \" got: %s\", resource_type)"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        LOG.info(\"Local IP Association notification received: %s, %s\","}],"source_content_type":"text/x-python","patch_set":20,"id":"2a5ed987_da2c0785","line":91,"range":{"start_line":91,"start_character":25,"end_line":91,"end_character":26},"updated":"2021-11-08 10:54:00.000000000","message":"nitty nit: this space is not needed","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"624f55a1e70ca5c121e938ddc0589fec59ebbda8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                             local_ip_associations, event_type):"},{"line_number":89,"context_line":"        if resource_type !\u003d resources.LOCAL_IP_ASSOCIATION:"},{"line_number":90,"context_line":"            LOG.warning(\"Only Local IP Association notifications supported, \""},{"line_number":91,"context_line":"                        \" got: %s\", resource_type)"},{"line_number":92,"context_line":"            return"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        LOG.info(\"Local IP Association notification received: %s, %s\","}],"source_content_type":"text/x-python","patch_set":20,"id":"e1a82eb4_60fed098","line":91,"range":{"start_line":91,"start_character":25,"end_line":91,"end_character":26},"in_reply_to":"2a5ed987_da2c0785","updated":"2021-11-08 11:56:01.000000000","message":"Done","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8593e0e446e38a96c05724b1b0a3c53b12b8eaa6","unresolved":true,"context_lines":[{"line_number":104,"context_line":"                assoc \u003d self.local_ip_associations.pop(assoc.id, None)"},{"line_number":105,"context_line":"                if not assoc:"},{"line_number":106,"context_line":"                    assoc \u003d self.resource_rpc.pull("},{"line_number":107,"context_line":"                        context, resources.LOCAL_IP_ASSOCIATION, assoc_id)"},{"line_number":108,"context_line":"                port_id \u003d assoc.fixed_port_id"},{"line_number":109,"context_line":"                lip_id \u003d assoc.local_ip_id"},{"line_number":110,"context_line":"                self.local_ip_updates[\u0027deleted\u0027][port_id][lip_id] \u003d assoc"}],"source_content_type":"text/x-python","patch_set":20,"id":"1ad220a7_27d976a5","line":107,"updated":"2021-11-08 10:54:00.000000000","message":"if it is deleted will it be still available to pull from server?","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"624f55a1e70ca5c121e938ddc0589fec59ebbda8","unresolved":true,"context_lines":[{"line_number":104,"context_line":"                assoc \u003d self.local_ip_associations.pop(assoc.id, None)"},{"line_number":105,"context_line":"                if not assoc:"},{"line_number":106,"context_line":"                    assoc \u003d self.resource_rpc.pull("},{"line_number":107,"context_line":"                        context, resources.LOCAL_IP_ASSOCIATION, assoc_id)"},{"line_number":108,"context_line":"                port_id \u003d assoc.fixed_port_id"},{"line_number":109,"context_line":"                lip_id \u003d assoc.local_ip_id"},{"line_number":110,"context_line":"                self.local_ip_updates[\u0027deleted\u0027][port_id][lip_id] \u003d assoc"}],"source_content_type":"text/x-python","patch_set":20,"id":"96f2a386_eb49d4d3","line":107,"in_reply_to":"1ad220a7_27d976a5","updated":"2021-11-08 11:56:01.000000000","message":"Good catch :)","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"d4097afd1540354bf58802c188440045f1a80d96","unresolved":true,"context_lines":[{"line_number":85,"context_line":"    def _handle_notification(self, context, resource_type,"},{"line_number":86,"context_line":"                             local_ip_associations, event_type):"},{"line_number":87,"context_line":"        if resource_type !\u003d resources.LOCAL_IP_ASSOCIATION:"},{"line_number":88,"context_line":"            LOG.warning(\"Only Local IP Association notifications are \""},{"line_number":89,"context_line":"                        \"supported, got: %s\", resource_type)"},{"line_number":90,"context_line":"            return"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        LOG.info(\"Local IP Association notification received: %s, %s\","}],"source_content_type":"text/x-python","patch_set":25,"id":"ba2d44ef_e991b57f","line":89,"range":{"start_line":88,"start_character":12,"end_line":89,"end_character":60},"updated":"2021-11-30 10:25:04.000000000","message":"nit: don\u0027t this will spam the log? or otherwise it can\u0027t happen that the resource_type is not LOCAL_IP_ASSOCIATION","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"54a664d84d27ac02d3e6b5c029da1b325230cce7","unresolved":true,"context_lines":[{"line_number":85,"context_line":"    def _handle_notification(self, context, resource_type,"},{"line_number":86,"context_line":"                             local_ip_associations, event_type):"},{"line_number":87,"context_line":"        if resource_type !\u003d resources.LOCAL_IP_ASSOCIATION:"},{"line_number":88,"context_line":"            LOG.warning(\"Only Local IP Association notifications are \""},{"line_number":89,"context_line":"                        \"supported, got: %s\", resource_type)"},{"line_number":90,"context_line":"            return"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        LOG.info(\"Local IP Association notification received: %s, %s\","}],"source_content_type":"text/x-python","patch_set":25,"id":"b2963e81_9b187e84","line":89,"range":{"start_line":88,"start_character":12,"end_line":89,"end_character":60},"in_reply_to":"ba2d44ef_e991b57f","updated":"2021-11-30 11:15:04.000000000","message":"It will not happen unless at some point someone (like me) will mis-code something :)","commit_id":"1222962767bf2b9a3620c9e4681f155146701765"}],"neutron/db/local_ip_db.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"28acc7e9d3dc2c040b71657af59bb4d1e4a6500f","unresolved":true,"context_lines":[{"line_number":213,"context_line":"    def create_local_ip_port_association(self, context, local_ip_id,"},{"line_number":214,"context_line":"                                         port_association):"},{"line_number":215,"context_line":"        fields \u003d port_association[\u0027port_association\u0027]"},{"line_number":216,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":217,"context_line":"            fixed_port \u003d port_obj.Port.get_object("},{"line_number":218,"context_line":"                context, id\u003dfields[\u0027fixed_port_id\u0027])"},{"line_number":219,"context_line":"            if not fixed_port:"},{"line_number":220,"context_line":"                msg \u003d _(\"Port %s not found\") % fixed_port.id"},{"line_number":221,"context_line":"                raise lib_exc.BadRequest("},{"line_number":222,"context_line":"                    resource\u003d\u0027local_ip_port_association\u0027, msg\u003dmsg)"},{"line_number":223,"context_line":"            requested_ip \u003d fields[\u0027fixed_ip\u0027]"},{"line_number":224,"context_line":"            if validators.is_attr_set(requested_ip):"},{"line_number":225,"context_line":"                for ip in fixed_port.fixed_ips:"},{"line_number":226,"context_line":"                    if str(ip.ip_address) \u003d\u003d requested_ip:"},{"line_number":227,"context_line":"                        break"},{"line_number":228,"context_line":"                else:"},{"line_number":229,"context_line":"                    raise lip_exc.LocalIPRequestedIPNotFound("},{"line_number":230,"context_line":"                        port_id\u003dfixed_port.id, ip\u003drequested_ip)"},{"line_number":231,"context_line":"            else:"},{"line_number":232,"context_line":"                if not fixed_port.fixed_ips:"},{"line_number":233,"context_line":"                    raise lip_exc.LocalIPNoIP(port_id\u003dfixed_port.id)"},{"line_number":234,"context_line":"                if len(fixed_port.fixed_ips) \u003e 1:"},{"line_number":235,"context_line":"                    raise lip_exc.LocalIPNoRequestedIP(port_id\u003dfixed_port.id)"},{"line_number":236,"context_line":"                requested_ip \u003d fixed_port.fixed_ips[0][\u0027ip_address\u0027]"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            args \u003d {\u0027local_ip_id\u0027: local_ip_id,"},{"line_number":239,"context_line":"                    \u0027fixed_port_id\u0027: fixed_port.id,"},{"line_number":240,"context_line":"                    \u0027fixed_ip\u0027: requested_ip}"},{"line_number":241,"context_line":"            lip_assoc \u003d lip_obj.LocalIPAssociation(context, **args)"},{"line_number":242,"context_line":"            try:"},{"line_number":243,"context_line":"                lip_assoc.create()"},{"line_number":244,"context_line":"            except obj_exc.NeutronDbObjectDuplicateEntry:"},{"line_number":245,"context_line":"                LOG.error(\"Local IP  %(lip)s association to port \""},{"line_number":246,"context_line":"                          \"%(port)s already exists.\","},{"line_number":247,"context_line":"                          {\u0027lip\u0027: local_ip_id,"},{"line_number":248,"context_line":"                           \u0027port\u0027: fixed_port.id})"},{"line_number":249,"context_line":"                return"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":252,"context_line":"            context, resource_id\u003dlip_assoc.id, states\u003d(lip_assoc,))"},{"line_number":253,"context_line":"        registry.publish(resources.LOCAL_IP_ASSOCIATION,"},{"line_number":254,"context_line":"                         events.AFTER_CREATE, self, payload\u003dpayload)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        return self._make_local_ip_assoc_dict(lip_assoc)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def get_local_ip_port_association(self, context, fixed_port_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"193ec22d_7243e2c5","line":255,"range":{"start_line":216,"start_character":0,"end_line":255,"end_character":0},"updated":"2021-11-05 02:54:11.000000000","message":"These change should be move to the neutron-server side patch to make this extension more clear.","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8593e0e446e38a96c05724b1b0a3c53b12b8eaa6","unresolved":true,"context_lines":[{"line_number":213,"context_line":"    def create_local_ip_port_association(self, context, local_ip_id,"},{"line_number":214,"context_line":"                                         port_association):"},{"line_number":215,"context_line":"        fields \u003d port_association[\u0027port_association\u0027]"},{"line_number":216,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":217,"context_line":"            fixed_port \u003d port_obj.Port.get_object("},{"line_number":218,"context_line":"                context, id\u003dfields[\u0027fixed_port_id\u0027])"},{"line_number":219,"context_line":"            if not fixed_port:"},{"line_number":220,"context_line":"                msg \u003d _(\"Port %s not found\") % fixed_port.id"},{"line_number":221,"context_line":"                raise lib_exc.BadRequest("},{"line_number":222,"context_line":"                    resource\u003d\u0027local_ip_port_association\u0027, msg\u003dmsg)"},{"line_number":223,"context_line":"            requested_ip \u003d fields[\u0027fixed_ip\u0027]"},{"line_number":224,"context_line":"            if validators.is_attr_set(requested_ip):"},{"line_number":225,"context_line":"                for ip in fixed_port.fixed_ips:"},{"line_number":226,"context_line":"                    if str(ip.ip_address) \u003d\u003d requested_ip:"},{"line_number":227,"context_line":"                        break"},{"line_number":228,"context_line":"                else:"},{"line_number":229,"context_line":"                    raise lip_exc.LocalIPRequestedIPNotFound("},{"line_number":230,"context_line":"                        port_id\u003dfixed_port.id, ip\u003drequested_ip)"},{"line_number":231,"context_line":"            else:"},{"line_number":232,"context_line":"                if not fixed_port.fixed_ips:"},{"line_number":233,"context_line":"                    raise lip_exc.LocalIPNoIP(port_id\u003dfixed_port.id)"},{"line_number":234,"context_line":"                if len(fixed_port.fixed_ips) \u003e 1:"},{"line_number":235,"context_line":"                    raise lip_exc.LocalIPNoRequestedIP(port_id\u003dfixed_port.id)"},{"line_number":236,"context_line":"                requested_ip \u003d fixed_port.fixed_ips[0][\u0027ip_address\u0027]"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            args \u003d {\u0027local_ip_id\u0027: local_ip_id,"},{"line_number":239,"context_line":"                    \u0027fixed_port_id\u0027: fixed_port.id,"},{"line_number":240,"context_line":"                    \u0027fixed_ip\u0027: requested_ip}"},{"line_number":241,"context_line":"            lip_assoc \u003d lip_obj.LocalIPAssociation(context, **args)"},{"line_number":242,"context_line":"            try:"},{"line_number":243,"context_line":"                lip_assoc.create()"},{"line_number":244,"context_line":"            except obj_exc.NeutronDbObjectDuplicateEntry:"},{"line_number":245,"context_line":"                LOG.error(\"Local IP  %(lip)s association to port \""},{"line_number":246,"context_line":"                          \"%(port)s already exists.\","},{"line_number":247,"context_line":"                          {\u0027lip\u0027: local_ip_id,"},{"line_number":248,"context_line":"                           \u0027port\u0027: fixed_port.id})"},{"line_number":249,"context_line":"                return"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":252,"context_line":"            context, resource_id\u003dlip_assoc.id, states\u003d(lip_assoc,))"},{"line_number":253,"context_line":"        registry.publish(resources.LOCAL_IP_ASSOCIATION,"},{"line_number":254,"context_line":"                         events.AFTER_CREATE, self, payload\u003dpayload)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        return self._make_local_ip_assoc_dict(lip_assoc)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def get_local_ip_port_association(self, context, fixed_port_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"f1f2612f_2244ebf6","line":255,"range":{"start_line":216,"start_character":0,"end_line":255,"end_character":0},"in_reply_to":"193ec22d_7243e2c5","updated":"2021-11-08 10:54:00.000000000","message":"I agree. Why You simply don\u0027t update https://review.opendev.org/c/openstack/neutron/+/804523/19/neutron/db/local_ip_db.py ?","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"a707b788ff8db1c353e7ef3d4f964de00c1101c5","unresolved":true,"context_lines":[{"line_number":213,"context_line":"    def create_local_ip_port_association(self, context, local_ip_id,"},{"line_number":214,"context_line":"                                         port_association):"},{"line_number":215,"context_line":"        fields \u003d port_association[\u0027port_association\u0027]"},{"line_number":216,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":217,"context_line":"            fixed_port \u003d port_obj.Port.get_object("},{"line_number":218,"context_line":"                context, id\u003dfields[\u0027fixed_port_id\u0027])"},{"line_number":219,"context_line":"            if not fixed_port:"},{"line_number":220,"context_line":"                msg \u003d _(\"Port %s not found\") % fixed_port.id"},{"line_number":221,"context_line":"                raise lib_exc.BadRequest("},{"line_number":222,"context_line":"                    resource\u003d\u0027local_ip_port_association\u0027, msg\u003dmsg)"},{"line_number":223,"context_line":"            requested_ip \u003d fields[\u0027fixed_ip\u0027]"},{"line_number":224,"context_line":"            if validators.is_attr_set(requested_ip):"},{"line_number":225,"context_line":"                for ip in fixed_port.fixed_ips:"},{"line_number":226,"context_line":"                    if str(ip.ip_address) \u003d\u003d requested_ip:"},{"line_number":227,"context_line":"                        break"},{"line_number":228,"context_line":"                else:"},{"line_number":229,"context_line":"                    raise lip_exc.LocalIPRequestedIPNotFound("},{"line_number":230,"context_line":"                        port_id\u003dfixed_port.id, ip\u003drequested_ip)"},{"line_number":231,"context_line":"            else:"},{"line_number":232,"context_line":"                if not fixed_port.fixed_ips:"},{"line_number":233,"context_line":"                    raise lip_exc.LocalIPNoIP(port_id\u003dfixed_port.id)"},{"line_number":234,"context_line":"                if len(fixed_port.fixed_ips) \u003e 1:"},{"line_number":235,"context_line":"                    raise lip_exc.LocalIPNoRequestedIP(port_id\u003dfixed_port.id)"},{"line_number":236,"context_line":"                requested_ip \u003d fixed_port.fixed_ips[0][\u0027ip_address\u0027]"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            args \u003d {\u0027local_ip_id\u0027: local_ip_id,"},{"line_number":239,"context_line":"                    \u0027fixed_port_id\u0027: fixed_port.id,"},{"line_number":240,"context_line":"                    \u0027fixed_ip\u0027: requested_ip}"},{"line_number":241,"context_line":"            lip_assoc \u003d lip_obj.LocalIPAssociation(context, **args)"},{"line_number":242,"context_line":"            try:"},{"line_number":243,"context_line":"                lip_assoc.create()"},{"line_number":244,"context_line":"            except obj_exc.NeutronDbObjectDuplicateEntry:"},{"line_number":245,"context_line":"                LOG.error(\"Local IP  %(lip)s association to port \""},{"line_number":246,"context_line":"                          \"%(port)s already exists.\","},{"line_number":247,"context_line":"                          {\u0027lip\u0027: local_ip_id,"},{"line_number":248,"context_line":"                           \u0027port\u0027: fixed_port.id})"},{"line_number":249,"context_line":"                return"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":252,"context_line":"            context, resource_id\u003dlip_assoc.id, states\u003d(lip_assoc,))"},{"line_number":253,"context_line":"        registry.publish(resources.LOCAL_IP_ASSOCIATION,"},{"line_number":254,"context_line":"                         events.AFTER_CREATE, self, payload\u003dpayload)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        return self._make_local_ip_assoc_dict(lip_assoc)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def get_local_ip_port_association(self, context, fixed_port_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"f466e88c_2dc32e59","line":255,"range":{"start_line":216,"start_character":0,"end_line":255,"end_character":0},"in_reply_to":"ce0e6761_b3b1a9cf","updated":"2021-11-08 14:20:27.000000000","message":"I came up with a simpler RPC communication solution - sending \"push\" directly from local_ip service plugin, thus no need registry.publish and ovo_rpc changes. Please see in next patchset.","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"624f55a1e70ca5c121e938ddc0589fec59ebbda8","unresolved":true,"context_lines":[{"line_number":213,"context_line":"    def create_local_ip_port_association(self, context, local_ip_id,"},{"line_number":214,"context_line":"                                         port_association):"},{"line_number":215,"context_line":"        fields \u003d port_association[\u0027port_association\u0027]"},{"line_number":216,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":217,"context_line":"            fixed_port \u003d port_obj.Port.get_object("},{"line_number":218,"context_line":"                context, id\u003dfields[\u0027fixed_port_id\u0027])"},{"line_number":219,"context_line":"            if not fixed_port:"},{"line_number":220,"context_line":"                msg \u003d _(\"Port %s not found\") % fixed_port.id"},{"line_number":221,"context_line":"                raise lib_exc.BadRequest("},{"line_number":222,"context_line":"                    resource\u003d\u0027local_ip_port_association\u0027, msg\u003dmsg)"},{"line_number":223,"context_line":"            requested_ip \u003d fields[\u0027fixed_ip\u0027]"},{"line_number":224,"context_line":"            if validators.is_attr_set(requested_ip):"},{"line_number":225,"context_line":"                for ip in fixed_port.fixed_ips:"},{"line_number":226,"context_line":"                    if str(ip.ip_address) \u003d\u003d requested_ip:"},{"line_number":227,"context_line":"                        break"},{"line_number":228,"context_line":"                else:"},{"line_number":229,"context_line":"                    raise lip_exc.LocalIPRequestedIPNotFound("},{"line_number":230,"context_line":"                        port_id\u003dfixed_port.id, ip\u003drequested_ip)"},{"line_number":231,"context_line":"            else:"},{"line_number":232,"context_line":"                if not fixed_port.fixed_ips:"},{"line_number":233,"context_line":"                    raise lip_exc.LocalIPNoIP(port_id\u003dfixed_port.id)"},{"line_number":234,"context_line":"                if len(fixed_port.fixed_ips) \u003e 1:"},{"line_number":235,"context_line":"                    raise lip_exc.LocalIPNoRequestedIP(port_id\u003dfixed_port.id)"},{"line_number":236,"context_line":"                requested_ip \u003d fixed_port.fixed_ips[0][\u0027ip_address\u0027]"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"            args \u003d {\u0027local_ip_id\u0027: local_ip_id,"},{"line_number":239,"context_line":"                    \u0027fixed_port_id\u0027: fixed_port.id,"},{"line_number":240,"context_line":"                    \u0027fixed_ip\u0027: requested_ip}"},{"line_number":241,"context_line":"            lip_assoc \u003d lip_obj.LocalIPAssociation(context, **args)"},{"line_number":242,"context_line":"            try:"},{"line_number":243,"context_line":"                lip_assoc.create()"},{"line_number":244,"context_line":"            except obj_exc.NeutronDbObjectDuplicateEntry:"},{"line_number":245,"context_line":"                LOG.error(\"Local IP  %(lip)s association to port \""},{"line_number":246,"context_line":"                          \"%(port)s already exists.\","},{"line_number":247,"context_line":"                          {\u0027lip\u0027: local_ip_id,"},{"line_number":248,"context_line":"                           \u0027port\u0027: fixed_port.id})"},{"line_number":249,"context_line":"                return"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        payload \u003d events.DBEventPayload("},{"line_number":252,"context_line":"            context, resource_id\u003dlip_assoc.id, states\u003d(lip_assoc,))"},{"line_number":253,"context_line":"        registry.publish(resources.LOCAL_IP_ASSOCIATION,"},{"line_number":254,"context_line":"                         events.AFTER_CREATE, self, payload\u003dpayload)"},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"        return self._make_local_ip_assoc_dict(lip_assoc)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def get_local_ip_port_association(self, context, fixed_port_id,"}],"source_content_type":"text/x-python","patch_set":20,"id":"ce0e6761_b3b1a9cf","line":255,"range":{"start_line":216,"start_character":0,"end_line":255,"end_character":0},"in_reply_to":"f1f2612f_2244ebf6","updated":"2021-11-08 11:56:01.000000000","message":"I added it here as it\u0027s part of server \u003c-\u003e agent RPC communication, thus leaving DB patch deal only with DB. I can move to DB patch if strictly required.","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"8593e0e446e38a96c05724b1b0a3c53b12b8eaa6","unresolved":true,"context_lines":[{"line_number":291,"context_line":"        registry.publish(resources.LOCAL_IP_ASSOCIATION,"},{"line_number":292,"context_line":"                         events.AFTER_DELETE,"},{"line_number":293,"context_line":"                         self,"},{"line_number":294,"context_line":"                         payload\u003dpayload)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    @staticmethod"},{"line_number":297,"context_line":"    @registry.receives(resources.PORT, [events.BEFORE_DELETE])"}],"source_content_type":"text/x-python","patch_set":20,"id":"9d9ceb43_715946cf","line":294,"updated":"2021-11-08 10:54:00.000000000","message":"same here","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"624f55a1e70ca5c121e938ddc0589fec59ebbda8","unresolved":true,"context_lines":[{"line_number":291,"context_line":"        registry.publish(resources.LOCAL_IP_ASSOCIATION,"},{"line_number":292,"context_line":"                         events.AFTER_DELETE,"},{"line_number":293,"context_line":"                         self,"},{"line_number":294,"context_line":"                         payload\u003dpayload)"},{"line_number":295,"context_line":""},{"line_number":296,"context_line":"    @staticmethod"},{"line_number":297,"context_line":"    @registry.receives(resources.PORT, [events.BEFORE_DELETE])"}],"source_content_type":"text/x-python","patch_set":20,"id":"bb3b3d23_51d34690","line":294,"in_reply_to":"9d9ceb43_715946cf","updated":"2021-11-08 11:56:01.000000000","message":"again part of RPC communication","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3259b3e6e8d6a18e76100230ab9f33d5c4a4ec94","unresolved":true,"context_lines":[{"line_number":248,"context_line":"                       \u0027port\u0027: fixed_port.id})"},{"line_number":249,"context_line":"            return"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        return lip_assoc"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    def create_local_ip_port_association(self, context, local_ip_id,"},{"line_number":254,"context_line":"                                         port_association):"},{"line_number":255,"context_line":"        lip_assoc \u003d self._create_local_ip_port_association("},{"line_number":256,"context_line":"            context, local_ip_id, port_association)"},{"line_number":257,"context_line":"        return self._make_local_ip_assoc_dict(lip_assoc)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def get_local_ip_port_association(self, context, fixed_port_id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"513a25af_342725f1","line":256,"range":{"start_line":251,"start_character":0,"end_line":256,"end_character":51},"updated":"2021-11-09 08:37:25.000000000","message":"These change should be moved to neutron-server side patch.","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"f5462258fd8bd26233b9a7a9b5fee115ae9d0938","unresolved":true,"context_lines":[{"line_number":248,"context_line":"                       \u0027port\u0027: fixed_port.id})"},{"line_number":249,"context_line":"            return"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        return lip_assoc"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    def create_local_ip_port_association(self, context, local_ip_id,"},{"line_number":254,"context_line":"                                         port_association):"},{"line_number":255,"context_line":"        lip_assoc \u003d self._create_local_ip_port_association("},{"line_number":256,"context_line":"            context, local_ip_id, port_association)"},{"line_number":257,"context_line":"        return self._make_local_ip_assoc_dict(lip_assoc)"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def get_local_ip_port_association(self, context, fixed_port_id,"}],"source_content_type":"text/x-python","patch_set":23,"id":"aed52030_db1fb995","line":256,"range":{"start_line":251,"start_character":0,"end_line":256,"end_character":51},"in_reply_to":"513a25af_342725f1","updated":"2021-11-09 09:14:03.000000000","message":"It\u0027s hard to predict all changes that might pop up on server side during implementation/review process. For example this change appeared when I decided to change RPC notifications from ovo_rpc to direct usage of ResourcesPushRpcApi. This change is related to agent-server communication (this patch). Do you think it\u0027s a blocking issue?","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3259b3e6e8d6a18e76100230ab9f33d5c4a4ec94","unresolved":true,"context_lines":[{"line_number":287,"context_line":"            raise lip_exc.LocalIPAssociationNotFound(local_ip_id\u003dlocal_ip_id,"},{"line_number":288,"context_line":"                                                     port_id\u003dfixed_port_id)"},{"line_number":289,"context_line":"        assoc.delete()"},{"line_number":290,"context_line":"        return assoc"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @staticmethod"},{"line_number":293,"context_line":"    @registry.receives(resources.PORT, [events.BEFORE_DELETE])"}],"source_content_type":"text/x-python","patch_set":23,"id":"ef87768b_a63ea658","line":290,"range":{"start_line":290,"start_character":7,"end_line":290,"end_character":20},"updated":"2021-11-09 08:37:25.000000000","message":"ditto","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"f5462258fd8bd26233b9a7a9b5fee115ae9d0938","unresolved":true,"context_lines":[{"line_number":287,"context_line":"            raise lip_exc.LocalIPAssociationNotFound(local_ip_id\u003dlocal_ip_id,"},{"line_number":288,"context_line":"                                                     port_id\u003dfixed_port_id)"},{"line_number":289,"context_line":"        assoc.delete()"},{"line_number":290,"context_line":"        return assoc"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"    @staticmethod"},{"line_number":293,"context_line":"    @registry.receives(resources.PORT, [events.BEFORE_DELETE])"}],"source_content_type":"text/x-python","patch_set":23,"id":"ee5565ca_1544632c","line":290,"range":{"start_line":290,"start_character":7,"end_line":290,"end_character":20},"in_reply_to":"ef87768b_a63ea658","updated":"2021-11-09 09:14:03.000000000","message":"same answer","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"}],"neutron/objects/local_ip.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"28acc7e9d3dc2c040b71657af59bb4d1e4a6500f","unresolved":true,"context_lines":[{"line_number":111,"context_line":"        self.id \u003d self.local_ip_id + \u0027_\u0027 + self.fixed_port_id"},{"line_number":112,"context_line":"        self.obj_reset_changes([\u0027id\u0027])"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @classmethod"},{"line_number":115,"context_line":"    def _pop_id(cls, kwargs):"},{"line_number":116,"context_line":"        if \u0027id\u0027 in kwargs and len(kwargs[\u0027id\u0027].split(\u0027_\u0027)) \u003d\u003d 2:"},{"line_number":117,"context_line":"            lip_id, port_id \u003d kwargs.pop(\u0027id\u0027).split(\u0027_\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"40f090ee_0268c885","line":114,"range":{"start_line":114,"start_character":4,"end_line":114,"end_character":16},"updated":"2021-11-05 02:54:11.000000000","message":"ditto","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"624f55a1e70ca5c121e938ddc0589fec59ebbda8","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        self.id \u003d self.local_ip_id + \u0027_\u0027 + self.fixed_port_id"},{"line_number":112,"context_line":"        self.obj_reset_changes([\u0027id\u0027])"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    @classmethod"},{"line_number":115,"context_line":"    def _pop_id(cls, kwargs):"},{"line_number":116,"context_line":"        if \u0027id\u0027 in kwargs and len(kwargs[\u0027id\u0027].split(\u0027_\u0027)) \u003d\u003d 2:"},{"line_number":117,"context_line":"            lip_id, port_id \u003d kwargs.pop(\u0027id\u0027).split(\u0027_\u0027)"}],"source_content_type":"text/x-python","patch_set":20,"id":"f8705807_1ec0b131","line":114,"range":{"start_line":114,"start_character":4,"end_line":114,"end_character":16},"in_reply_to":"40f090ee_0268c885","updated":"2021-11-08 11:56:01.000000000","message":"Agree","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"}],"neutron/plugins/ml2/ovo_rpc.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"28acc7e9d3dc2c040b71657af59bb4d1e4a6500f","unresolved":true,"context_lines":[{"line_number":163,"context_line":"            resources.SECURITY_GROUP: securitygroup.SecurityGroup,"},{"line_number":164,"context_line":"            resources.SECURITY_GROUP_RULE: securitygroup.SecurityGroupRule,"},{"line_number":165,"context_line":"            resources.ADDRESS_GROUP: address_group.AddressGroup,"},{"line_number":166,"context_line":"            resources.LOCAL_IP_ASSOCIATION: local_ip.LocalIPAssociation,"},{"line_number":167,"context_line":"        }"},{"line_number":168,"context_line":"        self._resource_handlers \u003d {"},{"line_number":169,"context_line":"            res: _ObjectChangeHandler(res, obj_class, self._rpc_pusher)"}],"source_content_type":"text/x-python","patch_set":20,"id":"451280d4_c925dac9","line":166,"range":{"start_line":166,"start_character":11,"end_line":166,"end_character":72},"updated":"2021-11-05 02:54:11.000000000","message":"IMO, this change is not needed. Because this does not involve with resource cache. And there is no callback for this \u0027local_ip\u0027 resource cache events were registered in ovs-agent.","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"624f55a1e70ca5c121e938ddc0589fec59ebbda8","unresolved":true,"context_lines":[{"line_number":163,"context_line":"            resources.SECURITY_GROUP: securitygroup.SecurityGroup,"},{"line_number":164,"context_line":"            resources.SECURITY_GROUP_RULE: securitygroup.SecurityGroupRule,"},{"line_number":165,"context_line":"            resources.ADDRESS_GROUP: address_group.AddressGroup,"},{"line_number":166,"context_line":"            resources.LOCAL_IP_ASSOCIATION: local_ip.LocalIPAssociation,"},{"line_number":167,"context_line":"        }"},{"line_number":168,"context_line":"        self._resource_handlers \u003d {"},{"line_number":169,"context_line":"            res: _ObjectChangeHandler(res, obj_class, self._rpc_pusher)"}],"source_content_type":"text/x-python","patch_set":20,"id":"eddec6cd_39c483b8","line":166,"range":{"start_line":166,"start_character":11,"end_line":166,"end_character":72},"in_reply_to":"451280d4_c925dac9","updated":"2021-11-08 11:56:01.000000000","message":"AFAIU ovo rpc is not just for resource cache, it\u0027s  main purpose is sending \"pushes\" on objects events. As I see the way it works: \n - registry.publish (from db mixin)\n - then \"push\" from ovo_rpc (line 126 here)\n - finally ovo topic is consumed by L2 extension and handled by _handle_notification()","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"a707b788ff8db1c353e7ef3d4f964de00c1101c5","unresolved":true,"context_lines":[{"line_number":163,"context_line":"            resources.SECURITY_GROUP: securitygroup.SecurityGroup,"},{"line_number":164,"context_line":"            resources.SECURITY_GROUP_RULE: securitygroup.SecurityGroupRule,"},{"line_number":165,"context_line":"            resources.ADDRESS_GROUP: address_group.AddressGroup,"},{"line_number":166,"context_line":"            resources.LOCAL_IP_ASSOCIATION: local_ip.LocalIPAssociation,"},{"line_number":167,"context_line":"        }"},{"line_number":168,"context_line":"        self._resource_handlers \u003d {"},{"line_number":169,"context_line":"            res: _ObjectChangeHandler(res, obj_class, self._rpc_pusher)"}],"source_content_type":"text/x-python","patch_set":20,"id":"a8805123_87d01599","line":166,"range":{"start_line":166,"start_character":11,"end_line":166,"end_character":72},"in_reply_to":"eddec6cd_39c483b8","updated":"2021-11-08 14:20:27.000000000","message":"I came up with a simpler RPC communication solution - sending \"push\" directly from local_ip service plugin, thus no need registry.publish and ovo_rpc changes. Please see in next patchset.","commit_id":"b2f6cdfa5518ef6ad884de53460f39389f9dbe26"}],"neutron/services/local_ip/local_ip_plugin.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"3259b3e6e8d6a18e76100230ab9f33d5c4a4ec94","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        lip_assoc \u003d super("},{"line_number":46,"context_line":"            LocalIPPlugin, self).delete_local_ip_port_association("},{"line_number":47,"context_line":"                context, fixed_port_id, local_ip_id)"},{"line_number":48,"context_line":"        self._resource_rpc.push(context, [lip_assoc], rpc_events.DELETED)"}],"source_content_type":"text/x-python","patch_set":23,"id":"b5374a33_ff9f73dd","line":48,"updated":"2021-11-09 08:37:25.000000000","message":"These change should be moved to neutron-server side.","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"f5462258fd8bd26233b9a7a9b5fee115ae9d0938","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        lip_assoc \u003d super("},{"line_number":46,"context_line":"            LocalIPPlugin, self).delete_local_ip_port_association("},{"line_number":47,"context_line":"                context, fixed_port_id, local_ip_id)"},{"line_number":48,"context_line":"        self._resource_rpc.push(context, [lip_assoc], rpc_events.DELETED)"}],"source_content_type":"text/x-python","patch_set":23,"id":"a6518ce3_e60643e6","line":48,"in_reply_to":"b5374a33_ff9f73dd","updated":"2021-11-09 09:14:03.000000000","message":"same answer. This is part of server-agent communication","commit_id":"2ca7c9ce23e17c4d7494e52cd66e86a2a8fd6b01"}]}
