)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"578d38aafed2fdecfe88528e0bc93c6af5532793","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5ecdf9e5_50c7981d","updated":"2021-12-17 15:44:24.000000000","message":"Thank you Slawek, comment on potential issue in-line.","commit_id":"d755c38838bf23457578d9f44416bf250ce874cd"},{"author":{"_account_id":23804,"name":"Daniel Alvarez","email":"dalvarez@redhat.com","username":"dalvarez"},"change_message_id":"00f967ff3d5f31430279b8f5189a576e2fe31d08","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4009d22f_1084495a","updated":"2021-12-17 13:50:08.000000000","message":"Thanks Slaweq!","commit_id":"d755c38838bf23457578d9f44416bf250ce874cd"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"578d38aafed2fdecfe88528e0bc93c6af5532793","unresolved":true,"context_lines":[{"line_number":639,"context_line":"            # a subnet-update and a router-interface-add operation are"},{"line_number":640,"context_line":"            # executed concurrently"},{"line_number":641,"context_line":"            if cur_subnet and not ipv6_utils.is_ipv6_pd_enabled(s):"},{"line_number":642,"context_line":"                gateway_ip \u003d str(cur_subnet[\u0027gateway_ip\u0027])"},{"line_number":643,"context_line":"                if s[\u0027gateway_ip\u0027] !\u003d gateway_ip:"},{"line_number":644,"context_line":"                    with db_api.CONTEXT_READER.using(context):"},{"line_number":645,"context_line":"                        alloc \u003d port_obj.IPAllocation.get_alloc_routerports("},{"line_number":646,"context_line":"                            context, cur_subnet[\u0027id\u0027], gateway_ip\u003dgateway_ip,"}],"source_content_type":"text/x-python","patch_set":1,"id":"a2280292_641af849","line":643,"range":{"start_line":642,"start_character":16,"end_line":643,"end_character":49},"updated":"2021-12-17 15:44:24.000000000","message":"I wonder if we need to be careful comparing IPv6 addresses as strings here. All of the below are the same IP address, despite the string being different.\n 2001:DB8::1\n 2001:0DB8::1\n 2001:0DB8::0001\n\nI think the string should be made an ipaddress.IPv6Address object, then compare the exploded[1] property of the object.\n\n\n[1] https://docs.python.org/3/library/ipaddress.html#ipaddress.IPv6Address.exploded","commit_id":"d755c38838bf23457578d9f44416bf250ce874cd"},{"author":{"_account_id":24245,"name":"Harald Jensås","email":"hjensas@redhat.com","username":"harald.jensas"},"change_message_id":"da0717d7d8bb4c263c5ee6168e16d5a5f7e25df4","unresolved":false,"context_lines":[{"line_number":639,"context_line":"            # a subnet-update and a router-interface-add operation are"},{"line_number":640,"context_line":"            # executed concurrently"},{"line_number":641,"context_line":"            if cur_subnet and not ipv6_utils.is_ipv6_pd_enabled(s):"},{"line_number":642,"context_line":"                gateway_ip \u003d str(cur_subnet[\u0027gateway_ip\u0027])"},{"line_number":643,"context_line":"                if s[\u0027gateway_ip\u0027] !\u003d gateway_ip:"},{"line_number":644,"context_line":"                    with db_api.CONTEXT_READER.using(context):"},{"line_number":645,"context_line":"                        alloc \u003d port_obj.IPAllocation.get_alloc_routerports("},{"line_number":646,"context_line":"                            context, cur_subnet[\u0027id\u0027], gateway_ip\u003dgateway_ip,"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f04794f_68809233","line":643,"range":{"start_line":642,"start_character":16,"end_line":643,"end_character":49},"in_reply_to":"8f021ca2_60cc8fbd","updated":"2021-12-20 10:56:41.000000000","message":"Ok, thanks! Looks good to me.","commit_id":"d755c38838bf23457578d9f44416bf250ce874cd"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"602ec79c672f15ca1181e626b97dd9ffbddb04e8","unresolved":false,"context_lines":[{"line_number":639,"context_line":"            # a subnet-update and a router-interface-add operation are"},{"line_number":640,"context_line":"            # executed concurrently"},{"line_number":641,"context_line":"            if cur_subnet and not ipv6_utils.is_ipv6_pd_enabled(s):"},{"line_number":642,"context_line":"                gateway_ip \u003d str(cur_subnet[\u0027gateway_ip\u0027])"},{"line_number":643,"context_line":"                if s[\u0027gateway_ip\u0027] !\u003d gateway_ip:"},{"line_number":644,"context_line":"                    with db_api.CONTEXT_READER.using(context):"},{"line_number":645,"context_line":"                        alloc \u003d port_obj.IPAllocation.get_alloc_routerports("},{"line_number":646,"context_line":"                            context, cur_subnet[\u0027id\u0027], gateway_ip\u003dgateway_ip,"}],"source_content_type":"text/x-python","patch_set":1,"id":"8f021ca2_60cc8fbd","line":643,"range":{"start_line":642,"start_character":16,"end_line":643,"end_character":49},"in_reply_to":"a2280292_641af849","updated":"2021-12-20 09:09:38.000000000","message":"Actually data which comes from API is always converted to the canonical form: https://github.com/openstack/neutron-lib/blob/6a922e45b0be869a22f43609178e77ba0252f6ea/neutron_lib/api/definitions/subnet.py#L79 and cur_subnet is OVO object where it is already netaddr.IPAddress object so we should be good here.\nBut just to be on the safe side, I changed it to compare IPAddress objects instead of strings. It will be better for sure :)","commit_id":"d755c38838bf23457578d9f44416bf250ce874cd"}],"neutron/tests/unit/db/test_db_base_plugin_v2.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"237ba2ff535688bc7858cd02d446f2dd5535b3e6","unresolved":true,"context_lines":[{"line_number":4861,"context_line":"                    # this protection only applies to router ports so we need"},{"line_number":4862,"context_line":"                    # to make this port belong to a router"},{"line_number":4863,"context_line":"                    ctx \u003d context.get_admin_context()"},{"line_number":4864,"context_line":"                    with db_api.CONTEXT_WRITER.using(ctx):"},{"line_number":4865,"context_line":"                        router \u003d l3_models.Router()"},{"line_number":4866,"context_line":"                        ctx.session.add(router)"},{"line_number":4867,"context_line":"                    rp \u003d l3_obj.RouterPort(ctx, router_id\u003drouter.id,"},{"line_number":4868,"context_line":"                                           port_id\u003dport[\u0027port\u0027][\u0027id\u0027])"},{"line_number":4869,"context_line":"                    rp.create()"},{"line_number":4870,"context_line":""},{"line_number":4871,"context_line":"                    # It\u0027s the same IP address but with all zeros now so string"},{"line_number":4872,"context_line":"                    # is different"}],"source_content_type":"text/x-python","patch_set":2,"id":"dce8909a_a472fdc6","line":4869,"range":{"start_line":4864,"start_character":20,"end_line":4869,"end_character":31},"updated":"2021-12-21 10:58:50.000000000","message":"nit 1: we have router OVO, you can use it instead the router DB object.\nnit 2: the RP creation should be inside another txn.\n\nBut I know this is a copy/paste from other tests that are working, so \"don\u0027t be picky\"","commit_id":"6809bed632b1c155bf370b78353e6b0fe059b3f0"}]}
