)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"edd03f30970affd9bf8fa0eda0bc11ef0af1dcc3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"30f32b28_18e892c8","updated":"2025-05-30 10:42:28.000000000","message":"Hi forks, I want to discuss about this new extension for some edge case which is need an internal DNS resolution.\n\nLike AWS with ip 169.254.169.253 and GCP with ip 169.254.169.254","commit_id":"98ec6efba58a6d2b68f604766a9a355fc2abc62f"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"562e443d07769f3635f5b79be7daa52ac3e601c3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"17cabf73_2fd7cfae","updated":"2025-06-04 12:43:36.000000000","message":"some small comments (anyway have to wait for the drivers meeting to discuss this topic):\n* The extension should be responsible for installing the flow\n* The dns server addresses should come from config file to make the solution flexible","commit_id":"98ec6efba58a6d2b68f604766a9a355fc2abc62f"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"a7aaca76c0eb088699f581a41a3fb7886eba5712","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fc05712c_054b3a79","in_reply_to":"30f32b28_18e892c8","updated":"2025-06-02 01:50:41.000000000","message":"And this is it did just for test:\n\novs-ofctl add-flow br-int \"udp,nw_dst\u003d169.254.169.253,tp_dst\u003d53,actions\u003dCONTROLLER:0\"\n\nWill add some code to add this flow everytime we restart neutron agent","commit_id":"98ec6efba58a6d2b68f604766a9a355fc2abc62f"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"fb55bcc1cf240621ba8fa4a9ef59ea50ef0f3b79","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"4aea5e09_b77c7ed3","in_reply_to":"3c47140b_6acfffa8","updated":"2025-06-04 09:17:06.000000000","message":"Tks, I created a new one, please let me know if I need to update more information.\n\nhttps://bugs.launchpad.net/neutron/+bug/2112446","commit_id":"98ec6efba58a6d2b68f604766a9a355fc2abc62f"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"0fd608a7e76697f2c7570a6cf8a14f8deafc5530","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3c47140b_6acfffa8","in_reply_to":"fc05712c_054b3a79","updated":"2025-06-03 14:07:28.000000000","message":"please describe the exact usecase and how you would like to achieve your goal in an RFE (i.e.: https://bugs.launchpad.net/neutron/+bug/2111899 ), please cosider topics like how to test it manually, deploy it in simple dev-envs like devstack, and how to run perhaps some tests with the CI for this.\nThe team can help of course to guide for exotic topics like upstream CI 😊","commit_id":"98ec6efba58a6d2b68f604766a9a355fc2abc62f"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"bb15511d06dd73825f0d012102ae856224c3e5d8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3029e49d_22669652","updated":"2025-06-25 06:40:37.000000000","message":"recheck neutron-functional","commit_id":"1d164d0738cb909c72839552b8bc3a8509db2541"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"e05a91857bc4c87f666bcde2c418da8deb988599","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"197e9826_18bb128f","updated":"2025-08-02 11:29:01.000000000","message":"// Using fd00::254 for ipv6\nroot@test-ipv6:~# dig omzcloud.vn\n\n; \u003c\u003c\u003e\u003e DiG 9.18.30-0ubuntu0.22.04.2-Ubuntu \u003c\u003c\u003e\u003e omzcloud.vn\n;; global options: +cmd\n;; Got answer:\n;; -\u003e\u003eHEADER\u003c\u003c- opcode: QUERY, status: NOERROR, id: 20277\n;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 1232\n;; QUESTION SECTION:\n;omzcloud.vn.                   IN      A\n\n;; ANSWER SECTION:\nomzcloud.vn.            300     IN      A       103.17.140.100\n\n;; Query time: 48 msec\n;; SERVER: fd00::254#53(fd00::254) (UDP)\n;; WHEN: Sat Aug 02 11:17:38 UTC 2025\n;; MSG SIZE  rcvd: 56\n\n// Using 169.254.169.254 for ipv4\n\nroot@test:~# dig @169.254.169.254 omzcloud.vn\n\n; \u003c\u003c\u003e\u003e DiG 9.18.30-0ubuntu0.22.04.2-Ubuntu \u003c\u003c\u003e\u003e @169.254.169.254 omzcloud.vn\n; (1 server found)\n;; global options: +cmd\n;; Got answer:\n;; -\u003e\u003eHEADER\u003c\u003c- opcode: QUERY, status: NOERROR, id: 61520\n;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 1232\n;; QUESTION SECTION:\n;omzcloud.vn.                   IN      A\n\n;; ANSWER SECTION:\nomzcloud.vn.            300     IN      A       103.17.140.100\n\n;; Query time: 44 msec\n;; SERVER: 169.254.169.254#53(169.254.169.254) (UDP)\n;; WHEN: Sat Aug 02 11:20:58 UTC 2025\n;; MSG SIZE  rcvd: 56","commit_id":"439651d17d79c77240d2681b98fba07debfc0a63"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e4b9191bd907dc472e0249a2809fd78d14716d8f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"c8902132_3cbc93d0","updated":"2025-08-06 09:46:27.000000000","message":"Code looks good to me.\nOne question, we will have fullstack test case to verify the ovs flows and functions for this extension?","commit_id":"d5e62c4e4b5791567aac72b74a9d1106d9e5b41a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f0ce354816ece25b5470dcd629bd4b0c2759a626","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"db9f9b6a_bc6e27af","in_reply_to":"c8902132_3cbc93d0","updated":"2025-08-07 05:18:33.000000000","message":"Thanks, I will do it in a follow-up patchset, Im thinking about fullstack or tempest test as lajoskatona said, we are migrating from fullstack to tempest.","commit_id":"d5e62c4e4b5791567aac72b74a9d1106d9e5b41a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"bf76232c077545448231bc074617158e5cee9aeb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"bc34289a_e092d4fd","updated":"2025-08-28 15:14:07.000000000","message":"I put your patch to a devstack and I have some questions (by the way I pushed a patch with some basic devstack things to make it easier to test and added the extension to neutron-tempest-plugin-openvswitch-distributed-dhcp experimental job)\n\nIn my env seems like the extension starts as expected, I see log lines like this one in the ovs-agent log:\n\nneutron-openvswitch-agent[541037]: DEBUG neutron.agent.l2.extensions.dns_forwarder [-] Connect to DNS upstream server: 208.67.222.222 {{(pid\u003d541037) forward_to_upstream /opt/stack/neutron/neutron/agent/l2/extensions/dns_forwarder.py:52}}\n\nBut if I check the flows on br-int I can\u0027t see the flows mentioned in the spec (https://specs.openstack.org/openstack/neutron-specs/specs/2025.2/distributed-dns-forwarder-ovs.html#openvswitch-agent-side-changes) and in the implementation in br-int.py:\n\n$ sudo ovs-ofctl dump-flows br-int | grep \"table\u003d60\" | cut -d \",\" -f 3,6,7,8,9,10,11,12\n table\u003d60, idle_age\u003d4233, priority\u003d101,udp,nw_dst\u003d255.255.255.255,tp_src\u003d68,tp_dst\u003d67 actions\u003dresubmit(,77)\n table\u003d60, idle_age\u003d4771, priority\u003d101,udp6,ipv6_dst\u003dff02::1:2,tp_src\u003d546,tp_dst\u003d547 actions\u003dresubmit(,78)\n table\u003d60, idle_age\u003d4237, priority\u003d9,in_port\u003d4,dl_src\u003dfa:16:3e:83:04:b4 actions\u003dload:0x2-\u003eNXM_NX_REG6[],resubmit(,61)\n table\u003d60, idle_age\u003d4738, priority\u003d9,in_port\u003d5,dl_src\u003dfa:16:3e:0e:a1:c3 actions\u003dload:0x1-\u003eNXM_NX_REG6[],resubmit(,61)\n table\u003d60, idle_age\u003d8, priority\u003d9,in_port\u003d6,dl_src\u003dfa:16:3e:06:08:b8 actions\u003dload:0x2-\u003eNXM_NX_REG6[],resubmit(,61)\n table\u003d60, idle_age\u003d8, priority\u003d9,in_port\u003d7,dl_src\u003dfa:16:3e:9b:3c:e3 actions\u003dload:0x2-\u003eNXM_NX_REG6[],resubmit(,61)\n table\u003d60, idle_age\u003d4747, priority\u003d4,in_port\u003d1 actions\u003dresubmit(,61)\n table\u003d60, idle_age\u003d4768, priority\u003d4,in_port\u003d2 actions\u003dresubmit(,61)\n table\u003d60, idle_age\u003d4768, priority\u003d4,in_port\u003d3 actions\u003dresubmit(,61)\n table\u003d60, idle_age\u003d4747, priority\u003d1 actions\u003dNORMAL","commit_id":"a1d7b9b3ad85432eea87e41535efdb69cdb7a20f"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"8b54a272edc138c05c71570fbc39d86c423c1f2d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"486ced7b_6842784b","updated":"2025-09-11 07:51:52.000000000","message":"let\u0027s wait for the coming release with the merge of this feature","commit_id":"a1d7b9b3ad85432eea87e41535efdb69cdb7a20f"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"76e95c636ec98019ed90d720493353c61e3e35fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"abc70677_6bc2290c","in_reply_to":"23f19e18_2873e1b5","updated":"2025-09-04 10:00:20.000000000","message":"Hi, thank for your patch, I will check it.\n\nAnd this is my config and ovs flows. Have you restart neutron openvswitch agent after patch code and reconfig?\n\nroot@compute-01 ~/patch_neutron# cat /etc/kolla/neutron-openvswitch-agent/openvswitch_agent.ini\n[agent]\ntunnel_types \u003d vxlan\nl2_population \u003d true\narp_responder \u003d true\nextensions \u003d dhcp,dns_forwarder\n\n[securitygroup]\nfirewall_driver \u003d neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver\n\n[ovs]\nbridge_mappings \u003d physnet1:br-ex\ndatapath_type \u003d system\novsdb_connection \u003d tcp:127.0.0.1:6640\novsdb_timeout \u003d 10\nlocal_ip \u003d 192.168.20.61\n\n[dhcp]\nenable_ipv6 \u003d False\n\n\n(neutron-openvswitch-agent)[root@compute-01 /]# ovs-ofctl dump-flows br-int | grep \"table\u003d60\"\n cookie\u003d0xffde9e55dbded81, duration\u003d2160.579s, table\u003d60, n_packets\u003d0, n_bytes\u003d0, idle_age\u003d2160, priority\u003d102,udp,nw_dst\u003d169.254.169.254,tp_dst\u003d53 actions\u003dCONTROLLER:0\n cookie\u003d0xffde9e55dbded81, duration\u003d2160.577s, table\u003d60, n_packets\u003d0, n_bytes\u003d0, idle_age\u003d2160, priority\u003d102,udp6,ipv6_dst\u003dfd00::254,tp_dst\u003d53 actions\u003dCONTROLLER:0\n cookie\u003d0xffde9e55dbded81, duration\u003d2160.590s, table\u003d60, n_packets\u003d11, n_bytes\u003d3713, idle_age\u003d91, priority\u003d101,udp,nw_dst\u003d255.255.255.255,tp_src\u003d68,tp_dst\u003d67 actions\u003dresubmit(,77)\n cookie\u003d0xffde9e55dbded81, duration\u003d2160.592s, table\u003d60, n_packets\u003d803, n_bytes\u003d93001, idle_age\u003d0, priority\u003d1 actions\u003dNORMAL","commit_id":"a1d7b9b3ad85432eea87e41535efdb69cdb7a20f"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"af4b24389e734993b42ea589b14f1fcd83fe0fd6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"ff006114_5990f143","in_reply_to":"486ced7b_6842784b","updated":"2025-10-08 04:35:32.000000000","message":"Hi, I just rebased on master, could you please to recheck this feature patchset😊","commit_id":"a1d7b9b3ad85432eea87e41535efdb69cdb7a20f"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"57c6e03b1d9604dbed184c9bfcc80edb03d7ef35","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"23f19e18_2873e1b5","in_reply_to":"9f91ffdb_34c94992","updated":"2025-09-02 07:00:10.000000000","message":"Could you please check the patch I pushed on top of this one (https://review.opendev.org/c/openstack/neutron/+/958774 ) and add documentation for your feature to help user in configuration and what to check for easy debugging?","commit_id":"a1d7b9b3ad85432eea87e41535efdb69cdb7a20f"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"ae750dd937a16db1ef55284fa209c63b7b315a23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"9f91ffdb_34c94992","in_reply_to":"bc1f89e4_7349c041","updated":"2025-08-29 07:52:21.000000000","message":"Hi yes I have those i.e.:\nneutron-openvswitch-agent[541037]: DEBUG neutron.agent.l2.extensions.dhcp.base [-] DHCP Controller packet received: buffer_id\u003dffffffff total_len\u003d342 reason\u003dACTION table_id\u003d77 cookie\u003d6185280578397777664 match\u003dOFPMatch(oxm_fields\u003d{\u0027in_port\u0027: 7, \u0027reg3\u0027: 1}) pkt\u003dethernet(dst\u003d\u0027ff:ff:ff:ff:ff:ff\u0027,ethertype\u003d2048,src\u003d\u0027fa:16:3e:9b:3c:e3\u0027), ipv4(csum\u003d14742,dst\u003d\u0027255.255.255.255\u0027,flags\u003d0,header_length\u003d5,identification\u003d0,offset\u003d0,option\u003dNone,proto\u003d17,src\u003d\u00270.0.0.0\u0027,tos\u003d16,total_length\u003d328,ttl\u003d128,version\u003d4), udp(csum\u003d24830,dst_port\u003d67,src_port\u003d68,total_length\u003d308), dhcp(boot_file\u003d\u0027\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\u0027,chaddr\u003d\u0027fa:16:3e:9b:3c:e3\u0027,ciaddr\u003d\u00270.0.0.0\u0027,flags\u003d0,giaddr\u003d\u00270.0.0.0\u0027,hlen\u003d6,hops\u003d0,htype\u003d1,op\u003d1,options\u003doptions(magic_cookie\u003d\u002799.130.83.99\u0027,option_list\u003d[option(length\u003d1,tag\u003d53,value\u003db\u0027\\x01\u0027), option(length\u003d6,tag\u003d12,value\u003db\u0027ubuntu\u0027), option(length\u003d13,tag\u003d55,value\u003db\u0027\\x01\\x1c\\x02\\x03\\x0f\\x06w\\x0c,/\\x1ay*\u0027)],options_len\u003d64),secs\u003d0,siaddr\u003d\u00270.0.0.0\u0027,sname\u003d\u0027\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\u0027,xid\u003d1773114935,yiaddr\u003d\u00270.0.0.0\u0027) {{(pid\u003d541037) _packet_in_handler /opt/stack/neutron/neutron/agent/l2/extensions/dhcp/base.py:70}}\n\n\nAnd the flows for table 77:\n$ sudo ovs-ofctl dump-flows br-int | grep \"table\u003d77\" | cut -d \",\" -f 3,6,7,8,9,10,11,12\n table\u003d77, idle_age\u003d2, priority\u003d100,udp,in_port\u003d7,dl_src\u003dfa:16:3e:9b:3c:e3,tp_src\u003d68,tp_dst\u003d67 actions\u003dCONTROLLER:0\n table\u003d77, idle_age\u003d64589, priority\u003d0 actions\u003ddrop","commit_id":"a1d7b9b3ad85432eea87e41535efdb69cdb7a20f"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"74770577ef127e44357c90935e40d5ac6f4a1d32","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"bc1f89e4_7349c041","in_reply_to":"bc34289a_e092d4fd","updated":"2025-08-28 15:44:55.000000000","message":"Hi, do you see any log related this code base, it should contain table id and match\n\n        LOG.debug(\u0027DNS Controller packet received: \u0027\n                  \u0027buffer_id\u003d%x total_len\u003d%d reason\u003dACTION \u0027\n                  \u0027table_id\u003d%d cookie\u003d%d match\u003d%s pkt\u003d%s\u0027,\n                  msg.buffer_id, msg.total_len,\n                  msg.table_id, msg.cookie, msg.match,\n                  pkt)","commit_id":"a1d7b9b3ad85432eea87e41535efdb69cdb7a20f"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"aace26e1d553d735af4aa4082ddd67b9af66d5a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"b99f7df3_278eeb7c","updated":"2025-10-10 08:06:45.000000000","message":"recheck\nrally job failed with ssl error, which seems not related","commit_id":"a312bbcbb65e4e59e6eb7f5b7535b0972761791a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"fcd41eeb633852bcec188aae20a34e54126a1999","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"a8eaf85c_f6bd503c","updated":"2025-10-09 02:22:30.000000000","message":"recheck neutron-tempest-plugin-openvswitch 500 gatewaytimeout","commit_id":"a312bbcbb65e4e59e6eb7f5b7535b0972761791a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"de20914101d96b60a2e62185dd6b5b1d16543a3d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"8db4eb80_f59f7cf7","updated":"2025-10-17 08:55:14.000000000","message":"Thanks, I pushed the update patch.","commit_id":"002b67780ef0e11389fae1ab71b2f3a323f17faa"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"456383bb1f827a122bd7fc6b5d39cb541899c8ef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"a1789b24_76a3b8d3","updated":"2025-10-19 16:33:05.000000000","message":"recheck \"Instance d91d660b-b195-428f-a310-288e79ad6586 could not be found.\"","commit_id":"58e322c26dc8b1a70b99810572157c9ccc046f9d"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"cc903160bc3cad58d7d95da2c95109c7785aa4e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"ae436efc_9c6bb000","updated":"2025-10-20 02:39:33.000000000","message":"recheck Instance could not be found and Unexpected status code 500","commit_id":"58e322c26dc8b1a70b99810572157c9ccc046f9d"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"61bd9dbe345982feaa77267bd61978c7e2db1bec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"ab827669_04abce21","updated":"2025-10-20 04:46:02.000000000","message":"recheck roundabout error","commit_id":"58e322c26dc8b1a70b99810572157c9ccc046f9d"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4d9df1dc6885ef9e7950fff719a615ec04f87872","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"82c363b2_fb7b4b43","updated":"2025-10-22 09:25:11.000000000","message":"Please check how oslo.config builtins can make cfg validation easier as Brian suggested.\n\nI plan to test again this feature in my local env (perhaps next week, as we have national holiday this week)","commit_id":"f1d7dc50e4b2b508b6a28088e4ad6140a7f3ffc0"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"c183c5246e092e43d762dc215ab55e7a242e3b31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"3300acb2_4d3d860d","updated":"2025-10-22 10:01:35.000000000","message":"Thanks, I got the points, will update soon.","commit_id":"f1d7dc50e4b2b508b6a28088e4ad6140a7f3ffc0"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f681850e6238a47bebcd646314462083c06ec8b9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"4b2fd62d_79465ca0","updated":"2025-10-22 10:45:16.000000000","message":"Regrex is tested with this \"/opt/stack/data/venv/bin/python3 test.py\"\n\nThe content of test.py:\n\n```\nfrom oslo_config import cfg\nfrom oslo_config import types\nimport oslo_i18n\n\nDOMAIN \u003d \"neutron\"\n_translators \u003d oslo_i18n.TranslatorFactory(domain\u003dDOMAIN)\n_ \u003d _translators.primary\n\ndns_forwarder_opts \u003d [\n    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,\n               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],\n               item_type\u003dtypes.String(regex\u003dr\u0027^(?:\\d+(?:\\.\\d+){3}|\\[[0-9a-fA-F:]+\\]):\\d+$\u0027),\n               help\u003d_(\"Comma-separated list of the Upstream DNS server \"\n                      \"in IP:port format which will be used as resolvers.\")),\n    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,\n               help\u003d_(\"Query timeout in seconds for each \"\n                      \"upstream DNS servers\")),\n    cfg.ListOpt(\u0027client_dns_server_ports\u0027,\n               default\u003d[\u0027169.254.169.254:53\u0027, \u0027[fd00::254]:53\u0027],\n               item_type\u003dtypes.String(regex\u003dr\u0027^(?:\\d+(?:\\.\\d+){3}|\\[[0-9a-fA-F:]+\\]):\\d+$\u0027),\n               help\u003d_(\"Comma-separated list of the Client DNS server \"\n                      \"in IP:port format which will be used \"\n                      \"inside client instances.\")),\n]\ncfg.CONF.register_opts(dns_forwarder_opts, \"DNS_FORWARDER\")\ncfg.CONF(default_config_files\u003d[\u0027/etc/neutron/plugins/ml2/ml2_conf.ini\u0027])\n\nprint(f\"upstream_dns_server_ports: {cfg.CONF.DNS_FORWARDER.upstream_dns_server_ports}\")\nprint(f\"client_dns_server_ports: {cfg.CONF.DNS_FORWARDER.client_dns_server_ports}\")\n```\n\nSome config failed test:\n\n```\nstack@daidv-openstack-aio:~$ /opt/stack/data/venv/bin/python3 test.py\nupstream_dns_server_ports: [\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027]\nTraceback (most recent call last):\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/cfg.py\", line 2931, in _do_get\n    return (convert(val), alt_loc)\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/cfg.py\", line 2900, in convert\n    return self._convert_value(\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/cfg.py\", line 3028, in _convert_value\n    return opt.type(value)\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/types.py\", line 513, in __call__\n    raise first_error\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/types.py\", line 507, in __call__\n    validated_value \u003d self.item_type(value.strip())\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/types.py\", line 153, in __call__\n    raise ValueError(\"Value %r doesn\u0027t match regex %r\" %\nValueError: Value \u0027[fd00::254]:x53\u0027 doesn\u0027t match regex \u0027^(?:\\\\d+(?:\\\\.\\\\d+){3}|\\\\[[0-9a-fA-F:]+\\\\]):\\\\d+$\u0027\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/opt/stack/test.py\", line 29, in \u003cmodule\u003e\n    print(f\"client_dns_server_ports: {cfg.CONF.DNS_FORWARDER.client_dns_server_ports}\")\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/cfg.py\", line 3377, in __getattr__\n    return self._conf._get(name, self._group)\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/cfg.py\", line 2868, in _get\n    value, loc \u003d self._do_get(name, group, namespace)\n  File \"/opt/stack/data/venv/lib/python3.10/site-packages/oslo_config/cfg.py\", line 2947, in _do_get\n    raise ConfigFileValueError(message)\noslo_config.cfg.ConfigFileValueError: Value for option client_dns_server_ports from LocationInfo(location\u003d\u003cLocations.user: (4, True)\u003e, detail\u003d\u0027/etc/neutron/plugins/ml2/ml2_conf.ini\u0027) is not valid: Value \u0027[fd00::254]:x53\u0027 doesn\u0027t match regex \u0027^(?:\\\\d+(?:\\\\.\\\\d+){3}|\\\\[[0-9a-fA-F:]+\\\\]):\\\\d+$\u0027\n```","commit_id":"3bcf047c1acf12b8f9362e0da9b96b77a70e1b17"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"791e0863f0c20b6ac1e26275ec54415f73fc13a8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"39f34883_6da82a49","updated":"2025-10-30 17:43:19.000000000","message":"Thanks, I had some time finally to revisit this feature","commit_id":"b14bf41b1f2a5b043787e22477e770f8a60bea8a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"891bccf41d211d76e1e89a3b9bddcd1674b29538","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"985e56d9_61d13dbe","updated":"2025-10-24 08:01:20.000000000","message":"recheck neutron-ovs-grenade-multinode-skip-level failed","commit_id":"b14bf41b1f2a5b043787e22477e770f8a60bea8a"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"a247f716ef261a4449b19cf392d3b64bdbf339a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"11e339fd_aa78e1ca","updated":"2026-02-26 14:22:21.000000000","message":"@daidv@omzcloud.vn could you please check the latest comments?","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"5ee6ed2d67b926648014875d50e659959de2cb50","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"a8d34030_07eab35d","updated":"2026-01-23 12:06:38.000000000","message":"It looks ok, and works as I tested","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"dff8230d_be0d33ca","updated":"2026-01-23 17:27:22.000000000","message":"Sorry, finally had a chance to really review this and had some comments.","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"94792139c3963ceef7f4392f3811350ed4409bef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"bc7458c9_a428ea92","updated":"2026-04-14 11:02:31.000000000","message":"@haleyb.dev@gmail.com @katonalala@gmail.com Sorry for late update, now I have time to recheck this","commit_id":"a76167e03e4324fefc1e9d57dfb09520dbd66074"}],"devstack/plugin.sh":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"576265973417c11168e0bf8f7ce9697c15689c98","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":41,"id":"83e69c93_a9fcfc26","updated":"2026-05-11 12:03:27.000000000","message":"thanks, it makes sense to have the devstack plugin here","commit_id":"bf41c5493f6e0cabad770e22eb2321c1560afa88"}],"neutron/agent/l2/extensions/dns_forwarder.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e4b9191bd907dc472e0249a2809fd78d14716d8f","unresolved":true,"context_lines":[{"line_number":69,"context_line":"                    query_data,"},{"line_number":70,"context_line":"                    (server, port)"},{"line_number":71,"context_line":"                )"},{"line_number":72,"context_line":"                response, _address \u003d upstream_socket.recvfrom(512)"},{"line_number":73,"context_line":"                upstream_socket.close()"},{"line_number":74,"context_line":"                return response"},{"line_number":75,"context_line":"            except (ValueError, netaddr.AddrFormatError):"}],"source_content_type":"text/x-python","patch_set":13,"id":"0da466a5_4afbacee","line":72,"range":{"start_line":72,"start_character":62,"end_line":72,"end_character":65},"updated":"2025-08-06 09:46:27.000000000","message":"512 bytes simply doesn\u0027t look big enough.","commit_id":"d5e62c4e4b5791567aac72b74a9d1106d9e5b41a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f0ce354816ece25b5470dcd629bd4b0c2759a626","unresolved":true,"context_lines":[{"line_number":69,"context_line":"                    query_data,"},{"line_number":70,"context_line":"                    (server, port)"},{"line_number":71,"context_line":"                )"},{"line_number":72,"context_line":"                response, _address \u003d upstream_socket.recvfrom(512)"},{"line_number":73,"context_line":"                upstream_socket.close()"},{"line_number":74,"context_line":"                return response"},{"line_number":75,"context_line":"            except (ValueError, netaddr.AddrFormatError):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7217c23f_93749e37","line":72,"range":{"start_line":72,"start_character":62,"end_line":72,"end_character":65},"in_reply_to":"0da466a5_4afbacee","updated":"2025-08-07 05:18:33.000000000","message":"Oops, thank you for your suggestion, I upgraded to 4096 bytes, so we can support EDNS as well.\n\nTested with: dig +bufsize\u003d4096 @169.254.169.254 1024.size.dns.netmeister.org","commit_id":"d5e62c4e4b5791567aac72b74a9d1106d9e5b41a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"41539f3c621d9d91bd538598963b39f34901a05f","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                    query_data,"},{"line_number":70,"context_line":"                    (server, port)"},{"line_number":71,"context_line":"                )"},{"line_number":72,"context_line":"                response, _address \u003d upstream_socket.recvfrom(512)"},{"line_number":73,"context_line":"                upstream_socket.close()"},{"line_number":74,"context_line":"                return response"},{"line_number":75,"context_line":"            except (ValueError, netaddr.AddrFormatError):"}],"source_content_type":"text/x-python","patch_set":13,"id":"4f0232e6_82aa03b3","line":72,"range":{"start_line":72,"start_character":62,"end_line":72,"end_character":65},"in_reply_to":"7217c23f_93749e37","updated":"2025-08-07 05:22:12.000000000","message":"Done","commit_id":"d5e62c4e4b5791567aac72b74a9d1106d9e5b41a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"e4b9191bd907dc472e0249a2809fd78d14716d8f","unresolved":true,"context_lines":[{"line_number":79,"context_line":"                LOG.debug(f\"Failed to query upstream server {server}: {e}\")"},{"line_number":80,"context_line":"                continue"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        return None"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _packet_in_handler(self, event):"},{"line_number":85,"context_line":"        msg \u003d event.msg"}],"source_content_type":"text/x-python","patch_set":13,"id":"db4107e4_cb4fa316","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":19},"updated":"2025-08-06 09:46:27.000000000","message":"\"return None\" is not necessary here, it is default behavior for python.","commit_id":"d5e62c4e4b5791567aac72b74a9d1106d9e5b41a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f0ce354816ece25b5470dcd629bd4b0c2759a626","unresolved":true,"context_lines":[{"line_number":79,"context_line":"                LOG.debug(f\"Failed to query upstream server {server}: {e}\")"},{"line_number":80,"context_line":"                continue"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        return None"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _packet_in_handler(self, event):"},{"line_number":85,"context_line":"        msg \u003d event.msg"}],"source_content_type":"text/x-python","patch_set":13,"id":"ea3f44fe_55013a14","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":19},"in_reply_to":"db4107e4_cb4fa316","updated":"2025-08-07 05:18:33.000000000","message":"Tks","commit_id":"d5e62c4e4b5791567aac72b74a9d1106d9e5b41a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"41539f3c621d9d91bd538598963b39f34901a05f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                LOG.debug(f\"Failed to query upstream server {server}: {e}\")"},{"line_number":80,"context_line":"                continue"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        return None"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def _packet_in_handler(self, event):"},{"line_number":85,"context_line":"        msg \u003d event.msg"}],"source_content_type":"text/x-python","patch_set":13,"id":"72a417c1_86fc7c94","line":82,"range":{"start_line":82,"start_character":8,"end_line":82,"end_character":19},"in_reply_to":"ea3f44fe_55013a14","updated":"2025-08-07 05:22:12.000000000","message":"Done","commit_id":"d5e62c4e4b5791567aac72b74a9d1106d9e5b41a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b9bfa0c764a172820d3bffa99903b543d1960b9","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def forward_to_upstream(self, query_data):"},{"line_number":46,"context_line":"        \"\"\"Forward DNS query to upstream servers\"\"\""},{"line_number":47,"context_line":"        for ip_port in cfg.CONF.DNS_FORWARDER.upstream_dns_server_ports:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                server_part, port_part \u003d ip_port.rsplit(\u0027:\u0027, 1)"},{"line_number":50,"context_line":"                server \u003d server_part.replace(\u0027[\u0027, \u0027\u0027).replace(\u0027]\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"95f07b7f_4f106f7e","line":47,"updated":"2025-10-15 19:44:10.000000000","message":"Maybe we should check validity at class init, else we have to do this every query.","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f681850e6238a47bebcd646314462083c06ec8b9","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def forward_to_upstream(self, query_data):"},{"line_number":46,"context_line":"        \"\"\"Forward DNS query to upstream servers\"\"\""},{"line_number":47,"context_line":"        for ip_port in cfg.CONF.DNS_FORWARDER.upstream_dns_server_ports:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                server_part, port_part \u003d ip_port.rsplit(\u0027:\u0027, 1)"},{"line_number":50,"context_line":"                server \u003d server_part.replace(\u0027[\u0027, \u0027\u0027).replace(\u0027]\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"6abdaf2d_fb8437f4","line":47,"in_reply_to":"547dea60_469a6b82","updated":"2025-10-22 10:45:16.000000000","message":"Done","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"de20914101d96b60a2e62185dd6b5b1d16543a3d","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    def forward_to_upstream(self, query_data):"},{"line_number":46,"context_line":"        \"\"\"Forward DNS query to upstream servers\"\"\""},{"line_number":47,"context_line":"        for ip_port in cfg.CONF.DNS_FORWARDER.upstream_dns_server_ports:"},{"line_number":48,"context_line":"            try:"},{"line_number":49,"context_line":"                server_part, port_part \u003d ip_port.rsplit(\u0027:\u0027, 1)"},{"line_number":50,"context_line":"                server \u003d server_part.replace(\u0027[\u0027, \u0027\u0027).replace(\u0027]\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"547dea60_469a6b82","line":47,"in_reply_to":"95f07b7f_4f106f7e","updated":"2025-10-17 08:55:14.000000000","message":"ext_mgr is init from l2_agent_extensions_manager.L2AgentExtensionsManager(cfg.CONF) will initialize all extensions after setup_integration_br().\n\nSo I think for client_dns_server_ports, still need to keep current logic because it run only one time.\n\n```\n        self.ext_manager \u003d ext_manager\n...\n        self.enable_dns_forwarder \u003d \u0027dns_forwarder\u0027 in self.ext_manager.names()\n...\n        self.setup_integration_br()\n...\n        self.ext_manager.initialize(\n            self.connection, ovs_const.EXTENSION_DRIVER_TYPE, agent_api)\n```\n\nFor upstream_dns_query_timeout, I agree with you that we should parsing it when Class instance is created.\n\nOne another think, I just changed logic from continue to exit if config is not in right format.","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b9bfa0c764a172820d3bffa99903b543d1960b9","unresolved":true,"context_lines":[{"line_number":70,"context_line":"                    (server, port)"},{"line_number":71,"context_line":"                )"},{"line_number":72,"context_line":"                response, _address \u003d upstream_socket.recvfrom(4096)"},{"line_number":73,"context_line":"                upstream_socket.close()"},{"line_number":74,"context_line":"                return response"},{"line_number":75,"context_line":"            except (ValueError, netaddr.AddrFormatError):"},{"line_number":76,"context_line":"                LOG.warning(\"Invalid dns forwarder config: %s\", ip_port)"}],"source_content_type":"text/x-python","patch_set":21,"id":"77d1bee4_c735b9e1","line":73,"updated":"2025-10-15 19:44:10.000000000","message":"Should this be under a finally block? Seems maybe one of the two exceptions below could be after it was created?","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f681850e6238a47bebcd646314462083c06ec8b9","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                    (server, port)"},{"line_number":71,"context_line":"                )"},{"line_number":72,"context_line":"                response, _address \u003d upstream_socket.recvfrom(4096)"},{"line_number":73,"context_line":"                upstream_socket.close()"},{"line_number":74,"context_line":"                return response"},{"line_number":75,"context_line":"            except (ValueError, netaddr.AddrFormatError):"},{"line_number":76,"context_line":"                LOG.warning(\"Invalid dns forwarder config: %s\", ip_port)"}],"source_content_type":"text/x-python","patch_set":21,"id":"4e4e325d_54ef4c4d","line":73,"in_reply_to":"69648388_1fa9dfbf","updated":"2025-10-22 10:45:16.000000000","message":"Done","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"de20914101d96b60a2e62185dd6b5b1d16543a3d","unresolved":true,"context_lines":[{"line_number":70,"context_line":"                    (server, port)"},{"line_number":71,"context_line":"                )"},{"line_number":72,"context_line":"                response, _address \u003d upstream_socket.recvfrom(4096)"},{"line_number":73,"context_line":"                upstream_socket.close()"},{"line_number":74,"context_line":"                return response"},{"line_number":75,"context_line":"            except (ValueError, netaddr.AddrFormatError):"},{"line_number":76,"context_line":"                LOG.warning(\"Invalid dns forwarder config: %s\", ip_port)"}],"source_content_type":"text/x-python","patch_set":21,"id":"69648388_1fa9dfbf","line":73,"in_reply_to":"77d1bee4_c735b9e1","updated":"2025-10-17 08:55:14.000000000","message":"Following your above idea, these line is removed","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4d9df1dc6885ef9e7950fff719a615ec04f87872","unresolved":true,"context_lines":[{"line_number":240,"context_line":"        app.start()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def handle_port(self, context, data):"},{"line_number":243,"context_line":"        \"\"\"Do nothing here\"\"\""},{"line_number":244,"context_line":"        pass"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def delete_port(self, context, data):"}],"source_content_type":"text/x-python","patch_set":25,"id":"349582c2_264b77ca","line":243,"range":{"start_line":243,"start_character":8,"end_line":243,"end_character":29},"updated":"2025-10-22 09:25:11.000000000","message":"nit: if you have to push new version these docstrings can be removed or changed to something","commit_id":"f1d7dc50e4b2b508b6a28088e4ad6140a7f3ffc0"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"c183c5246e092e43d762dc215ab55e7a242e3b31","unresolved":true,"context_lines":[{"line_number":240,"context_line":"        app.start()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def handle_port(self, context, data):"},{"line_number":243,"context_line":"        \"\"\"Do nothing here\"\"\""},{"line_number":244,"context_line":"        pass"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def delete_port(self, context, data):"}],"source_content_type":"text/x-python","patch_set":25,"id":"443f0ff2_e4bc44c4","line":243,"range":{"start_line":243,"start_character":8,"end_line":243,"end_character":29},"in_reply_to":"349582c2_264b77ca","updated":"2025-10-22 10:01:35.000000000","message":"Ok, I will update this","commit_id":"f1d7dc50e4b2b508b6a28088e4ad6140a7f3ffc0"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f681850e6238a47bebcd646314462083c06ec8b9","unresolved":false,"context_lines":[{"line_number":240,"context_line":"        app.start()"},{"line_number":241,"context_line":""},{"line_number":242,"context_line":"    def handle_port(self, context, data):"},{"line_number":243,"context_line":"        \"\"\"Do nothing here\"\"\""},{"line_number":244,"context_line":"        pass"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def delete_port(self, context, data):"}],"source_content_type":"text/x-python","patch_set":25,"id":"5e64c0d9_af7c317d","line":243,"range":{"start_line":243,"start_character":8,"end_line":243,"end_character":29},"in_reply_to":"443f0ff2_e4bc44c4","updated":"2025-10-22 10:45:16.000000000","message":"Done","commit_id":"f1d7dc50e4b2b508b6a28088e4ad6140a7f3ffc0"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                self.upstream_dns_server_ports.append({"},{"line_number":50,"context_line":"                    \u0027ip_port\u0027: ip_port,"},{"line_number":51,"context_line":"                    \u0027ip\u0027: ip,"},{"line_number":52,"context_line":"                    \u0027netaddr_ip\u0027: netaddr.IPAddress(ip),"},{"line_number":53,"context_line":"                    \u0027port\u0027: int(port_part)"},{"line_number":54,"context_line":"                })"},{"line_number":55,"context_line":"            except (ValueError, netaddr.AddrFormatError):"}],"source_content_type":"text/x-python","patch_set":34,"id":"ad3cbd0c_a87a5bc6","line":52,"updated":"2026-01-23 17:27:22.000000000","message":"Is this used for anything except the socket family below? If not it can just be the socket family to save the check and assignment below.","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"d5bdfeb5de381c44f8bd2f705162128eded008c9","unresolved":false,"context_lines":[{"line_number":49,"context_line":"                self.upstream_dns_server_ports.append({"},{"line_number":50,"context_line":"                    \u0027ip_port\u0027: ip_port,"},{"line_number":51,"context_line":"                    \u0027ip\u0027: ip,"},{"line_number":52,"context_line":"                    \u0027netaddr_ip\u0027: netaddr.IPAddress(ip),"},{"line_number":53,"context_line":"                    \u0027port\u0027: int(port_part)"},{"line_number":54,"context_line":"                })"},{"line_number":55,"context_line":"            except (ValueError, netaddr.AddrFormatError):"}],"source_content_type":"text/x-python","patch_set":34,"id":"ce701ce4_0c9cc453","line":52,"in_reply_to":"192a661e_4c748115","updated":"2026-05-06 10:13:40.000000000","message":"Done","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":true,"context_lines":[{"line_number":49,"context_line":"                self.upstream_dns_server_ports.append({"},{"line_number":50,"context_line":"                    \u0027ip_port\u0027: ip_port,"},{"line_number":51,"context_line":"                    \u0027ip\u0027: ip,"},{"line_number":52,"context_line":"                    \u0027netaddr_ip\u0027: netaddr.IPAddress(ip),"},{"line_number":53,"context_line":"                    \u0027port\u0027: int(port_part)"},{"line_number":54,"context_line":"                })"},{"line_number":55,"context_line":"            except (ValueError, netaddr.AddrFormatError):"}],"source_content_type":"text/x-python","patch_set":34,"id":"192a661e_4c748115","line":52,"in_reply_to":"ad3cbd0c_a87a5bc6","updated":"2026-04-14 09:39:31.000000000","message":"It provide 1-time parsing configuration and reuse later","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":70,"context_line":"            )"},{"line_number":71,"context_line":"            try:"},{"line_number":72,"context_line":"                # Determine if server is IPv4 or IPv6"},{"line_number":73,"context_line":"                if dns_server[\u0027netaddr_ip\u0027].version \u003d\u003d 6:"},{"line_number":74,"context_line":"                    upstream_socket \u003d socket.socket("},{"line_number":75,"context_line":"                        socket.AF_INET6, socket.SOCK_DGRAM"},{"line_number":76,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":34,"id":"e988dc54_0e5e3676","line":73,"range":{"start_line":73,"start_character":55,"end_line":73,"end_character":56},"updated":"2026-01-23 17:27:22.000000000","message":"nit: neutron-lib constant for this","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            )"},{"line_number":71,"context_line":"            try:"},{"line_number":72,"context_line":"                # Determine if server is IPv4 or IPv6"},{"line_number":73,"context_line":"                if dns_server[\u0027netaddr_ip\u0027].version \u003d\u003d 6:"},{"line_number":74,"context_line":"                    upstream_socket \u003d socket.socket("},{"line_number":75,"context_line":"                        socket.AF_INET6, socket.SOCK_DGRAM"},{"line_number":76,"context_line":"                    )"}],"source_content_type":"text/x-python","patch_set":34,"id":"7144de82_d9494135","line":73,"range":{"start_line":73,"start_character":55,"end_line":73,"end_character":56},"in_reply_to":"e988dc54_0e5e3676","updated":"2026-04-14 09:39:31.000000000","message":"Acknowledged","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":72,"context_line":"                # Determine if server is IPv4 or IPv6"},{"line_number":73,"context_line":"                if dns_server[\u0027netaddr_ip\u0027].version \u003d\u003d 6:"},{"line_number":74,"context_line":"                    upstream_socket \u003d socket.socket("},{"line_number":75,"context_line":"                        socket.AF_INET6, socket.SOCK_DGRAM"},{"line_number":76,"context_line":"                    )"},{"line_number":77,"context_line":"                else:"},{"line_number":78,"context_line":"                    upstream_socket \u003d socket.socket("}],"source_content_type":"text/x-python","patch_set":34,"id":"e09b07bd_ba1296ad","line":75,"updated":"2026-01-23 17:27:22.000000000","message":"So only UDP? DNS supports TCP","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"d5bdfeb5de381c44f8bd2f705162128eded008c9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"                # Determine if server is IPv4 or IPv6"},{"line_number":73,"context_line":"                if dns_server[\u0027netaddr_ip\u0027].version \u003d\u003d 6:"},{"line_number":74,"context_line":"                    upstream_socket \u003d socket.socket("},{"line_number":75,"context_line":"                        socket.AF_INET6, socket.SOCK_DGRAM"},{"line_number":76,"context_line":"                    )"},{"line_number":77,"context_line":"                else:"},{"line_number":78,"context_line":"                    upstream_socket \u003d socket.socket("}],"source_content_type":"text/x-python","patch_set":34,"id":"dcdbd0bc_46b373ec","line":75,"in_reply_to":"57269db6_28104746","updated":"2026-05-06 10:13:40.000000000","message":"Acknowledged","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":true,"context_lines":[{"line_number":72,"context_line":"                # Determine if server is IPv4 or IPv6"},{"line_number":73,"context_line":"                if dns_server[\u0027netaddr_ip\u0027].version \u003d\u003d 6:"},{"line_number":74,"context_line":"                    upstream_socket \u003d socket.socket("},{"line_number":75,"context_line":"                        socket.AF_INET6, socket.SOCK_DGRAM"},{"line_number":76,"context_line":"                    )"},{"line_number":77,"context_line":"                else:"},{"line_number":78,"context_line":"                    upstream_socket \u003d socket.socket("}],"source_content_type":"text/x-python","patch_set":34,"id":"57269db6_28104746","line":75,"in_reply_to":"e09b07bd_ba1296ad","updated":"2026-04-14 09:39:31.000000000","message":"exactly, for now, it only support UDP. Can we move forward and then support TCP in a different follow-up patch","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":87,"context_line":"                    (dns_server[\u0027ip\u0027], dns_server[\u0027port\u0027])"},{"line_number":88,"context_line":"                )"},{"line_number":89,"context_line":"                response, _address \u003d upstream_socket.recvfrom(4096)"},{"line_number":90,"context_line":"                upstream_socket.close()"},{"line_number":91,"context_line":"                return response"},{"line_number":92,"context_line":"            except Exception as e:"},{"line_number":93,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":34,"id":"99222ce7_31f75c7d","line":90,"updated":"2026-01-23 17:27:22.000000000","message":"So if there is an exception in any call above this will never be called, and we\u0027ll never close the socket. This should be done under a with(), for example:\n\nfrom neutron_lib import constants as const\n\ntry:\n    if dns_server[\u0027netaddr_ip\u0027].version \u003d\u003d const.IP_VERSION_6:\n        socket_family \u003d socket.AF_INET6\n    else:\n        socket_family \u003d socket.AF_INET\n\n    with socket.socket(socket_family, socket.SOCK_DGRAM) as upstream_socket:\n        ...\nexcept Exception as e:\n    ...\n\nYou can use the const.IP_VERSION_* elsewhere as well.","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                    (dns_server[\u0027ip\u0027], dns_server[\u0027port\u0027])"},{"line_number":88,"context_line":"                )"},{"line_number":89,"context_line":"                response, _address \u003d upstream_socket.recvfrom(4096)"},{"line_number":90,"context_line":"                upstream_socket.close()"},{"line_number":91,"context_line":"                return response"},{"line_number":92,"context_line":"            except Exception as e:"},{"line_number":93,"context_line":"                LOG.debug("}],"source_content_type":"text/x-python","patch_set":34,"id":"f6909e88_d77a732d","line":90,"in_reply_to":"99222ce7_31f75c7d","updated":"2026-04-14 09:39:31.000000000","message":"Done","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":94,"context_line":"                    \"Failed to query upstream server %s: %s\","},{"line_number":95,"context_line":"                    dns_server[\"ip_port\"], e"},{"line_number":96,"context_line":"                )"},{"line_number":97,"context_line":"                continue"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _packet_in_handler(self, event):"},{"line_number":100,"context_line":"        msg \u003d event.msg"}],"source_content_type":"text/x-python","patch_set":34,"id":"db9b9501_596964f2","line":97,"updated":"2026-01-23 17:27:22.000000000","message":"continue unnecessary","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":false,"context_lines":[{"line_number":94,"context_line":"                    \"Failed to query upstream server %s: %s\","},{"line_number":95,"context_line":"                    dns_server[\"ip_port\"], e"},{"line_number":96,"context_line":"                )"},{"line_number":97,"context_line":"                continue"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _packet_in_handler(self, event):"},{"line_number":100,"context_line":"        msg \u003d event.msg"}],"source_content_type":"text/x-python","patch_set":34,"id":"4dfd6a43_af43f8df","line":97,"in_reply_to":"db9b9501_596964f2","updated":"2026-04-14 09:39:31.000000000","message":"Acknowledged","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":125,"context_line":"            return"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # DNS Forwarding"},{"line_number":128,"context_line":"        dns_payload, ip_version \u003d self._get_dns_payload(pkt)"},{"line_number":129,"context_line":"        dns_result \u003d self.forward_to_upstream(dns_payload)"},{"line_number":130,"context_line":"        if dns_result:"},{"line_number":131,"context_line":"            # Build complete response packet"}],"source_content_type":"text/x-python","patch_set":34,"id":"7c3892f1_799648ff","line":128,"updated":"2026-01-23 17:27:22.000000000","message":"Need to check if call returned None here else below will fail.","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            return"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        # DNS Forwarding"},{"line_number":128,"context_line":"        dns_payload, ip_version \u003d self._get_dns_payload(pkt)"},{"line_number":129,"context_line":"        dns_result \u003d self.forward_to_upstream(dns_payload)"},{"line_number":130,"context_line":"        if dns_result:"},{"line_number":131,"context_line":"            # Build complete response packet"}],"source_content_type":"text/x-python","patch_set":34,"id":"a7115bb8_481fb964","line":128,"in_reply_to":"7c3892f1_799648ff","updated":"2026-04-14 09:39:31.000000000","message":"Acknowledged","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":141,"context_line":"                                    actions\u003dactions,"},{"line_number":142,"context_line":"                                    data\u003dresponse_pkt.data)"},{"line_number":143,"context_line":"            LOG.debug("},{"line_number":144,"context_line":"                \"DNS Controller packet out to OF port {of_in_port}, {out}\""},{"line_number":145,"context_line":"            )"},{"line_number":146,"context_line":"            datapath.send_msg(out)"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"375ad84e_08d92129","line":144,"updated":"2026-01-23 17:27:22.000000000","message":"Looks like the f\"\" is missing","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                                    actions\u003dactions,"},{"line_number":142,"context_line":"                                    data\u003dresponse_pkt.data)"},{"line_number":143,"context_line":"            LOG.debug("},{"line_number":144,"context_line":"                \"DNS Controller packet out to OF port {of_in_port}, {out}\""},{"line_number":145,"context_line":"            )"},{"line_number":146,"context_line":"            datapath.send_msg(out)"},{"line_number":147,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"e51d5556_37b1fd54","line":144,"in_reply_to":"375ad84e_08d92129","updated":"2026-04-14 09:39:31.000000000","message":"Acknowledged","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":166,"context_line":"                # IPv6 header is fixed at 40 bytes"},{"line_number":167,"context_line":"                ip_header_len \u003d 40"},{"line_number":168,"context_line":"            else:"},{"line_number":169,"context_line":"                return None"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"            # UDP header is 8 bytes"},{"line_number":172,"context_line":"            udp_header_len \u003d 8"}],"source_content_type":"text/x-python","patch_set":34,"id":"ab28facc_6ae5ea4e","line":169,"updated":"2026-01-23 17:27:22.000000000","message":"This should always return a tuple, does on L180 and caller expects it","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":false,"context_lines":[{"line_number":166,"context_line":"                # IPv6 header is fixed at 40 bytes"},{"line_number":167,"context_line":"                ip_header_len \u003d 40"},{"line_number":168,"context_line":"            else:"},{"line_number":169,"context_line":"                return None"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"            # UDP header is 8 bytes"},{"line_number":172,"context_line":"            udp_header_len \u003d 8"}],"source_content_type":"text/x-python","patch_set":34,"id":"add2d65e_717d224b","line":169,"in_reply_to":"ab28facc_6ae5ea4e","updated":"2026-04-14 09:39:31.000000000","message":"Acknowledged","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"}],"neutron/agent/l2/extensions/dns_proxy.py":[{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"562e443d07769f3635f5b79be7daa52ac3e601c3","unresolved":true,"context_lines":[{"line_number":54,"context_line":"            LOG.debug(f\"Connect to DNS upstream server: {server}\")"},{"line_number":55,"context_line":"            try:"},{"line_number":56,"context_line":"                # Determine if server is IPv4 or IPv6"},{"line_number":57,"context_line":"                if \u0027:\u0027 in server:"},{"line_number":58,"context_line":"                    # IPv6 server"},{"line_number":59,"context_line":"                    upstream_socket \u003d socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)"},{"line_number":60,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"0d0db36a_c4edb613","line":57,"updated":"2025-06-04 12:43:36.000000000","message":"please use some builtin lib, like netaddr:\nhttps://netaddr.readthedocs.io/en/latest/tutorial_01.html#basic-operations","commit_id":"98ec6efba58a6d2b68f604766a9a355fc2abc62f"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"5e5c0e6b8036a9e7de6f8b1c1284f7fd02080ab8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            LOG.debug(f\"Connect to DNS upstream server: {server}\")"},{"line_number":55,"context_line":"            try:"},{"line_number":56,"context_line":"                # Determine if server is IPv4 or IPv6"},{"line_number":57,"context_line":"                if \u0027:\u0027 in server:"},{"line_number":58,"context_line":"                    # IPv6 server"},{"line_number":59,"context_line":"                    upstream_socket \u003d socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)"},{"line_number":60,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"d03c20b3_b0b8ea1b","line":57,"in_reply_to":"0d0db36a_c4edb613","updated":"2025-06-25 01:52:11.000000000","message":"Acknowledged","commit_id":"98ec6efba58a6d2b68f604766a9a355fc2abc62f"}],"neutron/conf/plugins/ml2/drivers/ovs_conf.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b9bfa0c764a172820d3bffa99903b543d1960b9","unresolved":true,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"dns_forwarder_opts \u003d ["},{"line_number":289,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":290,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":291,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"}],"source_content_type":"text/x-python","patch_set":21,"id":"e561302e_5372a854","line":290,"updated":"2025-10-15 19:44:10.000000000","message":"Should we be using any defaults?\n\nAlso, I think oslo.config library can police things here a little so we don\u0027t have to check the items are valid in the code. For example, the ovn_nb_connection value has this in it\u0027s definition:\n\n    default\u003d[\u0027tcp:127.0.0.1:6641\u0027],\n    item_type\u003dtypes.String(regex\u003dr\u0027^(tcp|ssl|unix):.+\u0027)\n\nWe could at least verify it\u0027s IP:port, or see my other comment.","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"c183c5246e092e43d762dc215ab55e7a242e3b31","unresolved":true,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"dns_forwarder_opts \u003d ["},{"line_number":289,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":290,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":291,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"}],"source_content_type":"text/x-python","patch_set":21,"id":"ab878393_4a7a797a","line":290,"in_reply_to":"1b6ab6a9_5367b59e","updated":"2025-10-22 10:01:35.000000000","message":"I will take a look on item type validation. For the default, I think it will be showed as Default here: https://docs.openstack.org/neutron/latest/configuration/neutron.html\n\nIf we need more information related to using this exension, we can push an following-patch for docs, not only defaults value.","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4d9df1dc6885ef9e7950fff719a615ec04f87872","unresolved":true,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"dns_forwarder_opts \u003d ["},{"line_number":289,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":290,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":291,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"}],"source_content_type":"text/x-python","patch_set":21,"id":"1b6ab6a9_5367b59e","line":290,"in_reply_to":"3b631e78_9cad683f","updated":"2025-10-22 09:25:11.000000000","message":"+1 for item type for validation.\nFor defaults I agree with Brian, better to provide some basic docs where these values are written for first users as tutorial","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f681850e6238a47bebcd646314462083c06ec8b9","unresolved":false,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"dns_forwarder_opts \u003d ["},{"line_number":289,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":290,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":291,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"}],"source_content_type":"text/x-python","patch_set":21,"id":"605c95a1_12b9713f","line":290,"in_reply_to":"ab878393_4a7a797a","updated":"2025-10-22 10:45:16.000000000","message":"Done","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"de20914101d96b60a2e62185dd6b5b1d16543a3d","unresolved":true,"context_lines":[{"line_number":287,"context_line":""},{"line_number":288,"context_line":"dns_forwarder_opts \u003d ["},{"line_number":289,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":290,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":291,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3b631e78_9cad683f","line":290,"in_reply_to":"e561302e_5372a854","updated":"2025-10-17 08:55:14.000000000","message":"Following your above idea, IP:port already parsed. For the default, I would like to keep it for simple demo or devstack, when we just simply enable this extension.","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b9bfa0c764a172820d3bffa99903b543d1960b9","unresolved":true,"context_lines":[{"line_number":289,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":290,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":291,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"},{"line_number":294,"context_line":"               help\u003d_(\"Query timeout in seconds for each \""},{"line_number":295,"context_line":"                      \"Upstream DNS servers\")),"}],"source_content_type":"text/x-python","patch_set":21,"id":"9031a7d5_1d2ad63e","line":292,"range":{"start_line":292,"start_character":26,"end_line":292,"end_character":28},"updated":"2025-10-15 19:44:10.000000000","message":"nit: s/IP","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"de20914101d96b60a2e62185dd6b5b1d16543a3d","unresolved":false,"context_lines":[{"line_number":289,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":290,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":291,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"},{"line_number":294,"context_line":"               help\u003d_(\"Query timeout in seconds for each \""},{"line_number":295,"context_line":"                      \"Upstream DNS servers\")),"}],"source_content_type":"text/x-python","patch_set":21,"id":"6cf16837_ce92de68","line":292,"range":{"start_line":292,"start_character":26,"end_line":292,"end_character":28},"in_reply_to":"9031a7d5_1d2ad63e","updated":"2025-10-17 08:55:14.000000000","message":"Acknowledged","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b9bfa0c764a172820d3bffa99903b543d1960b9","unresolved":true,"context_lines":[{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"},{"line_number":294,"context_line":"               help\u003d_(\"Query timeout in seconds for each \""},{"line_number":295,"context_line":"                      \"Upstream DNS servers\")),"},{"line_number":296,"context_line":"    cfg.ListOpt(\u0027client_dns_server_ports\u0027,"},{"line_number":297,"context_line":"               default\u003d[\u0027169.254.169.254:53\u0027, \u0027[fd00::254]:53\u0027],"},{"line_number":298,"context_line":"               help\u003d_(\"Comma-separated list of the Client DNS server \""}],"source_content_type":"text/x-python","patch_set":21,"id":"141c7c0f_df8ed76a","line":295,"range":{"start_line":295,"start_character":23,"end_line":295,"end_character":43},"updated":"2025-10-15 19:44:10.000000000","message":"s/upstream DNS server.","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f681850e6238a47bebcd646314462083c06ec8b9","unresolved":false,"context_lines":[{"line_number":292,"context_line":"                      \"in ip:port format which will be used as resolvers.\")),"},{"line_number":293,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"},{"line_number":294,"context_line":"               help\u003d_(\"Query timeout in seconds for each \""},{"line_number":295,"context_line":"                      \"Upstream DNS servers\")),"},{"line_number":296,"context_line":"    cfg.ListOpt(\u0027client_dns_server_ports\u0027,"},{"line_number":297,"context_line":"               default\u003d[\u0027169.254.169.254:53\u0027, \u0027[fd00::254]:53\u0027],"},{"line_number":298,"context_line":"               help\u003d_(\"Comma-separated list of the Client DNS server \""}],"source_content_type":"text/x-python","patch_set":21,"id":"f88b0a15_30876ed0","line":295,"range":{"start_line":295,"start_character":23,"end_line":295,"end_character":43},"in_reply_to":"141c7c0f_df8ed76a","updated":"2025-10-22 10:45:16.000000000","message":"Done","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b9bfa0c764a172820d3bffa99903b543d1960b9","unresolved":true,"context_lines":[{"line_number":296,"context_line":"    cfg.ListOpt(\u0027client_dns_server_ports\u0027,"},{"line_number":297,"context_line":"               default\u003d[\u0027169.254.169.254:53\u0027, \u0027[fd00::254]:53\u0027],"},{"line_number":298,"context_line":"               help\u003d_(\"Comma-separated list of the Client DNS server \""},{"line_number":299,"context_line":"                      \"in ip:port format which will be used \""},{"line_number":300,"context_line":"                      \"inside client instances.\")),"},{"line_number":301,"context_line":"]"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"fc3ff964_73b722df","line":299,"range":{"start_line":299,"start_character":26,"end_line":299,"end_character":28},"updated":"2025-10-15 19:44:10.000000000","message":"nit: s/IP","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"de20914101d96b60a2e62185dd6b5b1d16543a3d","unresolved":false,"context_lines":[{"line_number":296,"context_line":"    cfg.ListOpt(\u0027client_dns_server_ports\u0027,"},{"line_number":297,"context_line":"               default\u003d[\u0027169.254.169.254:53\u0027, \u0027[fd00::254]:53\u0027],"},{"line_number":298,"context_line":"               help\u003d_(\"Comma-separated list of the Client DNS server \""},{"line_number":299,"context_line":"                      \"in ip:port format which will be used \""},{"line_number":300,"context_line":"                      \"inside client instances.\")),"},{"line_number":301,"context_line":"]"},{"line_number":302,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"f1ce8e1d_98e476da","line":299,"range":{"start_line":299,"start_character":26,"end_line":299,"end_character":28},"in_reply_to":"fc3ff964_73b722df","updated":"2025-10-17 08:55:14.000000000","message":"Acknowledged","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8cd398224fce530c6f404a6f7b945636599a77eb","unresolved":true,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"dns_forwarder_opts \u003d ["},{"line_number":290,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":291,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":292,"context_line":"               item_type\u003dtypes.String("},{"line_number":293,"context_line":"                     regex\u003dr\u0027^(?:\\d+(?:\\.\\d+){3}|\\[[0-9a-fA-F:]+\\]):\\d+$\u0027,"},{"line_number":294,"context_line":"               ),"}],"source_content_type":"text/x-python","patch_set":28,"id":"f82e4727_5cdf57a8","line":291,"updated":"2025-11-25 22:46:41.000000000","message":"I realize these IPs were used in the spec, but should they be the default? That first one is Verisign\u0027s root server (nstld.verisign-grs.com)","commit_id":"b14bf41b1f2a5b043787e22477e770f8a60bea8a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"d5bdfeb5de381c44f8bd2f705162128eded008c9","unresolved":false,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"dns_forwarder_opts \u003d ["},{"line_number":290,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":291,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":292,"context_line":"               item_type\u003dtypes.String("},{"line_number":293,"context_line":"                     regex\u003dr\u0027^(?:\\d+(?:\\.\\d+){3}|\\[[0-9a-fA-F:]+\\]):\\d+$\u0027,"},{"line_number":294,"context_line":"               ),"}],"source_content_type":"text/x-python","patch_set":28,"id":"0d72530b_a7595dfd","line":291,"in_reply_to":"1439f26d_26a72853","updated":"2026-05-06 10:13:40.000000000","message":"Acknowledged","commit_id":"b14bf41b1f2a5b043787e22477e770f8a60bea8a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"5f9e8b71e89d858c5a70e0b284e721e642a76a11","unresolved":true,"context_lines":[{"line_number":288,"context_line":""},{"line_number":289,"context_line":"dns_forwarder_opts \u003d ["},{"line_number":290,"context_line":"    cfg.ListOpt(\u0027upstream_dns_server_ports\u0027,"},{"line_number":291,"context_line":"               default\u003d[\u00271.1.1.1:53\u0027, \u0027[2606:4700:4700::1111]:53\u0027],"},{"line_number":292,"context_line":"               item_type\u003dtypes.String("},{"line_number":293,"context_line":"                     regex\u003dr\u0027^(?:\\d+(?:\\.\\d+){3}|\\[[0-9a-fA-F:]+\\]):\\d+$\u0027,"},{"line_number":294,"context_line":"               ),"}],"source_content_type":"text/x-python","patch_set":28,"id":"1439f26d_26a72853","line":291,"in_reply_to":"f82e4727_5cdf57a8","updated":"2025-12-10 08:44:11.000000000","message":"Sorry for late reply, I removed all defaults and leave the list empty. I think it is good default then before.","commit_id":"b14bf41b1f2a5b043787e22477e770f8a60bea8a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8cd398224fce530c6f404a6f7b945636599a77eb","unresolved":true,"context_lines":[{"line_number":304,"context_line":"               ),"},{"line_number":305,"context_line":"               help\u003d_(\"Comma-separated list of the Client DNS server \""},{"line_number":306,"context_line":"                      \"in IP:port format which will be used \""},{"line_number":307,"context_line":"                      \"inside client instances.\")),"},{"line_number":308,"context_line":"]"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"f8db6759_5566fb8b","line":307,"updated":"2025-11-25 22:46:41.000000000","message":"Super nit: the indentation is off by one space here, above option too. Must be multiple of 4 since linter didn\u0027t catch it.","commit_id":"b14bf41b1f2a5b043787e22477e770f8a60bea8a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"d5bdfeb5de381c44f8bd2f705162128eded008c9","unresolved":false,"context_lines":[{"line_number":304,"context_line":"               ),"},{"line_number":305,"context_line":"               help\u003d_(\"Comma-separated list of the Client DNS server \""},{"line_number":306,"context_line":"                      \"in IP:port format which will be used \""},{"line_number":307,"context_line":"                      \"inside client instances.\")),"},{"line_number":308,"context_line":"]"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"ec9d1b90_96747d4a","line":307,"in_reply_to":"6544be10_e1dbf341","updated":"2026-05-06 10:13:40.000000000","message":"Acknowledged","commit_id":"b14bf41b1f2a5b043787e22477e770f8a60bea8a"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"5f9e8b71e89d858c5a70e0b284e721e642a76a11","unresolved":true,"context_lines":[{"line_number":304,"context_line":"               ),"},{"line_number":305,"context_line":"               help\u003d_(\"Comma-separated list of the Client DNS server \""},{"line_number":306,"context_line":"                      \"in IP:port format which will be used \""},{"line_number":307,"context_line":"                      \"inside client instances.\")),"},{"line_number":308,"context_line":"]"},{"line_number":309,"context_line":""},{"line_number":310,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"6544be10_e1dbf341","line":307,"in_reply_to":"f8db6759_5566fb8b","updated":"2025-12-10 08:44:11.000000000","message":"I followed above metadata_opts, I think aligning with the above lines is OK.","commit_id":"b14bf41b1f2a5b043787e22477e770f8a60bea8a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":294,"context_line":"               ),"},{"line_number":295,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":296,"context_line":"                      \"in IP:port format which will be used as resolvers. \""},{"line_number":297,"context_line":"                      \"Example: \u00271.1.1.1:53, [2606:4700:4700::1111]:53\u0027\")),"},{"line_number":298,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"},{"line_number":299,"context_line":"               help\u003d_(\"Query timeout in seconds for each \""},{"line_number":300,"context_line":"                      \"upstream DNS servers\")),"}],"source_content_type":"text/x-python","patch_set":34,"id":"f0cbc787_a1f3276f","line":297,"updated":"2026-01-23 17:27:22.000000000","message":"Question: will this always be port 53?","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"d5bdfeb5de381c44f8bd2f705162128eded008c9","unresolved":false,"context_lines":[{"line_number":294,"context_line":"               ),"},{"line_number":295,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":296,"context_line":"                      \"in IP:port format which will be used as resolvers. \""},{"line_number":297,"context_line":"                      \"Example: \u00271.1.1.1:53, [2606:4700:4700::1111]:53\u0027\")),"},{"line_number":298,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"},{"line_number":299,"context_line":"               help\u003d_(\"Query timeout in seconds for each \""},{"line_number":300,"context_line":"                      \"upstream DNS servers\")),"}],"source_content_type":"text/x-python","patch_set":34,"id":"92eae65b_525705ed","line":297,"in_reply_to":"c792a064_15867c15","updated":"2026-05-06 10:13:40.000000000","message":"Acknowledged","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":true,"context_lines":[{"line_number":294,"context_line":"               ),"},{"line_number":295,"context_line":"               help\u003d_(\"Comma-separated list of the Upstream DNS server \""},{"line_number":296,"context_line":"                      \"in IP:port format which will be used as resolvers. \""},{"line_number":297,"context_line":"                      \"Example: \u00271.1.1.1:53, [2606:4700:4700::1111]:53\u0027\")),"},{"line_number":298,"context_line":"    cfg.IntOpt(\u0027upstream_dns_query_timeout\u0027, default\u003d5,"},{"line_number":299,"context_line":"               help\u003d_(\"Query timeout in seconds for each \""},{"line_number":300,"context_line":"                      \"upstream DNS servers\")),"}],"source_content_type":"text/x-python","patch_set":34,"id":"c792a064_15867c15","line":297,"in_reply_to":"f0cbc787_a1f3276f","updated":"2026-04-14 09:39:31.000000000","message":"It can be any port following none-default config","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"}],"neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/br_int.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1b9bfa0c764a172820d3bffa99903b543d1960b9","unresolved":true,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def init_dns_forwarder(self):"},{"line_number":180,"context_line":"        \"\"\"Initialize DNS Forwarder flows.\"\"\""},{"line_number":181,"context_line":"        for ip_port in cfg.CONF.DNS_FORWARDER.client_dns_server_ports:"},{"line_number":182,"context_line":"            try:"},{"line_number":183,"context_line":"                ip_part, port_part \u003d ip_port.rsplit(\u0027:\u0027, 1)"},{"line_number":184,"context_line":"                ip \u003d ip_part.replace(\u0027[\u0027, \u0027\u0027).replace(\u0027]\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"0ea3d83c_8429e9ee","line":181,"updated":"2025-10-15 19:44:10.000000000","message":"Here we\u0027re doing validation again","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"f681850e6238a47bebcd646314462083c06ec8b9","unresolved":false,"context_lines":[{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def init_dns_forwarder(self):"},{"line_number":180,"context_line":"        \"\"\"Initialize DNS Forwarder flows.\"\"\""},{"line_number":181,"context_line":"        for ip_port in cfg.CONF.DNS_FORWARDER.client_dns_server_ports:"},{"line_number":182,"context_line":"            try:"},{"line_number":183,"context_line":"                ip_part, port_part \u003d ip_port.rsplit(\u0027:\u0027, 1)"},{"line_number":184,"context_line":"                ip \u003d ip_part.replace(\u0027[\u0027, \u0027\u0027).replace(\u0027]\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":21,"id":"f4160080_8813bc49","line":181,"in_reply_to":"0ea3d83c_8429e9ee","updated":"2025-10-22 10:45:16.000000000","message":"Done","commit_id":"7484ed60fd49636f6e55f03e91a9a33fc51de952"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"af8b7bab03d376e2715add24c033540dc1d3d12c","unresolved":true,"context_lines":[{"line_number":189,"context_line":"                LOG.error(f\"Invalid client_dns_server_ports config: {ip_port}\")"},{"line_number":190,"context_line":"                sys.exit(1)"},{"line_number":191,"context_line":"            (_dp, ofp, ofpp) \u003d self._get_dp()"},{"line_number":192,"context_line":"            if netaddr_ip.version \u003d\u003d 6:"},{"line_number":193,"context_line":"                match \u003d ofpp.OFPMatch("},{"line_number":194,"context_line":"                    eth_type\u003dether_types.ETH_TYPE_IPV6,"},{"line_number":195,"context_line":"                    ip_proto\u003din_proto.IPPROTO_UDP,"}],"source_content_type":"text/x-python","patch_set":34,"id":"29d2d017_261e7d3b","line":192,"range":{"start_line":192,"start_character":37,"end_line":192,"end_character":38},"updated":"2026-01-23 17:27:22.000000000","message":"nit: lib_consts.IP_VERSION_6","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"},{"author":{"_account_id":19930,"name":"Dai Dang Van","email":"daidv@omzcloud.vn","username":"daidv"},"change_message_id":"28f4d2263cf1e36c691c04b3e37a96b95d4881b0","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                LOG.error(f\"Invalid client_dns_server_ports config: {ip_port}\")"},{"line_number":190,"context_line":"                sys.exit(1)"},{"line_number":191,"context_line":"            (_dp, ofp, ofpp) \u003d self._get_dp()"},{"line_number":192,"context_line":"            if netaddr_ip.version \u003d\u003d 6:"},{"line_number":193,"context_line":"                match \u003d ofpp.OFPMatch("},{"line_number":194,"context_line":"                    eth_type\u003dether_types.ETH_TYPE_IPV6,"},{"line_number":195,"context_line":"                    ip_proto\u003din_proto.IPPROTO_UDP,"}],"source_content_type":"text/x-python","patch_set":34,"id":"78a6da12_f06cad5a","line":192,"range":{"start_line":192,"start_character":37,"end_line":192,"end_character":38},"in_reply_to":"29d2d017_261e7d3b","updated":"2026-04-14 09:39:31.000000000","message":"Acknowledged","commit_id":"afc41b6ce251dcfdb666054f6635e8f499f1ad15"}]}
