)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fb8f44cb8088788b8cf9a293ea2a1097f767a0a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"a0b11de7_786d2e92","updated":"2022-09-27 10:30:48.000000000","message":"-1 just for visibility","commit_id":"03e9b16b66bfcd356f36684d6b614cb394004a4c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a9fdf12efef5aadcc107ddab2299f832f40cebb7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"85adb308_803372ac","updated":"2022-09-29 15:45:03.000000000","message":"Yeah, I think that should work. Thanks!\n\n(now the testing part...)","commit_id":"0a043aa34acf19a34cf938bb5fe50005331a4e7b"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"092ac2ef6ca9caae2add19c16cf2e103198734e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"5be17b5d_6687d40e","updated":"2022-10-26 14:12:27.000000000","message":"LGTM","commit_id":"1abb77d7a63cde2aa9640351f663870c14430919"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"1916698e569c6eaa8aebc8feec9d36fd1e69b1b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"3eda757e_35f79099","updated":"2022-10-26 15:23:29.000000000","message":"Thanks for addressing all my nits. LGTM","commit_id":"1abb77d7a63cde2aa9640351f663870c14430919"}],"neutron/db/l3_db.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fb8f44cb8088788b8cf9a293ea2a1097f767a0a1","unresolved":true,"context_lines":[{"line_number":935,"context_line":"        new_router_intf \u003d True"},{"line_number":936,"context_line":"        cleanup_port \u003d False"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"        if add_by_port:"},{"line_number":939,"context_line":"            port_id \u003d interface_info[\u0027port_id\u0027]"},{"line_number":940,"context_line":"            port \u003d self._check_router_port(context, port_id, \u0027\u0027)"},{"line_number":941,"context_line":"            revert_value \u003d {\u0027device_id\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"d46c5744_1eb14854","line":938,"range":{"start_line":938,"start_character":8,"end_line":938,"end_character":23},"updated":"2022-09-27 10:30:48.000000000","message":"I have some comments on this patch and the related bug.\n\n1) The bug reported refers only to the second branch of this condition, when we create the port. Did you try the same but with a pre-created port?\n\n2) I think that in the second case (port creation), you should do something similar to \"_validate_router_port_info\", that is called in \"_add_interface_by_port\". This method:\n* Check if there is another IPv6 port attached.\n* Retrieves the RP subnets (as you do) and makes this new \"_check_subnets_overlapping\"\n\nThe first check is missing. You should also skip the \"PROVISIONAL_IPV6_PD_PREFIX\" [1]\n\n[1]https://github.com/openstack/neutron/blob/994e2aa8f6b12b0a7f5dd7b2a0fd0b3e63652bba/neutron/db/l3_db.py#L669-L670","commit_id":"03e9b16b66bfcd356f36684d6b614cb394004a4c"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"19d07974477f4c1d7f921e4286fa3ddd53a77de7","unresolved":false,"context_lines":[{"line_number":935,"context_line":"        new_router_intf \u003d True"},{"line_number":936,"context_line":"        cleanup_port \u003d False"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"        if add_by_port:"},{"line_number":939,"context_line":"            port_id \u003d interface_info[\u0027port_id\u0027]"},{"line_number":940,"context_line":"            port \u003d self._check_router_port(context, port_id, \u0027\u0027)"},{"line_number":941,"context_line":"            revert_value \u003d {\u0027device_id\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"eaed0a14_b50ad478","line":938,"range":{"start_line":938,"start_character":8,"end_line":938,"end_character":23},"in_reply_to":"65a44284_fcc34704","updated":"2022-10-06 12:50:17.000000000","message":"Done","commit_id":"03e9b16b66bfcd356f36684d6b614cb394004a4c"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"d67bf5795317c887af04784163f5dce4ebd3e852","unresolved":true,"context_lines":[{"line_number":935,"context_line":"        new_router_intf \u003d True"},{"line_number":936,"context_line":"        cleanup_port \u003d False"},{"line_number":937,"context_line":""},{"line_number":938,"context_line":"        if add_by_port:"},{"line_number":939,"context_line":"            port_id \u003d interface_info[\u0027port_id\u0027]"},{"line_number":940,"context_line":"            port \u003d self._check_router_port(context, port_id, \u0027\u0027)"},{"line_number":941,"context_line":"            revert_value \u003d {\u0027device_id\u0027: \u0027\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"65a44284_fcc34704","line":938,"range":{"start_line":938,"start_character":8,"end_line":938,"end_character":23},"in_reply_to":"d46c5744_1eb14854","updated":"2022-09-27 18:29:28.000000000","message":"Good catch!\n\n1) It behaves exactly the same, the bug applies in the same way when the ports already exist.\n\n2) ok, refactorize the method for that check IPv6 and added the skip of PROVISIONAL_IPV6_PD_PREFIX\n\nthx","commit_id":"03e9b16b66bfcd356f36684d6b614cb394004a4c"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b8eb40d6b68b35a5a54fd6899f8d8230e41eabe9","unresolved":true,"context_lines":[{"line_number":565,"context_line":"        ip_address_change \u003d not ip_addresses \u003d\u003d new_ip_addresses"},{"line_number":566,"context_line":"        return ip_address_change"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"    def _check_subnets_overlapping(self, subnet_1, subnet_2):"},{"line_number":569,"context_line":"        cidr \u003d subnet_1[\u0027cidr\u0027]"},{"line_number":570,"context_line":"        ipnet \u003d netaddr.IPNetwork(cidr)"},{"line_number":571,"context_line":"        new_cidr \u003d subnet_2[\u0027cidr\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"4ab6e4c1_6d22e25c","line":568,"range":{"start_line":568,"start_character":8,"end_line":568,"end_character":34},"updated":"2022-10-21 03:36:18.000000000","message":"sorry for all nits 😊\nCall it \"_raise_on_subnets_overlap\" that makes it very clear what the function will do without reading it. Especially in this case since the function doesn\u0027t return anything useful","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":false,"context_lines":[{"line_number":565,"context_line":"        ip_address_change \u003d not ip_addresses \u003d\u003d new_ip_addresses"},{"line_number":566,"context_line":"        return ip_address_change"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"    def _check_subnets_overlapping(self, subnet_1, subnet_2):"},{"line_number":569,"context_line":"        cidr \u003d subnet_1[\u0027cidr\u0027]"},{"line_number":570,"context_line":"        ipnet \u003d netaddr.IPNetwork(cidr)"},{"line_number":571,"context_line":"        new_cidr \u003d subnet_2[\u0027cidr\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"c8dbdf9e_48ac8620","line":568,"range":{"start_line":568,"start_character":8,"end_line":568,"end_character":34},"in_reply_to":"4ab6e4c1_6d22e25c","updated":"2022-10-21 11:33:12.000000000","message":"Done","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b8eb40d6b68b35a5a54fd6899f8d8230e41eabe9","unresolved":true,"context_lines":[{"line_number":838,"context_line":"            if netaddr.IPNetwork(fixed_ip[\u0027ip_address\u0027]).version \u003d\u003d 6:"},{"line_number":839,"context_line":"                return True"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def _validate_just_one_port_ipv6_by_network_on_router(self, router, port):"},{"line_number":842,"context_line":"        if self._port_has_ipv6_address(port):"},{"line_number":843,"context_line":"            for existing_port in (rp.port for rp in router.attached_ports):"},{"line_number":844,"context_line":"                if (existing_port[\"id\"] !\u003d port[\"id\"] and"}],"source_content_type":"text/x-python","patch_set":10,"id":"da7663c7_febd70d9","line":841,"range":{"start_line":841,"start_character":8,"end_line":841,"end_character":57},"updated":"2022-10-21 03:36:18.000000000","message":"nit:\nMaybe its just me but this function does not read right to me. Consider:\n           \n_validate_only_one_router_ipv6_port_per_network\nor\n_validate_one_router_ipv6_port_per_network\nor you can drop validate since the function name implies it is validation\n_one_router_ipv6_port_per_network","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":false,"context_lines":[{"line_number":838,"context_line":"            if netaddr.IPNetwork(fixed_ip[\u0027ip_address\u0027]).version \u003d\u003d 6:"},{"line_number":839,"context_line":"                return True"},{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def _validate_just_one_port_ipv6_by_network_on_router(self, router, port):"},{"line_number":842,"context_line":"        if self._port_has_ipv6_address(port):"},{"line_number":843,"context_line":"            for existing_port in (rp.port for rp in router.attached_ports):"},{"line_number":844,"context_line":"                if (existing_port[\"id\"] !\u003d port[\"id\"] and"}],"source_content_type":"text/x-python","patch_set":10,"id":"0efd3767_63623acf","line":841,"range":{"start_line":841,"start_character":8,"end_line":841,"end_character":57},"in_reply_to":"da7663c7_febd70d9","updated":"2022-10-21 11:33:12.000000000","message":"I would buy your \u0027_validate_one_router_ipv6_port_per_network\u0027 as I like mantain the action (validate) over the function name.","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b8eb40d6b68b35a5a54fd6899f8d8230e41eabe9","unresolved":true,"context_lines":[{"line_number":844,"context_line":"                if (existing_port[\"id\"] !\u003d port[\"id\"] and"},{"line_number":845,"context_line":"                    existing_port[\"network_id\"] \u003d\u003d port[\"network_id\"] and"},{"line_number":846,"context_line":"                        self._port_has_ipv6_address(existing_port)):"},{"line_number":847,"context_line":"                    msg \u003d _(\"Cannot have multiple router ports with the \""},{"line_number":848,"context_line":"                        \"same network id if both contain IPv6 \""},{"line_number":849,"context_line":"                        \"subnets. Existing port %(p)s has IPv6 \""},{"line_number":850,"context_line":"                        \"subnet(s) and network id %(nid)s\")"},{"line_number":851,"context_line":"                    raise n_exc.BadRequest(resource\u003d\u0027router\u0027, msg\u003dmsg % {"},{"line_number":852,"context_line":"                        \u0027p\u0027: existing_port[\u0027id\u0027],"},{"line_number":853,"context_line":"                        \u0027nid\u0027: existing_port[\u0027network_id\u0027]})"}],"source_content_type":"text/x-python","patch_set":10,"id":"6546851f_5df937bd","line":850,"range":{"start_line":847,"start_character":1,"end_line":850,"end_character":59},"updated":"2022-10-21 03:36:18.000000000","message":"Consider:\n\"Router already contains IPv6 port %(p)s belonging to network id %(nid)s. Only one IPv6 port from a network subnet can be connected to a router.\"\n\nOr similar to that. Again, this is just my opinion. If others dont feel strongly about this you can drop it","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"38856e64550eb3be08fd6952b192d8a6307ec664","unresolved":false,"context_lines":[{"line_number":844,"context_line":"                if (existing_port[\"id\"] !\u003d port[\"id\"] and"},{"line_number":845,"context_line":"                    existing_port[\"network_id\"] \u003d\u003d port[\"network_id\"] and"},{"line_number":846,"context_line":"                        self._port_has_ipv6_address(existing_port)):"},{"line_number":847,"context_line":"                    msg \u003d _(\"Cannot have multiple router ports with the \""},{"line_number":848,"context_line":"                        \"same network id if both contain IPv6 \""},{"line_number":849,"context_line":"                        \"subnets. Existing port %(p)s has IPv6 \""},{"line_number":850,"context_line":"                        \"subnet(s) and network id %(nid)s\")"},{"line_number":851,"context_line":"                    raise n_exc.BadRequest(resource\u003d\u0027router\u0027, msg\u003dmsg % {"},{"line_number":852,"context_line":"                        \u0027p\u0027: existing_port[\u0027id\u0027],"},{"line_number":853,"context_line":"                        \u0027nid\u0027: existing_port[\u0027network_id\u0027]})"}],"source_content_type":"text/x-python","patch_set":10,"id":"25356f1d_fbc7fb2f","line":850,"range":{"start_line":847,"start_character":1,"end_line":850,"end_character":59},"in_reply_to":"012d0e75_82f28a77","updated":"2022-10-21 13:54:23.000000000","message":"looks clear! done!","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":true,"context_lines":[{"line_number":844,"context_line":"                if (existing_port[\"id\"] !\u003d port[\"id\"] and"},{"line_number":845,"context_line":"                    existing_port[\"network_id\"] \u003d\u003d port[\"network_id\"] and"},{"line_number":846,"context_line":"                        self._port_has_ipv6_address(existing_port)):"},{"line_number":847,"context_line":"                    msg \u003d _(\"Cannot have multiple router ports with the \""},{"line_number":848,"context_line":"                        \"same network id if both contain IPv6 \""},{"line_number":849,"context_line":"                        \"subnets. Existing port %(p)s has IPv6 \""},{"line_number":850,"context_line":"                        \"subnet(s) and network id %(nid)s\")"},{"line_number":851,"context_line":"                    raise n_exc.BadRequest(resource\u003d\u0027router\u0027, msg\u003dmsg % {"},{"line_number":852,"context_line":"                        \u0027p\u0027: existing_port[\u0027id\u0027],"},{"line_number":853,"context_line":"                        \u0027nid\u0027: existing_port[\u0027network_id\u0027]})"}],"source_content_type":"text/x-python","patch_set":10,"id":"b4070df7_329d043d","line":850,"range":{"start_line":847,"start_character":1,"end_line":850,"end_character":59},"in_reply_to":"6546851f_5df937bd","updated":"2022-10-21 11:33:12.000000000","message":"I will discard this because the second part of the sentence it is wrong or may lead to confusion for the user, \u0027Only one IPv6 port from a network subnet can be connected to a router\u0027 does not apply, because more than port IPv6 can be attached if their network_id are different. But this is mho, feel free to give feedback if you consider.","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"38a2f7fcaa5b124c0ad7375ddbaa6f194d77de92","unresolved":true,"context_lines":[{"line_number":844,"context_line":"                if (existing_port[\"id\"] !\u003d port[\"id\"] and"},{"line_number":845,"context_line":"                    existing_port[\"network_id\"] \u003d\u003d port[\"network_id\"] and"},{"line_number":846,"context_line":"                        self._port_has_ipv6_address(existing_port)):"},{"line_number":847,"context_line":"                    msg \u003d _(\"Cannot have multiple router ports with the \""},{"line_number":848,"context_line":"                        \"same network id if both contain IPv6 \""},{"line_number":849,"context_line":"                        \"subnets. Existing port %(p)s has IPv6 \""},{"line_number":850,"context_line":"                        \"subnet(s) and network id %(nid)s\")"},{"line_number":851,"context_line":"                    raise n_exc.BadRequest(resource\u003d\u0027router\u0027, msg\u003dmsg % {"},{"line_number":852,"context_line":"                        \u0027p\u0027: existing_port[\u0027id\u0027],"},{"line_number":853,"context_line":"                        \u0027nid\u0027: existing_port[\u0027network_id\u0027]})"}],"source_content_type":"text/x-python","patch_set":10,"id":"012d0e75_82f28a77","line":850,"range":{"start_line":847,"start_character":1,"end_line":850,"end_character":59},"in_reply_to":"b4070df7_329d043d","updated":"2022-10-21 13:38:40.000000000","message":"You are right the second sentence might is confusing now that I had some sleep :). How about make it more explicit\n\"Router already contains IPv6 port %(p)s belonging to network id %(nid)s. Only one IPv6 port from the same network subnet can be connected to a router.\"","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d8d8880a3a811058fa04fa54848990db7346db33","unresolved":true,"context_lines":[{"line_number":1029,"context_line":"                                       for fixed_ip in port[\u0027fixed_ips\u0027]])"},{"line_number":1030,"context_line":"                else:"},{"line_number":1031,"context_line":"                    raise l3_exc.RouterInterfaceNotFound("},{"line_number":1032,"context_line":"                        router_id\u003drouter.id, port_id\u003drp.port_id)"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"            if subnets_id:"},{"line_number":1035,"context_line":"                id_filter \u003d {\u0027id\u0027: subnets_id}"}],"source_content_type":"text/x-python","patch_set":10,"id":"64193ad4_c68c7266","line":1032,"updated":"2022-10-16 07:31:13.000000000","message":"is this correct exception? May it be potentially confusing for user maybe?","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"d375bdf4d7406a080734b65c7e9c31c6a4b40d25","unresolved":false,"context_lines":[{"line_number":1029,"context_line":"                                       for fixed_ip in port[\u0027fixed_ips\u0027]])"},{"line_number":1030,"context_line":"                else:"},{"line_number":1031,"context_line":"                    raise l3_exc.RouterInterfaceNotFound("},{"line_number":1032,"context_line":"                        router_id\u003drouter.id, port_id\u003drp.port_id)"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"            if subnets_id:"},{"line_number":1035,"context_line":"                id_filter \u003d {\u0027id\u0027: subnets_id}"}],"source_content_type":"text/x-python","patch_set":10,"id":"62406824_0848c8a8","line":1032,"in_reply_to":"62448f51_dffb1a55","updated":"2022-10-18 08:03:15.000000000","message":"Done","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"9fccbbba8dbd7a364ab49bc6be4956472869e004","unresolved":true,"context_lines":[{"line_number":1029,"context_line":"                                       for fixed_ip in port[\u0027fixed_ips\u0027]])"},{"line_number":1030,"context_line":"                else:"},{"line_number":1031,"context_line":"                    raise l3_exc.RouterInterfaceNotFound("},{"line_number":1032,"context_line":"                        router_id\u003drouter.id, port_id\u003drp.port_id)"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"            if subnets_id:"},{"line_number":1035,"context_line":"                id_filter \u003d {\u0027id\u0027: subnets_id}"}],"source_content_type":"text/x-python","patch_set":10,"id":"a45fd7b2_90b2ef86","line":1032,"in_reply_to":"64193ad4_c68c7266","updated":"2022-10-17 09:34:37.000000000","message":"I think so, taking into account that we already get all router_ports, the individual port query should only fail finding the port if a race deletes it. In such a case I think it is right to trigger this exception. Do you think there is one that fits the scenario better?","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"31118c46afba0d9a598eedb4816e1e53df62632d","unresolved":true,"context_lines":[{"line_number":1029,"context_line":"                                       for fixed_ip in port[\u0027fixed_ips\u0027]])"},{"line_number":1030,"context_line":"                else:"},{"line_number":1031,"context_line":"                    raise l3_exc.RouterInterfaceNotFound("},{"line_number":1032,"context_line":"                        router_id\u003drouter.id, port_id\u003drp.port_id)"},{"line_number":1033,"context_line":""},{"line_number":1034,"context_line":"            if subnets_id:"},{"line_number":1035,"context_line":"                id_filter \u003d {\u0027id\u0027: subnets_id}"}],"source_content_type":"text/x-python","patch_set":10,"id":"62448f51_dffb1a55","line":1032,"in_reply_to":"a45fd7b2_90b2ef86","updated":"2022-10-17 14:40:41.000000000","message":"ok, it can be like that for me","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d8d8880a3a811058fa04fa54848990db7346db33","unresolved":true,"context_lines":[{"line_number":1034,"context_line":"            if subnets_id:"},{"line_number":1035,"context_line":"                id_filter \u003d {\u0027id\u0027: subnets_id}"},{"line_number":1036,"context_line":"                subnets \u003d self._core_plugin.get_subnets(context.elevated(),"},{"line_number":1037,"context_line":"                                                        filters\u003did_filter)"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Ignore temporary Prefix Delegation CIDRs"},{"line_number":1040,"context_line":"                subnets \u003d ["}],"source_content_type":"text/x-python","patch_set":10,"id":"b0c75e1d_198d0c69","line":1037,"updated":"2022-10-16 07:31:13.000000000","message":"I don\u0027t remember exactly but can You maybe get all subnets in one query?","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"31118c46afba0d9a598eedb4816e1e53df62632d","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"            if subnets_id:"},{"line_number":1035,"context_line":"                id_filter \u003d {\u0027id\u0027: subnets_id}"},{"line_number":1036,"context_line":"                subnets \u003d self._core_plugin.get_subnets(context.elevated(),"},{"line_number":1037,"context_line":"                                                        filters\u003did_filter)"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Ignore temporary Prefix Delegation CIDRs"},{"line_number":1040,"context_line":"                subnets \u003d ["}],"source_content_type":"text/x-python","patch_set":10,"id":"0a03150b_61a097f9","line":1037,"in_reply_to":"373733cc_cb16aa76","updated":"2022-10-17 14:40:41.000000000","message":"ok :)","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"9fccbbba8dbd7a364ab49bc6be4956472869e004","unresolved":false,"context_lines":[{"line_number":1034,"context_line":"            if subnets_id:"},{"line_number":1035,"context_line":"                id_filter \u003d {\u0027id\u0027: subnets_id}"},{"line_number":1036,"context_line":"                subnets \u003d self._core_plugin.get_subnets(context.elevated(),"},{"line_number":1037,"context_line":"                                                        filters\u003did_filter)"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Ignore temporary Prefix Delegation CIDRs"},{"line_number":1040,"context_line":"                subnets \u003d ["}],"source_content_type":"text/x-python","patch_set":10,"id":"373733cc_cb16aa76","line":1037,"in_reply_to":"b0c75e1d_198d0c69","updated":"2022-10-17 09:34:37.000000000","message":"Yes, the filter accepts something as {\u0027id\u0027:[\u0027sb1\u0027, \u0027sb2\u0027]} to get both subnets by id.","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":23567,"name":"Luis Tomas Bolivar","email":"ltomasbo@redhat.com","username":"ltomasbo"},"change_message_id":"edda0083446ee72fb0451a2cadfa20ba94cd8a9e","unresolved":true,"context_lines":[{"line_number":1036,"context_line":"                subnets \u003d self._core_plugin.get_subnets(context.elevated(),"},{"line_number":1037,"context_line":"                                                        filters\u003did_filter)"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Ignore temporary Prefix Delegation CIDRs"},{"line_number":1040,"context_line":"                subnets \u003d ["},{"line_number":1041,"context_line":"                    s"},{"line_number":1042,"context_line":"                    for s in subnets"}],"source_content_type":"text/x-python","patch_set":10,"id":"bd6faac9_ddc913c7","line":1039,"range":{"start_line":1039,"start_character":16,"end_line":1039,"end_character":58},"updated":"2022-10-19 06:11:15.000000000","message":"perhaps worth to explain why or when we can stop ignoring it","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":false,"context_lines":[{"line_number":1036,"context_line":"                subnets \u003d self._core_plugin.get_subnets(context.elevated(),"},{"line_number":1037,"context_line":"                                                        filters\u003did_filter)"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Ignore temporary Prefix Delegation CIDRs"},{"line_number":1040,"context_line":"                subnets \u003d ["},{"line_number":1041,"context_line":"                    s"},{"line_number":1042,"context_line":"                    for s in subnets"}],"source_content_type":"text/x-python","patch_set":10,"id":"1411d9e6_39a42536","line":1039,"range":{"start_line":1039,"start_character":16,"end_line":1039,"end_character":58},"in_reply_to":"3aac9462_64763d26","updated":"2022-10-21 11:33:12.000000000","message":"Done","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"e20145eef275ed192076c4fb891c27c042ca5d5a","unresolved":true,"context_lines":[{"line_number":1036,"context_line":"                subnets \u003d self._core_plugin.get_subnets(context.elevated(),"},{"line_number":1037,"context_line":"                                                        filters\u003did_filter)"},{"line_number":1038,"context_line":""},{"line_number":1039,"context_line":"                # Ignore temporary Prefix Delegation CIDRs"},{"line_number":1040,"context_line":"                subnets \u003d ["},{"line_number":1041,"context_line":"                    s"},{"line_number":1042,"context_line":"                    for s in subnets"}],"source_content_type":"text/x-python","patch_set":10,"id":"3aac9462_64763d26","line":1039,"range":{"start_line":1039,"start_character":16,"end_line":1039,"end_character":58},"in_reply_to":"bd6faac9_ddc913c7","updated":"2022-10-19 14:15:43.000000000","message":"According to documentation [1] any number of subnets with this temporary CIDR (::/64) can exist without raising an overlap error, so not take them into account in the following check about subnet overlapping we remove from the list. Also look that this feature is still a gap in neutron [2].\n\n\n[1] https://docs.openstack.org/neutron/latest/admin/config-ipv6.html\n[2] https://docs.openstack.org/neutron/latest/ovn/gaps.html","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"}],"neutron/tests/unit/db/test_l3_db.py":[{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b8eb40d6b68b35a5a54fd6899f8d8230e41eabe9","unresolved":true,"context_lines":[{"line_number":514,"context_line":"            self.assertIsNone("},{"line_number":515,"context_line":"                self.db._validate_gw_info(mock.ANY, info, [], router))"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test___check_subnets_overlapping(self):"},{"line_number":518,"context_line":"        subnets \u003d ["},{"line_number":519,"context_line":"            {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":520,"context_line":"             \u0027cidr\u0027: \u002710.1.0.0/24\u0027},"}],"source_content_type":"text/x-python","patch_set":10,"id":"ade0d570_169ccd5d","line":517,"range":{"start_line":517,"start_character":8,"end_line":517,"end_character":40},"updated":"2022-10-21 03:36:18.000000000","message":"once you change the function name, test names will read better\ntest__raise_on_subnets_overlap_does_not_raise","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b8eb40d6b68b35a5a54fd6899f8d8230e41eabe9","unresolved":true,"context_lines":[{"line_number":514,"context_line":"            self.assertIsNone("},{"line_number":515,"context_line":"                self.db._validate_gw_info(mock.ANY, info, [], router))"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test___check_subnets_overlapping(self):"},{"line_number":518,"context_line":"        subnets \u003d ["},{"line_number":519,"context_line":"            {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":520,"context_line":"             \u0027cidr\u0027: \u002710.1.0.0/24\u0027},"}],"source_content_type":"text/x-python","patch_set":10,"id":"874b150f_22836ccd","line":517,"range":{"start_line":517,"start_character":12,"end_line":517,"end_character":15},"updated":"2022-10-21 03:36:18.000000000","message":"triple underscore ___ ?","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":false,"context_lines":[{"line_number":514,"context_line":"            self.assertIsNone("},{"line_number":515,"context_line":"                self.db._validate_gw_info(mock.ANY, info, [], router))"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test___check_subnets_overlapping(self):"},{"line_number":518,"context_line":"        subnets \u003d ["},{"line_number":519,"context_line":"            {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":520,"context_line":"             \u0027cidr\u0027: \u002710.1.0.0/24\u0027},"}],"source_content_type":"text/x-python","patch_set":10,"id":"abd52131_4a5bd6f5","line":517,"range":{"start_line":517,"start_character":12,"end_line":517,"end_character":15},"in_reply_to":"874b150f_22836ccd","updated":"2022-10-21 11:33:12.000000000","message":"Done","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":false,"context_lines":[{"line_number":514,"context_line":"            self.assertIsNone("},{"line_number":515,"context_line":"                self.db._validate_gw_info(mock.ANY, info, [], router))"},{"line_number":516,"context_line":""},{"line_number":517,"context_line":"    def test___check_subnets_overlapping(self):"},{"line_number":518,"context_line":"        subnets \u003d ["},{"line_number":519,"context_line":"            {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":520,"context_line":"             \u0027cidr\u0027: \u002710.1.0.0/24\u0027},"}],"source_content_type":"text/x-python","patch_set":10,"id":"f7bd68ef_e08da4ab","line":517,"range":{"start_line":517,"start_character":8,"end_line":517,"end_character":40},"in_reply_to":"ade0d570_169ccd5d","updated":"2022-10-21 11:33:12.000000000","message":"Done","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b8eb40d6b68b35a5a54fd6899f8d8230e41eabe9","unresolved":true,"context_lines":[{"line_number":522,"context_line":"             \u0027cidr\u0027: \u002710.2.0.0/24\u0027}]"},{"line_number":523,"context_line":"        self.db._check_subnets_overlapping(subnets[0], subnets[1])"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test___check_subnets_overlapping_detected(self):"},{"line_number":526,"context_line":"        subnets \u003d ["},{"line_number":527,"context_line":"            {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":528,"context_line":"             \u0027cidr\u0027: \u002710.1.0.0/20\u0027},"}],"source_content_type":"text/x-python","patch_set":10,"id":"65f1be38_d0137d0f","line":525,"range":{"start_line":525,"start_character":12,"end_line":525,"end_character":15},"updated":"2022-10-21 03:36:18.000000000","message":"same here","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b8eb40d6b68b35a5a54fd6899f8d8230e41eabe9","unresolved":true,"context_lines":[{"line_number":522,"context_line":"             \u0027cidr\u0027: \u002710.2.0.0/24\u0027}]"},{"line_number":523,"context_line":"        self.db._check_subnets_overlapping(subnets[0], subnets[1])"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test___check_subnets_overlapping_detected(self):"},{"line_number":526,"context_line":"        subnets \u003d ["},{"line_number":527,"context_line":"            {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":528,"context_line":"             \u0027cidr\u0027: \u002710.1.0.0/20\u0027},"}],"source_content_type":"text/x-python","patch_set":10,"id":"67252de6_8b725ce9","line":525,"range":{"start_line":525,"start_character":8,"end_line":525,"end_character":49},"updated":"2022-10-21 03:36:18.000000000","message":"test__raise_on_subnet_overlap_raises(self)","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":false,"context_lines":[{"line_number":522,"context_line":"             \u0027cidr\u0027: \u002710.2.0.0/24\u0027}]"},{"line_number":523,"context_line":"        self.db._check_subnets_overlapping(subnets[0], subnets[1])"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test___check_subnets_overlapping_detected(self):"},{"line_number":526,"context_line":"        subnets \u003d ["},{"line_number":527,"context_line":"            {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":528,"context_line":"             \u0027cidr\u0027: \u002710.1.0.0/20\u0027},"}],"source_content_type":"text/x-python","patch_set":10,"id":"cc377734_0398f1e7","line":525,"range":{"start_line":525,"start_character":12,"end_line":525,"end_character":15},"in_reply_to":"65f1be38_d0137d0f","updated":"2022-10-21 11:33:12.000000000","message":"Done","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":false,"context_lines":[{"line_number":522,"context_line":"             \u0027cidr\u0027: \u002710.2.0.0/24\u0027}]"},{"line_number":523,"context_line":"        self.db._check_subnets_overlapping(subnets[0], subnets[1])"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test___check_subnets_overlapping_detected(self):"},{"line_number":526,"context_line":"        subnets \u003d ["},{"line_number":527,"context_line":"            {\u0027id\u0027: uuidutils.generate_uuid(),"},{"line_number":528,"context_line":"             \u0027cidr\u0027: \u002710.1.0.0/20\u0027},"}],"source_content_type":"text/x-python","patch_set":10,"id":"4837feef_31bdff14","line":525,"range":{"start_line":525,"start_character":8,"end_line":525,"end_character":49},"in_reply_to":"67252de6_8b725ce9","updated":"2022-10-21 11:33:12.000000000","message":"Done","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"b8eb40d6b68b35a5a54fd6899f8d8230e41eabe9","unresolved":true,"context_lines":[{"line_number":554,"context_line":"        self.db._validate_just_one_port_ipv6_by_network_on_router("},{"line_number":555,"context_line":"            router, new_port)"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def test__validate_just_one_port_ipv6_by_network_on_router_failed(self):"},{"line_number":558,"context_line":"        port \u003d models_v2.Port("},{"line_number":559,"context_line":"                id\u003duuidutils.generate_uuid(),"},{"line_number":560,"context_line":"                network_id\u003d\u0027foo_network\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"1ac04d42_9feff640","line":557,"updated":"2022-10-21 03:36:18.000000000","message":"Consider writing one more simple unit test where you pass in a IPv4 and expect \"None\" as return. This is so we have coverage in case someone accidentally passes ipv4 in the future or accidentally removes ipv6 check","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34451,"name":"Fernando Royo","email":"froyo@redhat.com","username":"froyo"},"change_message_id":"21f4ba2d1c6e9dd4da4a1e5883950467701be2d7","unresolved":false,"context_lines":[{"line_number":554,"context_line":"        self.db._validate_just_one_port_ipv6_by_network_on_router("},{"line_number":555,"context_line":"            router, new_port)"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def test__validate_just_one_port_ipv6_by_network_on_router_failed(self):"},{"line_number":558,"context_line":"        port \u003d models_v2.Port("},{"line_number":559,"context_line":"                id\u003duuidutils.generate_uuid(),"},{"line_number":560,"context_line":"                network_id\u003d\u0027foo_network\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"485605cd_18934695","line":557,"updated":"2022-10-21 11:33:12.000000000","message":"New test added passing IPv4+IPv6 to check that validation runs well","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"},{"author":{"_account_id":34271,"name":"Miro Tomaska","display_name":"Miro Tomaska","email":"mtomaska@redhat.com","username":"mtomaska"},"change_message_id":"38a2f7fcaa5b124c0ad7375ddbaa6f194d77de92","unresolved":false,"context_lines":[{"line_number":554,"context_line":"        self.db._validate_just_one_port_ipv6_by_network_on_router("},{"line_number":555,"context_line":"            router, new_port)"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"    def test__validate_just_one_port_ipv6_by_network_on_router_failed(self):"},{"line_number":558,"context_line":"        port \u003d models_v2.Port("},{"line_number":559,"context_line":"                id\u003duuidutils.generate_uuid(),"},{"line_number":560,"context_line":"                network_id\u003d\u0027foo_network\u0027,"}],"source_content_type":"text/x-python","patch_set":10,"id":"2f35cffe_7849032a","line":557,"in_reply_to":"1ac04d42_9feff640","updated":"2022-10-21 13:38:40.000000000","message":"spoke to Fernando. He uses a ipv4 in other unit test so we have that coverage there. I am dropping this comment","commit_id":"71c96192cd80aaa903954394f52ffe52096012fb"}]}
